• 微信小程序--导航跟随


    最近开发小程序的时候遇到这样一个需求:如图1

    页面向下滚动到白色导航的位置时,白色导航固定到页面最上方;当页面向上滚动到白色导航时,白色导航恢复到原始位置;点击各个导航,平滑的跳到相应位置。

    思路1:

    1.给导航设置position: absolute; 页面向下滚动到白色导航的位置时,将给导航设置为position: fixed;

    2.绑定小程序滚动事件bindscroll,监听滚动距离;

    代码如下:

    wxml:

    <scroll-view class="layout" bindscroll='layoutScroll' scroll-y="true" >
      <view class='banner'>
        <text>我是一个banner</text>
      </view>
      <!-- 导航开始 -->
      <view class='nav clearfix {{navFixed?"positionFixed":""}}'>
        <view class='nav_row'>
         <text>导航1</text> 
        </view>
        <view class='nav_row'>
         <text>导航2</text> 
        </view>
        <view class='nav_row'>
         <text>导航3</text> 
        </view>
        <view class='nav_row'>
         <text>导航4</text> 
        </view>
      </view>
      <!-- 导航结束  -->
      <!-- 内容开始 -->
      <view class='content content1'>
        <text>我是内容1</text>
      </view>
      <view class='content content2'>
        <text>我是内容2</text>
      </view>
      <view class='content content3'>
        <text>我是内容3</text>
      </view>
      <view class='content content4'>
        <text>我是内容4</text>
      </view>
      <!-- 内容结束 -->
    </scroll-view>

    wxss:

    .clearfix:after {
      content: ".";
      display: block;
      height: 0;
      clear: both;
      visibility: hidden;
    }
    .positionFixed{
      position: fixed;
      left: 0;
      top: 0;
    }
    
    page{
      width: 100%;
      height:100%;
    }
    .layout{
      width: 100%;
      height: 100%;
      background: #eee;
    }
    .banner{
      width: 100%;
      height: 200px;
      line-height: 200px;
      background: #FFB11A ;
      
    }
    .banner text{
      text-align: center;
      display: block;
    }
    .nav{
      width: 100%;
      height: 45px;
      line-height: 45px;
      background: #fff;
    }
    .nav_row{
      float: left;
      width: 25%;
      font-family: PingFangSC-Light;
      font-size: 16px;
      color: #333333;
    }
    .nav_row text{
      text-align: center;
      display: block;
    }
    .content {
      width: 100%;
      height: 200px;
      font-family: PingFangSC-Light;
      font-size: 16px;
      color: #333333;
      padding: 15px;
    }
    .content1{
      background: #F5BBA4;
    }
    .content2{
      background: #E9ED9A;
    }
    .content3{
      background: #9DE59C;
    }
    .content4{
      background: #98A5E2;
    }

    js:

    Page({
      data: {
        scrollTop:'',    //滑动的距离
        navFixed:false,  //导航是否固定  
      },
      //页面滑动
      layoutScroll: function (e) {
        this.data.scrollTop = this.data.scrollTop * 1 + e.detail.deltaY * 1;
        console.log(this.data.scrollTop)
        console.log(this.data.navFixed)
        if (this.data.scrollTop <= -200){
          this.setData({
            navFixed:true
          })
        }else{
          this.setData({
            navFixed: false
          })
        }
      }
    })

    这个代码能基本实现需求,但是存在很大的弊端:

    1.导航固定后,页面卡顿一下

    2.导航效果延迟较长,用户体验很差

    总体来说这种方案并不可取,所以进行第二次迭代

    思路2:

    未完待续。。。

    注意:

    1.整个滑动的页面应该写在scroll-view中;

    2.scroll-view一定

  • 相关阅读:
    C# 非UI线程向UI线程发送数据的两种方法
    c# 富客户端使用 MethodInvoker简化代码
    Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while attempting to activate 'xxxx'.
    弃元
    Serilog 配置基础知识
    测试软件开发准则--基于TTStand
    SuperSocketHostBuilder<TReceivePackage>
    Ext CheckBoxGroup使用
    2020年12月28日 新工作新旅程
    2021年全国计算机等级考试报名照片制作教程(压缩、裁剪、换白底)
  • 原文地址:https://www.cnblogs.com/wangyuyuan/p/7645835.html
Copyright © 2020-2023  润新知