微信小程序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 相关文章推荐
javascript的事件描述
Sep 08 Javascript
使Ext的Template可以解析二层的json数据的方法
Dec 22 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
Jan 27 Javascript
jquery中append()与appendto()用法分析
Nov 14 Javascript
js代码实现随机颜色的小方块
Jul 30 Javascript
javascript下拉列表中显示树形菜单的实现方法
Nov 17 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
Dec 16 Javascript
使用jquery获取url及url参数的简单实例
Jun 14 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
Sep 09 Javascript
vue项目上传Github预览的实现示例
Nov 06 Javascript
基于jQuery拖拽事件的封装
Nov 29 jQuery
小程序wx.getUserProfile接口的具体使用
Jun 02 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下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
2011/09/19 PHP
解析MySql与Java的时间类型
2013/06/22 PHP
Javascript的并行运算实现代码
2010/11/19 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
Js可拖拽放大的层拖动特效实现方法
2015/02/25 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
2015/09/27 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
js获取元素下的第一级子元素的方法(推荐)
2017/03/05 Javascript
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
Vue之mixin全局的用法详解
2018/08/22 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
2019/08/27 jQuery
封装一下vue中的axios示例代码详解
2020/02/16 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
在Python中使用全局日志时需要注意的问题
2015/05/06 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
2018/05/02 Python
python实现图片彩色转化为素描
2019/01/15 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
python读文件的步骤
2019/10/08 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
护理学中专毕业生求职信
2013/11/11 职场文书
学校安全检查制度
2014/01/27 职场文书
信息员培训方案
2014/06/12 职场文书
关于成立领导小组的通知
2015/04/23 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书