滑动验证码-elementui实现

这篇具有很好参考价值的文章主要介绍了滑动验证码-elementui实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用elementui框架实现

html代码
<div class="button-center">
    <el-popover
                placement="top"
                :width="imgWidth"
                title="安全验证"
                trigger="manual"
                v-model="popoverVisible"
                @hide="popoverHide"
                @show="popoverShow">
        <div class="z-popover">
            <!--    滑块图片        -->
            <canvas id="sliderImg"></canvas>
            <!--背景图片-->
            <canvas id="backgroundImg"></canvas>

            <el-slider v-model="sliderValue" :show-tooltip="showTooltip" @input="sliderInput"
                       @change="sliderChange" v-mousedown="sliderDown"></el-slider>
            <el-divider></el-divider>
            <i class="el-icon-circle-close z-el-popover-size" @click="popoverVisible = false"
               title="关闭"></i>
            <i class="el-icon-refresh z-el-popover-size" @click="popoverShow"
               title="更换验证码"></i>
            <span class="z-slider-result">{{sliderResult}}</span>
        </div>
        <el-button slot="reference" type="primary" @click="login()" :disabled="isDisabled"
                   class="login-register-button-width">登录
        </el-button>
    </el-popover>

</div>
主要代码:
function SliderImg(width, height, r, w) {
    this.width = width;
    this.height = height;
    this.r = r;
    this.w = w;

    // 使用双缓冲区去闪烁
    let getBufferCanvas = () => {
        // 创建隐藏Canvas
        let buffer = document.createElement('canvas');
        buffer.width = this.width;
        buffer.height = this.height;
        buffer.ctx = buffer.getContext('2d');
        buffer.ctx.setTransform(1, 0, 0, 1, 0, 0);
        return buffer;
    }

    let init = () => {
        if (!this.backgroundImg || !this.sliderImg) {
            this.backgroundImg = document.getElementById("backgroundImg")
            this.backgroundImg.width = this.width;
            this.backgroundImg.height = this.height;
            this.backgroundImg.ctx = this.backgroundImg.getContext('2d');
            this.sliderImg = document.getElementById("sliderImg")
            this.sliderImg.width = this.width;
            this.sliderImg.height = this.height;
            this.sliderImg.ctx = this.sliderImg.getContext('2d');
        }
        this.sliderWidth = 2 * (this.r + this.w);
        $("#sliderImg").css('position', 'absolute').css("left", "0px");
        this.buffer1 = this.buffer1 == null ? getBufferCanvas() : this.buffer1;
        this.buffer2 = this.buffer2 == null ? getBufferCanvas() : this.buffer2;
        this.pos = getPos();
    }

    this.drawImg = function (src) {
        init();
        let img = new Image();
        img.src = src;
        img.onload = () => {
            drawBgBlock(img, this.buffer1.ctx);
            drawSiBlock(img, this.buffer2.ctx);
        }
    }

    let drawBgBlock = (img, ctx) => {
        ctx.clearRect(0, 0, this.width, this.height);
        ctx.drawImage(img, 0, 0, this.width, this.height);
        // 绘制滑块的形状
        drawBlock(ctx);
        ctx.fill();
        // 将缓冲区内容绘制到实际的画布中
        this.backgroundImg.ctx.clearRect(0, 0, this.width, this.height);
        this.backgroundImg.ctx.drawImage(this.buffer1, 0, 0, this.width, this.height);
    }

    let drawSiBlock = (img, ctx) => {
        ctx.clearRect(0, 0, this.width, this.height);
        ctx.drawImage(img, 0, 0, this.width, this.height);
        // 创建一个临时画布画一个圆, 然后将图片绘制上去, 形成一个滑块
        let tempCanvas = getBufferCanvas();
        tempCanvas.ctx.translate(-this.pos.siOffset, 0);
        drawBlock(tempCanvas.ctx);
        tempCanvas.ctx.clip();
        tempCanvas.ctx.drawImage(this.buffer2, 0, 0);
        // 将缓冲区内容绘制到实际的画布中
        this.sliderImg.ctx.clearRect(0, 0, this.width, this.height);
        this.sliderImg.ctx.drawImage(tempCanvas, 0, 0, this.width, this.height);
    }

    /**
     * 绘制缺口
     *
     * @param ctx
     */
    let drawBlock = (ctx) => {
        let x = this.pos.x, y = this.pos.y, r = this.pos.r, w = this.pos.w;
        ctx.beginPath();
        ctx.moveTo(x, y);
        // left
        // ctx.lineTo(x, y + w); 第一条直线可以省略, 下同理
        ctx.arc(x, y + w + r, r, -0.5 * Math.PI, 0.5 * Math.PI, false);
        ctx.lineTo(x, y + 2 * (w + r));
        // bottom
        ctx.arc(x + w + r, y + 2 * (w + r), r, Math.PI, 0, true);
        ctx.lineTo(x + 2 * (w + r), y + 2 * (w + r));
        // right
        ctx.arc(x + 2 * (w + r), y + w + r, r, 0.5 * Math.PI, -0.5 * Math.PI, true);
        ctx.lineTo(x + 2 * (w + r), y);
        // top
        ctx.arc(x + w + r, y, r, 0, Math.PI, false);
        ctx.lineTo(x, y);
        // 添加可见的效果
        ctx.lineWidth = 1;
        ctx.fillStyle = "rgba(255, 255, 255, 0.5)";
        ctx.strokeStyle = "rgba(255, 255, 255, 0.5)";
        ctx.stroke();
        // 和已有的图形进行异或操作
        ctx.globalCompositeOperation = "xor";
    }

    /**
     * 获取缺口坐标
     */
    let getPos = () => {
        // 背景缺口的x轴坐标
        let x = getRandomNum(this.width / 2 + this.sliderWidth, this.width - 1.5 * this.sliderWidth);
        // 滑块的偏移量
        let siOffset = getRandomNum(0.45 * this.width, 0.55 * this.width);
        // 相同的y轴高度
        let y = getRandomNum(0.5 * this.sliderWidth, this.height - 1.5 * this.sliderWidth);
        return {
            x: x,
            y: y,
            r: this.r,
            w: this.w,
            siOffset: siOffset
        }
    }

    /**
     * 获取随机数
     *
     * @param min
     * @param max
     * @returns {number}
     */
    let getRandomNum = (min, max) => {
        return Math.floor(Math.random() * (max - min + 1) + min);
    }
}
事件方法
// 控制滑块移动
sliderInput(value) {
    if (this.sliderImg == null) {
        return;
    }
    // 移动的距离
    let moveLength = value * (this.imgWidth / 100)
    let start = this.sliderImg.pos.x - this.sliderImg.pos.siOffset;
    // 控制最大位置
    if (start + moveLength >= this.imgWidth) {
        this.sliderValue = value;
    } else {
        $("#sliderImg").css("left", moveLength);
    }
},

    // 鼠标按下时, 记录当下时间
    sliderDown() {
        this.startTime = new Date().getTime();
    },

        // 是否成功的判断
        sliderChange(value) {
            // 移动的距离
            let moveLength = value * (this.imgWidth / 100) - this.sliderImg.sliderWidth / 3
            // 偏移量
            let offset = this.sliderImg.pos.siOffset;
            // 允许的误差
            let mis = 5;
            // 成功的判断
            if (Math.abs(moveLength - offset) < mis) {
                let time = ((new Date().getTime() - this.startTime) / 1000.0).toFixed(2);
                switch (true) {
                    case (time > 0 && time <= 1): {
                        this.sliderResult = "只用了" + time + "s,快如闪电!"
                        break;
                    }
                    case (time > 1 && time <= 2): {
                        this.sliderResult = "用了" + time + "s,还不错!"
                        break;
                    }
                    default: {
                        this.sliderResult = "居然使用了" + time + "s,果然持久!"
                    }
                }
                $(".z-slider-result").removeClass("z-slider-result-error").addClass("z-slider-result-success");
                // 后续成功的处理
                setTimeout(() => {
                    this.loginForm.sliderCode = this.getSliderResult(time);
                }, 500);
            } else {
                this.sliderResult = "验证失败!"
                $(".z-slider-result").removeClass("z-slider-result-success").addClass("z-slider-result-error");
                this.popoverShow();
            }
        },
相关变量
// 以下时滑动图片验证码相关
sliderValue: 0, // 滑块的值
sliderResult: "", // 验证结果
showTooltip: false, // 隐藏tooltip
imgSrc: "/imgs/test2.png", // 图片的src
popoverVisible: false, // 验证框的显示和隐藏
imgWidth: 300, // 验证码图片的宽度
imgHeight: 120,  // 验证码图片的高度
sliderImg: null, // 滑动图片验证码对象
startTime: 0, // 按下滑块的时间
使用示例:
if (this.sliderImg == null) {
    this.sliderImg = new SliderImg(this.imgWidth, this.imgHeight, 5, 10);
}
this.sliderImg.drawImg(this.imgSrc);
效果图

滑动验证码-elementui实现,js,html,网页设计,elementui,前端,javascript文章来源地址https://www.toymoban.com/news/detail-666110.html

到了这里,关于滑动验证码-elementui实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大学生web网页设计期末作业实例代码 (全网最全,建议收藏) HTML+CSS+JS(网页源码)

    临近期末,大一新生的各种考试和专业结课作业纷至沓来。web实训大作业、网页期末作业、web课程与设计、网页设计等,简直让人头大。你还在为网页设计老师的作业要求感到头大?网页作业无从下手?网页要求的总数量太多?没有合适的模板?等等一系列问题。你想要解决

    2024年04月28日
    浏览(57)
  • HTML+CSS+JS网页设计期末课程大作业 京剧文化水墨风书画

    Web前端开发技术 描述 网页设计题材,DIV+CSS 布局制作,HTML+CSS网页设计期末课程大作业,茶文化网站 | 中华传统文化题材 | 京剧文化水墨风书画 | 中国民间年画文化艺术网站 | HTML期末大学生网页设计作业 HTML:结构 CSS:样式 在操作方面上运用了html5和css3, 采用了div+css结构、

    2024年01月21日
    浏览(40)
  • web前端开发——期末大作业网页制作——web网页设计期末课程大作业 HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计

    HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐👇🏻👇🏻👇🏻 ❤ 【作者主页

    2024年02月09日
    浏览(64)
  • 大学生网页设计制作作业实例代码 (全网最全,建议收藏) HTML+CSS+JS

    临近期末,大一新生的各种考试和专业结课作业纷至沓来。web实训大作业、网页期末作业、web课程与设计、网页设计等,简直让人头大。你还在为网页设计老师的作业要求感到头大?网页作业无从下手?网页要求的总数量太多?没有合适的模板?等等一系列问题。你想要解决

    2024年02月03日
    浏览(67)
  • 静态网页设计二十四节气网站HTML+CSS+JS(web期末大作业)

    本网站介绍了中国二十四节气,中国二十四节气准确的反映了自然节律变化,在人们日常生活中发挥了极为重要的作用,二十四节气蕴含着悠久的文化内涵和历史积淀。 2 .1 整体页面布局 网页多次使用div进行页面排版和页面布局,同时使用了float的属性,页面内容清晰明了,

    2024年02月20日
    浏览(49)
  • 大鱼海棠国漫主题HTML前端网页设计成品预览与讲解DIV CSS JS

    国漫大鱼海棠主题,本套大作业共计10个页面,页面美观度较高,网页在细节设计上花了很大功夫,如边框、阴影,鼠标滑过效果等,运用的知识点有:Div+CSS、JS轮播图、Table、下拉菜单栏、视频、表单、二级页面,LOGO设计,基本期末作业所需的知识点都有覆盖~ 戳下方视频预

    2024年02月11日
    浏览(48)
  • 基于html/css/js的web网上书店系统网页设计大学生期末源码分享

    摘要: 随着互联网技术的发展,电子商务逐渐普及并成为人们购物的主要方式之一。本实验基于Web技术,使用HTML、CSS和JavaScript等前端技术,设计并实现了一个基于Web的书店商城系统。实现了用户和管理员两类用户的功能需求。 : Web;CSS;JavaScript;网上书店系统;

    2024年02月03日
    浏览(61)
  • 【网页设计】基于HTML在线图书商城购物项目设计与实现

    🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (1000套) 】 🧡 程序员有趣的告白方式:【💌HTML七夕情人节表白网页制作 (

    2024年02月04日
    浏览(53)
  • 关于我的家乡html网页设计完整版 以家乡为主题的网页设计与实现

    Web前端三大核心技术 HTML:结构 HTML期末大学生网页设计作业,可以替换文字图片满足不同的 CSS:样式 在操作方面上运用了html5和css3, 采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识 JavaScript:做与用户的交互行为 (1)html文件

    2023年04月17日
    浏览(50)
  • html网页设计大学生作业成品——公益校园网站设计与实现(HTML+CSS+JavaScript)

    🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (1000套) 】 🧡 程序员有趣的告白方式:【💌HTML七夕情人节表白网页制作 (

    2024年02月04日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包