vue 實(shí)現(xiàn)圖片放大鏡

新建imageBig.vue

<style>
  #_magnifier_layer{position: absolute; z-index: 9999; background: #f9f9f9;}
  ._magnifier{position: relative;display: inline-block;}
  ._magnifier img{vertical-align: middle;}
  ._magnifier_zoom{position: absolute; top:0;left:0; z-index: 10;pointer-events:none;}
</style>
<template>
  <div class="_magnifier">
    <img :src="src" :width="width" :height="height" @mouseover="handOver"  @mousemove="handMove" @mouseout="handOut"/>
  </div>
</template>

<script>
  export default {
    name: 'app',
    props: {
      src: {
        type: String,
        required: true
      },
      bigsrc: {
        type: String,
        required: true
      },
      width:{
        type: String,
        default:'auto'
      },
      height:{
        type: String,
        default:'auto'
      },
      configs: {
        type: Object,
        default() {
          return {
            width:750,
            height:450,
            maskWidth:50,
            maskHeight:50,
            maskColor:'#fff',
            maskOpacity:0.5
          }
        }
      }
    },
    data() {
      return {
        imgObj:{},
        bigImg:{},
        mouseMask:{},
        imgLayer:{},
        imgRect:{},
      }
    },
    methods: {
      handMove(e) {
        let objX=e.pageX - this.imgRect.left;
        let objY=e.pageY - this.imgRect.top;
        let backgroundX=objX*(Math.ceil(this.bigImg.width/this.imgObj.offsetWidth)/1.5);
        let backgroundY=objY*(Math.ceil(this.bigImg.height/this.imgObj.offsetHeight)/1.5);
        //判斷是否超出界限
        let _maskX=objX-this.mouseMask.offsetHeight/2;
        let _maskY=objY-this.mouseMask.offsetWidth/2;
        if(_maskY<=0){
          _maskY=0;
        }
        if(_maskY+this.mouseMask.offsetHeight>=this.imgRect.height){
          _maskY=this.imgRect.height-this.mouseMask.offsetHeight;
        }
        if(_maskX<=0){
          _maskX=0;
        }
        if(_maskX+this.mouseMask.offsetWidth>=this.imgRect.width){
          _maskX=this.imgRect.width-this.mouseMask.offsetWidth;
        }
        this.mouseMask.style.webkitTransform=`translate3d(${_maskX}px,${_maskY}px,0)`;
        //判斷背景圖是否小于預(yù)覽框
        if(backgroundY+this.configs.height>=this.bigImg.height){
          backgroundY=this.bigImg.height-this.configs.height;
        }
        if(backgroundX+this.configs.width>=this.bigImg.width){
          backgroundX=this.bigImg.width-this.configs.width;
        }
        this.imgLayer.style.backgroundPositionX= `-${backgroundX}px `;
        this.imgLayer.style.backgroundPositionY= `-${backgroundY}px `;
      },
      handOut(e) {
        this.imgLayer.remove();
        this.mouseMask.remove();
      },
      handOver(e) {
        if (!document.getElementById('_magnifier_layer')) {
          //獲取大圖尺寸
          this.imgObj= this.$el.getElementsByTagName('img')[0];
          this.imgRect =this.imgObj.getBoundingClientRect();
          this.bigImg = new Image();
          this.bigImg.src = this.bigsrc;
          //創(chuàng)建鼠標(biāo)選擇區(qū)域
          this.mouseMask = document.createElement("div");
          this.mouseMask.className='_magnifier_zoom';
          this.mouseMask.style.background=this.configs.maskColor;
          this.mouseMask.style.height=this.configs.maskWidth+'px';
          this.mouseMask.style.width=this.configs.maskHeight+'px';
          this.mouseMask.style.opacity=this.configs.maskOpacity;
          this.imgObj.parentNode.appendChild(this.mouseMask);
          //創(chuàng)建預(yù)覽框
          let imgLayer = document.createElement("div");
          this.imgLayer=imgLayer;
          let _layerHeight= this.configs.height;
          let _layerWidth= this.configs.width;
          imgLayer.id = '_magnifier_layer';
          imgLayer.style.width = _layerWidth + 'px';
          imgLayer.style.height = _layerHeight + 'px';
          imgLayer.style.left =this.imgRect.left+this.imgRect.width + 'px';
          imgLayer.style.top = this.imgRect.top+ 'px';
          imgLayer.style.backgroundImage = `url('${this.bigsrc}')`;
          imgLayer.style.backgroundRepeat = 'no-repeat';
          document.body.appendChild(imgLayer);
        }
      }
    }
  }
</script>

新建app.vue剛才新建的組件

  <div id="app">
    <div class="img-con">
      <img-zoom src="src/img/img-samll.png" bigsrc="src/img/img-big.jpg" ></img-zoom>
    </div>
    <div class="img-con2">
      <img-zoom src="src/img/img-samll.png" width="450" height="250" bigsrc="src/img/img-big.jpg" :configs="configs"></img-zoom>
    </div>
  </div>
</template>

<script>
  import imgZoom from './imgZoom.vue';
export default {
  name: 'app',
  data () {
    return {
      configs: {
        width:650,
        height:350,
        maskWidth:100,
        maskHeight:100,
        maskColor:'red',
        maskOpacity:0.2
      }
    }
  },
  components:{
    imgZoom
  }
}
</script>

<style lang="scss">
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 10px;
}
.img-con{border: 1px solid #ccc; text-align: center; padding:0;}
.img-con2{border: 1px solid #bbb; text-align: center; float: left; margin-top: 20px;}
</style>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末界斜,一起剝皮案震驚了整個(gè)濱河市屎媳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖嗜愈,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異料扰,居然都是意外死亡龟梦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)渐扮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)论悴,“玉大人,你說(shuō)我怎么就攤上這事墓律“蚬溃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵耻讽,是天一觀的道長(zhǎng)察纯。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么捐寥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任笤昨,我火速辦了婚禮祖驱,結(jié)果婚禮上握恳,老公的妹妹穿的比我還像新娘。我一直安慰自己捺僻,他們只是感情好乡洼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著匕坯,像睡著了一般束昵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上葛峻,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天锹雏,我揣著相機(jī)與錄音,去河邊找鬼术奖。 笑死礁遵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的采记。 我是一名探鬼主播佣耐,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼唧龄!你這毒婦竟也來(lái)了兼砖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤既棺,失蹤者是張志新(化名)和其女友劉穎讽挟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體丸冕,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戏挡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晨仑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褐墅。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖洪己,靈堂內(nèi)的尸體忽然破棺而出妥凳,到底是詐尸還是另有隱情,我是刑警寧澤答捕,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布逝钥,位于F島的核電站,受9級(jí)特大地震影響拱镐,放射性物質(zhì)發(fā)生泄漏艘款。R本人自食惡果不足惜持际,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哗咆。 院中可真熱鬧蜘欲,春花似錦、人聲如沸晌柬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)年碘。三九已至澈歉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屿衅,已是汗流浹背埃难。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涤久,地道東北人涡尘。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拴竹,于是被迫代替她去往敵國(guó)和親悟衩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫(kù) m...
    小姜先森o0O閱讀 9,418評(píng)論 0 72
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫(kù) m...
    柴東啊閱讀 15,850評(píng)論 2 140
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫(kù) m...
    你猜_3214閱讀 11,043評(píng)論 0 118
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫(kù) m...
    王喂馬_閱讀 6,452評(píng)論 1 77
  • 宮崎駿在全球動(dòng)畫(huà)界具有無(wú)可替代的地位栓拜,迪斯尼稱(chēng)其為“動(dòng)畫(huà)界的黑澤明”座泳。宮崎駿創(chuàng)作的影片背景的畫(huà)風(fēng)始終是清新浪漫的,...
    溜回青春的小胖weibo閱讀 5,672評(píng)論 0 8