Js实现元素右滑回弹效果(基于Uniapp)

更新日期: 2021-06-19阅读: 1.8k标签: 效果

需求说明:

多个view或图片横排显示,可以左右滑动,当滑动到最右侧时实现回弹效果(这里使用匀速动画)。滑动到最右侧显示“查看更多”,达到一定位置显示改完“释放查看”,如果用户释放了则进行相应操作。

如图所示:




代码实现:

view:

<view @touchmove="move" @touchend="moveEnd" @touchstart="moveStart" class="warp" :style="{transform: 'translate('+scl.tranNum+'%, 0px) translateZ(0px)'}">
<view class="list">
<view class="li"></view><view class="li"></view><view class="li"></view><view class="li" id="end"></view>
</view>
<view class="scorll" style="p" v-text="this.scl.sate?'释放查看':'查看更多'"></view>
</view>

js:

<script>
export default {
data() {
return {
scl:{
right:0,//容器距离,判断是否达到最右侧
width:0,//右滑块的width
tranNum:0,
tx:0,//滑动位置
lastX: 0,
lastY: 0,
inter:null,
sate:false,//状态
}
}
},
methods: {
getdom(dom,callback){
let query = uni.createSelectorQuery().in(this);
query.select(dom).boundingClientRect(res => {
callback(res);
}).exec();
},
move(event){
let currentX = event.changedTouches[0].pageX;
let currentY = event.changedTouches[0].pageY;
let tx = currentX - this.scl.lastX;//向左滑动:tx<0 ,向右滑动tx > 0
let ty = currentY - this.scl.lastY;
if (Math.abs(tx) <= Math.abs(ty)) {//上下方向滑动
return;
}
this.getDom('.list',res=>{
this.scl.right = res.right.toFixed(0);
})
if(this.scl.width==0){
this.getDom('.scorll',res => {
this.scl.width = res.width.toFixed(0);
});
}
this.getDom('#end',res => {
if( this.scl.right == res.right.toFixed(0)){
this.scl.tx = this.scl.tx + tx;
let scale= -(this.scl.right / this.scl.width)*100;//计算占比
this.scl.tx = this.scl.tx<scale ? scale : this.scl.tx;
if(this.scl.tx<0){
if( -(scale -this.scl.tx) <90){//这里的90按需求定
this.scl.sate = true;
}else{
this.scl.sate = false;
}
this.scl.tranNum=this.scl.tx*0.1;
}
}
});
//将当前坐标进行保存以进行下一次计算
this.scl.lastX = currentX;
this.scl.lastY = currentY;
},
moveEnd(event){
if(this.scl.tx<=0){
this.scl.inter=setInterval(()=>{
this.scl.tx=this.scl.tx+10;
this.scl.tx = this.scl.tx>=0 ? 0 : this.scl.tx;
this.scl.tranNum=this.scl.tx*0.1;
if(this.scl.tx==0){
clearInterval(this.scl.inter);
}
},10);
}else{
this.scl.tx=0;
this.scl.inter && clearInterval(this.scl.inter);
}
if(this.scl.sate){//执行操作
console.log("执行操作!")
}
},
moveStart(event){
this.scl.lastX = event.changedTouches[0].pageX;
this.scl.lastY = event.changedTouches[0].pageY;
},
}
}
</script>

less:

<style lang="less">
.warp{
position: relative;
height: 200px;
width: 100%;
white-space: nowrap;
-webkit-overflow-scrolling:touch;
transform: translate(0px, 0px) translateZ(0px);/*使用该属性来实现*/
.list{
height: 100%;
width: 100%;
position: relative;
font-size: 0;
overflow: auto;
.li{
display: inline-block;
vertical-align: middle;
height: 100%;
width: 400rpx;
margin-right: 30rpx;
background: #f1f2f3;
}
&>view:last-of-type{
margin-right: 0rpx;
}
}
.scorll{
display: inline-block;
vertical-align: middle;
font-size: 24rpx;
color: #999;
width: 200rpx;
text-align: center;
position: absolute;
top: 0;
right: -200rpx;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
}
</style>


总结:

1、主要使用css中transform: translate(0px, 0px) translateZ(0px);的属性来实现。transform 属性向元素应用 2D 或 3D 转换,该属性允许我们对元素进行旋转、缩放、移动或倾斜。

2、事件使用到:touchmove,touchend,touchstart。

3、uniapp不支持直接获取dom相应的属性,需要借助uni.createSelectorQuery()方法来实现。

4、代码比较粗糙,临时写的,许多细节未处理,后续再优化吧。


链接: https://fly63.com/article/detial/10451

使用 JavaScript 实现分屏视觉效果

今天这篇文章就来讲讲使用JavaScript来实现这种分屏的视觉UI效果。现在在网站上这种分屏视觉效果应用的也非常广泛,比如 Corsair website。

CSS3的过渡效果,使用transition实现鼠标移入/移出效果

在css中使用伪类虽然实现了样式的改变,但由于没有过渡效果会显得很生硬。以前如果要实现过渡,就需要借助第三方的js框架来实现。现在只需要使用CSS3的过渡(transition)功能,就可以从一组样式平滑的切换到另一组样式。

js如何实现新手引导效果?

js最近有个小伙伴问到了怎么实现新手引导的效果,然后便去网上找了下实现方案。可以通过css的border来实现。

css3 斜切角/斜边的实现方式

设计图含有斜切角的效果时,我们一般想到的方法是切出四个角为背景,然后用border连起来,这样就能显示出该效果了,那么直接使用css呢?下面就整理css做斜边的效果。

JavaScript 实现打字机效果,跑马灯效果

这篇文章在不使用任何插件的情况,以最简洁的原生javascript来实现打字机效果和跑马灯效果。打字效果即把一段话一个字一个字的显示出来。

CSS遮罩效果(模糊效果,阴影效果,毛玻璃效果)

一般遮罩加上透明度opacity就是阴影效果。阴影效果和一般遮罩一样,唯一不同的是设置.mask遮罩的背景色用rgba()表示,当然hsla()也是可以的。模糊效果(毛玻璃效果) 通过 filter来实现

纯css实现气泡效果

主要运用的是1.border 组成的直角三角形。2,before 和 after 伪元素 。3,z-index属性;将元素的长宽设置为0,并且将border的3条边设置为透明的,就会出现border颜色的直角三角形

css文字选中效果

文字选中效果,这个可能很少有人注意过。在默认状态先一般选中的文本颜色是白字蓝底的,不过可以通过CSS进行设置。::selection定义元素上的伪选择器,以便在选定元素时设置其中文本的样式。

text-fill-color:仿苹果官网介绍效果 CSS设置文字渐变效果 文字背景图遮罩

发布iPhone XR的时候 各种心动 去官网看了一遍又一遍。闲着无聊发现 里面的介绍很用大篇幅的有背景文字来介绍。Like this:看着挺酷炫的还不错 就看了下实现方式。还挺简单的。

Vue 中多个元素、组件的过渡,及列表过渡

多元素之间如何实现过渡动画效果呢?这么写行不行呢?肯定是不行的,因为 Vue 在两个元素进行切换的时候,会尽量复用dom,就是因为这个原因,导致现在动画效果不会出现。如果不让 Vue 复用dom的话,应该怎么做呢?只需要给这两个div不同的key值就行了

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!