当前位置:网站首页>Vue.js Mobile end left slide delete component
Vue.js Mobile end left slide delete component
2020-11-06 01:22:00 【:::::::】
Vue.js The mobile end slides left to delete components
Left sliding deletion is very common on mobile terminals . Let's encapsulate this simple widget together . We want to be :
- When the slider does not exceed half of the delete button, it will automatically return to the starting position .
- Slide more than half to the maximum ( Delete button width )
- Try to simplify the code
Before we start , We have to put [touchEventApi][1] Make sure. . In this widget , Yes :
1. TouchEvent.touches ( Represent one individual TouchList object , Contains all contacts currently touching the touch plane Touch object )
2. TouchEvent.changedTouches ( One TouchList object , Contains all the information from the last touch event to this event ,
Of a contact whose state has changed Touch object .)
Don't talk much , Go straight to the code :
<template>
<div class="delete">
<div class="slider">
<div class="content"
@touchstart='touchStart'
@touchmove='touchMove'
@touchend='touchEnd'
:style="deleteSlider"
>
<!-- The slot contains the content needed in the specific project -->
<slot></slot>
</div>
<div class="remove" ref='remove'>
Delete
</div>
</div>
</div>
</template>
And then there was css, What I'm using here is less
<style scoped lang="less" scoped>
.slider{
width: 100%;
height:200px;
position: relative;
user-select: none;
.content{
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background:green;
z-index: 100;
// Set the transition animation
transition: 0.3s;
}
.remove{
position: absolute;
width:200px;
height:200px;
background:red;
right: 0;
top: 0;
color:#fff;
text-align: center;
font-size: 40px;
line-height: 200px;
}
}
</style>
<script type="text/ecmascript-6">
export default {
data() {
return {
startX:0, // Touch the location
endX:0, // End position
moveX: 0, // Position when sliding
disX: 0, // Moving distance
deleteSlider: '',// The effect of sliding , Use v-bind:style="deleteSlider"
}
},
methods:{
touchStart(ev){
ev= ev || event
//tounches An array of class , be equal to 1 At this time, there is only one finger touching the screen
if(ev.touches.length == 1){
// Record the starting position
this.startX = ev.touches[0].clientX;
}
},
touchMove(ev){
ev = ev || event;
// Get the width of the delete button , This width is the maximum distance the slider slides to the left
let wd=this.$refs.remove.offsetWidth;
if(ev.touches.length == 1) {
// Real time distance from left side of browser when sliding
this.moveX = ev.touches[0].clientX
// Start position minus Real time sliding distance , Get the finger offset in real time
this.disX = this.startX - this.moveX;
console.log(this.disX)
// If it's sliding right or not , Don't change the position of the slider
if(this.disX < 0 || this.disX == 0) {
this.deleteSlider = "transform:translateX(0px)";
// Greater than 0, It means left slip , Now the slider starts to slide
}else if (this.disX > 0) {
// The specific sliding distance I take is Finger offset *5.
this.deleteSlider = "transform:translateX(-" + this.disX*5 + "px)";
// The maximum can only be equal to the width of the delete button
if (this.disX*5 >=wd) {
this.deleteSlider = "transform:translateX(-" +wd+ "px)";
}
}
}
},
touchEnd(ev){
ev = ev || event;
let wd=this.$refs.remove.offsetWidth;
if (ev.changedTouches.length == 1) {
let endX = ev.changedTouches[0].clientX;
this.disX = this.startX - endX;
console.log(this.disX)
// If the distance is less than half of the delete button , Forced back to the starting point
if ((this.disX*5) < (wd/2)) {
this.deleteSlider = "transform:translateX(0px)";
}else{
// More than half Slide to maximum
this.deleteSlider = "transform:translateX(-"+wd+ "px)";
}
}
}
}
}
</script>
It's all done here , Hopefully that helped ! I hope you can point out the deficiencies !
Participation of this paper Tencent cloud media sharing plan , You are welcome to join us , share .
版权声明
本文为[:::::::]所创,转载请带上原文链接,感谢
边栏推荐
- 在大规模 Kubernetes 集群上实现高 SLO 的方法
- IPFS/Filecoin合法性:保护个人隐私不被泄露
- Didi elasticsearch cluster cross version upgrade and platform reconfiguration
- 做外包真的很难,身为外包的我也无奈叹息。
- Common algorithm interview has been out! Machine learning algorithm interview - KDnuggets
- Group count - word length
- 如何将数据变成资产?吸引数据科学家
- 加速「全民直播」洪流,如何攻克延时、卡顿、高并发难题?
- Elasticsearch 第六篇:聚合統計查詢
- 至联云分享:IPFS/Filecoin值不值得投资?
猜你喜欢

快快使用ModelArts,零基础小白也能玩转AI!
![[C / C + + 1] clion configuration and running C language](/img/5b/ba96ff4447b150f50560e5d47cb8d1.jpg)
[C / C + + 1] clion configuration and running C language

一篇文章带你了解CSS3 背景知识

Subordination judgment in structured data

至联云分享:IPFS/Filecoin值不值得投资?

Face to face Manual Chapter 16: explanation and implementation of fair lock of code peasant association lock and reentrantlock

Python Jieba segmentation (stuttering segmentation), extracting words, loading words, modifying word frequency, defining thesaurus

中小微企业选择共享办公室怎么样?

大数据应用的重要性体现在方方面面

一篇文章带你了解CSS对齐方式
随机推荐
2019年的一个小目标,成为csdn的博客专家,纪念一下
Computer TCP / IP interview 10 even asked, how many can you withstand?
Existence judgment in structured data
Real time data synchronization scheme based on Flink SQL CDC
Natural language processing - wrong word recognition (based on Python) kenlm, pycorrector
Deep understanding of common methods of JS array
容联完成1.25亿美元F轮融资
2018中国云厂商TOP5:阿里云、腾讯云、AWS、电信、联通 ...
I've been rejected by the product manager. Why don't you know
Linked blocking Queue Analysis of blocking queue
合约交易系统开发|智能合约交易平台搭建
Summary of common string algorithms
数字城市响应相关国家政策大力发展数字孪生平台的建设
JVM memory area and garbage collection
大数据应用的重要性体现在方方面面
I think it is necessary to write a general idempotent component
Classical dynamic programming: complete knapsack problem
至联云分享:IPFS/Filecoin值不值得投资?
Aprelu: cross border application, adaptive relu | IEEE tie 2020 for machine fault detection
Did you blog today?