移动端样式小技巧(4)——模拟滚动

模拟滚动也是在项目中遇到的常见布局。布局要求弹层出来后,弹层中的内容可以滚动,弹层背后的列表不能随弹层滚动而滚动。并且在弹层上滑动的时候,整个页面也不能随之滚动。

经过前几步的练习,以下是我做的小demo。

先贴图:

图一
模拟滚动(0)

图二

模拟滚动(1)

html:
<div class="father">
    <!--页面内容、蒙层、蒙层中的内容互为兄弟节点,防止点击时页面穿透-->
    <section class="content-body">
      <ul>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
        <li class="item">
          <div class="left-container">
            <p class="top-container">
              <span class="top-word">跟团游</span>
              <span class="triangle"></span>
            </p>
            <img class="pic" src="img/scenic.jpg" alt="">
            <p class="bottom-word">
              上海出发世纪东方卡就是看到雷锋
            </p>
          </div>
        </li>
      </ul>
    </section>
    <!--页面内容、蒙层、蒙层中的内容互为兄弟节点,防止点击时页面穿透-->
    <section class="layout" style="display:none;">
    </section>
    <!--页面内容、蒙层、蒙层中的内容互为兄弟节点,防止点击时页面穿透-->
    <section class="layout-body" style="display:none;">
      <ul class="area">
        <li class="area-all">
          <span>全部</span>
        </li>
        <li class="area-item">
          <span>北京</span>
        </li>
        <li class="area-item">
          <span>上海</span>
        </li>
        <li class="area-item">
          <span>广州</span>
        </li>
        <li class="area-item">
          <span>深圳</span>
        </li>
        <li class="area-item">
          <span>成都</span>
        </li>
        <li class="area-item">
          <span>武汉</span>
        </li>
        <li class="area-item">
          <span>四川</span>
        </li>
        <li class="area-item">
          <span>江西</span>
        </li>
        <li class="area-item">
          <span>河南</span>
        </li>
        <li class="area-item">
          <span>贵州</span>
        </li>
      </ul>
    </section>
  </div>
css:
body,
  p,
  ul,
  li {
    padding: 0;
    margin: 0;
  }

  * {
    box-sizing: border-box;
  }
  /*item的样式*/

  .item {
    padding: 0 10px;
  }

  .left-container {
    position: relative;
    display: flex;
    flex-direction: column;
    width: 140px;
  }

  .item::after {
    content: '';
    display: block;
    margin-top: 5px;
    width: 100%;
    height: 0;
    border-top: 1px solid #999;
  }

  .pic {
    display: block;
    width: 100%;
    height: auto;
  }

  .top-container {
    position: absolute;
    left: 0;
    top: 0;
    z-index: 999;
    display: flex;
    height: 20px;
    /*font-size: 0;原本是为了解决间隙问题;因为有了display: flex;这个就不需要了;*/
    overflow: hidden;
  }

  .top-word {
    height: 20px;
    line-height: 20px;
    padding-left: 10px;
    overflow: hidden;
    background-color: #ff0;
    font-size: 10px;
    text-align: center;
    -webkit-line-clamp: 1;
    white-space: nowrap;
    text-overflow: ellipsis;
  }

  .triangle {
    display: inline-block;
    /* 控制宽高为0,用border宽度撑出一个三角形 */
    width: 0;
    height: 0;
    border-left: 8px solid #ff0;
    border-top: 20px solid #ff0;
    border-right: 8px solid transparent;
    border-bottom: 20px solid transparent;
  }

  .bottom-word {
    overflow: hidden;
    width: 100%;
    font-size: 10px;
    background-color: #999;
    padding: 10px 0;
    text-align: center;
    -webkit-line-clamp: 1;
    white-space: nowrap;
    text-overflow: ellipsis;
  }
  /*这次demo的重点,蒙层*/

  .father {
    width: 100%;
    height: 100%;
    /* 页面高度设置为屏幕高度,正常情况下超出滚动 */
    overflow-y: scroll;
  }

  .content-body {
    width: 100%;
    height: 100%;
    /* 内容高度设置为屏幕高度,正常情况下超出滚动 */
    overflow-y: scroll;
    /*一定要加下面的2个属性,否则蒙层出现,这个content-body还是能滚动*/
    position: absolute;
    z-index: 10;
  }

  .layout {
    height: 100%;
    width: 100%;
    position: fixed;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    background: rgba(0, 0, 0, 0.7);
    overflow: hidden;
    z-index: 1000000;
  }

  .layout-body {
    height: 46%;
    width: 100%;
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    background: rgba(255, 255, 255, 1);
    overflow: scroll;
    z-index: 1000001;
  }

  .area-all {
    font-size: 30px;
    color: #f00;
    text-align: center;
  }

  .area-item {
    padding: 10px;
    font-size: 26px;
    line-height: 30px;
    text-align: center;
  }

  .area-all:hover,
  .area-item:hover {
    background-color: #999;
    color: #fff;
  }

>
这个方法虽然实现了页面模拟滚动的效果,但是当蒙层弹出的时候设置了overflow:hidden会导致页面scrollTop变成0,页面相当于被滚到顶部了。如果UI或者PM不愿意,请与他们撕逼。

这里最需要注意的,就是.content-body一定要让它脱离文档流。如果没有定位,是没有z-index的。这个问题我也不造怎么说,反正就是不加这两个属性,蒙层出来,.content-body还是能滚动,overflow: hidden;没起作用。希望大神赐教!

.content-body {
    width: 100%;
    height: 100%;
    /* 内容高度设置为屏幕高度,正常情况下超出滚动 */
    overflow-y: scroll;
    /*一定要加下面的2个属性,否则蒙层出现,这个content-body还是能滚动*/
    position: absolute;
    z-index: 10;
  }

JavaScript:

<script src="jquery-2.1.0.js"></script>
  <script>
  // 事件代理
  /*$(document).on('click', ".item", function(e) {
      $(".layout").show();
      $(".layout-body").show();
    })*/
  // 直接绑定
  $(".item").on('click', function(e) {
    $(".layout").show();
    $(".layout-body").show();

    $(".father").css("overflow-y", "hidden");
    $(".content-body").css("overflow-y", "hidden");
  });
  $(".layout").on("click", function(e) {
    $(this).hide();
    $(".layout-body").hide();

    $(".father").css("overflow-y", "scroll");
    $(".content-body").css("overflow-y", "scroll");
  });
  $(".area-item").on("click", function(e) {
    $(".layout").hide();
    $(".layout-body").hide();
  })
  </script>

热评文章