Vue3 简单的滑块验证

复制代码
<template>
    <div class="sliderverify">
        <div class="bg" :style="`width:${ disX+40 }px;`"></div>
        <div ref="btn" :class="statusItem[status]"></div>
    </div>
</template>
<script setup>
    import {
        ref,
        getCurrentInstance,
        nextTick
    } from 'vue'
    const emit = defineEmits(['change'])
    const props = defineProps(['width'])
    const status = ref(0)
    const disX = ref(0)
    const btn = ref()
    const statusItem = ['button', 'success']

    nextTick(() => {

        const el = btn.value

        el.onmousedown = el.ontouchstart = e => {
            const clientX = e.clientX || e.changedTouches[0].clientX
            const pw = el.parentElement.offsetWidth - el.offsetWidth
            window.onmousemove = window.ontouchmove = m => {
                var x = (m.clientX || m.changedTouches[0].clientX) - clientX
                disX.value = x < 0 ? 0 : pw <= x ? pw - 2 : x
                e.target.style.transform = `translateX(${disX.value}px)`
                e.preventDefault()
            }
            window.onmouseup = window.ontouchend = () => {
                window.onmouseup = window.onmousemove = window.ontouchmove = null
                if (Math.abs(disX.value - pw) < 3) {
                    el.onmousedown = el.ontouchstart = null
                    status.value = 1
                } else {
                    status.value = disX.value = 0
                }
                emit('change', status.value)
                e.target.style.transform = 'translateX(0px)'
            }
        }

    })
</script>
<style scoped>
    .sliderverify {
        display: flex;
        height: 30px;
        background-color: #eee;
        border: 1px solid #ddd;
        border-radius: 5px;
        position: relative;
    }

    .sliderverify .button,
    .sliderverify .success,
    .sliderverify .fail {
        position: absolute;
        display: block;
        height: 100%;
        background-color: #fff;
        width: 40px;
        border-radius: 5px;
    }

    .sliderverify .bg {
        position: absolute;
        background-color: #a0cfff;
        border-radius: 5px;
        height: 100%
    }

    .sliderverify .button::before,
    .sliderverify .button::after,
    .sliderverify .success::after {
        position: absolute;
        display: block;
        content: "";
        width: 10px;
        height: 10px;
        border-left: 2px solid #bbb;
        border-bottom: 2px solid #bbb;
        transform: rotate(225deg);
        margin-left: 15px;
        margin-top: 8px;
    }

    .sliderverify .success::after {
        border-left: 2px solid #eee;
        border-bottom: 2px solid #eee;
    }

    .sliderverify .button::after {
        margin-left: 8px;
        margin-top: 8px;
    }

    .sliderverify .success::after {
        width: 14px;
        height: 8px;
        transform: rotate(307deg);
        margin: 7px 0 0 11px;
    }

    .sliderverify .success {
        background-color: #67c23a;
        right: 0;
    }
</style>
复制代码

 

posted @   87de海雷  阅读(861)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示