微信小程序侧边栏左右联动--亲测好用

本人新手,最近在做小程序的时候,遇到这么个需求。参考站内大神的方法,要么看不懂,要么有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)
  },

})

作为新手,真的研究了好久,有问题欢迎一起探讨!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值