微信小程序點(diǎn)擊item使之滾動(dòng)到屏幕中間位置
1.需求

想做類似貓眼電影選場(chǎng)次會(huì)自動(dòng)滾動(dòng)到屏幕中間的效果
如圖是最終效果
2.分析
實(shí)現(xiàn)這種效果的方法有三種:
1.直接使用原生CSS+js;
2.使用swiper,一屏顯示多個(gè)item,點(diǎn)擊item會(huì)自動(dòng)滾動(dòng)到中間
3.使用微信的scroll-view配合JS實(shí)現(xiàn)
權(quán)衡了一下最終選擇了第三個(gè)方案,比較是微信自帶的方法,使用起來會(huì)比較流暢,swiper的話會(huì)比較臃腫,原生的話就比較麻煩,需要考慮的兼容問題比較多。
3.代碼
wxml
<view class="items-box">
<scroll-view class="scroll-view_H" scroll-x="true" style="width: 100%" bindscroll="scrollMove" scroll-left='{{scrollLeft}}' scroll-with-animation="true">
<view class="scroll-wrapper">
<view id="scroll-item-{{index}}" class="item-pic {{selectItemIndex==index?'on':''}}" wx:for="{{ticketDetails}}" wx:key="index" bindtap="selectItem" data-index="{{index}}" data-name="{{item.TicketTitle}}" data-ticketid='{{item.TicketId}}'>
<image src='{{imgUrl}}{{item.TicketPostImg}}'></image>
</view>
</view>
</scroll-view>
</view>
<view class="item-name" hidden="{{!selectItemName}}">{{selectItemName}}</view>
wxss
.items-box .item-pic image {
width: 90rpx;
height: 120rpx;
}
.items-box .item-pic.on image {
width: 110rpx;
height: 148rpx;
border: 4rpx solid #2bb7b3;
box-sizing: border-box;
}
.items-box .item-pic {
margin: 0 20rpx;
}
.items-box .item-pic:first-child{
padding-left: 300rpx
}
.items-box .item-pic:last-child{
padding-right: 300rpx
}
.item-name {
padding: 18rpx 0;
background-color: #fff;
font-size: 24rpx;
font-weight: 500;
color: #232324;
text-align: center;
}
.items-box .scroll-wrapper {
align-items: flex-end;
padding: 32rpx 0 0 0;
}
.items-box .scroll-view_H {
border: none;
background-color: #edeff1;
}
js
data:{
moveParams: {
scrollLeft: 0
}
}
getRect(ele) {
//獲取點(diǎn)擊元素的信息,ele為傳入的id
var that = this;
//節(jié)點(diǎn)查詢
wx.createSelectorQuery().select(ele).boundingClientRect(function (rect) {
console.log(rect)
let moveParams = that.data.moveParams;
moveParams.subLeft = rect.left;
moveParams.subHalfWidth = rect.width / 2;
that.moveTo();
}).exec()
},
moveTo: function () {
let subLeft = this.data.moveParams.subLeft;
let screenHalfWidth = this.data.moveParams.screenHalfWidth;
let subHalfWidth = this.data.moveParams.subHalfWidth;
let scrollLeft = this.data.moveParams.scrollLeft;
let distance = subLeft - screenHalfWidth + subHalfWidth;
scrollLeft = scrollLeft + distance;
this.setData({
scrollLeft: scrollLeft
})
},
scrollMove(e) {
let moveParams = this.data.moveParams;
moveParams.scrollLeft = e.detail.scrollLeft;
this.setData({
moveParams: moveParams
})
},
//選擇項(xiàng)目
selectItem: function (e) {
let ele = 'scroll-item-' + e.currentTarget.dataset.index
this.getRect('#' + ele);
},
首先獲取屏幕的寬度,再獲取點(diǎn)擊元素的寬度,計(jì)算一下就可以獲得應(yīng)該滾動(dòng)的距離,再更改scroll-left='{{scrollLeft}}'即可
微信獲取元素寬高的方法
wx.createSelectorQuery().select(ele).boundingClientRect(function (rect) {
}).exec()
https://developers.weixin.qq.com/miniprogram/dev/api/wxml/wx.createSelectorQuery.html
總結(jié)
到此這篇關(guān)于微信小程序點(diǎn)擊item使之滾動(dòng)到屏幕中間的文章就介紹到這了,更多相關(guān)微信小程序item滾動(dòng)到屏幕中間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用js閉包的方法實(shí)現(xiàn)多點(diǎn)標(biāo)注冒泡示例
這篇文章主要介紹了用js閉包的方法實(shí)現(xiàn)多點(diǎn)標(biāo)注冒泡,需要的朋友可以參考下2014-05-05
JavaScript實(shí)現(xiàn)淘寶商品圖切換效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)淘寶商品圖切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
iframe高度自適應(yīng)及隱藏滾動(dòng)條的實(shí)例詳解
這篇文章主要介紹了iframe高度自適應(yīng)及隱藏滾動(dòng)條的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09
JavaScript導(dǎo)出CSV文件不完整的問題解決方法
在JavaScript中處理CSV文件時(shí),需要特別注意一些特殊字符,例如逗號(hào)、雙引號(hào)、換行符等,這些字符可能會(huì)影響CSV文件的解析,導(dǎo)致數(shù)據(jù)錯(cuò)亂,所以本文給大家介紹了如何解決JavaScript導(dǎo)出CSV文件不完整的問題,需要的朋友可以參考下2024-06-06
Bootstrap網(wǎng)頁布局網(wǎng)格的實(shí)現(xiàn)
柵格就是網(wǎng)格,本文詳細(xì)的介紹了Bootstrap網(wǎng)頁布局網(wǎng)格的原理和實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
JavaScript實(shí)現(xiàn)異步任務(wù)循環(huán)順序執(zhí)行詳解
這篇文章主要為大家詳細(xì)介紹了JavaScript中實(shí)現(xiàn)異步任務(wù)循環(huán)順序執(zhí)行的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-03-03
利用hasOwnProperty給數(shù)組去重的面試題分享
obj.hasOwnProperty(attr) 判斷是否是原型中的屬性,false就是原型中的屬性,下面這篇文章主要給大家介紹了一道利用hasOwnProperty給數(shù)組去重的面試題,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-11-11

