微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
作者:Grance2016 发布时间:2024-11-19 04:12:35
标签:小程序,scroll-view,滚动,锚点
1.wxml代码:
<view class="page">
<import src="../../components/catering-item/catering-item.wxml" />
<!-- 左侧滚动栏 -->
<view class='under_line'></view>
<view class="body">
<view style='float: left' class='left'>
<scroll-view scroll-y scroll-with-animation scroll-left="{{scrollLength}}" class='scrollY' style='height: {{winHeight}}px'>
<view class='all clear'>
<block wx:key="tabs" wx:for="{{tabs}}">
<view bindtap='jumpIndex' data-menuindex='{{index}}'data-anchor='{{item.anchor}}'>
<view class="text-style {{indexId==index?' activeView':''}}">
<text class="{{indexId==index?'active1':''}}">{{item.title}}</text>
</view>
</view>
</block>
</view>
</scroll-view>
</view>
<view class="right" style='height: {{winHeight}}px'>
<scroll-view scroll-y scroll-with-animation scroll-left="{{scrollLength}}" bindscroll="scrollToLeft" scroll-into-view="{{toTitle}}" class='scrollRight' style='height: {{winHeight}}px'>
<block wx:key="tabs" wx:for="{{tabs}}">
<view id="view-{{item.anchor}}">
<view class="title" id="title-{{item.anchor}}">{{item.title}}</view>
<view class="orders" wx:for="{{tabsList[item.anchor]}}">
<template is="cateringItem" data="{{...item}}" />
</view>
</view>
</block>
</scroll-view>
</view>
</view>
</view>
2.wxss代码:
@import "../../components/catering-item/catering-item.wxss";
/* pages/catering.wxss */
.page {
display: flex;
flex-direction: column;
width: 100%;
/* background: #F7F4F8; */
background-image: linear-gradient(90deg, #FCFCFC 0%, #FCFCFC 99%);
/* padding-top: 16px; */
}
.under_line{
width: 100%;
border-top: 1rpx solid #efefef;
}
::-webkit-scrollbar{
width: 0;
height: 0;
color: transparent;
}
.body{
display: flex;
width: 100%;
}
.scrollY {
width: 200rpx;
/* position: fixed;
left: 0;
top: 0; */
background: #F5F5F5;
/* border-right: 1rpx solid #efefef; */
}
/* scrollRight{
flex: 1;
} */
.right{
flex: 1;
/* height: 200rpx; */
/* background: #00FF00; */
}
.left {
border-top: 1rpx solid #efefef;
border-right: 1rpx solid #efefef;
}
.text-style {
width: 200rpx;
height: 100rpx;
line-height: 100rpx;
text-align: center;
font-size: 28rpx;
font-family: PingFangSC-Semibold;
color: rgba(51, 51, 51, 1);
}
.active1 {
color: #E5D1A9;
/* background: #FFF; */
}
.activeView{
background: #FFF;
}
.active {
display: block;
width: 50rpx;
height: 6rpx;
background: #E5D1A9;
position: relative;
left: 75rpx;
bottom: 30rpx;
}
.title{
margin-left: 32rpx;
padding-top: 16rpx;
font-size: 28rpx;
/* padding-bottom: 16rpx; */
}
3.js代码
// pages/catering.js
Page({
/**
* 页面的初始数据
*/
data: {
tabs: [
{ title: '特惠', anchor: 'a', },
{ title: '必点', anchor: 'b', },
{ title: '营养汤', anchor: 'c', },
{ title: '主食', anchor: 'd', },
{ title: '套餐', anchor: 'e', },
{ title: '饮料', anchor: 'f', },
],
tabsList: {
a: [{
price: 10.1, anchor: "a", index: 0, num: 0
}, {
price: 10.2, anchor: "a", index: 1, num: 0
},
{
price: 10.3, anchor: "a", index: 2, num: 0
},],
b: [{
price: 10.4, anchor: "b", index: 0, num: 0
}, {
price: 10.5, anchor: "b", index: 1, num: 0
},
{
price: 10.6, anchor: "b", index: 2, num: 0
},],
c: [{
price: 10.7, anchor: "c", index: 0, num: 0
}, {
price: 10.8, anchor: "c", index: 1, num: 0
},
{
price: 10.9, anchor: "c", index: 2, num: 0
},],
d: [{
price: 11.0, anchor: "d", index: 0, num: 0
}, {
price: 11.1, anchor: "d", index: 1, num: 0
},
{
price: 11.2, anchor: "d", index: 2, num: 0
},],
e: [{
price: 11.3, anchor: "e", index: 0, num: 0
}, {
price: 11.4, anchor: "e", index: 1, num: 0
},
{
price: 11.5, anchor: "e", index: 2, num: 0
},],
f: [{
price: 11.6, anchor: "f", index: 0, num: 0
}, {
price: 11.7, anchor: "f", index: 1, num: 0
},
{
price: 11.8, anchor: "f", index: 2, num: 0
},]
},
indexId: 0,
toTitle:"title-c",
scrollTop:0,
top:[],
},
// 左侧点击事件
jumpIndex(e) {
let index = e.currentTarget.dataset.menuindex;
let anchor = e.currentTarget.dataset.anchor;
let that = this
that.setData({
indexId: index,
toTitle: "title-" + anchor
});
//可以设置定位事件
},
scrollToLeft(res){
console.log("scrollToLeft-res:" + JSON.stringify(res) + JSON.stringify(this.data.top));
// let top=res.detail.scrollTop;
this.setData({
scrollTop: res.detail.scrollTop
})
var length = this.data.top.length;
for(var i=0;i<this.data.top.length;i++){
if (this.data.top[i] - this.data.top[0] <= this.data.scrollTop && (i < length - 1 && this.data.top[i + 1] - this.data.top[0] > this.data.scrollTop)){
if(this.data.indexId!=i){
this.setData({
indexId: i,
});
}
}
}
// console.log("top:"+top);
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
var that = this
wx.getSystemInfo({
success: function (res) {
that.setData({
winHeight: res.windowHeight
});
var top2=new Array();
for(var i=0;i<that.data.tabs.length;i++){
wx.createSelectorQuery().select('#view-' + that.data.tabs[i].anchor).boundingClientRect(function (rect) {
var isTop=Number(rect.top);
top2.push(isTop);
console.log("view-c:" + JSON.stringify(rect));
}).exec();
}
that.setData({
top: top2
});
}
});
},
})
说明:
wxml中的template是菜品的item,可根据自己的需求进行定义。
使用到scroll-view的scroll-into-view属性用于对左侧菜单种类点击定位到右侧菜单的具体位置,js中的jumpIndex为用户点击左侧菜单,对应选中位置改变,和对右侧菜单进行定位。
js中scrollToLeft用于实现用户滚动右侧菜单,对左侧菜单分类进行定位操作,主要思想是将右侧菜单中的种类标签的top位置记录下来,当右侧scroll-view滑动的位置小于等于某一个top,而大于下一个top时,则更换左侧种类菜单到指定位置。
来源:https://blog.csdn.net/Grance2016/article/details/106641591


猜你喜欢
- 对比起Cookie,Session 是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制。由于 Session 是以
- QQ影音新版发布官网Banner经过两周的酝酿、脑爆与设计调整,于20日顺利上线,连续7天,经历了昨天激动人心的最后发布,到此告一段落,这里
- 默认本系列的的读者已经初步熟悉tensorflow。我们通过tf.Variable构造一个variable添加进图中,Variable()构
- 本文实例为大家分享了python+opencv实现堆叠图片的具体代码,供大家参考,具体内容如下# import cv2# import nu
- python使用ctypes模块调用windows api GetVersionEx获取当前系统版本,没有使用python32#!c:/py
- 一个改进的仿google页面拖拽效果,移植方便。web2.0网站经常会用有这个拖拽页面布局的功能,如果你也想给你的网站加上这个有趣的功能,不
- Q: 不知xml和html有什么区别?它们不同在哪? A: 关于XML和HTML区别请参考: http://www.w3c.org/Mark
- 问题描述:很多网站会对用户发帖内容进行一定的检查,并自动把敏感词修改为特定的字符。技术要点:1)Python正则表达式模块re的sub()函
- 废话不多说,直接给大家贴代码了,具体代码如下所示,关键代码如下:<!DOCTYPE html> <html lang=&q
- 本文内容是在《Python核心编程2》上看到的,感觉很有用便写出来,给大家参考参考!浅拷贝首先我们使用两种方式来拷贝对象,一种是切片,另外一
- 以下是Python基础学习内容的学习笔记的全部内容,非常的详细,如果你对Python语言感兴趣,并且针对性的系统学习一下基础语言知识,下面的
- 一 distinct含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct
- 对于比较长的数字组成的字符串,我们一般会用逗号(,)隔开来格式化数字,从右往左每三个数字用一个逗号分组隔开。为什么要用逗号隔开数字呢?因为当
- MySQL的ODBC接口实现是通过安装MyODBC驱动,这个驱动程序是跨平台的。如果在Linux等Unix体系操作系统下使用,需要先安装Io
- 实现思路1、场地部署:我们需要拥有一个可以用来画节点的地方!详看我这篇文章QGraphicsScene、QGraphicsView的基础使用
- 作者: Terrance译者:Sheneyan(子乌)时间:2010.2.6英文原文:13 Useful WordPress SQL Que
- 最近用sysbench进行了较多的性能测试,也总结一下它的特点和用法和需要注意的事项。sysbench是一个多线程性能测试工具,可以进行CP
- 我就废话不多说了,大家还是直接看代码吧~print({1, 2} > {1}) # True补充:Python——集合是一个非常之牛逼
- IPython + ptpython,完美体验首先是安装pip install ipython ptpython然后使用ptipython有
- 问题描述在电脑中重新安装Anaconda3&PyCharm后,运行原来的程序画图时出现了下图界面。不能弹出如下图所示的“figure”窗口。