最近開始做小程序,通讀一遍文檔再上手并不算難,但不得不說小程序里還是有一些坑。這里說一下如何實(shí)現(xiàn)頁面錨點(diǎn)跳轉(zhuǎn),一個(gè)城市列表的效果示意圖如下:
因?yàn)樵谖⑿判〕绦虻沫h(huán)境中不能想在瀏覽器里設(shè)置標(biāo)簽,或者操作dom滾動(dòng),傳統(tǒng)做法就行不通了,一切都得按小程序的文檔來。
一開始我們的做法是使用boundingClientRect()方法獲取每個(gè)錨點(diǎn)的坐標(biāo),然后再用wx.pageScrollTo()方法滑動(dòng)過去。結(jié)果發(fā)現(xiàn)效果不是很好,因?yàn)閎oundingClientRect方法返回的每個(gè)點(diǎn)的坐標(biāo)會(huì)隨著屏幕滑動(dòng)而變化,可能還會(huì)引起頁面抖動(dòng),最后還是選擇scroll-view(可滾動(dòng)視圖區(qū)域)組件來實(shí)現(xiàn)錨點(diǎn)效果。
具體實(shí)現(xiàn)
具體API就不贅述了,可以去看官方文檔,這里講幾個(gè)需要注意的地方,下面是一個(gè)示意的scroll-view組件代碼,上面的幾個(gè)屬性是必須的:
復(fù)制代碼代碼如下:
scroll-into-view:這個(gè)綁定了一個(gè)屬性,它的值應(yīng)該是頁面元素的id,設(shè)置它的值就可以跳轉(zhuǎn)到ID對(duì)應(yīng)的元素那里了。
scroll-y:添加這個(gè)屬性標(biāo)明是豎向滑動(dòng)的,對(duì)應(yīng)的scroll-x則表示橫向滑動(dòng),豎向滑動(dòng)時(shí)scroll-view必須設(shè)置一個(gè)固定的height
bindscroll:監(jiān)聽滑動(dòng),傳給他一個(gè)事件,滑動(dòng)時(shí)執(zhí)行該事件
文檔上給的屬性特別多,暫時(shí)只需要上述幾個(gè)就可實(shí)現(xiàn)我們想要的效果。實(shí)現(xiàn)原理也很簡(jiǎn)單,內(nèi)容部分,每個(gè)英文簡(jiǎn)寫的view設(shè)置一個(gè)id,然后在導(dǎo)航list那里點(diǎn)擊時(shí),就把scroll-into-view的值設(shè)置成點(diǎn)擊的那個(gè)id即可實(shí)現(xiàn)跳轉(zhuǎn)。
再說一下scroll-view的高度問題,這個(gè)一定要做適配的固定高度,不然在不同屏幕大小的手機(jī)上的顯示效果有差異。
獲取屏幕大小的代碼:height是個(gè)變量,獲取到的高度付給他,并反饋到頁面
onLoad: function (options) { var that = this // 獲取系統(tǒng)信息 wx.getSystemInfo({ success: function (res) { // 計(jì)算主體部分高度,單位為px that.setData({ height: res.windowHeight }) } }) }, |
幾點(diǎn)優(yōu)化
到這里功能基本都實(shí)現(xiàn)了,但后面還發(fā)現(xiàn)一些問題:如果要隱藏scroll-view的滾動(dòng)條,需要設(shè)置css樣式:::-webkit-scrollbar
::-webkit-scrollbar { width: 0; height: 0; color: transparent; } |
還有就是點(diǎn)了一個(gè)錨點(diǎn)實(shí)現(xiàn)了跳轉(zhuǎn),這個(gè)時(shí)候你滾動(dòng)頁面再點(diǎn)之前點(diǎn)的錨點(diǎn),頁面就不會(huì)再跳轉(zhuǎn)了,這個(gè)時(shí)候就需要監(jiān)聽滾動(dòng)事件,滾動(dòng)時(shí)將scroll-into-view屬性的值清空?;蛘咴诿看五^點(diǎn)跳轉(zhuǎn)后,再由一個(gè)異步操作將scroll-into-view屬性的值清空。
scroll-view默認(rèn)是無滑動(dòng)動(dòng)畫的,需要滾動(dòng)的動(dòng)畫效果需要在組件上設(shè)置:
scroll-with-animation='true' 關(guān)于固定高度height的設(shè)置問題,一開始我以為這個(gè)高度和滾動(dòng)元素的數(shù)目/高度有關(guān),這個(gè)時(shí)候處理動(dòng)態(tài)變化的列表就很麻煩。后面在網(wǎng)上看到的一個(gè)方法就是使用wx.getSystemInfo方法得到windowHeight,把這個(gè)設(shè)置為scroll-view的高度(單位為px)即可。
自己的測(cè)試代碼
wxml代碼:
{{item.name}} {{item.name}} {{item}}
wxss代碼:
/* 汽車圖片 */ .tupian{ width: 100rpx; height: 100rpx; display:inline-block; vertical-align:middle; margin-left: 10rpx; } /* 汽車外框 */ .carFrame,.biaotou{ font-size: 30rpx; width: 100%; height: 100rpx; line-height: 50rpx; border-bottom: 1rpx solid #F4F4F8; display:inline-block; } /* 文本文字 */ .carText{ font-size: 28rpx; margin-left: 50rpx; display:inline-block; vertical-align:middle; } /* 字母屬性 */ .zimu{ height: 50rpx; border-bottom: 1rpx solid #F4F4F8; font-size: 29rpx; color: #777777; } /* 字母位置 */ .weizhi{ margin:10rpx 0 0 18rpx; } /* 菜單位置 */ #cdwz{ position: fixed; right: 30rpx; top: 80rpx; text-align: center; } /* 字母菜單樣式 */ .caidan{ font-size: 25rpx; margin-top: 10rpx; color: #007ADF; } ::-webkit-scrollbar { width: 0; height: 0; color: transparent; } |
js代碼:
//獲取屏幕高度 var screenHeight = wx.getSystemInfo({ success: function (res) { screenHeight = res.windowHeight } }) Page({ /** * 頁面的初始數(shù)據(jù) */ data: { toView:'', height:"", carModel: [ [ { id: "0", name: "A" }, ], [ { id: "0", name: "B" }, ], [ { id: "0", name: "C" }, ], [ { id: "0", name: "D" }, ], [ { id: "0", name: "E" }, ], [ { id: "0", name: "F" }, ], [ { id: "0", name: "G" }, ], [ { id: "0", name: "H" }, ], [ { id: "0", name: "I" }, ], [ { id: "0", name: "J" }, ], [ { id: "0", name: "K" }, ], [ { id: "0", name: "L" }, ], [ { id: "0", name: "M" }, ], [ { id: "0", name: "N" }, ], [ { id: "0", name: "O" }, ], [ { id: "0", name: "P" }, ], [ { id: "0", name: "Q" }, ], [ { id: "0", name: "R" }, ], [ { id: "0", name: "S" }, ], [ { id: "0", name: "T" }, ], [ { id: "0", name: "U" }, ], [ { id: "0", name: "V" }, ], [ { id: "0", name: "W" }, ], [ { id: "0", name: "X" }, ], [ { id: "0", name: "Y" }, ], [ { id: "0", name: "Z" }, ], ], letter: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'], }, jump: function (num){ var text = this.data.letter[num.target.id]; this.setData({ toView: text, }) console.log(text); }, onLoad: function (options) { var that = this // 獲取系統(tǒng)信息 wx.getSystemInfo({ success: function (res) { // 計(jì)算主體部分高度,單位為px that.setData({ height: res.windowHeight }) } }) }, }) |
工作日 8:30-12:00 14:30-18:00
周六及部分節(jié)假日提供值班服務(wù)