1. 程式人生 > 程式設計 >Vue圖片放大鏡元件的封裝使用詳解

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

基於的圖片放大鏡元件封裝,供大家參考,具體內容如下

圖片放大鏡的實現過程是將一個小圖放置在一個盒子裡,當滑鼠在小圖盒子裡移動時,出現一個移動塊(陰影區域/遮罩層),右側大圖片盒子出現一個等比例放大的在小圖盒子移動塊中的圖片內容。效果圖如下:

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

實現圖片放大鏡效果的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"); //左側遮罩層
      smallimg = document.getElementById("smallimg"); //左邊的小圖
      big = document.getElementById("big"); //右側可視區域
      bigImg = big.getElementsByTagName("img")[0]; //右側大圖
      small = document.getElementById("small");// 左側的容器

      //得到右側可視區的寬高
      var bigW = big.clientWidth;
      var bigH = big.clientHeight;

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

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

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

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

      //右側圖片運動的最大距離
      bigImg_maxJL_l = bigImg.clientWidth - big.offsetWidth;
      bigImg_maxJL_t = bigImg.clientHeight - big.offsetHeight;

      big.style.display = "none";
      float.style.visibility ="hidden"; //滑鼠未移入左側區域使遮罩層以及右側大圖均不可見
    },methods: {
    //滑鼠移入左側區域使遮罩層以及右側大圖可見
      over: function ()
{ float.style.visibility ="visible"; big.style.visibility ="visible"; big.style.display = "block"; },//滑鼠移出左側區域使遮罩層以及右側大圖不可見 out: function () { float.style.visibility ="hidden"; big.style.display = "none"; },//滑鼠移動時遮罩層隨滑鼠的移動而移動 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; //限制其運動範圍在容器之內 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"; },},} </script> //樣式 <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; } </styGCBwK
le>

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

遮罩層分析:

左側遮罩層的寬(高) = 右側可視區域的寬(高)/右側大圖的寬(高)*左側小圖的寬(高)
(遮罩層可以理解為模擬右側大圖盒子,在右側大圖盒子中放置的是一張大的圖片,然後根據一定比例得到浮動區域,同時將盒子設定成溢位隱藏。右側大圖相對於右側容器的呈現比例和左側遮罩層相對於左側容器的比例相對應)
遮罩層運動的距離=左側容器的寬(高)-遮罩層的寬(高);(使其總是在左側容器中運動)
當滑鼠移動到左側小圖盒子的時候我們需要實現滑鼠始終在遮罩層中,並且遮罩層會隨著滑鼠的移動而移動(言外之意:遮罩層的位置和滑鼠移動時的座標息息相關,且不能使它溢位左邊容器,計算方法見程式碼)。

注意:這裡有一個潛藏的bug,即當你的介面滾動的時候,遮罩層不會GCBwK隨介面的滾動而移動,當介面向下滾動的時候,滑鼠在左側容器內但卻不再在遮罩層區域裡,且無法再移動遮罩層。解決辦法如下:

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

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

        t=t+scroll;  //遮罩層移動的高度應該相應的加上介面滾動的高度

        if( l GCBwK< 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";
},//獲取介面滾動的高度的方法
getClGCBwKientHeight: function(){
    var scrollTop=0;
    if(document.documentElement&&document.documentElement.scrollTop)
    {
      scrollTop=document.documentElement.scrollTop;
    }
    else if(document.body)
    {
      scrollTop=document.body.scrollTop;
    }
    return scrollTop;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。