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

Vue實(shí)現(xiàn)圖片預(yù)覽效果實(shí)例(放大、縮小、拖拽)

 更新時(shí)間:2021年05月13日 14:18:08   作者:DOM曼珠沙華  
現(xiàn)在項(xiàng)目中有這樣的一個(gè)需求,對(duì)上傳的圖片可以點(diǎn)擊之后在線預(yù)覽,這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)圖片預(yù)覽效果實(shí)例(放大、縮小、拖拽)的相關(guān)資料,需要的朋友可以參考下

前言

這張圖是顯示的圖片放大的一個(gè)預(yù)覽情況,這里是參考預(yù)覽操作實(shí)現(xiàn)的一個(gè)背景為黑色的部分,上層的圖片可實(shí)現(xiàn)滾輪放大或者點(diǎn)擊上部的放大鏡圖標(biāo)進(jìn)行放大,代碼是基于Ant Design Vue框架的基礎(chǔ)上

這里先分解部分,后面有全部代碼

1.需要有黑色背景用于預(yù)覽背景:

這里的背景要占滿整個(gè)屏幕(這里的一般是參考其他插件預(yù)覽的樣式進(jìn)行模擬設(shè)計(jì)的),樣式在后方代碼內(nèi)

2.展示圖片并且把圖片展示到背景板最中間。

3.最重要的下方的兩部分:

滾輪放大縮小圖片:

bbimg() {
      let e = e || window.event
      this.params.zoomVal += e.wheelDelta / 1200
      if (this.params.zoomVal >= 0.2) {
        this.test = `transform:scale(${this.params.zoomVal});`
      } else {
        this.params.zoomVal = 0.2
        this.test = `transform:scale(${this.params.zoomVal});`
        return false
      }
    },

圖片拖拽:

imgMove(e) {
      console.log('e', e)
      let oImg = e.target
      let disX = e.clientX - oImg.offsetLeft
      let disY = e.clientY - oImg.offsetTop
      console.log('disX', disX)
      document.onmousemove = (e) => {
        e.preventDefault()
        let left = e.clientX - disX
        let top = e.clientY - disY
        this.test = this.test + `left: ${left}px;top: ${top}px;`
      }
      document.onmouseup = (e) => {
        document.onmousemove = null
        document.onmouseup = null
      }
    },

這里的test和classStyle是作為圖片的動(dòng)態(tài)樣式,雖然名字起得著急,但是不影響使用

整體實(shí)現(xiàn)的功能:

  1. 點(diǎn)擊圖片,可以進(jìn)行滾輪放大及縮小,
  2. 點(diǎn)擊后按壓左鍵可進(jìn)行拖拽查看圖片
  3. 點(diǎn)擊上方的放大及縮小圖標(biāo)也可以進(jìn)行放大等操作,
  4. 點(diǎn)擊 x 可關(guān)于預(yù)覽
  5. 點(diǎn)擊關(guān)閉后,恢復(fù)大小,避免點(diǎn)擊其他照片影響大小

下面是全部實(shí)現(xiàn)代碼:

<template>
  <a-card style="width: 100%">
    <div>
      <img
        :src="file"
        alt=""
        @click="handlePhotoShow(file)"
        />
      <!-- preview="0"
        preview-text="圖片" -->
    </div>
    <div class="showImg" v-if="pictShow" @mousewheel="bbimg(this)">
      <div class="setting_box">
        <a-icon
          class="setting_zoom"
          v-if="zoomInShow == false"
          type="zoom-in"
          @click="handleZoomIn"
        />
        <a-icon
          color="#fff"
          class="setting_zoom"
          v-if="zoomInShow == true"
          type="zoom-out"
          @click="handleZoomOut"
        />
        <a-icon color="#fff" class="setting_close" type="close" @click="handleClose" />
      </div>
      <img :src="file" alt="" :class="classStyle" :style="test" @mousedown="imgMove" />
    </div>
  </a-card>
</template>
 
<script>
export default {
  data() {
    return {
      test: '',
      pictShow: false,
      zoomInShow: false,
      params: {
        zoomVal: 1,
        left: 0,
        top: 0,
        currentX: 0,
        currentY: 0,
        flag: false,
      },
      file: '',
    }
  },
  computed: {
    classStyle() {
      return this.zoomInShow ? 'a1' : 'a2'
    },
  },
  methods: {
    // 實(shí)現(xiàn)圖片放大縮小 
    bbimg() {
      let e = e || window.event
      this.params.zoomVal += e.wheelDelta / 1200
      if (this.params.zoomVal >= 0.2) {
        this.test = `transform:scale(${this.params.zoomVal});`
      } else {
        this.params.zoomVal = 0.2
        this.test = `transform:scale(${this.params.zoomVal});`
        return false
      }
    },
    // 實(shí)現(xiàn)圖片拖拽
    imgMove(e) {
      console.log('e', e)
      let oImg = e.target
      let disX = e.clientX - oImg.offsetLeft
      let disY = e.clientY - oImg.offsetTop
      console.log('disX', disX)
      document.onmousemove = (e) => {
        e.preventDefault()
        let left = e.clientX - disX
        let top = e.clientY - disY
        this.test = this.test + `left: ${left}px;top: ${top}px;`
      }
      document.onmouseup = (e) => {
        document.onmousemove = null
        document.onmouseup = null
      }
    },
    handleZoomIn() {
      this.zoomInShow = true
    },
    handleZoomOut() {
      this.zoomInShow = false
    },
    handlePhotoShow(file) {
      console.log('file', file)
      this.file = file
      this.pictShow = true
    },
    handleClose() {
      this.pictShow = false
      this.test = `transform:scale(1)`
    },
  },
}
</script>
<style scoped lang="less">
.showImg {
  width: 100%;
  height: 100vh;
  background-color: rgba(0, 0, 0, 1);
  position: fixed;
  *position: absolute;
  z-index: 20;
  margin: 0 auto;
  top: 0;
  left: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  .setting_box {
    width: 100%;
    height: 50px;
    line-height: 50px;
    font-size: 20px;
    background-color: rgba(0, 0, 0, 0.3);
    position: absolute;
    top: 0;
    z-index: 999;
    .setting_zoom,
    .setting_close {
      position: absolute;
      z-index: 1000;
      top: 20px;
      color: #fff;
      opacity: 1;
    }
    .setting_zoom {
      right: 50px;
    }
    .setting_close {
      right: 10px;
    }
  }
}
.a1 {
  max-width: 200vw;
  max-height: 180vh;
  position: absolute;
  z-index: 22;
  margin-top: 40px;
  cursor: move;
}
.a2 {
  max-width: 95vw;
  max-height: 90vh;
  position: absolute;
  z-index: 22;
  margin-top: 40px;
  cursor: move;
}
.zoom-box {
  cursor: zoom-in;
}
.photo_box {
  margin: 0 5px 5px 0;
}
</style>

因?yàn)榫唧w也是查看了很多博客等資源最后完成的。

其實(shí)在代碼內(nèi)有一部分代碼:

<img
	:src="file"
	preview="0"
	preview-text="圖片"
	alt=""
	@click="handlePhotoShow(file)"
/>

其實(shí)有  preview="0" preview-text="圖片" 這兩行實(shí)現(xiàn)圖片的預(yù)覽,但是找了資料沒找到具體實(shí)現(xiàn)的部分,但是這個(gè)屬性確實(shí)實(shí)現(xiàn)了

這里手寫預(yù)覽的原因是這個(gè)插件在數(shù)量大的情況下是沒有反應(yīng)的。

總結(jié)

到此這篇關(guān)于Vue實(shí)現(xiàn)圖片預(yù)覽效果實(shí)例(放大、縮小、拖拽)的文章就介紹到這了,更多相關(guān)Vue圖片放大縮小拖拽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue 的 solt 子組件過濾過程解析

    vue 的 solt 子組件過濾過程解析

    這篇文章主要介紹了vue 的 solt 子組件過濾過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • vue+element-ui實(shí)現(xiàn)主題切換功能

    vue+element-ui實(shí)現(xiàn)主題切換功能

    這篇文章主要介紹了vue+element-ui實(shí)現(xiàn)主題切換功能,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • vue解決使用webpack打包后keep-alive不生效的方法

    vue解決使用webpack打包后keep-alive不生效的方法

    今天小編就為大家分享一篇vue解決使用webpack打包后keep-alive不生效的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue使用echarts實(shí)現(xiàn)地圖的方法詳解

    vue使用echarts實(shí)現(xiàn)地圖的方法詳解

    這篇文章主要為大家詳細(xì)介紹了vue使用echarts實(shí)現(xiàn)地圖的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • el-date-picker 選擇日期范圍只保存左側(cè)日期面板的實(shí)現(xiàn)代碼

    el-date-picker 選擇日期范圍只保存左側(cè)日期面板的實(shí)現(xiàn)代碼

    接到這樣的需求,日期篩選,但限制只能選擇同一個(gè)月的數(shù)據(jù),故此應(yīng)該去掉右側(cè)月份面板,今天通過本文給大家分享el-date-picker 選擇日期范圍只保存左側(cè)日期面板的實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧
    2024-06-06
  • Vue插槽簡(jiǎn)介和使用示例詳解

    Vue插槽簡(jiǎn)介和使用示例詳解

    插槽就是子組件中的提供給父組件使用的一個(gè)占位符,用<slot></slot>?表示,父組件可以在這個(gè)占位符中填充任何模板代碼,如?HTML、組件等,填充的內(nèi)容會(huì)替換子組件的<slot></slot>標(biāo)簽,這篇文章主要介紹了Vue插槽的理解和使用,需要的朋友可以參考下
    2023-03-03
  • VS?Code打開vue文件出現(xiàn)很多黃色波浪線的完美解決辦法

    VS?Code打開vue文件出現(xiàn)很多黃色波浪線的完美解決辦法

    作為一名經(jīng)驗(yàn)豐富的開發(fā)者,下面這篇文章主要給大家介紹了關(guān)于VS?Code打開vue文件出現(xiàn)很多黃色波浪線的完美解決辦法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • Vuex中g(shù)etters和actions的使用補(bǔ)充說明

    Vuex中g(shù)etters和actions的使用補(bǔ)充說明

    這篇文章主要介紹了在Vuex中關(guān)于getters和actions使用的補(bǔ)充作了簡(jiǎn)要說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-09-09
  • vuex的輔助函數(shù)該如何使用

    vuex的輔助函數(shù)該如何使用

    vue通過輔助函數(shù)mapState、mapActions、mapMutations,把vuex.store中的屬性映射到vue實(shí)例身上,這樣在vue實(shí)例中就能訪問vuex.store中的屬性了,對(duì)于操作vuex.store就很方便了,本文具體的介紹下這些輔助函數(shù)的使用方法
    2021-06-06
  • vue中css如何使用data中的變量

    vue中css如何使用data中的變量

    這篇文章主要介紹了vue中css如何使用data中的變量問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評(píng)論

北川| 松溪县| 上饶县| 合山市| 沙坪坝区| 元氏县| 台南市| 凤台县| 桦南县| 翼城县| 松阳县| 潮安县| 新泰市| 扶沟县| 闸北区| 墨江| 九台市| 武义县| 读书| 蒙山县| 璧山县| 阿拉善右旗| 淄博市| 龙口市| 元谋县| 红原县| 大城县| 关岭| 东乡县| 双城市| 清河县| 和田县| 金寨县| 阜平县| 泰和县| 通化市| 内乡县| 北宁市| 固镇县| 揭阳市| 大理市|