版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】小程序如何實(shí)現(xiàn)列表滾動(dòng)上下聯(lián)動(dòng)效果
這篇文章主要為大家展示了“小程序如何實(shí)現(xiàn)列表滾動(dòng)上下聯(lián)動(dòng)效果”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓在下帶領(lǐng)大家一起研究并學(xué)習(xí)一下“小程序如何實(shí)現(xiàn)列表滾動(dòng)上下聯(lián)動(dòng)效果”這篇文章吧。最近在做公司的一款小程序,其中有一塊的設(shè)計(jì)的是在列表做上下滾動(dòng)的是時(shí)候,頂部的tab欄跟著一起聯(lián)動(dòng),當(dāng)點(diǎn)擊tab欄的時(shí)候,列表數(shù)據(jù)也跟隨聯(lián)動(dòng)。頂部的頭部區(qū)域不跟隨列表滾動(dòng);
頭部區(qū)域以下屬于滾動(dòng)區(qū)域。2.1原理介紹這個(gè)地方的實(shí)現(xiàn)主要借助了微信小程序原生的scroll-view組件。使用它的scroll-into-view屬性,可以實(shí)現(xiàn)點(diǎn)擊頂部的tab欄,將頁面滾動(dòng)到指定的列表位置;使用bindscroll事件,可以知道當(dāng)前頁面滾動(dòng)的距離,根據(jù)滾動(dòng)的距離做tab欄的切換操作;2.1頁面布局代碼先說下界面的整體布局,主要分為兩部分,頭部固定區(qū)域+可滾動(dòng)列表區(qū)域??蓾L動(dòng)的列表區(qū)域的標(biāo)題欄當(dāng)滾動(dòng)一定的距離后,它也要固定在頂部。代碼實(shí)現(xiàn):<!--index.wxml-->
<view
class="list">
<!--頂部固定區(qū)域-->
<view
style="height:
88rpx;width:
100%;background-color:
burlywood;text-align:
center;">頭部區(qū)域</view>
<!--可滾動(dòng)區(qū)域-->
<scroll-view
scroll-y="true"
style="width:
100%;
height:
{{scrollAreaHeight}}px;"
bindscroll="scroll"
scroll-into-view="{{scrollToItem}}"
scroll-with-animation="true"
scroll-top="{{scrollTop}}">
<!--水平滾動(dòng)的tab欄-->
<scroll-view
scroll-x="true"
style="height:
88rpx;width:
100%;">
<view
class="head-area
{{float
?
'head-float'
:
''}}"
>
<view
class="head-area-item
{{curSelectTab
===
index
?
'head-area-item-select'
:
''}}"
wx:for="{{appGroupList}}"
bindtap="tabClick"
data-index="{{index}}">
{{}}
</view>
</view>
</scroll-view>
<!--數(shù)據(jù)列表-->
<view
class="list-group"
style="height:
{{listGroupHeight}}px;">
<view
class="list-group-item"
id="v_{{index}}"
wx:for="{{appGroupList}}"
data-index="{{index}}">
<view
class="group-name">
{{}}
</view>
<view
class="group-children"
>
<view
wx:for="{{item.children}}"
class="group-children-item"
style="width:
{{itemWidth}}px;">
<image
src="{{item.url}}"></image>
<view>{{}}</view>
</view>
</view>
</view>
</view>
</scroll-view>
</view>在布局代碼中有幾個(gè)點(diǎn)需要注意:1、scrollAreaHeight滾動(dòng)區(qū)域的高度計(jì)算。通過獲取當(dāng)前設(shè)備的窗口高度減去頂部固定區(qū)域的高度2、水平tab欄是否置頂。根據(jù)頁面的滾動(dòng)距離來判斷,如果滾動(dòng)距離大于或者等于水平tab欄的高度,則置頂;3、設(shè)置數(shù)據(jù)列表的id="v_{{index}}"id,后續(xù)點(diǎn)擊tab欄滾動(dòng)到指定的位置就是根據(jù)這個(gè)id去實(shí)現(xiàn)的。2.2樣式代碼/**index.wxss**/
.list{
width:
100%;
height:
100%;
display:
flex;
flex-direction:
column;
}
.head-area{
display:
flex;
flex-direction:
row;
flex-wrap:
nowrap;
height:
88rpx;
width:
100%;
padding:
0
10;
}
.head-area-item{
display:
flex;
height:
88rpx;
text-align:
center;
width:
150rpx;
align-items:
center;
justify-content:
center;
}
.head-area-item-select{
color:
#09bb07;
}
image{
width:
88rpx;
height:
88rpx;
}
.list-group{
display:
flex;
width:
100%;
height:
1000%;
flex-direction:
column;
}
.list-group-item{
display:
flex;
width:
100%;
background-color:
#aaa;
flex-direction:
column;
}
.group-name{
height:
88rpx;
display:
flex;
text-align:
center;
align-items:
center;
margin-left:
20rpx;
}
.group-children{
display:
flex;
flex-direction:
row;
flex-wrap:
wrap;
width:
100%;
}
.group-children-item{
height:
160rpx;
display:
flex;
flex-direction:
column;
justify-content:
center;
align-items:
center;
}
.head-float{
position:
fixed;
top:
88rpx;
background-color:
#ffffff;
}2.3邏輯代碼//
index.js
Page({
heightArr:
[],
//記錄scroll-view滾動(dòng)過程中距離頂部的高度
distance:
0,
data:
{
appGroupList:[
{name:"分組01",children:[{"name":"測(cè)試0","url":"/images/bluetooth.png"},
{"name":"測(cè)試1","url":"/images/bluetooth.png"},
{"name":"測(cè)試2","url":"/images/bluetooth.png"},
{"name":"測(cè)試3","url":"/images/bluetooth.png"},
{"name":"測(cè)試4","url":"/images/bluetooth.png"},
{"name":"測(cè)試5","url":"/images/bluetooth.png"},
{"name":"測(cè)試6","url":"/images/bluetooth.png"},
{"name":"測(cè)試7","url":"/images/bluetooth.png"}]},
{name:"分組02",children:[{"name":"測(cè)試0","url":"/images/bluetooth.png"},
{"name":"測(cè)試1","url":"/images/bluetooth.png"},
{"name":"測(cè)試2","url":"/images/bluetooth.png"},
{"name":"測(cè)試3","url":"/images/bluetooth.png"},
{"name":"測(cè)試4","url":"/images/bluetooth.png"},
{"name":"測(cè)試5","url":"/images/bluetooth.png"},
{"name":"測(cè)試6","url":"/images/bluetooth.png"},
{"name":"測(cè)試7","url":"/images/bluetooth.png"}]},
{name:"分組03",children:[{"name":"測(cè)試0","url":"/images/bluetooth.png"},
{"name":"測(cè)試1","url":"/images/bluetooth.png"},
{"name":"測(cè)試2","url":"/images/bluetooth.png"},
{"name":"測(cè)試3","url":"/images/bluetooth.png"},
{"name":"測(cè)試4","url":"/images/bluetooth.png"},
{"name":"測(cè)試5","url":"/images/bluetooth.png"},
{"name":"測(cè)試6","url":"/images/bluetooth.png"},
{"name":"測(cè)試7","url":"/images/bluetooth.png"}]},
{name:"分組04",children:[{"name":"測(cè)試0","url":"/images/bluetooth.png"},
{"name":"測(cè)試1","url":"/images/bluetooth.png"},
{"name":"測(cè)試2","url":"/images/bluetooth.png"},
{"name":"測(cè)試3","url":"/images/bluetooth.png"},
{"name":"測(cè)試4","url":"/images/bluetooth.png"},
{"name":"測(cè)試5","url":"/images/bluetooth.png"},
{"name":"測(cè)試6","url":"/images/bluetooth.png"},
{"name":"測(cè)試7","url":"/images/bluetooth.png"}]},
{name:"分組05",children:[{"name":"測(cè)試0","url":"/images/bluetooth.png"},
{"name":"測(cè)試1","url":"/images/bluetooth.png"},
{"name":"測(cè)試2","url":"/images/bluetooth.png"},
{"name":"測(cè)試3","url":"/images/bluetooth.png"},
{"name":"測(cè)試4","url":"/images/bluetooth.png"},
{"name":"測(cè)試5","url":"/images/bluetooth.png"},
{"name":"測(cè)試6","url":"/images/bluetooth.png"},
{"name":"測(cè)試7","url":"/images/bluetooth.png"}]},
],
itemWidth:
wx.getSystemInfoSync().windowWidth
/
4,
scrollAreaHeight:wx.getSystemInfoSync().windowHeight
-
44,
float:false,
curSelectTab:0,
scrollToItem:null,
scrollTop:
0,
//到頂部的距離
listGroupHeight:0,
},
onReady:
function
()
{
this.cacluItemHeight();
},
scroll:function(e){
console.log("scroll:",e);
if(e.detail.scrollTop>=44){
this.setData({
float
:
true
})
}
else
if(e.detail.scrollTop<44)
{
this.setData({
float
:
false
})
}
let
scrollTop
=
e.detail.scrollTop;
let
current
=
this.data.curSelectTab;
if
(scrollTop
>=
this.distance)
{
//頁面向上滑動(dòng)
//列表當(dāng)前可視區(qū)域最底部到頂部的距離
超過
當(dāng)前列表選中項(xiàng)距頂部的高度(且沒有下標(biāo)越界),則更新tab欄
if
(current
+
1
<
this.heightArr.length
&&
scrollTop
>=
this.heightArr[current])
{
this.setData({
curSelectTab:
current
+
1
})
}
}
else
{
//頁面向下滑動(dòng)
//如果列表當(dāng)前可視區(qū)域最頂部到頂部的距離
小于
當(dāng)前列表選中的項(xiàng)距頂部的高度,則切換tab欄的選中項(xiàng)
if
(current
-
1
>=
0
&&
scrollTop
<
this.heightArr[current
-
1])
{
this.setData({
curSelectTab:
current
-
1
})
}
}
//更新到頂部的距離
this.distance
=
scrollTop;
},
tabClick(e){
this.setData({
curSelectTab:
e.currentTarget
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 新員工培訓(xùn)匯報(bào)
- 大班科學(xué)活動(dòng)仿生現(xiàn)象
- 名師班主任培訓(xùn)心得
- 數(shù)控車削加工技術(shù) 教案 項(xiàng)目十 螺紋車削工藝及編程
- 13.1 分子熱運(yùn)動(dòng)(6大題型)(含答案解析)
- 新疆喀什地區(qū)2024-2025學(xué)年高二上學(xué)期期中地理試卷(無答案)
- 廣東順德德勝學(xué)校2024-2025學(xué)年高二上學(xué)期10月月考英語試題(含答案無聽力原文及音頻)
- 2025屆湖北省部分高中高三上學(xué)期11月期中聯(lián)考數(shù)學(xué)試題(含答案)
- 2024-2025學(xué)年安徽省六安市裕安區(qū)六安九中九年級(jí)(上)月考物理試卷(10月份)(含答案)
- T-YNZYC 0106-2023 綠色藥材 烏天麻產(chǎn)地環(huán)境標(biāo)準(zhǔn)
- 幼兒園安全教育課件:《過馬路》
- 過橋墊資合同模板
- 個(gè)體戶經(jīng)營(yíng)章程
- 24春國家開放大學(xué)《市場(chǎng)調(diào)查》形考任務(wù)1-3參考答案
- 中醫(yī)康復(fù)技術(shù)操作規(guī)范標(biāo)準(zhǔn)
- 三年級(jí)口算3課件
- DZT0233-2011礦山地質(zhì)環(huán)境保護(hù)與恢復(fù)治理方案編制規(guī)范
- MOOC 中國文化概論-華南師范大學(xué) 中國大學(xué)慕課答案
- 風(fēng)能發(fā)電的電網(wǎng)接入技術(shù)
- 年回收30萬噸廢塑料PET破碎清洗線建設(shè)項(xiàng)目可行性研究報(bào)告
- 初中語文作文專項(xiàng)突破課講義
評(píng)論
0/150
提交評(píng)論