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


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 相关文章推荐
JavaScript触发器详解
Mar 10 Javascript
IE和Firefox下event事件杂谈
Dec 18 Javascript
jquery禁止回车触发表单提交
Dec 12 Javascript
AngularJs Understanding the Model Component
Sep 02 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
Oct 13 Javascript
ionic+AngularJs实现获取验证码倒计时按钮
Apr 22 Javascript
vue元素实现动画过渡效果
Jul 01 Javascript
vue组件 $children,$refs,$parent的使用详解
Jul 31 Javascript
基于Vue实现页面切换左右滑动效果
Jun 29 Javascript
详解vue mint-ui源码解析之loadmore组件
Oct 11 Javascript
小程序实现背景音乐播放和暂停
Jun 19 Javascript
react的hooks的用法详解
Oct 12 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页面跳转实现延时跳转的方法
2016/12/10 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
thinkphp5引入公共部分header、footer的方法详解
2018/09/14 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
javascript中对对层的控制
2006/12/29 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
浅谈Vue下使用百度地图的简易方法
2018/03/23 Javascript
JavaScript实现仿Clock ISO时钟
2018/06/29 Javascript
vue遍历生成的输入框 绑定及修改值示例
2019/10/30 Javascript
JS实现放烟花效果
2020/03/10 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
[01:16:12]完美世界DOTA2联赛PWL S2 FTD vs Inki 第一场 11.21
2020/11/23 DOTA
python实现简单的TCP代理服务器
2014/10/08 Python
一些常用的Python爬虫技巧汇总
2016/09/28 Python
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
django框架单表操作之增删改实例分析
2019/12/16 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
巴西最大的在线约会网站:ParPerfeito
2018/07/11 全球购物
优秀学生事迹材料
2014/02/08 职场文书
劲霸男装广告词
2014/03/21 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
技校毕业生自荐信
2014/06/03 职场文书
企业财务经理岗位职责
2015/04/08 职场文书
Python数据分析之pandas读取数据
2021/06/02 Python
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android