欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

原生js實現(xiàn)一個放大鏡效果超詳細

 更新時間:2022年09月25日 15:01:46   作者:Coder66  
這篇文章主要介紹了原生js實現(xiàn)一個放大鏡效果超詳細,文章圍繞主題展開詳細的內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下

前言:

學習js之初,寫過js放大鏡,但是當時模模糊糊,似懂非懂,最近重溫js內(nèi)容,決定重寫了一下這個放大鏡效果,希望可以讓初學者對js-DOM的練習更好上手

一、放大鏡效果

二、實現(xiàn)步驟

1. 首先分析放大鏡結(jié)構

  • 左邊圖片:img---原圖片
  • 左邊圖片里面的類似于放大鏡的遮罩層:glass---用于選擇需要放大的部分
  • 右邊放大的圖片:bigImg ---用于展示放大效果

html代碼如下:

  <div class="box">
    <div class="glassWrapper">
      <img src="./assets/green.jpg" class="img"/>
      <div class="glass" id="glass"></div>
    </div>
    <div class="bigWrapper">
      <img src="./assets/green.jpg" class="bigImg"/>
    </div>
  </div>

2. 整體樣式---css部分

整體居中: 左右兩張圖片居中垂直使用flex布局,網(wǎng)上很多,這里不多說布局問題

右邊放大效果的關鍵樣式: 底部有一張大圖片,有一個固定的框展示放大的部分,超過這個展示款的部分就遮住,從而出現(xiàn)一種被放大的效果,使用:overflow: hidden; 

 圖片移動的關鍵: 移動的圖片使用:絕對定位(注意子絕父相)

css代碼:

.glassTitle {
  color: #89cff0;
  text-align: center;
}

.box {
  width: 80vw;
  min-width: 800px;
  height: 80vh;
  min-height: 600px;
  line-height: 80vh;
  display: flex;
  align-items: center;
  justify-content: space-around;
  background-color: #f2f3f4;
  margin: 10px auto;
  border-radius: 10px;
  box-shadow: 0px 0px 10px 1px #5d8aa8;
}

.glassWrapper{
  line-height: 0;
  position: relative;
}

.img {
  display: block;
  width: 250px;
  height: auto;
}

.glass {
  position: absolute;
  width: 80px;
  height: 80px;
  background: #89cff0;
  opacity: .5;
  display: none;
}

.bigWrapper {
  position: relative;
  width: 500px;
  height: 500px;
  background-color: #fff;
  border: 1px dashed #89cff0;
  border-radius: 10px;
  overflow: hidden;
}

.bigImg {
  width: 2500px;
  display: none;
  position: absolute;
}

3. JS操作dom實現(xiàn)放大鏡

現(xiàn)在樣式和結(jié)構都準備好了,就差來操作DOM了

1. 實現(xiàn)glass跟隨鼠標移動

效果是只要鼠標進入img中,就出現(xiàn)glass,出去就消失,所以給img添加鼠標監(jiān)聽事件mouseover,原本imgdisplay:none, 后變成display:block,離開img的鼠標監(jiān)聽事件是mouseout,

const glassWrapper = document.querySelector('.glassWrapper'); // 放大鏡的盒子
? glassWrapper.addEventListener('mouseover', () => {
? ? glass.style.display = 'block';
? ? bigImg.style.display = 'block';
? });
  
? glassWrapper.addEventListener('mouseout', () => {
? ? glass.style.display = 'none';
? ? bigImg.style.display = 'none';
? })

2. 實現(xiàn)glass跟隨鼠標移動,并且鼠標位于glass中央

如圖: 

  • e.pageX是鼠標相對于文檔(document)的水平坐標, e.pageY是鼠標相對文檔的垂直坐標
  • glassWrapper.offsetWidthglassWrapper元素的水平偏移位置,glassWrapper.offsetTopglassWrapper元素的垂直偏移位置,
  • e.pageX - glassWrapper.offsetLeft可以得到鼠標相對于glassWrapper的偏移量x
  • x - glass.offsetWidth / 2:x減去glass寬度的一半就可以得到glass相對于glassWrapper的偏移量,即可得到絕對定位的left,同理Top也可以得到
  • 以下代碼即可實現(xiàn)glass跟隨鼠標移動

為什么因為glass是相對于glassWrapper而移動的?因為css里面的子絕父相

  box.addEventListener('mousemove', (e) => {
    // 該操作讓glassWrapper的左上角變成坐標原點, 因為glass是先相對于glassWrapper而移動的
    const x = e.pageX - glassWrapper.offsetLeft;
    const y = e.pageY - glassWrapper.offsetTop;
    // 讓鼠標在glass的中間位置
    let width = x - glass.offsetWidth / 2;
    let height = y - glass.offsetHeight / 2;

    // 改變放大鏡的位置
    glass.style.left = width + 'px';
    glass.style.top = height + 'px';

3. glass不超出img內(nèi)部

如圖絕對定位的left, 也就是width的最小是0,最大是glassWrapper.offsetWidth - glass.offsetWidth

  box.addEventListener('mousemove', (e) => {
    // 該操作讓glassWrapper的左上角變成坐標原點, 因為glass是先相對于glassWrapper而移動的
    const x = e.pageX - glassWrapper.offsetLeft;
    const y = e.pageY - glassWrapper.offsetTop;
    // 讓鼠標在glass的中間位置
    let width = x - glass.offsetWidth / 2;
    let height = y - glass.offsetHeight / 2;
    // 讓glass不超出img內(nèi)部
  + if (width <= 0) {
  +   width = 0;
  + } else if (width >= glassWrapper.offsetWidth - glass.offsetWidth) {
  +   width = glassWrapper.offsetWidth - glass.offsetWidth;
  + }
  + if (height <= 0) {
  +   height = 0;
  + } else if (height >= glassWrapper.offsetHeight - glass.offsetHeight) {
  +   height = glassWrapper.offsetHeight - glass.offsetHeight;
  + }

    // 改變放大鏡的位置
    glass.style.left = width + 'px';
    glass.style.top = height + 'px';
 })

4.重點:放大的圖片的移動--較難理解

  • 首先確定放大比例并更改大圖片的大小

放大比例是由glassbigWrapper之間的比例來決定的,所以首先先計算大圖片應該有多大,bigImg.style.width = img.offsetWidth * bigWrapper.offsetWidth / glass.offsetWidth + 'px';并且更改大圖片的大??;

  • 移動大圖片left的正負

小圖片img和大圖片bigImgleft都是相對其父元素的,不同的是:左邊我們移動的是glass, 而右邊我們移動的是bigImgglass往左邊移動(left為正),相當于視口相對于圖片往左邊移動,反過來,圖片就是相對于視口往右邊移(bigImg的left為負),所以bigImgleftglassleft是符號是相反的

  • left的比例

bigImg移動的距離是glass移動的距離之間的比例由:大圖片和小圖片之間的比例(或者glass和glassWrapper之間的比例)來決定

    // 改變大圖片的位置
    bigImg.style.width = img.offsetWidth * bigWrapper.offsetWidth / glass.offsetWidth + 'px';
    bigImg.style.left = - width * bigImg.offsetWidth / img.offsetWidth + 'px';
    bigImg.style.top = - height * bigImg.offsetHeight / img.offsetHeight + 'px';

總結(jié)

到此這篇關于原生js實現(xiàn)一個放大鏡效果超詳細的文章就介紹到這了,更多相關js放大鏡效果內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • js實現(xiàn)Select列表各項上移和下移的方法

    js實現(xiàn)Select列表各項上移和下移的方法

    這篇文章主要介紹了js實現(xiàn)Select列表各項上移和下移的方法,涉及javascript動態(tài)操作頁面元素屬性值的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • JavaScript實現(xiàn)刮刮樂效果

    JavaScript實現(xiàn)刮刮樂效果

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)刮刮樂效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 微信小程序?qū)崿F(xiàn)單列下拉菜單效果

    微信小程序?qū)崿F(xiàn)單列下拉菜單效果

    這篇文章主要介紹了微信小程序單列下拉菜單,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • JavaScript中跨標簽頁通信的常見方式

    JavaScript中跨標簽頁通信的常見方式

    跨標簽頁通信是指在瀏覽器中的不同標簽頁之間進行數(shù)據(jù)傳遞和通信的過程,這篇文章為大家整理了幾個常見的跨標簽頁通信方式,感興趣的小伙伴可以了解下
    2023-10-10
  • JavaScript中var let const的用法有哪些區(qū)別

    JavaScript中var let const的用法有哪些區(qū)別

    在ES6(ES2015)出現(xiàn)之前,JavaScript中聲明變量就只有通過var關鍵字,函數(shù)聲明是通過function關鍵字,而在ES6之后,聲明的方式有var、let、const、function、class,本文主要討論var、let和const之間的區(qū)別
    2021-10-10
  • JS數(shù)組去重的九種高階方法(親測有效)

    JS數(shù)組去重的九種高階方法(親測有效)

    這篇文章主要給大家介紹了關于JS數(shù)組去重的九種高階方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • 跟我學習javascript的定時器

    跟我學習javascript的定時器

    跟我學習javascript的定時器,告訴大家具體的使用方法,并向大家提出了一個消息要求,制作一個定時器,有沒有朋友感興趣,挑戰(zhàn)一下
    2015-11-11
  • JS實現(xiàn)獲取圖片大小和預覽的方法完整實例【兼容IE和其它瀏覽器】

    JS實現(xiàn)獲取圖片大小和預覽的方法完整實例【兼容IE和其它瀏覽器】

    這篇文章主要介紹了JS實現(xiàn)獲取圖片大小和預覽的方法,結(jié)合完整實例形式分析了javascript針對不同瀏覽器處理圖片上傳與預覽等操作的相關實現(xiàn)技巧,需要的朋友可以參考下
    2017-04-04
  • 原生javascript實現(xiàn)勻速運動動畫效果

    原生javascript實現(xiàn)勻速運動動畫效果

    這篇文章主要為大家詳細介紹了原生javascript實現(xiàn)勻速運動動畫效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-02-02
  • js FLASH幻燈片字符串中有連接符&的處理方法

    js FLASH幻燈片字符串中有連接符&的處理方法

    一般情況下我們在FLASH幻燈片字符串中有連接符時點擊鏈接就會不正常,造成鏈接中的參數(shù)丟失,那么就需要用encodeURIComponent來對鏈接地址進行編碼
    2012-03-03

最新評論