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

Vue圖片放大鏡組件的封裝使用詳解

 更新時間:2021年08月18日 11:31:59   作者:WMMWYC  
這篇文章主要為大家詳細(xì)介紹了Vue圖片放大鏡組件的封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

基于Vue的圖片放大鏡組件封裝,供大家參考,具體內(nèi)容如下

圖片放大鏡的實現(xiàn)過程是將一個小圖放置在一個盒子里,當(dāng)鼠標(biāo)在小圖盒子里移動時,出現(xiàn)一個移動塊(陰影區(qū)域/遮罩層),右側(cè)大圖片盒子出現(xiàn)一個等比例放大的在小圖盒子移動塊中的圖片內(nèi)容。效果圖如下:

實現(xiàn)圖片放大鏡效果的Vue組件代碼如下:

<template>
  <div>
    <div class="move" @mouseover="over()" @mouseout="out()" @mousemove="move($event)">
      <div id="small">  //小圖片以及遮罩層容器
        <div id="float"></div>  //遮罩層
        <img :src="item" id="smallimg">  //需要放大的圖片
      </div>
    </div>
    <div id="big">
      <img :src="item">    //放大以后的圖片
    </div>
  </div>
</template>

<script>
  var float,smallimg,big,bigImg,small,float_maxJL_t,float_maxJL_l,bigImg_maxJL_t,bigImg_maxJL_l;

  export default{
    props: {
      item: {
        type: String
      }
    },
    data() {
     return{
     }
    }, 

    mounted(){
      float = document.getElementById("float"); //左側(cè)遮罩層
      smallimg = document.getElementById("smallimg"); //左邊的小圖
      big = document.getElementById("big"); //右側(cè)可視區(qū)域
      bigImg = big.getElementsByTagName("img")[0]; //右側(cè)大圖
      small = document.getElementById("small");// 左側(cè)的容器

      //得到右側(cè)可視區(qū)的寬高
      var bigW = big.clientWidth;
      var bigH = big.clientHeight;

      //右側(cè)大圖的寬高
      var bigImgW = bigImg.offsetWidth;
      var bigImgH = bigImg.offsetHeight;

      //左側(cè)的小圖的寬高
      var smallImgW = smallimg.offsetWidth;
      var smallImgH = smallimg.offsetHeight;

      //左側(cè)遮罩層的寬高
      float.style.width =  bigW/bigImgW * smallImgW + "px";   //175
      float.style.height = bigH/bigImgH * smallImgH/3*2 + "px";     

      //遮罩層運(yùn)動的最大距離
      float_maxJL_l = small.clientWidth -float.offsetWidth-10;
      float_maxJL_t = small.clientHeight - float.offsetHeight-5;

      //右側(cè)圖片運(yùn)動的最大距離
      bigImg_maxJL_l = bigImg.clientWidth - big.offsetWidth;
      bigImg_maxJL_t = bigImg.clientHeight - big.offsetHeight;

      big.style.display = "none";
      float.style.visibility ="hidden"; //鼠標(biāo)未移入左側(cè)區(qū)域使遮罩層以及右側(cè)大圖均不可見
    },

    methods: {
    //鼠標(biāo)移入左側(cè)區(qū)域使遮罩層以及右側(cè)大圖可見
      over: function () {
        float.style.visibility ="visible";
        big.style.visibility ="visible";
        big.style.display = "block";
      }, 

      //鼠標(biāo)移出左側(cè)區(qū)域使遮罩層以及右側(cè)大圖不可見
      out: function () {
        float.style.visibility ="hidden";
        big.style.display = "none";
      }, 

      //鼠標(biāo)移動時遮罩層隨鼠標(biāo)的移動而移動
      move: function (ev) {
        var l = ev.clientX  - small.offsetLeft - float.offsetWidth/2;
        var t = ev.clientY  - small.offsetTop - float.offsetHeight/2;

        if( l < 0 ) l = 0;     // 超出左邊界賦值為0
        if( t < 0 ) t = 0;     // 超出上邊界賦值為0

        if( l > float_maxJL_l ) l = float_maxJL_l;  //限制其運(yùn)動范圍在容器之內(nèi)
        if( t > float_maxJL_t ) t = float_maxJL_t;

        //求出來一個比例
        var scaleL = l/float_maxJL_l;
        var scaleT = t/float_maxJL_t;

         //遮罩層運(yùn)動位置
        float.style.left = l + "px";
        float.style.top = t + "px"; 

         //右側(cè)大圖運(yùn)動位置
        bigImg.style.left = -scaleL * bigImg_maxJL_l + "px";
        bigImg.style.top = -scaleT * bigImg_maxJL_t + "px";
      },
    },
  }
</script>

//css樣式
<style lang="scss" rel="stylesheet/scss" scoped>
  @import 'src/assets/scss/variable.scss';
  #float {
    width: 120px;
    height: 120px;
    position: absolute;     //必須
    background: $primary;
    border: 1px solid #ccc;
    opacity: 0.5;
    cursor:move ;
  }
  #big {
    position: absolute;  //必須
    top: 260px;
    left: 37.6%;
    width: 350px;
    height: 500px;
    overflow: hidden;
    border: 1px solid #ccc;
    background: #ffffff;
    z-index: 1;
    visibility: hidden;
  }
  #small {
    position: relative;  //必須
    z-index: 1;
    img{
      width:340px;
      height:320px;
    }
  }
  #big img {
    position: absolute;   //必須
    z-index: 5;
    width:700px;
    height:700px;
  }
</style>

在css中需要注意設(shè)置各個圖片以及遮罩層的位置即position。

遮罩層分析:

左側(cè)遮罩層的寬(高) = 右側(cè)可視區(qū)域的寬(高)/右側(cè)大圖的寬(高)*左側(cè)小圖的寬(高)
(遮罩層可以理解為模擬右側(cè)大圖盒子,在右側(cè)大圖盒子中放置的是一張大的圖片,然后根據(jù)一定比例得到浮動區(qū)域,同時將盒子設(shè)置成溢出隱藏。右側(cè)大圖相對于右側(cè)容器的呈現(xiàn)比例和左側(cè)遮罩層相對于左側(cè)容器的比例相對應(yīng))
遮罩層運(yùn)動的距離=左側(cè)容器的寬(高)-遮罩層的寬(高);(使其總是在左側(cè)容器中運(yùn)動)
當(dāng)鼠標(biāo)移動到左側(cè)小圖盒子的時候我們需要實現(xiàn)鼠標(biāo)始終在遮罩層中,并且遮罩層會隨著鼠標(biāo)的移動而移動(言外之意:遮罩層的位置和鼠標(biāo)移動時的坐標(biāo)息息相關(guān),且不能使它溢出左邊容器,計算方法見代碼)。

注意:這里有一個潛藏的bug,即當(dāng)你的界面滾動的時候,遮罩層不會隨界面的滾動而移動,當(dāng)界面向下滾動的時候,鼠標(biāo)在左側(cè)容器內(nèi)但卻不再在遮罩層區(qū)域里,且無法再移動遮罩層。解決辦法如下:

move = function (ev){
        var scroll =  this.getClientHeight(); //得到當(dāng)前界面移動的位置

        var l = ev.clientX  - small.offsetLeft - float.offsetWidth/2;
        var t = ev.clientY  - small.offsetTop - float.offsetHeight/2;

        t=t+scroll;  //遮罩層移動的高度應(yīng)該相應(yīng)的加上界面滾動的高度

        if( l < 0 ) l = 0;
        if( t < 0 ) t = 0; 

        if( l > float_maxJL_l ) l = float_maxJL_l;
        if( t > float_maxJL_t ) t = float_maxJL_t;

        var scaleL = l/float_maxJL_l;
        var scaleT = t/float_maxJL_t;

        float.style.left = l + "px";
        float.style.top = t + "px";

        bigImg.style.left = -scaleL * bigImg_maxJL_l + "px";
        bigImg.style.top = -scaleT * bigImg_maxJL_t + "px";
},
//獲取界面滾動的高度的方法
getClientHeight: function(){
    var scrollTop=0;
    if(document.documentElement&&document.documentElement.scrollTop)
    {
      scrollTop=document.documentElement.scrollTop;
    }
    else if(document.body)
    {
      scrollTop=document.body.scrollTop;
    }
    return scrollTop;
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue2?響應(yīng)式系統(tǒng)之異步隊列

    Vue2?響應(yīng)式系統(tǒng)之異步隊列

    這篇文章主要介紹了Vue2?響應(yīng)式系統(tǒng)之異步隊列,文章基于Vue2?的相關(guān)資料展開對主題的詳細(xì)介紹,具有一定的參考價值需要的小伙伴可以參考一下
    2022-04-04
  • vue與electron實現(xiàn)進(jìn)程間的通信詳情

    vue與electron實現(xiàn)進(jìn)程間的通信詳情

    這篇文章主要介紹了vue與electron實現(xiàn)進(jìn)程間的通信詳情,本文主要介紹electron渲染進(jìn)程和主進(jìn)程間的通信,以及在渲染進(jìn)程和主進(jìn)程中常用的配置項,需要的朋友可以參考一下
    2022-09-09
  • vue實現(xiàn)路由切換改變title功能

    vue實現(xiàn)路由切換改變title功能

    這篇文章主要介紹了vue實現(xiàn)路由切換改變title功能,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-05-05
  • vue項目使用cmd運(yùn)行方式

    vue項目使用cmd運(yùn)行方式

    在開發(fā)過程中,啟動項目是必不可少的一步,本文介紹了兩種啟動項目的方法,第一種方法是通過命令提示符(cmd)進(jìn)入項目目錄,然后輸入npm run serve來啟動項目,第二種方法是直接在項目目錄下打開命令提示符(cmd),輸入npm run serve即可啟動項目
    2024-10-10
  • vue使用自定義指令實現(xiàn)拖拽

    vue使用自定義指令實現(xiàn)拖拽

    這篇文章主要為大家詳細(xì)介紹了vue使用自定義指令實現(xiàn)拖拽,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Vue中定義src在img標(biāo)簽使用時加載不出來的解決

    Vue中定義src在img標(biāo)簽使用時加載不出來的解決

    這篇文章主要介紹了Vue中定義src在img標(biāo)簽使用時加載不出來的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • vue+webrtc(騰訊云) 實現(xiàn)直播功能的實踐

    vue+webrtc(騰訊云) 實現(xiàn)直播功能的實踐

    本文主要介紹了vue+webrtc(騰訊云) 實現(xiàn)直播功能的實踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • vue?底部footer導(dǎo)航組件問題

    vue?底部footer導(dǎo)航組件問題

    這篇文章主要介紹了vue?底部footer導(dǎo)航組件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue3不同環(huán)境下實現(xiàn)配置代理

    vue3不同環(huán)境下實現(xiàn)配置代理

    這篇文章主要介紹了vue3不同環(huán)境下實現(xiàn)配置代理,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • vue2.0實現(xiàn)音樂/視頻播放進(jìn)度條組件

    vue2.0實現(xiàn)音樂/視頻播放進(jìn)度條組件

    這篇文章主要為大家詳細(xì)介紹了vue2.0實現(xiàn)音樂和視頻播放進(jìn)度條組件的思路及具體實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06

最新評論

松滋市| 方正县| 黔西| 长岭县| 永春县| 阜新| 平安县| 拉萨市| 廊坊市| 杭锦旗| 潜江市| 怀远县| 嵊泗县| 渝中区| 潜江市| 黄骅市| 旬阳县| 财经| 剑川县| 漠河县| 安溪县| 榆林市| 泸定县| 通化县| 乐业县| 将乐县| 白水县| 桂东县| 汉阴县| 保亭| 婺源县| 华蓥市| 阿勒泰市| 申扎县| 通海县| 瑞金市| 高邮市| 大安市| 凌海市| 湖南省| 遂宁市|