jQuery制作商场项目的楼梯层

完整代码

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8" />
  <title></title>
  <style type="text/css">
    * {
      margin: 0;
      padding: 0;
    }

    #LoutiNav {
      position: fixed;
      top: 25%;
      left: 40px;
      width: 30px;
      border: 1px solid;
    }

    #LoutiNav ul li {
      position: relative;
      width: 30px;
      height: 30px;
      list-style: none;
      text-align: center;
      line-height: 30px;
      font-size: 12px;
      cursor: pointer;
      border-bottom: 1px dotted #AAAAAA;
    }

    #LoutiNav ul li.last {
      background: darkred;
      color: white;
      border-bottom: none;
    }

    #LoutiNav ul li span {
      display: none;
      width: 30px;
      height: 30px;
      position: absolute;
      top: 0;
      left: 0;
      color: red;
    }

    #LoutiNav ul li:hover span {
      display: block;
      background: darkred;
      color: white;
    }

    #LoutiNav ul li span.active {
      display: block;
      background: white;
      color: red;
    }

    #LoutiNav ul li:hover span.active {
      display: block;
      background: darkred;
      color: white;
    }

    #header,
    #main,
    #footer {
      margin: auto;
      width: 1000px;
      text-align: center;
      font-size: 40px;
      font-weight: bold;
      line-height: 500px;
    }

    #main div {
      height: 700px;
      font-size: 50px;
      color: honeydew;
      line-height: 700px;
    }

    #header {
      height: 500px;
      background: darkcyan;
    }

    #footer {
      height: 500px;
      background: darkcyan;
    }
  </style>
  <script type="text/javascript" src="./jquery.js"></script>
</head>

<body><!--左侧设置楼梯-->
  <div id="LoutiNav">
    <ul><!--设置每一层楼梯路面的内容-->
      <li>1F <span>服饰</span> </li>
      <li>2F <span>美妆</span> </li>
      <li>3F <span>手机</span> </li>
      <li>4F <span>家电</span> </li>
      <li>5F <span>数码</span> </li>
      <li>6F <span>运动</span> </li>
      <li>7F <span>居家</span> </li>
      <li>8F <span>母婴</span> </li>
      <li>9F <span>食品</span> </li>
      <li>10F <span>图书</span> </li>
      <li>11F <span>服务</span> </li>
      <li class="last">Top</li>
    </ul>
  </div><!--楼层内容开始-->
  <div id="header">头部</div>
  <div id="main"><!--各楼层内容-->
    <div class="Louti" style="background: #cc0033;">服饰</div>
    <div class="Louti" style="background: #999933;">美妆</div>
    <div class="Louti" style="background: #ccff33;">手机</div>
    <div class="Louti" style="background: #006633;">家电</div>
    <div class="Louti" style="background: #6666cc;">数码</div>
    <div class="Louti" style="background: #ff6600;">运动</div>
    <div class="Louti" style="background: #ffcc00;">居家</div>
    <div class="Louti" style="background: #3333ff;">母婴</div>
    <div class="Louti" style="background: #ff00cc;">食品</div>
    <div class="Louti" style="background: #669900;">图书</div>
    <div class="Louti" style="background: #ff66cc;">服务</div>
  </div>
  <div id="footer">尾部</div><!--楼层内容结束-->
</body>

</html>
<script type="text/javascript">
  //使用jq获取各个元素
  let $list = $("#LoutiNav li:not(.last)");//楼层号,排除.last的li
  let $topLi = $(".last");//回调顶部
  let $floorDiv = $(".Louti");//楼层
  let flag = true;//假设值为true时  滚动条可以被操作
  $list.click(function () {//给楼梯设置点击事件
    flag = false;//点击时,滚动条不可以被操作

    //使用jq改变当前的li的样式
    $(this).find("span").addClass("active")//给当前所有li下面的span的标签增加样式
      .end().siblings().find("span").removeClass("active");//给其余所有li下面的span标签删除样式
    //获取当前操作的楼层号的下标
    let index = $(this).index();
    //根据下标获取对应的楼层
    let $floor = $floorDiv.eq(index);
    //获取该楼层相对于body的距离
    let bTop = $floor.offset().top;
    //设置页面滚走的距离 为 bTop
    $("body,html").animate({ scrollTop: bTop }, 1000, function () {
      flag = true;
    });

  })

  //回到顶部功能
  $topLi.click(function () {
    flag = false;
    $("body,html").animate({ scrollTop: 0 }, 1000, function () {
      flag = true;
    });
  })
  //操作滚动条显示对应的楼层号
  $(window).scroll(function () {
    if (flag) {
      //获取页面滚走的距离
      let sTop = $(document).scrollTop();
      //使用filter遍历每一个楼层 并返回满足某个条件的楼层
      // 条件: 某个楼层距离body的top值 - 页面滚走的距离 < 楼层高度/2
      let $fDiv = $floorDiv.filter(function (index) {
        return Math.abs($(this).offset().top - sTop) < $(this).height() / 2;
      })
      //获取当前在可视区中高度最高的楼层的下标
      let index = $fDiv.index();
      console.log(index)
      if (index != -1) {
        //根据下标找到对应要高亮显示的楼层号
        $list.eq(index).find("span").addClass("active").end().siblings().find("span").removeClass("active");
      }
      if (sTop < 100 || sTop > ($floorDiv.eq(10).offset().top + 300)) {
        $list.find("span").removeClass("active");
      }
    }
  })</script>

效果如下:
在这里插入图片描述
但目前里边有一些小bug(但不影响整体功能),一直点击楼梯层时,之前的效果并没有清除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值