微信小程序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学习网址备忘
May 29 Javascript
javascript获得CheckBoxList选中的数量
Oct 27 Javascript
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
Nov 12 Javascript
jquery插件制作教程 txtHover
Aug 17 Javascript
jquery中.add()的使用分析
Apr 26 Javascript
js如何设置在iframe框架中指定div不显示
Dec 04 Javascript
javascript内置对象操作详解
Feb 04 Javascript
jQuery封装的屏幕居中提示信息代码
Jun 08 Javascript
10分钟掌握XML、JSON及其解析
Dec 06 Javascript
常用的javascript设计模式
Jan 11 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
Mar 06 Javascript
vue如何安装使用Quill富文本编辑器
Sep 21 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&amp;mysql(三)
2006/10/09 PHP
php读取30天之内的根据算法排序的代码
2008/04/06 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
Smarty变量调节器失效的解决办法
2014/08/20 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
PHP安装memcached扩展笔记
2015/05/28 PHP
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
PHP制作登录异常ip检测功能的实例代码
2016/11/16 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
js cookies实现简单统计访问次数
2009/11/24 Javascript
js字符串的各种格式的转换 ToString,Format
2011/08/08 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
javascript图片预加载实例分析
2015/07/16 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
深入探秘jquery瀑布流的实现
2016/01/30 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
Vue渲染函数详解
2017/09/15 Javascript
实例详解BootStrap的动态模态框及静态模态框
2018/08/13 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
Python的string模块中的Template类字符串模板用法
2016/06/27 Python
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
Python高级property属性用法实例分析
2019/11/19 Python
详解Python中的分支和循环结构
2020/02/11 Python
解决更改AUTH_USER_MODEL后出现的问题
2020/05/14 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
2021/02/03 Python
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
《圆明园的毁灭》教学反思
2014/02/28 职场文书
手机销售员岗位职责
2015/04/11 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书