35.[前端开发-JavaScript基础]Day12-for循环中变量-华为商城-商品列表-轮播图

news2025/7/9 4:15:08

for循环中监听函数中打印变量

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <button>按钮</button>

  <script>

    var btnEl = document.querySelector("button")
    var message = "Hello World"

    /*
      for1: var name = kobe + 0
      for2: var name = kobe + 1
      for3: var name = kobe + 2
      for4: var name = kobe + 3
      for5: var name = kobe + 4
    */

    for (var i = 0; i < 5; i++) {

      console.log("---------")
      var name = "kobe" + i
      
      btnEl.onclick = function() {
        console.log(i)
        console.log(message)
        console.log(name)
      }
    }

    message = "哈哈哈哈哈"
    console.log(i) // 5
    console.log(name)
    
  </script>

</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>

  <div class="box">
    <button>按钮1</button>
    <button>按钮2</button>
    <button>按钮3</button>
    <button>按钮4</button>
  </div>
  
  <script>

    // 强调: 代码的执行顺序

    var btnEls = document.querySelectorAll("button")

    // [btn1, btn2, btn3, btn4]

    /*
      for1: var btnItemEl = btnEls[0]
            btn1.index = 0
            btnItemEl.onclick = function() {}
      for2: var btnItemEl = btnEls[1]
            btn2.index = 1
      for3: var btnItemEl = btnEls[2]
            btn3.index = 2
      for4: var btnItemEl = btnEls[3]
            btn4.index = 3
    */

    // 对每一个按钮的点击进行监听
    for (var i = 0; i < btnEls.length; i++) {
      var btnItemEl = btnEls[i]
      btnItemEl.index = i
      
      debugger

      btnItemEl.onclick = function() {
        debugger
        console.log(i)
        console.log(btnItemEl)

        // 怎么样在这里能拿到对应的btnItemEl
        // 方案一: 直接获取this
        console.log(this)

        // 方案二: 先获取索引
        console.log(this.index)
      }
    }

    console.log(i) // 4
    console.log(btnItemEl)



  </script>

</body>
</html>

华为商城-整体项目的概览

华为商城-导航-操作界面搭建

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./css/reset.css">
  <link rel="stylesheet" href="./css/common.css">
  <style>
    .crumbs {
      height: 63px;
      line-height: 63px;
      font-size: 12px;
    }

    .crumbs .item {
      cursor: pointer;
    }

    .crumbs .item:last-child {
      color: #000;
    }

    .operation {
      padding: 0 24px;
      background-color: #fff;
    }

    .operation > .row {
      display: flex;
    }

    .operation > .row .item {
      width: 104px;
      height: 48px;
      line-height: 48px;
      font-size: 12px;
      color: #000;
      cursor: pointer;
    }

    .operation > .row .item:first-child {
      color: #666;
      cursor: auto;
    }

    .operation > .row .item.active {
      color: red;
    }

    /* 商品列表 */
    .products {
      margin-top: 20px;
      display: flex;
      flex-wrap: wrap;
      justify-content: space-between;
    }

    .products > .item {
      width: 291px;
      background-color: #fff;
      margin-bottom: 12px;
    }

    .products > .item a {
      display: flex;
      flex-direction: column;
      align-items: center;
    }

    .products > .item .album {
      width: 180px;
      height: 180px;
      margin: 30px 0;
    }

    .products > .item .name {
      font-weight: 700;
      color: #000;
    }

    .products > .item .discount {
      margin: 10px 0 16px;
      color: #666;
    }

    .products > .item .price {
      font-size: 16px;
      font-weight: 700;
      color: red;
    }

    .products > .item .service {
      display: flex;
      justify-content: center;
      margin: 10px 0;
    }

    .products > .item .service .tip {
      margin: 0 3px;
      padding: 0 3px;
      border: 1px solid red;
      border-radius: 3px;
      font-size: 12px;
      color: red;
    }

    .products > .item .comment {
      display: flex;
      justify-content: center;
      margin-bottom: 12px;
    }

    .products > .item .comment span {
      margin: 0 5px;
      font-size: 12px;
      color: #666;
    }

  </style>
</head>
<body>
  
  <!-- 商品展示的部分 -->
  <div class="wrapper">
    <!-- 面包屑的导航 -->
    <div class="crumbs">
      <span class="item">首页</span>
      <span>&gt;</span>
      <span class="item">笔记本</span>
    </div>

    <!-- 对内容进行操作 -->
    <div class="operation">
      <ul class="row category">
        <li class="item">分类:</li>
        <li class="item">笔记本</li>
        <li class="item">台式机</li>
        <li class="item">智慧屏</li>
      </ul>
      <ul class="row discount">
        <li class="item">服务优惠:</li>
        <li class="item">仅看有货</li>
        <li class="item">分期免息</li>
        <li class="item">优惠商品</li>
      </ul>
      <ul class="row sort">
        <li class="item">排序:</li>
        <li class="item active">综合</li>
        <li class="item">最新</li>
        <li class="item">评论数</li>
        <li class="item">价格</li>
      </ul>
    </div>

    <!-- 商品列表部分 -->
    <ul class="products">
      <li class="item">
        <a href="#">
          <img class="album" src="./img/product_01.webp" alt="">
          <div class="name">HUAWEI MateBook E 12.6英寸</div>
          <div class="discount">预订立省300元|12期免息</div>
          <div class="price">¥6499</div>
          <div class="service">
            <span class="tip">分期免息</span>
            <span class="tip">赠送积分</span>
          </div>
          <div class="comment">
            <span>3190人评论</span>
            <span>96% 好评</span>
          </div>
        </a>
      </li>
      <li class="item">
        <a href="#">
          <img class="album" src="./img/product_01.webp" alt="">
          <div class="name">HUAWEI MateBook E 12.6英寸</div>
          <div class="discount">预订立省300元|12期免息</div>
          <div class="price">¥6499</div>
          <div class="service">
            <span class="tip">分期免息</span>
            <span class="tip">赠送积分</span>
          </div>
          <div class="comment">
            <span>3190人评论</span>
            <span>96% 好评</span>
          </div>
        </a>
      </li>
      <li class="item">
        <a href="#">
          <img class="album" src="./img/product_01.webp" alt="">
          <div class="name">HUAWEI MateBook E 12.6英寸</div>
          <div class="discount">预订立省300元|12期免息</div>
          <div class="price">¥6499</div>
          <div class="service">
            <span class="tip">分期免息</span>
            <span class="tip">赠送积分</span>
          </div>
          <div class="comment">
            <span>3190人评论</span>
            <span>96% 好评</span>
          </div>
        </a>
      </li>
      <li class="item">
        <a href="#">
          <img class="album" src="./img/product_01.webp" alt="">
          <div class="name">HUAWEI MateBook E 12.6英寸</div>
          <div class="discount">预订立省300元|12期免息</div>
          <div class="price">¥6499</div>
          <div class="service">
            <span class="tip">分期免息</span>
            <span class="tip">赠送积分</span>
          </div>
          <div class="comment">
            <span>3190人评论</span>
            <span>96% 好评</span>
          </div>
        </a>
      </li>
    </ul>
  </div>


</body>
</html>

华为商城-动态商品列表的展示

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./css/reset.css">
  <link rel="stylesheet" href="./css/common.css">
  <link rel="stylesheet" href="./css/product.css">
</head>
<body>
  <!-- 商品展示的部分 -->
  <div class="wrapper">
    <!-- 面包屑的导航 -->
    <div class="crumbs">
      <span class="item">首页</span>
      <span>&gt;</span>
      <span class="item">笔记本</span>
    </div>

    <!-- 对内容进行操作 -->
    <div class="operation">
      <ul class="row category">
        <li class="item">分类:</li>
        <li class="item">笔记本</li>
        <li class="item">台式机</li>
        <li class="item">智慧屏</li>
      </ul>
      <ul class="row discount">
        <li class="item">服务优惠:</li>
        <li class="item">仅看有货</li>
        <li class="item">分期免息</li>
        <li class="item">优惠商品</li>
      </ul>
      <ul class="row sort">
        <li class="item">排序:</li>
        <li class="item active">综合</li>
        <li class="item">最新</li>
        <li class="item">评论数</li>
        <li class="item">价格</li>
      </ul>
    </div>

    <!-- 商品列表部分 -->
    <ul class="products">
      <!-- <li class="item">
        <a href="#">
          <img class="album" src="./img/product_01.webp" alt="">
          <div class="name">HUAWEI MateBook E 12.6英寸</div>
          <div class="discount">预订立省300元|12期免息</div>
          <div class="price">¥6499</div>
          <div class="service">
            <span class="tip">分期免息</span>
            <span class="tip">赠送积分</span>
          </div>
          <div class="comment">
            <span>3190人评论</span>
            <span>96% 好评</span>
          </div>
        </a>
      </li> -->
    </ul>
  </div>


  <script src="./json/product_data.js"></script>
  <script>
    // 0.资源服务器的地址
    var serverURL = "https://res.vmallres.com/pimages"

    // 1.动态的展示商品列表
    var productsEl = document.querySelector(".products")
    for (var i = 0; i < resultList.length; i++) {
      // console.log(resultList[i]) // -> item
      // 获取一条数据
      var resultItem = resultList[i]

      // 将一条数据转成界面一个item
      // 1.1. 最外层的item
      var itemEl = document.createElement("li")
      itemEl.classList.add("item")
      productsEl.append(itemEl)

      // 1.2. 创建a元素
      var aEl = document.createElement("a")
      aEl.href = "#"
      itemEl.append(aEl)

      // 1.3. 添加img
      var albumEl = document.createElement("img")
      albumEl.classList.add("album")
      albumEl.src = `${serverURL}${resultItem.photoPath}428_428_${resultItem.photoName}`
      aEl.append(albumEl)

      // 1.4. 创建name
      var nameEl = document.createElement("div")
      nameEl.classList.add("name")
      nameEl.textContent = resultItem.name
      aEl.append(nameEl)

      // 1.5. 创建discount
      var discountEl = document.createElement("div")
      discountEl.classList.add("discount")
      discountEl.textContent = resultItem.promotionInfo
      aEl.append(discountEl)

      // 1.6. 创建price
      var priceEl = document.createElement("div")
      priceEl.classList.add("price")
      priceEl.textContent = "¥" + resultItem.price
      aEl.append(priceEl)

      // 1.7. 创建service
      var serviceEl = document.createElement("div")
      serviceEl.classList.add("service")
      for (var label of resultItem.promoLabels) {
        var tipEl = document.createElement("span")
        tipEl.classList.add("tip")
        tipEl.textContent = label
        serviceEl.append(tipEl)
      }
      aEl.append(serviceEl)

      // 1.8 创建comment
      var commentEl = document.createElement("div")
      commentEl.classList.add("comment")
      var countEl = document.createElement("span")
      countEl.textContent = `${resultItem.rateCount}人评论`
      commentEl.append(countEl)
      var goodEl = document.createElement("span")
      goodEl.textContent = `${resultItem.goodRate}% 好评`
      commentEl.append(goodEl)
      aEl.append(commentEl)
    }

  </script>
</body>
</html>

华为商城-动态商品列表的展示(重构)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./css/reset.css">
  <link rel="stylesheet" href="./css/common.css">
  <link rel="stylesheet" href="./css/product.css">
</head>
<body>
  <!-- 商品展示的部分 -->
  <div class="wrapper">
    <!-- 面包屑的导航 -->
    <div class="crumbs">
      <span class="item">首页</span>
      <span>&gt;</span>
      <span class="item">笔记本</span>
    </div>

    <!-- 对内容进行操作 -->
    <div class="operation">
      <ul class="row category">
        <li class="item">分类:</li>
        <li class="item">笔记本</li>
        <li class="item">台式机</li>
        <li class="item">智慧屏</li>
      </ul>
      <ul class="row discount">
        <li class="item">服务优惠:</li>
        <li class="item">仅看有货</li>
        <li class="item">分期免息</li>
        <li class="item">优惠商品</li>
      </ul>
      <ul class="row sort">
        <li class="item">排序:</li>
        <li class="item active">综合</li>
        <li class="item">最新</li>
        <li class="item">评论数</li>
        <li class="item">价格</li>
      </ul>
    </div>

    <!-- 商品列表部分 -->
    <ul class="products">
    </ul>
  </div>


  <script src="./json/product_data.js"></script>
  <script>
    // 0.资源服务器的地址
    var serverURL = "https://res.vmallres.com/pimages"

    // 1.动态的展示商品列表
    var productsEl = document.querySelector(".products")
    showResultListAction()
    function showResultListAction() {
      for (var i = 0; i < resultList.length; i++) {
      // 获取一条数据
        var resultItem = resultList[i]

        // 将一条数据转成界面一个item
        var itemEl = document.createElement("li")
        itemEl.classList.add("item")

        // item里面的内容
        var serviceString = ""
        for (var label of resultItem.promoLabels) {
          serviceString += `<span class="tip">${label}</span>`
        }

        itemEl.innerHTML = `
          <a href="#">
            <img class="album" src="${serverURL}${resultItem.photoPath}428_428_${resultItem.photoName}" alt="">
            <div class="name">${resultItem.name}</div>
            <div class="discount">${resultItem.promotionInfo}</div>
            <div class="price">¥${resultItem.price}</div>
            <div class="service">
              ${serviceString}
            </div>
            <div class="comment">
              <span>${resultItem.rateCount}人评论</span>
              <span>${resultItem.goodRate}% 好评</span>
            </div>
          </a>
        `
        productsEl.append(itemEl)
      }
    }
  </script>
</body>
</html>

华为商城-服务优惠的点击处理

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./css/reset.css">
  <link rel="stylesheet" href="./css/common.css">
  <link rel="stylesheet" href="./css/product.css">
</head>
<body>
  <!-- 商品展示的部分 -->
  <div class="wrapper">
    <!-- 面包屑的导航 -->
    <div class="crumbs">
      <span class="item">首页</span>
      <span>&gt;</span>
      <span class="item">笔记本</span>
    </div>

    <!-- 对内容进行操作 -->
    <div class="operation">
      <ul class="row category">
        <li class="item">分类:</li>
        <li class="item">笔记本</li>
        <li class="item">台式机</li>
        <li class="item">智慧屏</li>
      </ul>
      <ul class="row discount">
        <li class="item">服务优惠:</li>
        <li class="item">仅看有货</li>
        <li class="item">分期免息</li>
        <li class="item">优惠商品</li>
      </ul>
      <ul class="row sort">
        <li class="item">排序:</li>
        <li class="item active">综合</li>
        <li class="item">最新</li>
        <li class="item">评论数</li>
        <li class="item">价格</li>
      </ul>
    </div>

    <!-- 商品列表部分 -->
    <ul class="products">
    </ul>
  </div>


  <script src="./json/product_data.js"></script>
  <script>
    // 0.资源服务器的地址
    var serverURL = "https://res.vmallres.com/pimages"

    // 1.动态的展示商品列表
    var productsEl = document.querySelector(".products")
    for (var i = 0; i < resultList.length; i++) {
      // 获取一条数据
      var resultItem = resultList[i]

      // 将一条数据转成界面一个item
      var itemEl = document.createElement("li")
      itemEl.classList.add("item")

      // item里面的内容
      var serviceString = ""
      for (var label of resultItem.promoLabels) {
        serviceString += `<span class="tip">${label}</span>`
      }

      itemEl.innerHTML = `
        <a href="#">
          <img class="album" src="${serverURL}${resultItem.photoPath}428_428_${resultItem.photoName}" alt="">
          <div class="name">${resultItem.name}</div>
          <div class="discount">${resultItem.promotionInfo}</div>
          <div class="price">¥${resultItem.price}</div>
          <div class="service">
            ${serviceString}
          </div>
          <div class="comment">
            <span>${resultItem.rateCount}人评论</span>
            <span>${resultItem.goodRate}% 好评</span>
          </div>
        </a>
      `
      productsEl.append(itemEl)
    }
    
    // 2.服务优惠的赛选
    var operationEl = document.querySelector(".operation")
    var discountEl = operationEl.querySelector(".discount")
    // 定义变量, 用户记录选中的服务
    var discountFilters = []
    for (var i = 1; i < discountEl.children.length; i++) {
      // 获取对应的discountItemEl
      var discountItemEl = discountEl.children[i]

      // 监听discountItemEl
      discountItemEl.onclick = function() {
        // 在active和非active切换
        this.classList.toggle("active")

        // 判断是否将关键字添加或者从discountFilters移除掉
        if (this.classList.contains("active")) {
          discountFilters.push(this.textContent.trim())
        } else {
          var filterItem = this.textContent.trim()
          var filterIndex = discountFilters.findIndex(function(item) {
            return item === filterItem
          })
          discountFilters.splice(filterIndex, 1)
        }
        console.log(discountFilters)
      }
    }

  </script>
</body>
</html>

华为商城-服务优惠的点击过滤展示

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./css/reset.css">
  <link rel="stylesheet" href="./css/common.css">
  <link rel="stylesheet" href="./css/product.css">
</head>
<body>
  <!-- 商品展示的部分 -->
  <div class="wrapper">
    <!-- 面包屑的导航 -->
    <div class="crumbs">
      <span class="item">首页</span>
      <span>&gt;</span>
      <span class="item">笔记本</span>
    </div>

    <!-- 对内容进行操作 -->
    <div class="operation">
      <ul class="row category">
        <li class="item">分类:</li>
        <li class="item">笔记本</li>
        <li class="item">台式机</li>
        <li class="item">智慧屏</li>
      </ul>
      <ul class="row discount">
        <li class="item">服务优惠:</li>
        <li class="item">仅看有货</li>
        <li class="item">分期免息</li>
        <li class="item">优惠商品</li>
      </ul>
      <ul class="row sort">
        <li class="item">排序:</li>
        <li class="item active">综合</li>
        <li class="item">最新</li>
        <li class="item">评论数</li>
        <li class="item">价格</li>
      </ul>
    </div>

    <!-- 商品列表部分 -->
    <ul class="products">
    </ul>
  </div>


  <script src="./json/product_data.js"></script>
  <script src="./js/utils.js"></script>
  <script>
    /*
      1.获取服务优惠中的item
      2.监听item的点击
        * 切换active
      3.根据item的点击获取filterItem
        * 将其放在一个数组中
      4.根据最新的filter, 过滤数据
        * filterResultListAction
      5.根据过滤的最新数据进行展示
        * showResultListAction
    */

    // 0.资源服务器的地址
    var serverURL = "https://res.vmallres.com/pimages"

    // 1.动态的展示商品列表
    var productsEl = document.querySelector(".products")
    
    
    // 2.服务优惠的赛选
    var operationEl = document.querySelector(".operation")
    var discountEl = operationEl.querySelector(".discount")
    // 定义变量, 用户记录选中的服务
    var discountFilters = []
    for (var i = 1; i < discountEl.children.length; i++) {
      // 获取对应的discountItemEl
      var discountItemEl = discountEl.children[i]

      // 监听discountItemEl
      discountItemEl.onclick = function() {
        // 在active和非active切换
        this.classList.toggle("active")

        // 判断是否将关键字添加或者从discountFilters移除掉
        if (this.classList.contains("active")) {
          discountFilters.push(this.textContent.trim())
        } else {
          var filterItem = this.textContent.trim()
          var filterIndex = discountFilters.findIndex(function(item) {
            return item === filterItem
          })
          discountFilters.splice(filterIndex, 1)
        }

        // 过滤resultList
        filterResultListAction()
      }
    }


    // 封装函数: 过滤resultList数据
    var showResultList = resultList
    function filterResultListAction() {
      // 1.过滤数据
      showResultList = resultList.filter(function(item) {
        var isFlag = true
        for (var filterItem of discountFilters) {
          if (!item.services.includes(filterItem)) {
            isFlag = false
            break
          }
        }
        return isFlag
      })

      // 2.重新展示数据
      showResultListAction()
    }

    // 封装函数: 通过for循环, 展示数据
    showResultListAction()
    function showResultListAction() {
      productsEl.innerHTML = ""
      for (var i = 0; i < showResultList.length; i++) {
        // 获取一条数据
        var resultItem = showResultList[i]

        // 将一条数据转成界面一个item
        var itemEl = document.createElement("li")
        itemEl.classList.add("item")

        // item里面的内容
        var serviceString = ""
        for (var label of resultItem.promoLabels) {
          serviceString += `<span class="tip">${label}</span>`
        }

        itemEl.innerHTML = `
          <a href="#">
            <img class="album" src="${serverURL}${resultItem.photoPath}428_428_${resultItem.photoName}" alt="">
            <div class="name">${resultItem.name}</div>
            <div class="discount">${resultItem.promotionInfo}</div>
            <div class="price">¥${resultItem.price}</div>
            <div class="service">
              ${serviceString}
            </div>
            <div class="comment">
              <span>${resultItem.rateCount}人评论</span>
              <span>${resultItem.goodRate}% 好评</span>
            </div>
          </a>
        `
        productsEl.append(itemEl)
      }

      // 添加空的item
      addProductsEmptyItem()
    }
  </script>
</body>
</html>

华为商城-轮播图界面基本搭建

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./css/reset.css">
  <link rel="stylesheet" href="./css/common.css">
  <style>
    .banner .images {
      position: relative;
    }

    .banner .images .item {
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      overflow: hidden;

      opacity: 0;
    }

    .banner .images .item.active {
      opacity: 1;
    }

    .banner .images .item img {
      position: relative;
      transform: translate(-50%);
      left: 50%;
      width: 1920px;
      height: 550px;
    }
  </style>
</head>
<body>
  
  <div class="banner">
    <ul class="images">
    </ul>
    <div class="control">
      <button>上一个</button>
      <button>下一个</button>
    </div>
    <div class="indicator"></div>
  </div>

  <script src="./json/banner_data.js"></script>
  <script>
    // 0.banner的serverURL
    var bannerServerURL = "https://res.vmallres.com/"

    // 1.动态添加轮播图图片数据
    var imagesEl = document.querySelector(".images")
    var activeItemEl = null
    for (var i = 0; i < banners.length; i++) {
      // 获取数据
      var banner = banners[i]

      // 创建li元素
      var itemEl = document.createElement("li")
      itemEl.classList.add("item")
      if (i === 0) {
        itemEl.classList.add("active")
        activeItemEl = itemEl
      }
      imagesEl.append(itemEl)

      // 创建img元素
      var imgEl = document.createElement("img")
      imgEl.src = `${bannerServerURL}${banner.imgUrl}`
      itemEl.append(imgEl)
    }

  </script>

</body>
</html>

华为商城-李轮播图的自动轮播效果

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./css/reset.css">
  <link rel="stylesheet" href="./css/common.css">
  <style>
    .banner .images {
      position: relative;
      height: 550px;
    }

    .banner .images .item {
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      overflow: hidden;

      opacity: 0;
      transition: opacity 1000ms ease;
    }

    .banner .images .item.active {
      opacity: 1;
    }

    .banner .images .item img {
      position: relative;
      transform: translate(-50%);
      left: 50%;
      width: 1920px;
      height: 550px;
    }
  </style>
</head>
<body>
  
  <div class="banner">
    <ul class="images">
    </ul>
    <div class="control">
      <button class="prev">上一个</button>
      <button class="next">下一个</button>
    </div>
    <div class="indicator"></div>
  </div>

  <script src="./json/banner_data.js"></script>
  <script>
    var bannersCount = banners.length

    // 0.banner的serverURL
    var bannerServerURL = "https://res.vmallres.com/"

    // 1.动态添加轮播图图片数据
    var imagesEl = document.querySelector(".images")
    var activeItemEl = null
    for (var i = 0; i < banners.length; i++) {
      // 获取数据
      var banner = banners[i]

      // 创建li元素
      var itemEl = document.createElement("li")
      itemEl.classList.add("item")
      if (i === 0) {
        itemEl.classList.add("active")
        activeItemEl = itemEl
      }
      imagesEl.append(itemEl)

      // 创建img元素
      var imgEl = document.createElement("img")
      imgEl.src = `${bannerServerURL}${banner.imgUrl}`
      itemEl.append(imgEl)
    }

    // 2.监听按钮的点击
    var previousIndex = 0
    var currentIndex = 0
    var controlEl = document.querySelector(".control")
    var prevBtnEl = controlEl.querySelector(".prev")
    var nextBtnEl = controlEl.querySelector(".next")
    prevBtnEl.onclick = function() {
      // 找到上一个
      previousIndex = currentIndex
      currentIndex--
      if (currentIndex === -1) {
        currentIndex = bannersCount - 1
      }

      // 让currentIndex变成active状态, 让previous变成普通的状态
      switchBannerItem()
    }
    nextBtnEl.onclick = function() {
      nextSwitch()
    }

    // 3.自动轮播效果
    var timer = null
    startTimer()

    // 4.暂停自动轮播
    imagesEl.onmouseenter = function() {
      console.log("------onmouseenter")
      stopTimer()
    }
    imagesEl.onmouseleave = function() {
      startTimer()
    }

    // 对功能封装的函数
    // 封装到函数: switchBannerItem
    function switchBannerItem() {
      var currentItemEl = imagesEl.children[currentIndex]
      var previousItemEl = imagesEl.children[previousIndex]
      previousItemEl.classList.remove("active")
      currentItemEl.classList.add("active")
    }

    // 封装到函数: 播放下一个
    function nextSwitch() {
      // 找到下一个
      previousIndex = currentIndex
      currentIndex++
      if (currentIndex === bannersCount) {
        currentIndex = 0
      }

      // 让currentIndex变成active状态, 让previous变成普通的状态
      switchBannerItem()
    }

    // 封装到函数: 开启定时器
    function startTimer() {
      timer = setInterval(function() {
        nextSwitch()
      }, 3000);
    }
    function stopTimer() {
      console.log("timer:", timer)
      clearInterval(timer)
    }
  </script>

</body>
</html>

商品列表-服务优惠-排序

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./css/reset.css">
  <link rel="stylesheet" href="./css/common.css">
  <link rel="stylesheet" href="./css/product.css">
</head>
<body>
  <!-- 商品展示的部分 -->
  <div class="wrapper">
    <!-- 面包屑的导航 -->
    <div class="crumbs">
      <span class="item">首页</span>
      <span>&gt;</span>
      <span class="item">笔记本</span>
    </div>

    <!-- 对内容进行操作 -->
    <div class="operation">
      <ul class="row category">
        <li class="item">分类:</li>
        <li class="item">笔记本</li>
        <li class="item">台式机</li>
        <li class="item">智慧屏</li>
      </ul>
      <ul class="row discount">
        <li class="item">服务优惠:</li>
        <li class="item">仅看有货</li>
        <li class="item">分期免息</li>
        <li class="item">优惠商品</li>
      </ul>
      <ul class="row sort">
        <li class="item">排序:</li>
        <li class="item active" data-key="default">综合</li>
        <li class="item" data-key="goodRate">好评</li>
        <li class="item" data-key="rateCount">评论数</li>
        <li class="item" data-key="price">价格</li>
      </ul>
    </div>

    <!-- 商品列表部分 -->
    <ul class="products">
    </ul>
  </div>


  <script src="./json/product_data.js"></script>
  <script src="./js/utils.js"></script>
  <script>
    /*
      1.监听排序item的点击
      2.排他效果
       * 点击item的active
       * 之前的item取消active
      3.获取点击的信息(比如评论数/好评/价格)
      4.根据点击信息, 对数据进行排序
       * default情况
       * 有key的情况
       * 特别注意: 不能修改源数组
      5.根据排序之后的数据, 重新展示页面
    */

    // 0.资源服务器的地址
    var serverURL = "https://res.vmallres.com/pimages"

    // 1.动态的展示商品列表
    var productsEl = document.querySelector(".products")
    
    
    // 2.服务优惠的赛选
    var operationEl = document.querySelector(".operation")
    var discountEl = operationEl.querySelector(".discount")
    // 定义变量, 用户记录选中的服务
    var discountFilters = []
    for (var i = 1; i < discountEl.children.length; i++) {
      // 获取对应的discountItemEl
      var discountItemEl = discountEl.children[i]

      // 监听discountItemEl
      discountItemEl.onclick = function() {
        // 在active和非active切换
        this.classList.toggle("active")

        // 判断是否将关键字添加或者从discountFilters移除掉
        if (this.classList.contains("active")) {
          discountFilters.push(this.textContent.trim())
        } else {
          var filterItem = this.textContent.trim()
          var filterIndex = discountFilters.findIndex(function(item) {
            return item === filterItem
          })
          discountFilters.splice(filterIndex, 1)
        }

        // 过滤resultList
        filterResultListAction()
      }
    }

    // 3.监听排序功能
    var sortEl = document.querySelector(".sort")
    var activeItemEl = sortEl.querySelector(".active")
    // var sortKeys = ["default", "goodRate", "rateCount", "price"]
    for (var i = 1; i < sortEl.children.length; i++) {
      var sortItemEl = sortEl.children[i]
      sortItemEl.index = i

      sortItemEl.onclick = function() {
        // 1.取消之前的, 添加新的active
        activeItemEl.classList.remove("active")
        this.classList.add("active")
        activeItemEl = this

        // 2.获取信息
        var sortKey = this.dataset.key

        // 3.根据key, 对数据进行排序
        sortResultListAction(sortKey)
      }
    }


    // 封装函数: 过滤resultList数据
    var showResultList = [].concat(resultList)
    function filterResultListAction() {
      // 1.过滤数据
      showResultList = resultList.filter(function(item) {
        var isFlag = true
        for (var filterItem of discountFilters) {
          if (!item.services.includes(filterItem)) {
            isFlag = false
            break
          }
        }
        return isFlag
      })

      // 2.重新展示数据
      showResultListAction()
    }

    // 封装函数: 通过for循环, 展示数据
    showResultListAction()
    function showResultListAction() {
      productsEl.innerHTML = ""
      for (var i = 0; i < showResultList.length; i++) {
        // 获取一条数据
        var resultItem = showResultList[i]

        // 将一条数据转成界面一个item
        var itemEl = document.createElement("li")
        itemEl.classList.add("item")

        // item里面的内容
        var serviceString = ""
        for (var label of resultItem.promoLabels) {
          serviceString += `<span class="tip">${label}</span>`
        }

        itemEl.innerHTML = `
          <a href="#">
            <img class="album" src="${serverURL}${resultItem.photoPath}428_428_${resultItem.photoName}" alt="">
            <div class="name">${resultItem.name}</div>
            <div class="discount">${resultItem.promotionInfo}</div>
            <div class="price">¥${resultItem.price}</div>
            <div class="service">
              ${serviceString}
            </div>
            <div class="comment">
              <span>${resultItem.rateCount}人评论</span>
              <span>${resultItem.goodRate}% 好评</span>
            </div>
          </a>
        `
        productsEl.append(itemEl)
      }

      // 添加空的item
      addProductsEmptyItem()
    }
  
    // 封装函数: 通过key进行排序
    function sortResultListAction(key) {
      if (key === "default") {
        filterResultListAction()
      } else {
        showResultList.sort(function(item1, item2) {
          return item2[key] - item1[key]
        })
      }
      
      showResultListAction()
    }
  </script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2330647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【蓝桥杯】十五届省赛B组c++

目录 前言 握手问题 分析 排列组合写法 枚举 小球反弹 分析 代码 好数 分析 代码 R 格式 分析 代码 宝石组合 分析 代码 数字接龙 分析 代码 拔河 分析 代码 总结 前言 主播这两天做了一套蓝桥杯的省赛题目&#xff08;切实感受到了自己有多菜&#x…

[Linux系统编程]多线程

多线程 1. 线程1.1 线程的概念1.2 进程与线程对比1.3 轻量级进程 2. Linux线程控制2.1 POSIX 线程&#xff08;pthread&#xff09;2.2 线程ID、pthread_t、和进程地址空间的关系2.2.1 pthread_self2.2.2 pthread_create2.2.3 pthread_join2.2.4 线程终止的三种方式2.2.5 pthre…

IntelliJ IDEA下开发FPGA——FPGA开发体验提升__下

前言 由于Quartus写代码比较费劲&#xff0c;虽然新版已经有了代码补全&#xff0c;但体验上还有所欠缺。于是使用VS Code开发&#xff0c;效果如下所示&#xff0c;代码样式和基本的代码补全已经可以满足开发&#xff0c;其余工作则交由Quartus完成 但VS Code的自带的git功能&…

odo18实施——销售-仓库-采购-制造-制造外包-整个流程自动化单据功能的演示教程

安装模块 安装销售 、库存、采购、制造模块 2.开启外包功能 在进入制造应用点击 配置—>设置 勾选外包&#xff0c;点击保存 添加信息 一、添加客户信息 点击到销售应用 点击订单—>客户 点击新建 创建客户1&#xff0c;及其他客户相关信息&#xff0c;点…

微信小程序生成某个具体页面的二维码

微信小程序&#xff0c;如果要生成某个具体页面&#xff0c;而非首页的二维码&#xff0c;体验和正式的生成方法如下&#xff1a; 1、体验版二维码&#xff1a; 管理---版本管理---修改页面路径&#xff0c;输入具体页面的路径以及参数&#xff0c;生成的是二维码 2、正式小程…

鸿蒙开发_ARKTS快速入门_语法说明_组件声明_组件手册查看---纯血鸿蒙HarmonyOS5.0工作笔记010

然后我们来看如何使用组件 可以看到组件的组成 可以看到我们使用的组件 然后看一下组件的语法.组件中可以使用子组件. 然后组件中可以有参数,来修改组件的样式等 可以看到{},这种方式可以设置组件参数,当然在下面. 的方式也可以的 然后再来

接口异常数组基础题

题目描述 设想你正在构建一个智能家居控制系统。这个系统可以连接多种不同类型的智能设备&#xff0c;如智能灯泡、智能空调和智能门锁。每种设备都有其独特的功能&#xff0c;不过它们也有一些通用的操作&#xff0c;像开启、关闭和获取设备状态等。系统需要提供一个方法来控…

rustdesk折腾手记

背景 我的工作环境&#xff1a;主力电脑是macPro, 另外一台ThinkPad W530作为开发机&#xff0c;装的是LinuxMint&#xff0c;还有一台ThinkPad P15作为服务器。平常显示器接到macPro&#xff0c;在macOS上通过微软的远程桌面连接到另外两台Linux。基本访问比较流畅&#xff0…

使用el-tab 实现两个tab切换

1、主页面 index.vue 2、tab1&#xff1a;school.vue 3、tab2&#xff1a;parent.vue 具体代码如下&#xff1a; <template><div class"app-container"><!-- 使用el-tabs 实现两个组件的切换 --><el-tabs v-model"activeName" typ…

使用Pholcus编写Go爬虫示例

想用Pholcus库来写一个Go的爬虫程序。首先&#xff0c;我得确认Pholcus的当前状态&#xff0c;因为之前听说过它可能已经不再维护了。不过用户可能还是需要基于这个库的示例&#xff0c;所以得先提供一个基本的框架。 首先&#xff0c;我应该回忆一下Pholcus的基本用法。Pholc…

单片机实现触摸按钮执行自定义任务组件

触摸按钮执行自定义任务组件 项目简介 本项目基于RT8H8K001开发板 RT6809CNN01开发板 TFT显示屏(1024x600) GT911触摸屏实现了一个多功能触摸按钮组件。系统具备按钮控制后执行任务的功能&#xff0c;可用于各类触摸屏人机交互场景。 硬件平台 MCU: STC8H8K64U&#xff0…

Ai云防护技术解析——服务器数据安全的智能防御体系

本文深度解析AI云防护技术如何通过智能流量分析、动态行为建模、自适应防御策略构建服务器安全体系。结合2023年群联科技实战案例,揭示机器学习算法在识别新型DDoS攻击、加密流量检测、零日漏洞防御中的技术突破,并附Gartner最新防护效果验证数据。 AI驱动的流量特征建模技术…

JSONP跨域访问漏洞

一、漏洞一:利用回调GetCookie <?php$conn new mysqli(127.0.0.1,root,root,learn) or die("数据库连接不成功"); $conn->set_charset(utf8); $sql "select articleid,author,viewcount,creattime from learn3 where articleid < 5"; $result…

图形裁剪算法

1.学习目标 理解区域编码(Region Code&#xff0c;RC) 设计Cohen-Sutherland直线裁剪算法 编程实现Cohen-Sutherland直线裁剪算法 2.具体代码 1.具体算法 /*** Cohen-Sutherland直线裁剪算法 - 优化版* author AI Assistant* license MIT*/// 区域编码常量 - 使用对象枚举…

R 语言科研绘图第 36 期 --- 饼状图-基础

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

vue 3 从零开始到掌握

vue3从零开始一篇文章带你学习 升级vue CLI 使用命令 ## 查看vue/cli版本&#xff0c;确保vue/cli版本在4.5.0以上 vue --version ## 安装或者升级你的vue/cli npm install -g vue/cli ## 创建 vue create vue_test ## 启动 cd vue_test npm run servenvm管理node版本&#…

【R语言绘图】圈图绘制代码

绘制代码 rm(list ls())# 加载必要包 library(data.table) library(circlize) library(ComplexHeatmap) library(rtracklayer) library(GenomicRanges) library(BSgenome) library(GenomicFeatures) library(dplyr)### 数据准备阶段 ### # 1. 读取染色体长度信息 df <- re…

Python爬虫第6节-requests库的基本用法

目录 前言 一、准备工作 二、实例引入 三、GET请求 3.1 基本示例 3.2 抓取网页 3.3 抓取二进制数据 3.4 添加headers 四、POST请求 五、响应 前言 前面我们学习了urllib的基础使用方法。不过&#xff0c;urllib在实际应用中存在一些不便之处。以网页验证和Cookies处理…

什么是可靠性工程师?

一、什么是可靠性工程师&#xff1f; 可靠性工程师就是负责确保产品在使用过程中不出故障、不给客户添麻烦。 你可以理解为是那种“挑毛病的人”&#xff0c;但不是事后挑&#xff0c;是提前想清楚产品在哪些情况下可能会出问题&#xff0c;然后解决掉。 比如&#xff1a; …

如何根据设计稿进行移动端适配:全面详解

如何根据设计稿进行移动端适配&#xff1a;全面详解 文章目录 如何根据设计稿进行移动端适配&#xff1a;全面详解1. **理解设计稿**1.1 设计稿的尺寸1.2 设计稿的单位 2. **移动端适配的核心技术**2.1 使用 viewport 元标签2.1.1 代码示例2.1.2 参数说明 2.2 使用相对单位2.2.…