微信小程序之側(cè)邊欄滑動(dòng)實(shí)現(xiàn)過(guò)程解析(附完整源碼)
一、效果圖
講什么都不如直接上效果圖好,所以我們先來(lái)看下實(shí)現(xiàn)效果如何。
通過(guò)滑動(dòng)屏幕,或者點(diǎn)擊左上角的圖標(biāo)按鈕,都能實(shí)現(xiàn)側(cè)邊欄的劃出效果。


二、原理解析
1.先實(shí)現(xiàn)側(cè)邊欄的內(nèi)容,讓側(cè)邊欄的內(nèi)容居左,然后將側(cè)邊欄的內(nèi)容置于屏幕的最底部。
2.接著實(shí)現(xiàn)主頁(yè)的內(nèi)容,并且讓主頁(yè)的內(nèi)容默認(rèn)是覆蓋在側(cè)邊欄的內(nèi)容上面。
3.然后,實(shí)現(xiàn)手指滑動(dòng)屏幕的時(shí)候,主頁(yè)的內(nèi)容,向左滑動(dòng)一定的寬度,讓側(cè)邊欄的內(nèi)容顯示出來(lái),而滑動(dòng)的效果是通過(guò) css 的 transition 來(lái)實(shí)現(xiàn)的。
三、源碼
由于實(shí)現(xiàn)過(guò)程的時(shí),我對(duì)代碼作了比較詳細(xì)的注釋,所有這里就不廢話,直接上代碼。
slide.wxml
<view class="page">
<!-- 側(cè)邊欄內(nèi)容 -->
<view class="page-slidebar">
<view class="page-content">
<view class="wc">
<text>首頁(yè)</text>
</view>
<view class="wc">
<text>導(dǎo)航一</text>
</view>
<view class="wc">
<text>導(dǎo)航二</text>
</view>
<view class="wc">
<text>導(dǎo)航三</text>
</view>
</view>
</view>
<!-- 主頁(yè)內(nèi)容 -->
<!-- (open ? 'c-state' : '')三元運(yùn)算符: -->
<!-- 1.默認(rèn)情況下 open 為 false -->
<!-- 2.當(dāng)點(diǎn)擊左上角圖標(biāo)的時(shí)候或者屏幕向左滑動(dòng),open 變化 true -->
<!-- 3.當(dāng) open 為 true 時(shí),會(huì)加上類名為 c-state 和 cover 的 css 樣式 -->
<!-- bindtouchstart、 bindtouchmove、bindtouchend -->
<!-- 當(dāng)手指觸摸屏幕并滑動(dòng)時(shí),所觸發(fā)的三個(gè)函數(shù) -->
<view bindtouchmove="tap_drag" bindtouchend="tap_end" bindtouchstart="tap_start" class="page-top {{open ? ['c-state','cover'] : ''}} ">
<image bindtap="tap_ch" src="../../images/btn.png"></image>
<view class='content'>
<text>為了幫助開發(fā)者簡(jiǎn)單和高效地開發(fā)和調(diào)試微信小程序,我們?cè)谠械墓娞?hào)網(wǎng)頁(yè)調(diào)試工具的基礎(chǔ)上,推出了全新的 微信開發(fā)者工具,集成了公眾號(hào)網(wǎng)頁(yè)調(diào)試和小程序調(diào)試兩種開發(fā)模式。
使用公眾號(hào)網(wǎng)頁(yè)調(diào)試,開發(fā)者可以調(diào)試微信網(wǎng)頁(yè)授權(quán)和微信JS-SDK 詳情
使用小程序調(diào)試,開發(fā)者可以完成小程序的 API 和頁(yè)面的開發(fā)調(diào)試、代碼查看和編輯、小程序預(yù)覽和發(fā)布等功能。
為了更好的開發(fā)體驗(yàn),我們從視覺(jué)、交互、性能等方面對(duì)開發(fā)者工具進(jìn)行升級(jí),推出了 1.0.0 版本。</text>
<button>按鈕</button>
</view>
</view>
</view>
slide.wcss
/* 全局樣式 */
page, .page {
height: 100%;
font-family: 'PingFang SC',
'Helvetica Neue',
Helvetica,
'Droid Sans Fallback',
'Microsoft Yachei',
sans-serif;
}
/* 側(cè)邊欄樣式 */
.page-slidebar {
height: 100%;
width: 750rpx;
position: fixed;
background-color:white;
z-index: 0;
}
/* 控制側(cè)邊欄的內(nèi)容距離頂部的距離 */
.page-content {
padding-top: 60rpx;
}
/* 側(cè)邊欄內(nèi)容的 css 樣式 */
.wc {
color:black;
padding: 30rpx 0 30rpx 150rpx;
border-bottom: 1px solid #eee;
}
/* 當(dāng)屏幕向左滑動(dòng),出現(xiàn)側(cè)邊欄的時(shí)候,主頁(yè)的動(dòng)畫樣式 */
/* scale:取值范圍 0~1 ,表示屏幕大小是原來(lái)的百分之幾,可以自己修改成 0.8 試下*/
/* translate(60%,0%) 表示向左滑動(dòng)的時(shí)候,側(cè)邊欄占用平時(shí)的寬度為 60% */
.c-state {
transform: rotate(0deg) scale(1) translate(60%, 0%);
-webkit-transform: rotate(0deg) scale(1) translate(60%, 0%);
}
/* 主頁(yè)樣式 */
.page-top {
height: 100%;
position: fixed;
width: 750rpx;
background-color:white;
z-index: 0;
transition: All 0.4s ease;
-webkit-transition: All 0.4s ease;
}
/* 左上角圖標(biāo)的樣式 */
.page-top image {
position: absolute;
width: 68rpx;
height: 68rpx;
left: 20rpx;
top: 20rpx;
}
/* 遮蓋層樣式 */
.cover{
width: 100%;
height: 100%;
background-color:gray;
opacity: 0.5;
z-index: 9000;
}
.content{
margin-top: 100rpx;
}
slide.js
Page({
data: {
open: false,
// mark 是指原點(diǎn)x軸坐標(biāo)
mark: 0,
// newmark 是指移動(dòng)的最新點(diǎn)的x軸坐標(biāo)
newmark: 0,
istoright: true
},
// 點(diǎn)擊左上角小圖標(biāo)事件
tap_ch: function(e) {
if (this.data.open) {
this.setData({
open: false
});
} else {
this.setData({
open: true
});
}
},
tap_start: function(e) {
// touchstart事件
// 把手指觸摸屏幕的那一個(gè)點(diǎn)的 x 軸坐標(biāo)賦值給 mark 和 newmark
this.data.mark = this.data.newmark = e.touches[0].pageX;
},
tap_drag: function(e) {
// touchmove事件
this.data.newmark = e.touches[0].pageX;
// 手指從左向右移動(dòng)
if (this.data.mark < this.data.newmark) {
this.istoright = true;
}
// 手指從右向左移動(dòng)
if (this.data.mark > this.data.newmark) {
this.istoright = false;
}
this.data.mark = this.data.newmark;
},
tap_end: function(e) {
// touchend事件
this.data.mark = 0;
this.data.newmark = 0;
// 通過(guò)改變 opne 的值,讓主頁(yè)加上滑動(dòng)的樣式
if (this.istoright) {
this.setData({
open: true
});
} else {
this.setData({
open: false
});
}
}
})
四、項(xiàng)目下載
git 在線下載:
https://github.com/yyzheng1729/slide
五、同類文章推薦
微信小程序之下拉列表實(shí)現(xiàn)方法解析(附完整源碼)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
postMessage消息通信Promise化的方法實(shí)現(xiàn)
postMessage Api 想必大家都不陌生,WebWorker 通信會(huì)用到,iframe 窗口之間通信也會(huì)用到,那么我們能不能將 postMessage 進(jìn)行一次轉(zhuǎn)化,把他變成類似 Promise 的使用方式,所以本文給大家介紹了postMessage消息通信Promise化的方法實(shí)現(xiàn),需要的朋友可以參考下2024-03-03
基于Typescript與Axios的接口請(qǐng)求管理詳解
接口是一系列抽象方法的聲明,是一些方法特征的集合,這些方法都應(yīng)該是抽象的,需要由具體的類去實(shí)現(xiàn),然后第三方就可以通過(guò)這組抽象方法調(diào)用,讓具體的類執(zhí)行具體的方法,這篇文章主要給大家介紹了基于Typescript與Axios的接口請(qǐng)求管理的相關(guān)資料,需要的朋友可以參考下2021-09-09
JavaScript實(shí)現(xiàn)設(shè)置默認(rèn)日期范圍為最近40天的方法分析
這篇文章主要介紹了JavaScript實(shí)現(xiàn)設(shè)置默認(rèn)日期范圍為最近40天的方法,結(jié)合實(shí)例形式分析了javascript結(jié)合HTML5 date元素進(jìn)行時(shí)間運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
webpack HappyPack實(shí)戰(zhàn)詳解
這篇文章主要介紹了webpack HappyPack實(shí)戰(zhàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
js模仿php中strtotime()與date()函數(shù)實(shí)現(xiàn)方法
這篇文章主要介紹了js模仿php中strtotime()與date()函數(shù)實(shí)現(xiàn)方法,涉及javascript時(shí)間操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-08-08
JavaScript判斷變量數(shù)據(jù)類型的常見(jiàn)方法小結(jié)
在JavaScript開發(fā)中,了解和判斷變量的數(shù)據(jù)類型是編寫健壯代碼的基礎(chǔ),變量的類型可以在運(yùn)行時(shí)改變,這為開發(fā)者帶來(lái)了靈活性的同時(shí)也增加了復(fù)雜性,本文將深入探討幾種常見(jiàn)的判斷變量類型的技巧,并結(jié)合實(shí)際案例進(jìn)行分析,需要的朋友可以參考下2024-12-12
Select標(biāo)簽下拉列表二級(jí)聯(lián)動(dòng)級(jí)聯(lián)實(shí)例代碼
這篇文章主要介紹了Select標(biāo)簽下拉列表二級(jí)聯(lián)動(dòng)級(jí)聯(lián)實(shí)例代碼,需要的朋友可以參考下2014-02-02

