91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue如何封裝圖片滑塊驗證組件

發布時間:2022-03-31 14:42:53 來源:億速云 閱讀:331 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“vue如何封裝圖片滑塊驗證組件”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“vue如何封裝圖片滑塊驗證組件”這篇文章吧。

具體內容如下

滑塊驗證組件整體不難,主要在于設置圖片的樣式問題,想要讓背景圖充滿div,就需要滑塊圖片也跟隨等比放大,效果與代碼如下:

vue如何封裝圖片滑塊驗證組件

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如何封裝圖片滑塊驗證組件”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vue
AI

潞西市| 泽库县| 陆良县| 许昌县| 通许县| 阳曲县| 阳春市| 宁蒗| 阜宁县| 米易县| 新绛县| 沅陵县| 堆龙德庆县| 邓州市| 和平县| 肇庆市| 庄浪县| 崇信县| 英吉沙县| 通道| 宜宾市| 涪陵区| 漯河市| 巴里| 隆安县| 绵阳市| 榆树市| 长海县| 乌什县| 万盛区| 井陉县| 寿宁县| 孟村| 桐柏县| 亚东县| 金华市| 西充县| 库尔勒市| 蛟河市| 东海县| 公安县|