天天看点

二级渲染菜单

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    ul, ol, li {
      list-style: none;
    }

    ul {
      width: 100%;
      height: 60px;
      text-align: center;
      overflow: hidden;
    }

    ul > li {
      float: left;
      line-height: 60px;
      width: 200px;
      cursor: pointer;
      background-color: orange;
      font-size: 30px;
    }

    div {
      width: 100%;
      height: 230px;
      border-top: 1px solid #333;
      border-bottom: 1px solid #333;
    }

    div > ol {
      width: 1226px;
      height: 100%;
      margin: 0 auto;
      overflow: hidden;
    }

    div > ol > li {
      width: calc(100% / 6);
      float: left;
      height: 100%;
      background-color: #fff;
    }

  </style>
</head>
<body>

  <ul class="nav"></ul>

  <div>
    <ol class="goodsBox"></ol>
  </div>

  <script src="./data.js"></script>
  <script>
    /*
      二级菜单渲染

      分析数据结构
        + 类似于 data.js 的多维数组结构

      代码实现:
        1. 获取元素
          => .nav : 承载标题的
          => .goodsBox : 放二级菜单的商品盒子
        2. 根据数组渲染标题
          => 循环遍历数组, 根据数组的成员创建 li 标签
          => 添加倒 ul 里面
        3. 给每一个一级标题添加一个鼠标移入事件
          => 因为使用的是创建节点的方式
          => 创建的时候直接添加
          方案2:
            => 单独获取所有的 li
            => 但是一定要在插入页面以后再获取
        4. 根据移入的不同渲染不同的二级菜单
          => 移入哪一个 li ? this
          => 我移入的这个 li 对应的数据是谁 ?
            -> 再渲染页面的时候, 把 id 当作一个自定义属性放在元素身上
          => 再移入事件里面, 获取倒当前移入这个元素的 data-id 属性
          => 去数组里面找到数据
        5. 用我们找到的二级数据列表来渲染页面
          => 拼接字符串的方式渲染
    */

    // 1. 获取元素
    var nav = document.querySelector('.nav')
    var goodsBox = document.querySelector('.goodsBox')

    // 2. 根据数组渲染标题
    // 准备一个文档碎片
    var frg = document.createDocumentFragment()
    dataList.forEach(function (item) {
      // 创建 li
      var li = document.createElement('li')
      // 向 li 里面添加一些内容
      li.innerHTML = item.name
      // 4-1. 添加一个数据 id 再元素身上
      li.dataset.id = item.id
      // 把 li 放在筐里
      frg.appendChild(li)
    })
    // 循环结束以后, 把 frg 的内容放在 ul 里面
    nav.appendChild(frg)


    // 3. 给每一个一级标题绑定一个鼠标移入事件
    var lis = nav.querySelectorAll('li')
    lis.forEach(function (item) {
      item.onmouseover = function () {
        // 4-2. 拿到元素身上记录的 data-id 属性
        var id = this.dataset.id - 0
        // 4-3. 去数组里面找东西
        // console.log(dataList)
        // 数组常用方法 filter
        // var secondList = dataList.filter(function (item) { return item.id === id })[0]
        // console.log(secondList)
        // 数组常用方法 find
        var secondList = dataList.find(function (item) { return item.id === id }).list
        // console.log(secondList)

        // 5. 拼接字符串的方式来渲染页面
        var str = ''
        secondList.forEach(function (item) {
          str += `
            <li>
              <img src="${ item.list_url }" alt="">
              <p>${ item.list_name }</p>
              <p>¥${ item.list_price.toFixed(2) }</p>
            </li>
          `
        })
        // 插入倒 ol 里面
        goodsBox.innerHTML = str
      }
    })
  </script>
</body>
</html>
           

继续阅读