最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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: { // 監(jiān)聽滑塊數據變化,重置滑塊位置
? ? ? 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() // 創(chuàng)建背景圖片
? ? ? 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() // 創(chuàng)建滑塊圖片
? ? ? ? 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 ?// 設置滑塊距離背景圖左側的距離
? ? ? }
? ? },
? ? // 移動事件觸發(fā)
? ? 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 實現(xiàn)Web端的定位功能 獲取經緯度

    vue 實現(xiàn)Web端的定位功能 獲取經緯度

    這篇文章主要介紹了vue 實現(xiàn)Web端的定位功能獲取經緯度,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • 淺談vue+vite項目部署會遇到的幾個問題

    淺談vue+vite項目部署會遇到的幾個問題

    本文主要介紹了vue+vite項目部署會遇到的幾個問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Vue中實現(xiàn)權限管理詳解

    Vue中實現(xiàn)權限管理詳解

    這篇文章主要介紹了Vue中實現(xiàn)權限管理詳解,權限是對特定資源的訪問許可,所謂權限控制,也就是確保用戶只能訪問到被分配的資源,而前端權限歸根結底是請求的發(fā)起權,請求的發(fā)起可能有下面兩種形式觸發(fā),需要的朋友可以參考下
    2023-08-08
  • vue3輸入框生成的時候如何自動獲取焦點詳解

    vue3輸入框生成的時候如何自動獲取焦點詳解

    記錄一下自己最近開發(fā)vue3.0的小小問題,下面這篇文章主要給大家介紹了關于vue3輸入框生成的時候如何自動獲取焦點的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Vue自定義指令獲取不到參數的原因及解決

    Vue自定義指令獲取不到參數的原因及解決

    這篇文章主要介紹了Vue自定義指令獲取不到參數的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue使用自定義指令實現(xiàn)按鈕權限展示功能

    vue使用自定義指令實現(xiàn)按鈕權限展示功能

    這篇文章主要介紹了vue中使用自定義指令實現(xiàn)按鈕權限展示功能,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 關于vue-color-顏色選擇器插件

    關于vue-color-顏色選擇器插件

    這篇文章主要介紹了關于vue-color-顏色選擇器插件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Vue項目引發(fā)的「過濾器」使用教程

    Vue項目引發(fā)的「過濾器」使用教程

    這篇文章主要給大家介紹了關于Vue項目引發(fā)的「過濾器」使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用vue具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-03-03
  • 使用Vue開發(fā)一個實時性時間轉換指令

    使用Vue開發(fā)一個實時性時間轉換指令

    我們就來實現(xiàn)這樣一個Vue自定義指令v-time,將表達式傳入的時間戳實時轉換為相對時間。下面小編給大家?guī)砹耸褂肰ue開發(fā)一個實時性時間轉換指令,需要的朋友參考下吧
    2018-01-01
  • Vue過濾器使用方法詳解

    Vue過濾器使用方法詳解

    過濾器的功能是對要顯示的數據進行格式化后再顯示,其并沒有改變原本的數據,只是產生新的對應的數據,下面這篇文章主要給大家介紹了關于Vue中過濾器定義以及使用方法的相關資料,需要的朋友可以參考下
    2022-12-12

最新評論

寿光市| 聊城市| 岳普湖县| 娄烦县| 兴海县| 道真| 垫江县| 海丰县| 长宁区| 简阳市| 康保县| 察隅县| 平舆县| 中山市| 柏乡县| 唐山市| 阿拉善左旗| 泗洪县| 汾阳市| 漠河县| 车致| 罗江县| 太康县| 博白县| 勃利县| 碌曲县| 县级市| 陆河县| 庆阳市| 惠东县| 桓仁| 麟游县| 永安市| 华亭县| 阜康市| 荔波县| 富平县| 金塔县| 菏泽市| 石泉县| 宁都县|