微信小程序实现点击导航标签滚动定位到对应位置


Posted in Javascript onNovember 19, 2020

本文要实现的是点击标签滚动定位到对应位置,且给在当前板块范围指定的导航标签添加样式

效果的话看下面GIF

微信小程序实现点击导航标签滚动定位到对应位置

wxml部分

top当前离顶部滚动的距离
block_ScrollTop是当前模块离顶部的距离,多减60是因为我的导航是悬浮的,会挡住部分内容,自行修改;
specify-style是我自定义选中标签时的样式,可自行更改;

<!-- 导航 -->
 <view class='nav' id="tab-con">
 <view class='resume-title'>伟安的简历</view>
 <view bindtap="toblock1" class="{{top<block2_ScrollTop-60?'specify-style':''}}">关于我</view>
 <view bindtap="toblock2" class="{{top>=block2_ScrollTop-60&&top<block3_ScrollTop-60?'specify-style':''}}">工作经验</view>
 <view bindtap="toblock3" class="{{top>=block3_ScrollTop-60?'specify-style':''}}">项目经验</view>
 </view>
 <!-- 中部内容 -->
 <view class="body">
 <scroll-view class="list" scroll-y="true" style="height:{{winHeight}}">
 <view id='block_1'>
 <!-- 第一个板块 -->
 </view>
 <view id='block_2'>
 <!-- 第二个板块 -->
 </view>
 <view id='block_3'>
 <!-- 第三个板块 -->
 </view>
 <view id='block_3'>
 <!-- 嗯,高度不够凑数的 -->
 </view>
 </scroll-view>
 </view>

wxss选中的字体加粗以及底部三角形样式参考

用了伪类::before画了三角形,板块没有内容所以加了高度。

.nav {
 display: flex;
 justify-content: space-around;
 align-items: center;
 height: 100rpx;
 background-color: rgba(0, 0, 0, 0.2);
 position: fixed;
 top: 0;
 left: 0;
 width: 100%;
 z-index: 9999;
}

.specify-style {
 font-weight: 800;
 position: relative;
}

.specify-style::before {
 content: '';
 border: solid transparent;
 border-width: 0px 14rpx 14rpx 14rpx;
 border-bottom-color: snow;
 position: absolute;
 z-index: 1000;
 margin-top: 36rpx;
 left: 37%;
}

#block_1,
#block_2,
#block_3 {
 height: 70vh;
}

#block_1 {
 background-color: aqua;
}

#block_2 {
 background-color: bisque;
}

#block_3 {
 background-color: cadetblue;
}

js部分

先是在onLoad中拿到自适应winHeight赋值到scroll-view组件;
然后通过createSelectorQuery方法获取顶部id、板块一id、板块二id、板块三id离顶部的距离;
然后通过onPageScroll方法时时监听获取当前位置离顶部滚动的距离;
然后通过pageScrollTo实现点击跳转定位;

Page({
 data: {
 //当前离顶部滚动的距离
 top: 0,
 },
 // 监听滚动事件 scrollTop 滚动的距离
 onPageScroll: function (e) { // 获取滚动条当前位置
 // console.log(e)
 this.setData({
 top: e.scrollTop
 })
 if (e.scrollTop > this.data.tabScrollTop) {
 this.setData({
 tabFixed: true
 })
 // console.log("我锁定了")
 } else {
 this.setData({
 tabFixed: false
 })
 }
 },
 //点击跳转到板块一
 toblock1: function () {
 wx.pageScrollTo({
 /*
 *多减50是因为我的导航是悬浮的,会挡住部分内容
 *这里是1等于2rpx
 */
 scrollTop: this.data.block1_ScrollTop - 50
 })
 },
 //点击跳转到板块二
 toblock2: function () {
 wx.pageScrollTo({
 scrollTop: this.data.block2_ScrollTop - 50
 })
 },
 //点击跳转到板块三
 toblock3: function () {
 wx.pageScrollTo({
 scrollTop: this.data.block3_ScrollTop - 50
 })
 },
 onLoad: function (options) {
 let that = this
 // 高度自适应
 wx.getSystemInfo({
 success: function (res) {
 var clientHeight = res.windowHeight,
  clientWidth = res.windowWidth,
  rpxR = 750 / clientWidth;
 var calc = clientHeight * rpxR;
 that.setData({
  winHeight: calc
 });
 }
 });
 var query = wx.createSelectorQuery()
 //获取顶部的距离
 query.select('#tab-con').boundingClientRect(function (res) {
 var top = res.top;
 if (top == null) {
 var top = 0;
 }
 that.setData({
 tabScrollTop: top
 })
 }).exec()
 //获取板块一离顶部的距离
 query.select('#block_1').boundingClientRect(function (res) {
 that.setData({
 block_1ScrollTop: res.top
 })
 }).exec()
 //获取板块二离顶部的距离
 query.select('#block_2').boundingClientRect(function (res) {
 that.setData({
 block2_ScrollTop: res.top
 })
 }).exec()
 //获取板块三离顶部的距离
 query.select('#block_3').boundingClientRect(function (res) {
 that.setData({
 block3_ScrollTop: res.top
 })
 }).exec()
 },
})

为大家推荐现在关注度比较高的微信小程序教程一篇:《微信小程序开发教程》小编为大家精心整理的,希望喜欢。

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

Javascript 相关文章推荐
Code: write(s,d) 输出连续字符串
Aug 19 Javascript
有趣的JavaScript数组长度问题代码说明
Jan 20 Javascript
js调用webservice中的方法实现思路及代码
Feb 25 Javascript
js 事件截取enter按键页面提交事件示例代码
Mar 04 Javascript
jquery实现更改表格行顺序示例
Apr 30 Javascript
js操作模态窗口及父子窗口间相互传值示例
Jun 09 Javascript
全面解析Bootstrap中Carousel轮播的使用方法
Jun 13 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
Oct 08 Javascript
原生JS实现图片轮播效果
Dec 26 Javascript
整理关于Bootstrap列表组的慕课笔记
Mar 29 Javascript
详解为Bootstrap Modal添加拖拽的方法
Jan 05 Javascript
ajax请求+vue.js渲染+页面加载的示例
Feb 11 Javascript
深入了解Vue3模板编译原理
Nov 19 #Vue.js
微信小程序实现倒计时功能
Nov 19 #Javascript
微信小程序实现列表左右滑动
Nov 19 #Javascript
详解JavaScript 中的批处理和缓存
Nov 19 #Javascript
Javascript中window.name属性详解
Nov 19 #Javascript
JavaScript实现图片合成下载的示例
Nov 19 #Javascript
vue 获取到数据但却渲染不到页面上的解决方法
Nov 19 #Vue.js
You might like
PHP通用检测函数集合
2011/02/08 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
jquery实现的可隐藏重现的靠边悬浮层实例代码
2013/05/27 Javascript
javaScript中的this示例学习详解及工作原理
2014/01/13 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
全面解析Bootstrap图片轮播效果
2015/12/03 Javascript
详解JavaScript表单验证(E-mail 验证)
2016/03/31 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
如何快速上手Vuex
2017/02/14 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
js实现随机数小游戏
2019/06/28 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
JS前端基于canvas给图片添加水印
2020/11/11 Javascript
[39:07]LGD vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
[03:15]DOTA2-DPC中国联赛1月22日Recap集锦
2021/03/11 DOTA
Python操作列表的常用方法分享
2014/02/13 Python
Python break语句详解
2014/03/11 Python
python构建深度神经网络(DNN)
2018/03/10 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
python 直接赋值和copy的区别详解
2019/08/07 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
Python使用pyexecjs代码案例解析
2020/07/13 Python
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
Java如何调用外部Exe程序
2015/07/04 面试题
《我为你骄傲》教学反思
2014/02/20 职场文书
投标诚信承诺书
2014/05/26 职场文书
金融专业求职信
2014/08/05 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
学习党史心得体会2016
2016/01/23 职场文书