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


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 相关文章推荐
JQuery Highcharts 动态生成图表的方法
Nov 15 Javascript
Javascript实现Web颜色值转换
Feb 05 Javascript
jquery解析XML及获取XML节点名称的实现代码
May 18 Javascript
Boostrap实现的登录界面实例代码
Oct 09 Javascript
Jquery获取radio选中的值
May 05 jQuery
使用JavaScript实现alert的实例代码
Jul 06 Javascript
基于JavaScript中标识符的命名规则介绍
Jan 06 Javascript
Vue递归实现树形菜单方法实例
Nov 06 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
Jan 24 Javascript
vue路由跳转传参数的方法
May 06 Javascript
Vue.js递归组件实现组织架构树和选人功能
Jul 04 Javascript
ant design的table组件实现全选功能以及自定义分页
Nov 17 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
基于mysql的bbs设计(五)
2006/10/09 PHP
PHP中=赋值操作符对不同数据类型的不同行为
2011/01/02 PHP
在MongoDB中模拟Auto Increment的php代码
2011/03/06 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
php简单实现多语言切换的方法
2016/05/09 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
php文件管理基本功能简单操作
2017/01/16 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
YII框架批量插入数据的方法
2017/03/18 PHP
javascript 正则表达式相关应介绍
2012/11/27 Javascript
jQuery弹出(alert)select选择的值
2013/04/21 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
2013/08/28 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
javascript每日必学之循环
2016/02/19 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
vue新vue-cli3环境配置和模拟json数据的实例
2018/09/19 Javascript
JavaScript格式化json和xml的方法示例
2019/01/22 Javascript
JavaScript获取某一天所在的星期
2019/09/05 Javascript
vue数据响应式原理知识点总结
2020/02/16 Javascript
Javascript原生ajax请求代码实例
2020/02/20 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
Python学习笔记(一)(基础入门之环境搭建)
2014/06/05 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
python里 super类的工作原理详解
2019/06/19 Python
深入学习python多线程与GIL
2019/08/26 Python
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
服装厂厂长职责
2013/12/16 职场文书
道路建设实施方案
2014/03/18 职场文书
出生证明公证书
2014/04/09 职场文书
感恩教育观后感
2015/06/17 职场文书