scroll-view 实现自定义模块的横向滑动(到屏幕的中间显示)

想要实现的功能是:一个横向的tab栏,点击item的时候,item自动滚动到屏幕的中间展示,有想过用vant的插件库来实现,但是那个不支持自定义内容,所以只好自己实现了。

效果图展示:
在这里插入图片描述
代码实现:
.wxml

<view class="container">
  <scroll-view id = "scroll-view" scroll-into-view="{{itemview}}" scroll-x class="scroll-x" scroll-left="{{scrollLeft}}"  scroll-with-animation="true" bindscroll="scrollMove">
  <view  wx:for="{{datalist}}" wx:key="index" class="view-parent">
    <view id="{{'item'+index}}"  bindtap="dianji" class="view-item{{selectItemIndex == index?'on':''}}" data-index="{{index}}">{{item.date}}</view>
  </view>
</scroll-view>

</view>

.wxss

/* pages/login/login.wxss */
.container {
  display: flex;
  flex-direction: column;
  width: 100%;
  height: 100%h;
}

.scroll-x{
  height:80px;
  white-space:nowrap;
  display:flex;
}
/* 隐藏scrollbar */
::-webkit-scrollbar{
  width: 0;
  height: 0;
  color: transparent;
}
.view-parent{
  display:inline-block;
}
.view-item{
  width:50px;
  height:50px;
  display:flex;
  align-items:center;
  justify-content:center;
  font-size:12px;
  font-color:#222222;
  background:#80CBC4;
  margin:10px;
}
.view-itemon{
  width:70px;
  height:70px;
  display:flex;
  align-items:center;
  justify-content:center;
  font-size:12px;
  font-color:#222222;
  background:#80cb99;
  margin:10px;
}

.js

data: {
    scrollLeft: 0,
    selectItemIndex: 7,
    itemview: 'item7',
    value: '',
    datalist: [{
        date: "1",
        week: "日"
      },
      {
        date: "2",
        week: "六"
      },
      {
        date: "3",
        week: "五"
      },
      {
        date: "4",
        week: "四"
      },
      {
        date: "5",
        week: "一"
      },
      {
        date: "6",
        week: "二"
      },
      {
        date: "7",
        week: "三"
      },
      {
        date: "8",
        week: "三"
      },
      {
        date: "9",
        week: "三"
      },
      {
        date: "10",
        week: "三"
      },
      {
        date: "11",
        week: "三"
      },
      {
        date: "12",
        week: "三"
      },
      {
        date: "13",
        week: "三"
      },
      {
        date: "14",
        week: "三"
      },
      {
        date: "15",
        week: "三"
      },
    ],
  },
  dianji: function (event) {
    console.log(event)
    var itemid = event.target.id;
    var index = event.target.dataset.index;
    this.setData({
      selectItemIndex: index,
    })
    var ele = itemid
    this.getRect('#' + ele)
  },
  getRect: function (ele) {
    var that = this
    wx.createSelectorQuery().select(ele).boundingClientRect(function (rect) {
      console.log(JSON.stringify(rect))
      //获取屏幕的宽度的一半
      var screen = wx.getSystemInfoSync().windowWidth/2;
      //获取点击item的左边坐标
      var left = rect.left;
      //获取item的宽度de 一半
      var subhalfwidth= rect.width/2
      //需要scrollview 移动的距离是
      var juli = left-screen
      var zuizhongjuli = juli+subhalfwidth
      that.setData({
        scrollLeft:that.data.scrollLeft+=zuizhongjuli
      })
    }).exec()
  },
  
  scrollMove(e) {
    console.log(e)
    var scrollLeft = e.detail.scrollLeft;
    this.data.scrollLeft = scrollLeft
  },

实现的思路就是点击item的时候记录item左边的坐标和item的宽度,这样就可以计算出item滑动到屏幕的中间需要多少距离,然后去调用scroll-view的滑动方法就可以了,代码的重点展示:

 wx.createSelectorQuery().select(ele).boundingClientRect(function (rect) {
      console.log(JSON.stringify(rect))
      //获取屏幕的宽度的一半
      var screen = wx.getSystemInfoSync().windowWidth/2;
      //获取点击item的左边坐标
      var left = rect.left;
      //获取item的宽度de 一半
      var subhalfwidth= rect.width/2
      //需要scrollview 移动的距离是
      var juli = left-screen
      var zuizhongjuli = juli+subhalfwidth
      that.setData({
        scrollLeft:that.data.scrollLeft+=zuizhongjuli
      })
    }).exec()
使用scroll-view让多个view横向滑动的方法如下: 1. 在scroll-view组件上设置scroll-x属性为true,表示横向滚动。 2. 在scroll-view组件上设置class属性为"moduleView",并在对应的wxss样式文件中添加.moduleView样式,设置white-space为nowrap,表示子view不换行。 3. 在子view组件上设置class属性为"modulItemView",并在对应的wxss样式文件中添加.modulItemView样式,设置display为inline-block,表示子view以行内块元素的方式排列。 示例代码如下: ```html <scroll-view scroll-x class="moduleView"> <view class="modulItemView">1</view> <view class="modulItemView">2</view> <view class="modulItemView">3</view> </scroll-view> ``` 在上述代码中,scroll-view组件设置了scroll-x属性为true,表示横向滚动。同时,scroll-view组件的class属性为"moduleView",子view组件的class属性为"modulItemView"。在对应的wxss样式文件中,添加了.moduleView样式和.modulItemView样式,分别设置了white-space为nowrap和display为inline-block。 这样,多个子view就可以在scroll-view组件中横向滑动了。 #### 引用[.reference_title] - *1* [uniapp - 使用 <scroll-view> 内置组件,实现容器 “横向 / 纵向“ 区域内滚动功能(详细示例教程)](https://blog.csdn.net/weixin_44198965/article/details/129857990)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [微信小程序 scroll-view设置scroll-x无法横向显示滑动的解决方案](https://blog.csdn.net/wshpwangshiyu/article/details/130964682)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值