vue實現(xiàn)左右滑動效果實例代碼
前言
個人實際開發(fā)中用到的效果問題總結(jié)出來便于自己以后開發(fā)查看調(diào)用,如果也適用其他人請隨意拿走勿噴就行!
vue.js是現(xiàn)在流行的js框架之一,vue 是一套用于構(gòu)建用戶界面的漸進式j(luò)avascript框架,與其它大型框架不同的是:vue被設(shè)計為可以自底向上逐層應(yīng)用。vue的核心庫只關(guān)注視圖層,不僅易于上手,還便于與第三方庫或既有項目整合,另外一個方面,當(dāng)vue與現(xiàn)代化的工具鏈以及各種支持類庫結(jié)合使用時,vue也完全能夠為復(fù)雜的單頁應(yīng)用提供驅(qū)動。
vue.js是用于構(gòu)建交互式的Web界面的庫,它提供MVVM數(shù)據(jù)綁定和一個可組合的組件系統(tǒng),具有簡單、靈活的API。從技術(shù)上講,vue.js集中在MVVM模式上的視圖模型層(viewModel),并通過雙向數(shù)據(jù)綁定連接視圖(view) 和模型(model)。實際的DOM操作和輸出格式被抽象出來成指令和過濾器。相比其他的MVVM框架,vue.js更容易上手,它讓你通過簡單而靈活的API創(chuàng)建由數(shù)據(jù)驅(qū)動的UI組件。
實例代碼
HTML代碼
<template>
<div id="SlideBar" class="box">
<div class="item" ref="slide" :style="slideStyle" @touchstart="start($event)" @touchmove="move($event)" @touchend="end($event)">
<img src="http://img2.imgtn.bdimg.com/it/u=2555191195,2735808065&fm=26&gp=0.jpg" alt="">
<div class="right">
<div class="title">你好!</div>
<p class="text">哈哈哈</p>
<p class="price">好不</p>
</div>
</div>
<div class="btn" ref="btn">
<button>編輯</button>
<button style="background:#387ef5;color:#fff">收藏</button>
</div>
</div>
</template>
CSS代碼
<style>
.box{
position:relative;
border-bottom:0.026667rem solid #666666;
}
.btn{
height:100%;
position:absolute;
right:0;
top:0;
background:red;
display:flex;
}
button{
width:1.6rem;
height:100%;
background:#f8f8f8;
border:none;
}
.item{
padding:0.266667rem;
display:flex;
position:relative;
background:#fff;
z-index: 2;
box-shadow: 0.026667rem 0 0.053333rem #ddd;
}
.item img{
width:2.133333rem;
height:2.133333rem;
margin-right:0.4rem;
border-radius: 0.133333rem;
}
.item .title{
font-size:0.48rem;
float: left;
}
.item .text{
font-size:0.426667rem;
color:#888;
float: left;
margin: 0 1.33rem;
}
.item .price{
color:#888;
float: left;
margin: 0 1.33rem;
}
</style>
JS代碼
<script>
export default {
name: 'SlideBar',
props: {
},
data (){
return {
flag: false,
startX: 0,
endX: 0,
slideStyle: {
left: 0,
transition: 'none'
}
}
},
methods: {
start (e){ //記錄開始滑動屏幕的X軸的位置
this.flag = true;
this.startX = e.touches[0].clientX;
this.endX = this.$refs.slide.offsetLeft;
this.slideStyle.transition = 'none';
},
move (e){
if(this.flag){
// 處理鼠標(biāo)移動的邏輯
var moveX = this.endX + (e.touches[0].clientX - this.startX); //計算滑動的距離
if(Math.abs(moveX) >= this.$refs.btn.offsetWidth && moveX < 0){ //判斷滑動的距離是否大于class:btn的寬度
moveX = (Math.abs(moveX) - this.$refs.btn.offsetWidth) * 0.1; // 0.3阻力系數(shù)
this.slideStyle.left = - this.$refs.btn.offsetWidth - moveX + 'px';
}else if(moveX >= 0){ //滑動距離是否大于等于0
this.slideStyle.left = 0 + 'px'; //大于等于0讓class:item等于0
}else{
this.slideStyle.left = moveX + 'px'; //小于0讓class:item等于滑動的距離
}
}
},
end (e){
if(this.flag){
this.flag = false;
// endX = slide.offsetLeft;
var moveX = e.changedTouches[0].clientX - this.startX; //計算滑動的距離
this.slideStyle.transition = 'left .3s';
var btnWidth = this.$refs.btn.offsetWidth; //class:btn的寬度
if(moveX < 0){
if(Math.abs(moveX) >= btnWidth / 2 || Math.abs(this.$refs.slide.offsetLeft) >= this.$refs.btn.offsetWidth){ //是否大于class:btn寬度的一半
this.slideStyle.left = - btnWidth + 'px'; //左滑超過class:btn寬度的一半就滑回去
}else if(Math.abs(moveX) < btnWidth / 2){ //小于class:btn寬度的一半
this.slideStyle.left = 0 + 'px'; //左滑沒有超過class:btn寬度的一半回原位
}
}else if(moveX > 0 && this.endX != 0){
if(Math.abs(moveX) >= btnWidth / 2){
this.slideStyle.left = 0 + 'px'; //右滑超過class:btn寬度的一半就滑回去
}else if(Math.abs(moveX) < btnWidth / 2){
this.slideStyle.left = - btnWidth + 'px'; //右滑沒有超過class:btn寬度的一半回原位
}
}
}
}
},
mounted (){
var _this = this;
// 使用js的現(xiàn)代事件監(jiān)聽transition過渡結(jié)束
this.$refs.slide.addEventListener('transitionend',function(){
_this.endX = this.offsetLeft;
})
}
}
</script>
總結(jié)
到此這篇關(guān)于vue實現(xiàn)左右滑動效果的文章就介紹到這了,更多相關(guān)vue左右滑動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue進入頁面加載數(shù)據(jù)緩慢實現(xiàn)loading提示過程
這篇文章主要介紹了vue進入頁面加載數(shù)據(jù)緩慢實現(xiàn)loading提示過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
如何解決npm i下載依賴的時候出現(xiàn)某依賴版本沖突
這篇文章主要介紹了如何解決npm i 下載依賴的時候出現(xiàn)某依賴版本沖突問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
vue2.0使用v-for循環(huán)制作多級嵌套菜單欄
這篇文章主要介紹了vue2.0制作多級嵌套菜單欄,主要使用v-for循環(huán)生成一個多級嵌套菜單欄,這個方法應(yīng)用非常廣泛,需要的朋友可以參考下2018-06-06

