微信小程序wxs实现吸顶效果


Posted in Javascript onJanuary 08, 2020

在.js文件中使用page的onPageScroll事件和scroll-view的scroll事件中产生卡顿 (setData 渲染会阻塞其它脚本执行,导致了整个用户交互的动画过程会有延迟), 所以使用wxs响应事件来实现吸顶效果。wxs响应事件基础库 2.4.4 开始支持,低版本需做兼容处理。

附上文档链接:wxs响应事件

吸顶效果

使用scroll-view组件实现滚动效果,页面和scroll-view组件的高度设成100%,当竖向滚动条大于等于导航到顶部距离时,导航变成固定定位,固定显示在顶部,反之,导航取消定位。

<!-- wxml文件 -->
<wxs module="scroll1" src="./scroll1.wxs"></wxs> <!-- 引入wxs文件 -->
<scroll-view bindscroll="{{scroll1.scrollEvent}}" data-top="{{navTop}}" style='height:100%;' scroll-y>
 <image src='/images/top_image.png' mode='aspectFill' class='nav-image'></image>
 <view class='navigation'>
  <view wx:for="{{navBarList}}" wx:key="">{{item}}</view>
 </view>
 <view class='div' wx:for="{{8}}" wx:key="">第{{index}}部分</view>
</scroll-view>
 
/* wxss文件 */
page{
 font-size: 30rpx;
 background: #fea;
 height: 100%;
}
.div{
 width: 100%;height: 500rpx;
}
.nav-image{
 width: 100%;height: 400rpx;
 vertical-align: middle;
}
.navigation{
 width: 100%;
 height: 100rpx;
 display: flex;
 justify-content: center;
 align-items: center;
 background: #fff;
 top:0;left:0; /*只有使用定位才起效果*/
}
.navigation view{
 padding: 15rpx 20rpx;
 margin: 0 20rpx;
}
//wxs文件
var scrollEvent = function (e, ins) {
 var scrollTop = e.detail.scrollTop;
 var navTop = e.currentTarget.dataset.top;
 if (scrollTop >= navTop) {
  ins.selectComponent('.navigation').setStyle({
   "position": 'fixed'
  })
 } else {
  ins.selectComponent('.navigation').setStyle({
   "position": 'static'
  })
 }
}
module.exports = {
 scrollEvent: scrollEvent
}
//js文件
Page({
 /**
  * 页面的初始数据
  */
 data: {
  navBarList: ['喜欢', '点赞', '收藏'],
  navTop:0, //导航距顶部距离
 },
 /**
  * 生命周期函数--监听页面加载
  */
 onLoad: function (options) {
  this.getNavTop();
 },
 /**
  * 获取导航距顶部距离
  */
 getNavTop() {
  var that = this;
  var query = wx.createSelectorQuery();
  query.select('.navigation').boundingClientRect(function (data) {
   that.setData({
    navTop: data.top,
   })
  }).exec();
 },
 })

渐变导航效果

当竖向滚动条滚动到指定位置时,出现导航条,导航条透明度也随滚动条位置发生变化。

<!-- wxml文件 -->
<wxs module="scroll2" src="./scroll2.wxs"></wxs>
<scroll-view bindscroll="{{scroll2.scrollEvent}}" style='height:100%;' scroll-y>
 <!-- 头部 -->
 <image src='/images/top_image.png' mode='aspectFill' class='nav-image'></image>
 <view class='nav-icon'>
  <navigator open-type='navigateBack' class='back-icon'></navigator>
 </view>
 <view class='nav-bar' style='opacity:0;'>
  <navigator open-type='navigateBack' class='back-icon'></navigator>
  <view>我是导航条</view>
 </view>
 <!-- 头部 END -->
 <view class='div' wx:for="{{8}}" wx:key="">第{{index}}部分</view>
</scroll-view>
/* wxss文件 */
page{font-size: 30rpx;background: rgba(200, 58, 57, 0.3);height: 100%;}
.div{width: 100%;height: 500rpx;}
.nav-image{width: 100%;height: 400rpx;vertical-align: middle;}
.nav-icon,.nav-bar{
 position: fixed;
 top: 0;left: 0;
 height: 120rpx;
}
.nav-bar{
 width: 100%;
 display: flex;
 align-items: center;
 background: #fff;
}
.back-icon{
 width: 100rpx;
 height: 100%;
 display: flex;
 justify-content: center;
 align-items: center;
}
.back-icon::after{ /*利用伪类元素模拟出返回icon*/
 content: "";
 display: block;
 width: 25rpx;height: 25rpx;
 border-top: 5rpx solid #fff;
 border-left: 5rpx solid #fff;
 transform: rotate(-45deg);
}
.nav-bar .back-icon::after{border-color: #000;}
//wxs文件
var scrollEvent=function(e,ins){
 var scrollTop=e.detail.scrollTop;
 if(scrollTop>100){
  ins.selectComponent(".nav-icon").setStyle({
   "opacity":"0"
  })
  var dot = (scrollTop-100)/50;
  ins.selectComponent(".nav-bar").setStyle({
   "opacity": dot
  })
 }else{
  ins.selectComponent(".nav-bar").setStyle({
   "opacity": "0"
  })
  var dot = (100-scrollTop) / 50;
  ins.selectComponent(".nav-icon").setStyle({
   "opacity": dot
  })
 }
};
module.exports={
 scrollEvent: scrollEvent
};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS解密入门之凭直觉解
Jun 25 Javascript
js 异步处理进度条
Apr 01 Javascript
jquery 提示信息显示后自动消失的具体实现
Dec 18 Javascript
谈谈因Vue.js引发关于getter和setter的思考
Dec 02 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
Feb 13 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
Mar 03 Javascript
javascript使用btoa和atob来进行Base64转码和解码
Mar 20 Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
Jul 24 Javascript
Javascript 对象(object)合并操作实例分析
Jul 30 Javascript
javascript操作向表格中动态加载数据
Aug 27 Javascript
axios解决高并发的方法:axios.all()与axios.spread()的操作
Nov 09 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
Jan 06 Javascript
微信小程序实现吸顶特效
Jan 08 #Javascript
nuxt配置通过指定IP和端口访问的实现
Jan 08 #Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
Jan 08 #Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
Dec 24 #Javascript
你可能从未使用过的11+个JavaScript特性(小结)
Jan 08 #Javascript
你知道JavaScript Symbol类型怎么用吗
Jan 08 #Javascript
js实现多个标题吸顶效果
Jan 08 #Javascript
You might like
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
基于PHP读取csv文件内容的详解
2013/06/18 PHP
深入解析phpCB批量转换的代码示例
2013/06/27 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
图片翻转效果具体实现代码
2014/01/09 Javascript
JavaScript禁止复制与粘贴的实现代码
2016/05/16 Javascript
js实现抽奖效果
2017/03/27 Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
2019/01/27 Javascript
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
vue将data恢复到初始状态 &amp;&amp; 重新渲染组件实例
2020/09/04 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
python基础教程之获取本机ip数据包示例
2014/02/10 Python
简单解析Django框架中的表单验证
2015/07/17 Python
Django中的Model操作表的实现
2018/07/24 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
简单了解python的一些位运算技巧
2019/07/13 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
python dataframe NaN处理方式
2019/12/26 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
2020/02/20 Python
用python发送微信消息
2020/12/21 Python
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
2013/07/15 HTML / CSS
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
印尼网上商店:Alfacart.com
2019/03/11 全球购物
涉外文秘个人求职的自我评价
2013/10/07 职场文书
幼儿园保育员责任书
2014/07/22 职场文书
检讨书1000字
2014/10/11 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python
Python极值整数的边界探讨分析
2021/09/15 Python
Python中tqdm的使用和例子
2022/09/23 Python