zoukankan      html  css  js  c++  java
  • uniapp 滑动回弹效果

    <template>
        <view class="lst">
            <view @touchmove="move" @touchstart="moveStart" @touchend="moveEnd" class="warp" 
                :style="{transform: 'translate(0px, '+scl.tranNum+'%) translateZ(0px)'}"
            >
                <view class="list end">
                    
                </view>
                <view class="scorll" v-text="this.scl.sate?'释放查看':'查看更多'"></view>
            </view>
        </view>
    </template>
    <script>
        export default {
            data() {
                return {
                    scl:{
                        right:0,//容器距离,判断是否达到最右侧
                        bottom:0,//容器距离,判断是否达到最右侧
                        0,//右滑块的width
                        tranNum:0,
                        tx:0,//滑动位置
                        lastX: 0,
                        lastY: 0,
                        inter:null,
                        sate:false,//状态
                    }
                }
            },
            onShow() {
                
            },
            onLoad(options) {
                
            },
            onReady() {
                
            },
            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 ty = currentX - this.scl.lastX;//向左滑动:tx<0 ,向右滑动tx > 0
                    let tx = currentY - this.scl.lastY;
                    
                    if (Math.abs(tx) <= Math.abs(ty)) {//上下方向滑动
                        return;
                    }
                    this.getDom('.list',res=>{
                        this.scl.right = res.bottom.toFixed(0);
                    })
                    if(this.scl.width==0){
                        this.getDom('.scorll',res => {
                            this.scl.width = res.height.toFixed(0);
                        });
                    }
                    this.getDom('.end',res => {
                        if( this.scl.right == res.bottom.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) < 10){//这里的10按需求定(手指滑动多少距离执行)
                                    this.scl.sate = true;
                                    console.log(-(scale -this.scl.tx))
                                }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){//执行操作
                        this.scl.sate = false;
                        console.log("执行操作!")
                    }
                },
                moveStart(event){
                    this.scl.lastX = event.changedTouches[0].pageX;
                    this.scl.lastY = event.changedTouches[0].pageY;
                }
            }
        }
    </script>
    
    <style lang="scss" scoped>
        .warp{
            position: relative;
             100%;
            white-space: nowrap;
            -webkit-overflow-scrolling:touch;
            transform: translate(0px, 0px) translateZ(0px);/*使用该属性来实现*/
            .list{ 
                height: 700px;
                border: 1px solid;
            }
            .scorll{
                display: inline-block;
                vertical-align: middle;
                font-size: 24rpx;
                color: #999;
                 100%;
                text-align: center;
                position: absolute;
                top: 0;
                height: 100%;
                display: flex;
                align-items: center;
                justify-content: center;
                z-index: -1;
            }
        }
    </style>

    参考于:https://www.cnblogs.com/xiaonian8/p/14928101.html

  • 相关阅读:
    Python学习之collections module-defaultdict()
    LinkList Operation
    Eng1—English daily notes
    (知识扩展)R运用领域一览表
    TED_Topic3:The hidden reason for poverty the world needs to address now
    Stat3—因子分析(Factor Analysis)
    R3—日期处理
    Stat2—主成分分析(Principal components analysis)
    TED_Topic2:My desperate journey with a human smuggler
    MagicB.0—怎样设置电脑自动关机?
  • 原文地址:https://www.cnblogs.com/chenshaoxiong/p/15330618.html
Copyright © 2011-2022 走看看