Uniapp自定义swiper滑动模块

Uniapp自定义swiper滑动模块

简介

用Uniapp写的App端swiper滑动模块,主要是理解原理,如果后期有可能的话再优化成组件。本篇文章主要参考卧龙派的文章手把手教你用原生js来写一个swiper滑块插件(上)原理,感谢分享。

参考文章

  1. 手把手教你用原生js来写一个swiper滑块插件(上)原理
  2. vue:Class 与 Style 绑定

上代码

我就耍一次流氓吧先,主要内容看参考文章,以后有时间再详细补上。

<template>
    <view>
        <view>
            <p>abc</p>
        </view>
        <view class="ps-swiper">
            <view :class="{'ps-swiper-container':isTrue,'move':isMove}" @touchstart="touchstartEvent" @touchmove="touchmoveEvent" @touchend="touchendEvent"
                :style="{ left: initLeft + 'rpx' }">
                <view class="ps-swiper-item" style="background-color: #007AFF;">1</view>
                <view class="ps-swiper-item" style="background-color: #aa00ff;">2</view>
                <view class="ps-swiper-item" style="background-color: #ffff7f;">3</view>
            </view>
        </view>
    </view>
</template>

<script>
    export default {
        data() {
            return {
                isTrue:true,
                isMove:false,//控制是否应用move类
                state: 0, //监控鼠标事件,鼠标落下之后才开始动作
                oldEvent: null, // 用来记录鼠标上次的位置
                initLeft: 0, //rpx ;//ps-swiper-container初始left值
                initIndex: 0, // 记录当前滑块的顺序(从0开始)

                moveLeft: 0,
            }
        },
        onLoad() {
            console.log(this.initLeft);
        },
        methods: {
            flashIndex: function() {

            },
            touchstartEvent: function(event) {
                // console.log(event);
                this.isMove = false;
                this.moveLeft = 0;
                this.oldEvent = event; // 当鼠标按下时候记录初始位置
                this.state = 1;
                //console.log("event 事件:"+event.touches[0].pageX);
                console.log("手指按下了");
            },
            touchmoveEvent: function(event) {
                if (this.state != 1) {
                    return
                }; // 只有当state == 1时候才允许执行该事件
                this.moveStart = event.touches[0].pageX;
                // 用当前鼠标的位置来和上次鼠标的位置作比较
                // 如果当前鼠标的pageX小于上次鼠标的pageX,那就表示鼠标在向左拖动,就需要把容器left值减去鼠标移动的距离
                if (event.touches[0].pageX < this.oldEvent.touches[0].pageX) {
                    this.initLeft -= this.oldEvent.touches[0].pageX - event.touches[0].pageX;
                    // this.initLeft -= 300;
                    this.moveLeft++;
                } else {
                    this.initLeft += event.touches[0].pageX - this.oldEvent.touches[0].pageX;
                    this.moveLeft--;
                }
                // 完事之后记得把当前鼠标的位置赋值给oldEvent
                this.oldEvent = event;

                // console.log(this.initLeft);
                // console.log("手指移动了");
            },
            touchendEvent: function(event) {
                // console.log(event);
                console.log("this.moveLeft" + this.moveLeft);
                if (this.moveLeft > 3) {
                    this.initIndex++;
                    if(this.initIndex==3){this.initIndex--;}//右边界,不能滑动到超一屏
                } else if (this.moveLeft < -3){
                    this.initIndex--;
                    if (this.initIndex < 0) {
                        this.initIndex = 0;
                    } //左边界,不能滑动到负一屏
                }
                this.isMove = true;
                console.log("this.initIndex" + this.initIndex);
                this.initLeft = this.initIndex * -300;
                this.state = 0;
                console.log("手指起来了");
            }
        }
    }
</script>

<style>
    .ps-swiper {
        width: 300rpx;

        /* 下面是为了让大家看的更清楚,加的修饰 */
        padding: 30rpx 0;
        margin: 0 auto;
        background: #FFB973;
    }

    .ps-swiper .ps-swiper-container {
        position: relative;
        /* 为啥要设置-300px呢,因为我想让他默认在第二个滑块的位置,一会会给大家演示 */
        /* left: -300rpx; */
        /* 让容器尽可能的宽,这样才能容纳更多的滑块 */
        width: 10000%;
        /* 让内部滑块可以排成一行 */
        display: flex;
        /* 滑动时有动画:如果元素的left值变更,会有一个0.2s的过渡动画(补间动画) */
        /* transition: left 0.2s ease-in-out; */

        /* 下面是为了让大家看的更清楚,加的修饰 */
        background: red;
        padding: 15rpx 0;
    }
    .move {
        transition: left 0.2s ease-in-out;
    } 

    .ps-swiper .ps-swiper-container .ps-swiper-item {
        /* 宽度设置1%会按照外层视图的宽度来铺满 */
        width: 1%;
        height: 375rpx;
        background: #eee;

    }
</style>

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Uni-app是一个利用Vue.js开发跨平台应用的框架,允许开发者将一个代码库用于多个平台,比如iOS、Android、H5等。Swiper一个非常流行的移动端轮播图组件,可以实现图片的滑动切换效果。在Uni-app中,我们可以自定义一个类似Swiper的组件来实现类似的效果。 首先,我们需要在页面中创建一个滑动容器,可以使用`<swiper></swiper>`来表示,然后在其中放置需要轮播的图片,可以使用`<image></image>`来表示。当然,也可以根据实际需要自定义轮播元素的样式。 接下来,我们需要通过Vue的数据绑定实现轮播图的逻辑。我们可以在data中定义一个变量currentIndex来表示当前显示的图片索引,默认为0。然后使用v-bind将该变量与滑动容器的currentIndex属性进行绑定。 为了实现滑动效果,我们可以在组件的methods中定义一个滑动事件函数,在每次滑动时根据滑动的方向和距离更新currentIndex的值。比如,当滑动到右边时,将currentIndex加1,当滑动到左边时,将currentIndex减1。同时,需要限制currentIndex在合理的范围内,防止越界。 最后,我们需要使用动态的样式来控制滑动效果。我们可以使用v-bind将currentIndex与滑动容器的transform属性进行绑定,通过设置transform的translateX值来实现滑动。比如,当currentIndex为0时,将translateX的值设为0,表示不偏移;当currentIndex为1时,将translateX的值设为容器宽度的负数,表示向右偏移一个图片宽度。 以上是利用Uni-app和Vue.js自定义仿Swiper的大致思路,具体实现会根据项目需求的不同而有所调整。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值