日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

用JS逐步分解实现放大镜(看完就有收获)

發布時間:2023/12/18 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用JS逐步分解实现放大镜(看完就有收获) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 案例描述
    • 案例圖示
    • HTML
    • CSS樣式
    • JS代碼
      • JS分解代碼----小圖點擊事件
      • JS分解代碼----鼠標進入和移出
      • JS分解代碼----鼠標的移動
      • JS分解代碼----碰撞事件,放大鏡的移動
      • JS分解代碼----超大圖的位置改變
      • JS全部代碼展示

案例描述

在瀏覽器的左邊有一張大圖,下面有兩張小圖,點擊任何一張小圖會在大圖的位置顯示這張小圖的畫面。進入大圖,鼠標所指之處有一個透明的黃色區域,而在大圖的右邊(以下稱超大圖)會放大這一區域

案例圖示

HTML

<body><div id="box"><div id="small"><img src="./program1/images/1.jpg" ><span id="mask"></span></div><div id="big"><img src="./program1/images/1.jpg" ></div></div><div id="list"><ul><li><img src="./program1/images/1.jpg" width="100px"></li><li><img src="./program1/images/2.jpg" width="100px"></li></ul></div> </body>

CSS樣式

詳解請看注釋

<style>* {padding: 0;margin: 0;box-sizing: border-box;list-style: none;border: none;}#box {width: 250px;height: 160px;margin-left: 100px;margin-top: 100px;position: relative;}#small {width: 100%;height: 100%;border: 1px solid #ccc; /* 放大鏡操作 */position: relative; }#small img{width: 100%;height: 100%;padding: 2px;}/* 顯微鏡 */#mask {width: 50px;height: 50px;/* 透明圖 */background-color:rgba(255, 255, 0,.4);position: absolute;left: 0;top: 0;cursor: move;/* 隱藏 */display: none;}#big {width: 400px;height: 255px;border: 1px solid #ccc;/* 為以后大圖位置改變作準備 */position: absolute;/* 250 + 10 margin */left: 260px; top: 0;/* 圖片超出部分隱藏 */overflow: hidden;/* 整個大圖開始是隱藏的 */display: none;}#big img {width: 700px;padding: 2px;position: absolute;left: 0;top: 0;margin: 0 auto;background-color: red;}#list {margin-top: 5px;margin-left: 100px;}#list li {float: left;margin-right: 5px;cursor: pointer;} </style>

JS代碼

JS分解代碼----小圖點擊事件

(1)首先設置一個value屬性用于改變small_img中的圖片src,value的值為其下標+1
(2)監聽li中的點擊事件時,要改變small_img(大圖)中的圖片展示和big_img(超大圖)中的圖片展示

for (let i = 0; i < allLi.length; i++) {var li = allLi[i];//設置一個value屬性用于改變small_img中的圖片srcli.setAttribute('value',i+1);//監聽li中的點擊事件li.addEventListener('click',function(){//改變small_img中的圖片展示small_img.setAttribute('src',"./program1/images/" + this.getAttribute('value') +".jpg");//改變big_img中的圖片展示big_img.setAttribute('src',"./program1/images/" + this.getAttribute('value') +".jpg");});}

JS分解代碼----鼠標進入和移出

鼠標進入和移出都要改變放大鏡和超大圖的display屬性。
進入時display屬性值為*“block”*
移出時display屬性值為*“none”*

//監聽鼠標進入boxbox.addEventListener('mouseover',function() { //放大鏡顯示mask.style.display = 'block';//big圖片顯示big.style.display = 'block'; });//監聽鼠標移出boxbox.addEventListener('mouseout',function(){//放大鏡隱藏mask.style.display = 'none';//big圖片隱藏big.style.display = 'none';})});

JS分解代碼----鼠標的移動

在鼠標進入事件中監聽鼠標的移動
這里運用到事件對象和offset家族的知識
可以參考:
事件對象
offset家族
注意事項看注釋

//監聽鼠標的移動 small.addEventListener('mousemove',function(event){ //事件對象 var e = event || window.event; //獲取鼠標的位置 鼠標顯示在mask中間:減去自身寬高度的一半 //最好用pageX、pageY,不要用clientX、clientY 防止有分頁時出錯var small_x = event.pageX - box.offsetLeft - mask.offsetWidth*0.5; var small_y= event.pageY - box.offsetTop - mask.offsetHeight*0.5;

JS分解代碼----碰撞事件,放大鏡的移動

寫完上述代碼,你會發現放大鏡也能去到大圖以外的區域,這不是我們所期望的,這里就需要用到碰撞事件了
這里還是用到了offset家族的知識
這里用到的思維是用if判斷條件限制上下左右的邊界
放大鏡的移動就是改變它的top和left值(因為它相對父元素絕對定位)
不理解offset,請參考:offset家族
注意事項看注釋

//放大鏡碰撞 //相對于box 因為box有定位 if(small_x <= 0)small_x = 0; else if( small_x >= box.offsetWidth-mask.offsetWidth)small_x = box.offsetWidth-mask.offsetWidth - 2; //除去邊框 if(small_y <= 0)small_y = 0; else if( small_y >= box.offsetHeight-mask.offsetHeight)small_y = box.offsetHeight-mask.offsetHeight - 2;//放大鏡跟著鼠標的位置 mask.style.left = small_x + 'px'; mask.style.top = small_y + 'px';

JS分解代碼----超大圖的位置改變

big_img.style.left 和 big_img.style.top為負值(你可以試試去掉負號是什么樣的效果)
這里的重點是這個公式

//big_img中的位置相應改變 //公式:small_x/big_x = small_width/big_img_widthbig_img.style.left = - (event.pageX - box.offsetLeft) /(small.offsetWidth / big.offsetWidth) + 'px'; big_img.style.top = -( event.pageY - box.offsetTop)/( small.offsetHeight / big.offsetHeight) + 'px';

JS全部代碼展示

<script>window.addEventListener ('load',function(){//獲取元素var small = $('small');var big = $('big'); var mask = $('mask');var allLi = document.getElementsByTagName('li');var small_img = small.children[0];var big_img = big.children[0];//遍歷每一個li中的點擊事件for (let i = 0; i < allLi.length; i++) {var li = allLi[i];//設置一個value屬性用于改變small_img中的圖片srcli.setAttribute('value',i+1);//監聽li中的點擊事件li.addEventListener('click',function(){//改變small_img中的圖片展示small_img.setAttribute('src',"./program1/images/" + this.getAttribute('value') +".jpg");//改變big_img中的圖片展示big_img.setAttribute('src',"./program1/images/" + this.getAttribute('value') +".jpg");});}//監聽鼠標進入boxbox.addEventListener('mouseover',function() { //放大鏡顯示mask.style.display = 'block';//big圖片顯示big.style.display = 'block';//監聽鼠標的移動small.addEventListener('mousemove',function(event){//事件對象var e = event || window.event;//獲取鼠標的位置 鼠標顯示在mask中間:減去自身寬高度的一半//最好用pageX、pageY,不要用clientX、clientY 防止有分頁時出錯var small_x = event.pageX - box.offsetLeft - mask.offsetWidth*0.5;var small_y= event.pageY - box.offsetTop - mask.offsetHeight*0.5;//放大鏡碰撞 // console.log(mask.offsetLeft) ;//相對于box 因為boxx有定位if(small_x <= 0)small_x = 0;else if( small_x >= box.offsetWidth-mask.offsetWidth)small_x = box.offsetWidth-mask.offsetWidth - 2; //除去邊框if(small_y <= 0)small_y = 0;else if( small_y >= box.offsetHeight-mask.offsetHeight)small_y = box.offsetHeight-mask.offsetHeight - 2;//放大鏡跟著鼠標的位置 mask.style.left = small_x + 'px';mask.style.top = small_y + 'px';//big_img中的位置相應改變//公式:small_x/big_x = small_width/big_img_widthbig_img.style.left = - (event.pageX - box.offsetLeft) /(small.offsetWidth / big.offsetWidth) + 'px';big_img.style.top = -( event.pageY - box.offsetTop)/( small.offsetHeight / big.offsetHeight) + 'px';});});//監聽鼠標移出boxbox.addEventListener('mouseout',function(){//放大鏡隱藏mask.style.display = 'none';//big圖片隱藏big.style.display = 'none';})});//封裝function $(id) {return typeof id === 'string'? document.getElementById(id):null;} </script>

總結

以上是生活随笔為你收集整理的用JS逐步分解实现放大镜(看完就有收获)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。