javascript
用JS逐步分解实现放大镜(看完就有收获)
文章目錄
- 案例描述
- 案例圖示
- HTML
- CSS樣式
- JS代碼
- JS分解代碼----小圖點(diǎn)擊事件
- JS分解代碼----鼠標(biāo)進(jìn)入和移出
- JS分解代碼----鼠標(biāo)的移動(dòng)
- JS分解代碼----碰撞事件,放大鏡的移動(dòng)
- JS分解代碼----超大圖的位置改變
- JS全部代碼展示
案例描述
在瀏覽器的左邊有一張大圖,下面有兩張小圖,點(diǎn)擊任何一張小圖會(huì)在大圖的位置顯示這張小圖的畫(huà)面。進(jìn)入大圖,鼠標(biāo)所指之處有一個(gè)透明的黃色區(qū)域,而在大圖的右邊(以下稱超大圖)會(huì)放大這一區(qū)域
案例圖示
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樣式
詳解請(qǐng)看注釋
<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;/* 為以后大圖位置改變作準(zhǔn)備 */position: absolute;/* 250 + 10 margin */left: 260px; top: 0;/* 圖片超出部分隱藏 */overflow: hidden;/* 整個(gè)大圖開(kāi)始是隱藏的 */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分解代碼----小圖點(diǎn)擊事件
(1)首先設(shè)置一個(gè)value屬性用于改變small_img中的圖片src,value的值為其下標(biāo)+1
(2)監(jiān)聽(tīng)li中的點(diǎn)擊事件時(shí),要改變small_img(大圖)中的圖片展示和big_img(超大圖)中的圖片展示
JS分解代碼----鼠標(biāo)進(jìn)入和移出
鼠標(biāo)進(jìn)入和移出都要改變放大鏡和超大圖的display屬性。
進(jìn)入時(shí)display屬性值為*“block”*
移出時(shí)display屬性值為*“none”*
JS分解代碼----鼠標(biāo)的移動(dòng)
在鼠標(biāo)進(jìn)入事件中監(jiān)聽(tīng)鼠標(biāo)的移動(dòng)
這里運(yùn)用到事件對(duì)象和offset家族的知識(shí)
可以參考:
事件對(duì)象
offset家族
注意事項(xiàng)看注釋
JS分解代碼----碰撞事件,放大鏡的移動(dòng)
寫(xiě)完上述代碼,你會(huì)發(fā)現(xiàn)放大鏡也能去到大圖以外的區(qū)域,這不是我們所期望的,這里就需要用到碰撞事件了
這里還是用到了offset家族的知識(shí)
這里用到的思維是用if判斷條件限制上下左右的邊界
放大鏡的移動(dòng)就是改變它的top和left值(因?yàn)樗鄬?duì)父元素絕對(duì)定位)
不理解offset,請(qǐng)參考:offset家族
注意事項(xiàng)看注釋
JS分解代碼----超大圖的位置改變
big_img.style.left 和 big_img.style.top為負(fù)值(你可以試試去掉負(fù)號(hào)是什么樣的效果)
這里的重點(diǎn)是這個(gè)公式
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];//遍歷每一個(gè)li中的點(diǎn)擊事件for (let i = 0; i < allLi.length; i++) {var li = allLi[i];//設(shè)置一個(gè)value屬性用于改變small_img中的圖片srcli.setAttribute('value',i+1);//監(jiān)聽(tīng)li中的點(diǎn)擊事件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");});}//監(jiān)聽(tīng)鼠標(biāo)進(jìn)入boxbox.addEventListener('mouseover',function() { //放大鏡顯示mask.style.display = 'block';//big圖片顯示big.style.display = 'block';//監(jiān)聽(tīng)鼠標(biāo)的移動(dòng)small.addEventListener('mousemove',function(event){//事件對(duì)象var e = event || window.event;//獲取鼠標(biāo)的位置 鼠標(biāo)顯示在mask中間:減去自身寬高度的一半//最好用pageX、pageY,不要用clientX、clientY 防止有分頁(yè)時(shí)出錯(cuò)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) ;//相對(duì)于box 因?yàn)閎oxx有定位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;//放大鏡跟著鼠標(biāo)的位置 mask.style.left = small_x + 'px';mask.style.top = small_y + 'px';//big_img中的位置相應(yīng)改變//公式: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';});});//監(jiān)聽(tīng)鼠標(biāo)移出boxbox.addEventListener('mouseout',function(){//放大鏡隱藏mask.style.display = 'none';//big圖片隱藏big.style.display = 'none';})});//封裝function $(id) {return typeof id === 'string'? document.getElementById(id):null;} </script>總結(jié)
以上是生活随笔為你收集整理的用JS逐步分解实现放大镜(看完就有收获)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 6.1. Principles of U
- 下一篇: .NET实现Wap飞信协议