vue滑动解锁组件使用方法详解

本文实例为大家分享了vue滑动解锁组件的使用,供大家参考,具体内容如下

这是一个pc端的滑动解锁组件

效果图:

话不多说,直接上代码

html部分

<template>
    <div class="dragVerify">
        <div class="spout" ref="spout">
            <div
                class="slidingBlock"
                ref="slidingBlock"
                :style="{ left: `${place}%` }"
                @mousedown="mousedown($event)"
                :class="place < distance ? 'unfinished' : 'complete'"
            ></div>
            <div class="succeedBox" :class="place >= distance ? 'succeedText' : ''" :style="{ width: `${place}%` }"></div>
        </div>
    </div>
</template>

js部分

export default {
    name: 'dragVerify',
    data() {
        return {
            place: 0,
            sliding: {
                isDown: true,
                X: 0 // 初始X值
            },
            move: {
                X: 0 // 移动X值
            },
            spoutW: 0,
            slidingBlockW: 0,
            distance: 1 // 要移动的距离
        }
    },
    mounted() {},
    methods: {
        // 鼠标事件
        mousedown(e) {
            if (this.place < this.distance) {
                this.sliding.isDown = true
                // 计算百分比
                this.spoutW = this.$refs.spout.offsetWidth
                this.slidingBlockW = this.$refs.slidingBlock.offsetWidth
                this.distance = 100 - (this.slidingBlockW / this.spoutW) * 100
            }
            this.sliding.X = e.x
            // 添加鼠标的移动事件
            document.addEventListener('mousemove', e => {
                if (this.sliding.isDown) {
                    this.move.X = e.x
                    if (this.place >= this.distance) {
                        this.place = this.distance
                    } else if (this.place >= 0 && this.place < this.distance) {
                        this.place = ((this.move.X - this.sliding.X) / this.spoutW) * 100
                    }
                    if (this.place <= 0) {
                        this.place = 0
                        document.removeEventListener('mousemove', null, false)
                        return
                    }
                }
                e.preventDefault()
            })
            // 松开鼠标
            document.onmouseup = e => {
                if (this.place == this.distance) {
                    this.$emit('setVerify', true)
                } else {
                    this.sliding.isDown = false
                    this.place = 0
                    this.$emit('setVerify', false)
                }
            }
        }
    }
}

css部分

.dragVerify {
    border: 1px solid #e1e1e1;
    height: 40px;
    background: #eeeeee;
}
.spout {
    line-height: 40px;
    height: 40px;
    /* text-align: center; */
    position: relative;
    width: 293px;
}
.spout::before {
    content: '请按住滑块,拖动到最右边';
    width: 233px;
    top: 0;
    right: 0;
    bottom: 0;
    color: #919593;
    font-size: 16px;
    text-align: center;
    position: absolute;
}
.succeedText::before {
    content: '验证通过';
    width: 233px;
    top: 0;
    right: 0;
    bottom: 0;
    color: #ffffff;
    font-size: 16px;
    text-align: center;
    position: absolute;
}
.succeedBox {
    color: #ffffff;
    font-size: 16px;
    text-align: center;
    line-height: 38px;
    height: 38px;
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: #23b14d;
    z-index: 8;
}
.slidingBlock {
    width: 60px;
    /* height: 38px; */
    height: calc(100% - 0.1rem);
    border: 1px solid #e1e1e1;
    border-top: none;
    /* border-bottom: none; */
    border-left: none;
    background: #ffffff;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    /* margin-left: -1px; */
    cursor: move;
    z-index: 9;
}
.slidingBlock::after {
    content: '';
    position: absolute;
    background-size: 100% 100%;
    background-repeat: no-repeat;
    width: 20px;
    height: 20px;
    left: 50%;
    top: 50%;
    margin-left: -10px;
    margin-top: -10px;
}
.unfinished::after {
    background-image: url(你的图片);
}
.complete::after {
    background-image: url(你的图片);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • vue实现滑动解锁功能

    本文实例为大家分享了vue实现滑动解锁功能的具体代码,供大家参考,具体内容如下 话不多说,直接上代码: <template>   <div>     <div id="box">       <div class="bgColor"></div>       <div class="txt">滑动解锁</div>       <!--给i标签添加上相应字体图

  • vue滑动解锁组件使用方法详解

    本文实例为大家分享了vue滑动解锁组件的使用,供大家参考,具体内容如下 这是一个pc端的滑动解锁组件 效果图: 话不多说,直接上代码 html部分 <template>     <div class="dragVerify">         <div class="spout" ref="spout">             <div                 class="slidi

  • Vue滑块解锁组件使用方法详解

    本文实例为大家分享了Vue滑块解锁组件的使用,供大家参考,具体内容如下 依据 JS拖动滑块验证 开发的 Vue 滑块解锁组件. <template>   <div ref="wrap" class="slider-unlock">     <div class="before">请按住滑块,拖动到最右边</div>     <div ref="after" class=&q

  • Vue数字输入框组件使用方法详解

    前面的话 关于基础组件介绍,已经更新完了.这篇文章将用组件基础知识开发一个数字输入框组件.将涉及到指令.事件.组件间通信. 基础需求 只能输入数字 设置初始值,最大值,最小值 在输入框聚焦时,增加对键盘上下键的支持 增加一个控制步伐prop-step,例如,设置为10 ,点击加号按钮,一次增加10 项目搭建 在了解需求后,进行项目的初始化: <!DOCTYPE html> <html lang="en"> <head> <meta charse

  • vue车牌输入组件使用方法详解

    一个简单的车牌输入组件(vue),供大家参考,具体内容如下 效果图: vue代码: <template> <div class="enTer"> <div class="plateInput" id="plateInput"> <div class="item" :class="{active: plateInput.input.type === 'p1'}" @c

  • vue车牌搜索组件使用方法详解

    一个简单的车牌输入组件(vue),供大家参考,具体内容如下 代码: vue代码: <template> <div class="pulls"> <!-- 精确车牌搜索 --> <div class="enterPlate"> <div class="enterBox" :style="{width:noRightPart==='on'?'100%':''}"> <

  • vue拖拽组件使用方法详解

    前言 pc端开发需要拖拽组件完成列表的顺序交换,一般移动端的UI组件会包含,但是我在用的iview并没有此功能的组件,于是手写一个,实现起来很简单.效果图如下: 可以拖拽完成新排序,点击某一项可以触发相关事件. 关于拖拽 drag & drop 拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖拽对象 dataTransfer对象,只能在拖放事件的事件处理程序中访问.重要属性: effectAllowed ( none | copy | copyLink | copyMove |

  • Vue使用Swiper封装轮播图组件的方法详解

    目录 Swiper 为什么要封装组件 开始封装 1.下载安装Swiper 2.引入css样式文件 3.引入js文件 4.把官网使用方法中的HTML结构复制粘贴过来 5.初始化Swiper 自定义效果 完整代码 效果展示 Swiper Swiper是一个很常用的用于实现各种滑动效果的插件,PC端和移动端都能很好的适配. 官网地址:www.swiper.com.cn/ 目前最新版本是Swiper7,但众所周知最新版本通常不稳定,所以这里使用Swiper6来封装. Swiper各版本区别: 为什么要封

  • vue中使用vue-pdf的方法详解

    需求:简单说~~有两个pdf文件需在h5上展示,通过点击按钮切换不同文件的显示 注: 1.vue-pdf默认展示首页,我这里的需求是通过滑动展示所有页面,这里使用的v-for遍历.有多少页就加载了多少个pdf组件. 2.pdf文件存在跨域问题,这个需要后端同学支持. 3.demo上的pdf文件只有一页,测试多页展示,自己改用多页pdf文件即可 <template> <div class="pdf_wrap"> <div class="pdf_li

  • vue动态注册组件实例代码详解

    写本篇文章之前其实也关注过vue中的一个关于加载动态组件is的API,最开始研究它只是用来实现一个tab切换的功能,使用起来也蛮不错的. is 预期:string | Object (组件的选项对象) 用于动态组件且基于 DOM 内模板的限制来工作. 示例: <!-- 当 `currentView` 改变时,组件也跟着改变 --> <component v-bind:is="currentView"></component> 详见vue API中关于

  • Vue 中使用 typescript的方法详解

    什么是typescript typescript 为 javaScript的超集,这意味着它支持所有都JavaScript都语法.它很像JavaScript都强类型版本,除此之外,它还有一些扩展的语法,如interface/module等. typescript 在编译期会去掉类型和特有语法,生成纯粹的JavaScript. Typescript 5年内的热度随时间变化的趋势,整体呈现一个上升的趋势.也说明ts越来越️受大家的关注了. 安装typescript npm install -g ty

随机推荐