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


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实现继承机制之构造函数方法对象冒充的使用详解
May 07 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
Dec 18 Javascript
深入理解JavaScript系列(35):设计模式之迭代器模式详解
Mar 03 Javascript
谈谈JavaScript中function多重理解
Aug 28 Javascript
JS实现弹性菜单效果代码
Sep 07 Javascript
JS实现设置ff与ie元素绝对位置的方法
Mar 08 Javascript
利用angular.copy取消变量的双向绑定与解析
Nov 25 Javascript
webpack实现热更新(实施同步刷新)
Jul 28 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
Feb 05 Javascript
详解React Native 屏幕适配(炒鸡简单的方法)
Jun 11 Javascript
Bootstrap Table中的多选框删除功能
Jul 15 Javascript
vue 自定义的组件绑定点击事件
Apr 21 Vue.js
深入了解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也能干大事之PHP中的编码解码详解
2015/04/20 PHP
基于laravel where的高级使用方法
2019/10/10 PHP
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
Google的跟踪代码 动态加载js代码方法应用
2012/11/12 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
Jquery的Ajax技术使用方法
2019/01/21 jQuery
python查询sqlite数据表的方法
2015/05/08 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
python turtle库画一个方格和圆实例
2019/06/27 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
对tensorflow中cifar-10文档的Read操作详解
2020/02/10 Python
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
高中军训广播稿
2014/01/14 职场文书
学校联谊活动方案
2014/02/15 职场文书
学院党委班子四风问题自查报告及整改措施
2014/10/25 职场文书
公务员年度个人总结
2015/02/12 职场文书
体育委员竞选稿
2015/11/21 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
解析Java中的static关键字
2021/06/14 Java/Android