vue封装图片滑块验证组件的方法

 更新时间:2022年03月31日 11:49:47   作者:guanguan0_0  
这篇文章主要为大家详细介绍了vue封装图片滑块验证组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了vue封装图片滑块验证组件的具体代码,供大家参考,具体内容如下

滑块验证组件整体不难,主要在于设置图片的样式问题,想要让背景图充满div,就需要滑块图片也跟随等比放大,效果与代码如下:

HTML:

<template>
  <section class="slider-section">
    <div class="img-box">
      <img :src="'data:image/png;base64,' + sliderData.bigImg" class="bg-img" ref="bgImg" />
      <img :src="'data:image/png;base64,' + sliderData.smallImg" class="slider-img" ref="sliderImg" />
    </div>
    <div class="slider-box">
      <span class="slider-text">向右滑动滑块填充拼图</span>
      <div class="slider-icon" @mousedown="rangeMove">></div>
    </div>
  </section>
</template>

JS:

<script>
export default {
  props: ['sliderData'], // 父组件传入的滑块数据对象
  watch: {
    sliderData: { // 监听滑块数据变化,重置滑块位置
      handler (newVal, oldVal) {
        if (newVal) {
          this.init()
        }
      },
      deep: true
    }
  },
  data () {
    return {
      disX: 0 // 滑块距离背景图左侧的位置
    }
  },
  mounted () {
    this.init()
  },
  methods: {
    // 初始化滑块的位置
    init () {
      this.disX = 0 // 初始化滑块位置
      let bigImg = new Image() // 创建背景图片
      bigImg.src = "data:image/png;base64," + this.sliderData.bigImg
      bigImg.onload = () => {
        let originWidth = bigImg.width  // 获取原始背景图片的宽度
        let widthRate = this.$refs.bgImg.width / originWidth // 背景图片渲染后的实际宽度/原始图片宽度
        let smallImg = new Image() // 创建滑块图片
        smallImg.src = "data:image/png;base64," + this.sliderData.smallImg
        this.$refs.sliderImg.src = 'data:image/png;base64,' + this.sliderData.smallImg // 设置滑块图片地址
        this.$refs.sliderImg.style.width = smallImg.width * widthRate + 'px'  // 设置滑块图片宽度
        this.$refs.sliderImg.style.top = this.sliderData.smallY * this.$refs.bgImg.height + 'px'  // 设置滑块距离背景图顶部的距离
        this.$refs.sliderImg.style.left = 0  // 设置滑块距离背景图左侧的距离
      }
    },
    // 移动事件触发
    rangeMove (e) {
      let ele = e.target
      let startX = e.clientX
      let eleWidth = ele.offsetWidth
      let parentWidth = ele.parentElement.offsetWidth
      let MaxX = parentWidth - eleWidth
      document.onmousemove = (e) => {
        let endX = e.clientX
        this.disX = endX - startX
        this.$refs.sliderImg.style.left = this.disX + 'px'
        if (this.disX <= 0) {
          this.disX = 0
          this.$refs.sliderImg.style.left = 0
        }
        if (this.disX >= MaxX - eleWidth) {//减去滑块的宽度,体验效果更好
          this.disX = MaxX
          this.$refs.sliderImg.style.left = (parentWidth - this.$refs.sliderImg.width) + 'px'
        }
        ele.style.transition = '.1s all'
        ele.style.transform = 'translateX(' + this.disX + 'px)'
        e.preventDefault()
      }
      document.onmouseup = () => {
        this.$emit('submitPic', this.disX / parentWidth) // 停止滑动事件冒泡给父级
        setTimeout(() => {
          ele.style.transition = '.5s all'; // 初始化滑块位置
          ele.style.transform = 'translateX(0)';
        }, 200)
        document.onmousemove = null
        document.onmouseup = null
      }
    }
  }
}
</script>

CSS:

<style scoped lang="less">
.slider-section {
  margin: 20px 0;
  .img-box {
    position: relative;
    .bg-img {
      width: 100%;
    }
    .slider-img {
      position: absolute;
      left: 0;
      top: 0;
    }
  }
 
  .slider-box {
    margin-top: 20px;
    background: #f7f9fa;
    color: #666;
    border: 1px solid #e4e7eb;
    position: relative;
    height: 30px;
    width: 100%;
    &:hover {
      box-shadow: 0 0 3px #ccc;
    }
    .slider-text {
      font-size: 14px;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
    }
    .slider-icon {
      width: 30px;
      height: 30px;
      background: #c8923a;
      text-align: center;
      font-size: 20px;
      color: #fff;
      box-shadow: 0 0 6px #ccc;
    }
  }
}
</style>

注:使用的是mousedown、onmousemove 、onmouseup 事件,仅支持PC端,如果要在移动端使用,需要把这些事件改成touch等;

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

相关文章

  • vue 实现Web端的定位功能 获取经纬度

    vue 实现Web端的定位功能 获取经纬度

    这篇文章主要介绍了vue 实现Web端的定位功能获取经纬度,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • 浅谈vue+vite项目部署会遇到的几个问题

    浅谈vue+vite项目部署会遇到的几个问题

    本文主要介绍了vue+vite项目部署会遇到的几个问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Vue中实现权限管理详解

    Vue中实现权限管理详解

    这篇文章主要介绍了Vue中实现权限管理详解,权限是对特定资源的访问许可,所谓权限控制,也就是确保用户只能访问到被分配的资源,而前端权限归根结底是请求的发起权,请求的发起可能有下面两种形式触发,需要的朋友可以参考下
    2023-08-08
  • vue3输入框生成的时候如何自动获取焦点详解

    vue3输入框生成的时候如何自动获取焦点详解

    记录一下自己最近开发vue3.0的小小问题,下面这篇文章主要给大家介绍了关于vue3输入框生成的时候如何自动获取焦点的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Vue自定义指令获取不到参数的原因及解决

    Vue自定义指令获取不到参数的原因及解决

    这篇文章主要介绍了Vue自定义指令获取不到参数的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • vue使用自定义指令实现按钮权限展示功能

    vue使用自定义指令实现按钮权限展示功能

    这篇文章主要介绍了vue中使用自定义指令实现按钮权限展示功能,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 关于vue-color-颜色选择器插件

    关于vue-color-颜色选择器插件

    这篇文章主要介绍了关于vue-color-颜色选择器插件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Vue项目引发的「过滤器」使用教程

    Vue项目引发的「过滤器」使用教程

    这篇文章主要给大家介绍了关于Vue项目引发的「过滤器」使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • 使用Vue开发一个实时性时间转换指令

    使用Vue开发一个实时性时间转换指令

    我们就来实现这样一个Vue自定义指令v-time,将表达式传入的时间戳实时转换为相对时间。下面小编给大家带来了使用Vue开发一个实时性时间转换指令,需要的朋友参考下吧
    2018-01-01
  • Vue过滤器使用方法详解

    Vue过滤器使用方法详解

    过滤器的功能是对要显示的数据进行格式化后再显示,其并没有改变原本的数据,只是产生新的对应的数据,下面这篇文章主要给大家介绍了关于Vue中过滤器定义以及使用方法的相关资料,需要的朋友可以参考下
    2022-12-12

最新评论