微信小程序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 相关文章推荐
根据邮箱的域名跳转到相应的登录页面的代码
Feb 27 Javascript
js模拟点击事件实现代码
Nov 06 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
Jan 13 Javascript
javascript发送短信验证码实现代码
Nov 12 Javascript
jquery实现一个简单的表单验证实例
Mar 30 Javascript
Bootstrap编写导航栏和登陆框
May 30 Javascript
jQuery实现模拟flash头像裁切上传功能示例
Dec 11 Javascript
Webpack devServer中的 proxy 实现跨域的解决
Jun 15 Javascript
对angularjs框架下controller间的传值方法详解
Oct 08 Javascript
浅谈Angular 观察者模式理解
Nov 01 Javascript
如何优雅地在vue中添加权限控制示例详解
Mar 07 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
Jul 31 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 cron中的批处理
2008/09/16 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
jQuery初学:find()方法及children方法的区别分析
2011/01/31 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
js实现的二级横向菜单条实例
2015/08/22 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
JS 实现百度搜索功能
2018/02/01 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
python生成随机mac地址的方法
2015/03/16 Python
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
python版本的读写锁操作方法
2016/04/25 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
有关Python的22个编程技巧
2018/08/29 Python
详解python读取和输出到txt
2019/03/29 Python
python求绝对值的三种方法小结
2019/12/04 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
美国网上鞋子零售商:Dr. Scholl’s Shoes
2017/11/17 全球购物
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
翻译专业应届生求职信
2013/11/23 职场文书
校园新闻广播稿
2014/01/10 职场文书
中国梦口号
2014/06/13 职场文书
欢迎横幅标语
2014/06/17 职场文书
村道德模范事迹材料
2014/08/28 职场文书
机关作风建设剖析材料
2014/10/11 职场文书
党支部综合考察意见
2015/06/01 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
python 对图片进行简单的处理
2021/06/23 Python
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers