本人新手,最近在做小程序的时候,遇到这么个需求。参考站内大神的方法,要么看不懂,要么有BUG,最终结合大神们的做法,好歹实现了功能,暂时没有遇到BUG。
主要参考:https://blog.csdn.net/qq_37870901/article/details/83269608
完成的界面如下:
说一下主要的修改:
1.关于页面高度,获取屏幕的高度,动态改变height即可
2.关于联动不吻合的bug,尝试了很久,发现之所以有这个bug,是因为设备不同,px显示的也是不同,根据测试,和屏幕的宽度有关??也不知道为什么。最终采用 wx.createSelectorQuery()方法直接获取view的高度。
view选的是右边内容的所有每一块,获取到的数组为每一块的高度(不是长度)
比如0–500—1000—1300,这里500、1000、1300是高度,500-0、1000-500、1300-1000才是长度
我本想直接用高度来判断联动,奈何水平有限,尝试了N个方法都没有成功,索性还是改成参考的方法,用长度
最后就是修改参考的方法,成功实现联动
3.还有些小bug,比如加载完页面点击的第一个无效,所以在onLoad函数中直接获取长度,此处06就是item的个数
还有就是点击左边会造成右边显示不正确,在点击左边事件中添加如下
最后放上代码,图片随意加个试试看吧
wxml
<view class='main'>
<view class='left'>
<scroll-view scroll-y="true" style="height: {{screenHeight}}px" scroll-into-view="true" scroll-with-animation="true">
<block wx:for="{{leftText}}" wx:for-list="item">
<view class="{{classfiySelect == item.id?'active':'default'}}" data-id='{{item.id}}' bindtap='left_list'>
<image src='{{item.img_url}}'></image>
<text>{{item.text1}}</text>
</view>
</block>
</scroll-view>
</view>
<view class='right'>
<scroll-view scroll-y="true" style="height: {{screenHeight}}px" bindscroll="scroll" scroll-top="{{scrollTop}}" scroll-into-view="{{'inToview'+rigId}}" scroll-with-animation="true">
<block wx:for="{{rightData}}" wx:for-list="item">
<view class="listHeight">
<view class='itemTitle' id="{{'inToview'+item.id}}">{{item.title}}</view>
<view class='listItem' data-id='{{item.id}}'>
<block wx:for="{{item.frist}}">
<view class='img'>
<image src='{{item.url}}' mode="widthFix"></image>
</view>
<view class='listText'>
<text>{{item.text}}</text>
</view>
</block>
</view>
</view>
</block>
</scroll-view>
</view>
</view>
wxss
.active{
color: rgb(255, 0, 0);
opacity: 0.7;
text-shadow: 2rpx 2rpx 2rpx rgb(160, 42, 42);
}
.default{
color: rgb(173, 173, 173);
}
.main{
display: flex;
}
.left{
font-size: 30rpx;
width: 20%;
background-color: rgb(79, 77, 83);
position: fixed;
}
.left view{
padding-top: 30rpx;
text-align: center;
height: 100rpx;
display: flex;
flex-direction: column;
align-items: center;
}
.left image{
width: 50rpx;
height: 50rpx;
}
.right{
position: absolute;
right: 0;
width: 80%;
}
.listItem .img{
width: 100%;
text-align: center;
padding-top: 10rpx;
}
.listItem .img image{
width: 100%;
}
.itemTitle{
font-size: 50rpx;
font-weight: bold;
padding-left: 20rpx;
padding-top: 20rpx;
color:rgb(28, 0, 41);
}
::-webkit-scrollbar
{
width: 6px;
height: 6px;
background-color: #ffffff;
}
::-webkit-scrollbar-track{
height: 20rpx;
color: black;
}
JS
Page({
data: {
heightArr: 0,
classfiySelect: "",
leftText: [{
id: "01",
text1: "标题1",
img_url: "/images/icon.png",
},
{
id: "02",
text1: "标题2",
img_url: "/images/icon.png",
},
{
id: "03",
text1: "标题3",
img_url: "/images/icon.png",
},
{
id: "04",
text1: "标题4",
img_url: "/images/icon.png",
},
{
id: "05",
text1: "标题5",
img_url: "/images/icon.png",
},
{
id: "06",
text1: "标题6",
img_url: "/images/icon.png",
},
],
rightData: [{
id: "01",
title: "内容1",
frist: [{
url: "/images/demo1.jpg",
text: "文字说明1",
},
{
url: "/images/demo2.jpg",
text: "文字说明2",
},
],
},
{
id: "02",
title: "内容2",
frist: [{
url: "/images/demo1.jpg",
text: "文字说明1",
},
],
},
{
id: "03",
title: "内容3",
frist: [{
url: "/images/demo1.jpg",
text: "文字说明1",
},
{
url: "/images/demo2.jpg",
text: "文字说明2",
},
],
},
{
id: "04",
title: "内容4",
frist: [{
url: "/images/demo1.jpg",
text: "文字说明1",
},
{
url: "/images/demo2.jpg",
text: "文字说明2",
},
],
},
{
id: "05",
title: "内容5",
frist: [{
url: "/images/demo1.jpg",
text: "文字说明1",
},
{
url: "/images/demo2.jpg",
text: "文字说明2",
},
],
},
{
id: "06",
title: "内容6",
frist: [{
url: "/images/demo1.jpg",
text: "文字说明1",
},
{
url: "/images/demo2.jpg",
text: "文字说明2",
},
{
url: "/images/demo2.jpg",
text: "文字说明3",
},
],
},
],
},
onLoad: function (options) {
var sysInfo = wx.getSystemInfoSync();
this.setData({
classfiySelect: this.data.leftText[0].id,
screenHeight: sysInfo.windowHeight
})
this.length('06')
},
//滚动触发
scroll: function (e) {
var scrollTop = e.detail.scrollTop,
h = 0,
classfiySelect;
var that = this;
that.data.leftText.forEach(function (clssfiy, i) {
var _h = that.length(clssfiy['id']);
if (scrollTop >= h) {
classfiySelect = clssfiy['id'];
}
h += _h;
console.log("滚动高度:", scrollTop);
console.log("高度差:", that.data.heightArr)
})
that.setData({
classfiySelect: classfiySelect,
})
},
//求每一栏高度
length: function (e) {
var query = wx.createSelectorQuery();
//选择id
var that = this;
var rightData = that.data.rightData;
var heightArr = [];
for (var i = 0; i < rightData.length; i++) {
if (rightData[i]['id'] == e) {
query.selectAll('.listHeight').boundingClientRect(function (n) {
var s = 0;
n.forEach((res) => {
s += res.height;
heightArr.push(s)
});
var arr1 = heightArr;
var arr2 = [];
arr2.push(arr1[0]);
for (var j = 1; j <= arr1.length - 1; j++) {
arr2.push(arr1[j] - arr1[j - 1])
}
that.setData({
heightArr: arr2
})
}).exec()
return that.data.heightArr[i]
}
}
},
//点击左边事件
left_list: function (e) {
var that = this;
var l_id = e.currentTarget.dataset.id;
that.setData({
rigId: l_id,
classfiySelect: l_id
})
//console.log(l_id)
},
})
作为新手,真的研究了好久,有问题欢迎一起探讨!