微信小程序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实现下拉框的动态添加(附效果)
Apr 03 Javascript
JavaScript常用全局属性与方法记录积累
Jul 03 Javascript
js实现class样式的修改、添加及删除的方法
Jan 20 Javascript
JQuery选择器、过滤器大整理
May 26 Javascript
基于jQuery实现多层次的手风琴效果附源码
Sep 21 Javascript
详解AngularJS 模态对话框
Apr 07 Javascript
除Console.log()外更多的Javascript调试命令
Jan 24 Javascript
JS常见构造模式实例对比分析
Aug 27 Javascript
angularjs性能优化的方法
Sep 05 Javascript
Vue 配合eiement动态路由,权限验证的方法
Sep 26 Javascript
vue父子组件间引用之$parent、$children
May 20 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
Aug 10 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/17 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
jQuery Ajax之load()方法
2009/10/12 Javascript
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
使用Ajax与服务器(JSON)通信实例
2016/11/04 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
bootstrap提示标签、提示框实现代码
2016/12/28 Javascript
jQuery操作之效果详解
2017/05/19 jQuery
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
Vue——前端生成二维码的示例
2020/12/19 Vue.js
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
python实现挑选出来100以内的质数
2015/03/24 Python
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
使用tensorflow实现矩阵分解方式
2020/02/07 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
Python常见反爬虫机制解决方案
2020/06/01 Python
python中time包实例详解
2021/02/02 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
医学生自荐信
2013/12/03 职场文书
公司营业员的自我评价
2014/03/04 职场文书
文化与传播毕业生求职信
2014/03/09 职场文书
奥利奥广告词
2014/03/20 职场文书
研讨会主持词
2014/04/02 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
大国崛起英国观后感
2015/06/02 职场文书
2015年国庆晚会主持词
2015/07/01 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书