美文网首页
html的局部滚动和全局滚动

html的局部滚动和全局滚动

作者: RadishHuang | 来源:发表于2020-04-16 11:56 被阅读0次

    前端开发人员,肯定会遇到过,局部滚动的问题。在微信上,顶部会有一个地址栏。很多时候我们做单屏的页面,是不需要这个全局滚动。但是禁用了全局滚动,往往会导致局部滚动也无法使用。

    示例

    这时候我们可以通过绝对定位,将这个问题解决。或者是禁用整个外层的滚动事件。

    #app {
      position: fixed;
      left: 0px;
      top: 0px;
      width: 100%;
      height: 100%;
    }
    

    这种方式虽然能解决,但是里面的局部滚动已经没办法滚动了。这种网上也有很多人提过方案,我这里就用最简单的解决。里面滚动用第三方组件,比如swiper比如iscroll等,这些组件已经有解决过这些问题。

    添加swiper组件到项目中

    由于习惯于vue的框架,因此我引入进来的是vue-awesome-swiper 具体用法和swiper还是有些小差别,可以看github的示例。

    main.js引入vue-awesome-swiper

    import VueAwesomeSwiper from 'vue-awesome-swiper'
    import 'swiper/css/swiper.css';
    Vue.use(VueAwesomeSwiper)
    

    在单独的vue文件里面引入swiper。把需要滚动的内容放入到swiper里面即可。

    <template>
      <div class="home">
         <swiper class="swiper" :options="swiperOption">
          <swiper-slide class="swiper_content">
            <img alt="Vue logo" src="../assets/logo.png">
              <img alt="Vue logo" src="../assets/logo.png">
              <img alt="Vue logo" src="../assets/logo.png">
              <img alt="Vue logo" src="../assets/logo.png">
              <img alt="Vue logo" src="../assets/logo.png">
              <img alt="Vue logo" src="../assets/logo.png">
              <img alt="Vue logo" src="../assets/logo.png">
              <img alt="Vue logo" src="../assets/logo.png">
              <img alt="Vue logo" src="../assets/logo.png">
              <img alt="Vue logo" src="../assets/logo.png">
              <img alt="Vue logo" src="../assets/logo.png">
              <img alt="Vue logo" src="../assets/logo.png">
          </swiper-slide>
          <div class="swiper-scrollbar" slot="scrollbar"></div>
        </swiper>
      </div>
    </template>
    
    <script>
    
    import { Swiper, SwiperSlide } from "vue-awesome-swiper";
    import "swiper/css/swiper.css";
    
    
    export default {
      name: 'Home',
      data() {
        return {
          swiperOption: {
            direction: "vertical",
            slidesPerView: "auto",
            scrollbar: {
              el: ".swiper-scrollbar"
            },
            mousewheel: true,
            autoHeight: true,
          }
        };
      },
      components: {
        Swiper, 
        SwiperSlide
      }
    }
    </script>
    
    <style>
    .swiper {
      margin-top: 100px;
      height: 400px;
      background: pink;
    }
    
    .swiper_content {
      height: 100%;
      background: red;
    }
    
    .swiper-scrollbar {
      background: orange;
      border: none;
    }
    </style>
    
    可以滚动的内容

    内容flex自适应高度的滚动。

    上面列举的滚动视图,是固定了swiper的高度。所以基本上没啥太大的问题。开发中可能会遇到,内容区域是flex:1进行自适应高度的情况。我们需要把swiper的高度撑满,以及slide也要撑满。这几个个样式是重点。
    PS:遇到过滚动条黑色bar不显示,发现需要设置图片的高度,才会计算出实际的滚动高度,才会出现滚动条黑色bar。

    .scroll_content {
      flex: 1;
      overflow: hidden;
      display: flex;
      flex-direction: column;
      background: red;
    }
    .main_content {
      height: 100%;
      width: 100%;
      overflow: hidden;
    }
    
    .swiper {
      height: 100%;
    }
    
    .slide_content {
      height: 100%;
    }
    
    .test_img {
      width: 100%;
      height: 100px;
    }
    
    自适应高度的滚动

    全部的代码如下

      <template>
      <div class="home">
        <div class="head">head content</div>
        <div class="scroll_content">
          <div class="main_content">
            <swiper class="swiper" :options="swiperOption">
              <swiper-slide class="slide_content">
                <div>
                  <div>scroll head</div>
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <img class="test_img" alt="Vue logo" src="../assets/logo.png">
                  <div>scroll foot</div>
                </div>
              </swiper-slide>
              <div class="swiper-scrollbar" slot="scrollbar"></div>
            </swiper>
          </div>
        </div>
        <div class="foot">foot content</div>
      </div>
    </template>
    
    <script>
    
    import { Swiper, SwiperSlide } from "vue-awesome-swiper";
    import "swiper/css/swiper.css";
    
    export default {
      name: 'Home',
      data() {
        return {
          swiperOption: {
            direction: "vertical",
            slidesPerView: "auto",
            freeMode: true,
            scrollbar: {
              el: ".swiper-scrollbar"
            },
            mousewheel: true,
            autoHeight: true,
            setWrapperSize: true
          }
        };
      },
      components: {
        Swiper,
        SwiperSlide
      }
    }
    </script>
    
    <style >
    .home {
      height: 100%;
      display: flex;
      flex-direction: column;
    }
    .head {
      width: 100%;
      height: 100px;
      background: orange;
    }
    .foot{
      width: 100%;
      height: 50px;
      background: orange;
    }
    .scroll_content {
      flex: 1;
      overflow: hidden;
      display: flex;
      flex-direction: column;
      background: red;
      
    }
    
    .main_content {
      height: 100%;
      width: 100%;
      overflow: hidden;
    }
    
    .swiper {
      height: 100%;
    }
    
    .slide_content {
      height: 100%;
    }
    
    .test_img {
      width: 100%;
      height: 100px;
    }
    
    
    </style>
    
    
    

    自定义滚动条的颜色

    在上面的代码设置成功后,可以修改如下两个样式。可以修改滚动条的颜色。

    .swiper-scrollbar {
      background: black;
    }
    
    .swiper-scrollbar-drag {
      background: blue;
    }
    
    真机测试效果

    相关文章

      网友评论

          本文标题:html的局部滚动和全局滚动

          本文链接:https://www.haomeiwen.com/subject/rcncvhtx.html