JavaScript實(shí)現(xiàn)京東放大鏡效果
本文實(shí)例為大家分享了JavaScript實(shí)現(xiàn)京東放大鏡展示的具體代碼,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)效果:
1.鼠標(biāo)放到圖片上顯示放大鏡和詳細(xì)圖,鼠標(biāo)離開時(shí)什么都不顯示(效果消失)
2.鼠標(biāo)一直在放大鏡的中間,且放大鏡隨鼠標(biāo)移動(dòng)
3.放大鏡不能出縮列圖的盒子
4.鼠標(biāo)放在詳細(xì)圖上詳細(xì)圖消失

實(shí)現(xiàn)細(xì)節(jié):
1.大盒子雖然比詳細(xì)圖的盒子寬度小,但是在邏輯上詳細(xì)圖的盒子屬于大盒子
2.詳細(xì)圖不能使用浮動(dòng),因?yàn)楹凶酉旅嬉话銜?huì)有文字內(nèi)容
3.以父盒子來(lái)定位詳細(xì)圖的盒子
4.放大鏡鼠標(biāo)選中為十字形
5.對(duì)圖片進(jìn)行定位才能使圖片移動(dòng)
6.使用var evt = event || window.event; //兼容性寫法
7.用放大鏡頂點(diǎn)在盒子中的位置根據(jù)比例找到圖片的位置,來(lái)顯示圖片
8.圖片在詳細(xì)圖中的定位為負(fù)值
代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>京東放大鏡</title>
<style>
.box{ /*大盒子雖然比詳細(xì)圖的盒子寬度小,但是在邏輯上詳細(xì)圖的盒子屬于大盒子*/
width: 350px;
height: 350px;
position: relative;
margin: 100px;
border: 1px solid #aaa;
}
.box .detailed{ /*詳細(xì)圖不能使用浮動(dòng),因?yàn)楹凶酉旅嬉话銜?huì)有文字內(nèi)容*/
width: 450px;
height: 450px;
border: 1px solid #aaa;
position: absolute;
overflow: hidden;
left: 365px; /*以父盒子來(lái)定位*/
top: 0;
/*初始設(shè)置為不可見*/
display: none;
}
.box .normal .magnfier{
width: 150px;
height: 150px;
top: 0;
left: 0;
position: absolute;
background-color: rgba(0, 0, 255, 0.2);/*也可以用opacity來(lái)設(shè)置透明度*/
cursor: move; /*鼠標(biāo)選中為十字*/
display: none; /*初始設(shè)為不可見*/
}
.detailed img{ /*對(duì)圖片進(jìn)行定位使圖片移動(dòng)*/
position: absolute;
top: 0;
left: 0;
}
</style>
<script>
function $(id){
return document.getElementById(id);
}
window.onload = function(){
var box = $('box');
var normal = box.children[0];
var margnfier = normal.children[1];//獲取放大鏡的Dom對(duì)象,document.getElementsByClassName來(lái)獲取。
var detailed = box.children[1];//獲得縮略圖DOM對(duì)象也可以用document.getElementsByClassName('zoom')[0];
var detailedImg = box.children[1].children[0];
normal.onmouseover = function(){//不能給box注冊(cè)onmousever事件,否則快速移到詳細(xì)圖上是詳細(xì)圖也不會(huì)消失,
margnfier.style.display = 'block';
detailed.style.display = 'block';
}
normal.onmouseout = function(){
margnfier.style.display = 'none';
detailed.style.display = 'none';
}
var x = 0;
var y = 0;
//控制zoom放大鏡部分在normal里面的移動(dòng)
normal.onmousemove = function(event){
var evt = event || window.event;
//兼容性寫法
x = evt.clientX - box.offsetLeft - margnfier.offsetWidth / 2;
y = evt.clientY - box.offsetTop - margnfier.offsetHeight / 2;
//判斷鼠標(biāo)是不是溢出了normal的區(qū)域,
if(x < 0){
x = 0;
}else{
if(x > box.offsetWidth - margnfier.offsetWidth){
x = box.offsetWidth - margnfier.offsetWidth;
}
}
if(y < 0){
y = 0;
}else{
if(y > box.offsetHeight - margnfier.offsetHeight){
y = box.offsetHeight - margnfier.offsetHeight;
}
}
margnfier.style.left = x + 'px';
margnfier.style.top = y + 'px';
var detailedX = -x * 800 / this.offsetWidth;
var detailedY = -y * 800 / this.offsetHeight;
//用放大鏡頂點(diǎn)在盒子中的位置根據(jù)比例找到圖片的位置,來(lái)顯示圖片
//改變圖片位置
detailedImg.style.left = detailedX + 'px';
detailedImg.style.top = detailedY + 'px';
}
}
</script>
</head>
<body>
<div id="box" class="box"> <!--包含詳細(xì)圖和縮略圖的盒子-->
<div class="normal">
<img src="imgs/show.jpg" alt="">
<div class="magnfier"></div>
</div>
<div class="detailed">
<img src="imgs/detail.jpg" alt="">
</div>
</div>
</body>
</html>

更多關(guān)于放大鏡的效果,請(qǐng)查看專題:《放大鏡特效》
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS簡(jiǎn)單實(shí)現(xiàn)點(diǎn)擊復(fù)制鏈接的方法
這篇文章主要介紹了JS簡(jiǎn)單實(shí)現(xiàn)點(diǎn)擊復(fù)制鏈接的方法,提供了2種簡(jiǎn)單的復(fù)制鏈接操作方法供大家選擇使用,需要的朋友可以參考下2016-08-08
Webpack打包c(diǎn)ss后z-index被重新計(jì)算的解決方法
這篇文章主要跟大家分享了Webpack打包c(diǎn)ss后z-index被重新計(jì)算的解決方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
Javascript call及apply應(yīng)用場(chǎng)景及實(shí)例
這篇文章主要介紹了Javascript call及apply應(yīng)用場(chǎng)景及實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
使用js獲取地址欄參數(shù)的方法推薦(超級(jí)簡(jiǎn)單)
下面小編就為大家?guī)?lái)一篇使用js獲取地址欄參數(shù)的方法推薦(超級(jí)簡(jiǎn)單)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06
canvas實(shí)現(xiàn)手機(jī)端用來(lái)上傳用戶頭像的代碼
這篇文章主要介紹了canvas實(shí)現(xiàn)手機(jī)端用來(lái)上傳用戶頭像的代碼代碼簡(jiǎn)單易懂非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10
用javascript實(shí)現(xiàn)截取字符串包含中文處理的函數(shù)
一直不知道js可以截取中文字符,呵呵,原理用正則表達(dá)式,匹配中文的長(zhǎng)度,中文算兩個(gè),因?yàn)樗阋粋€(gè),是個(gè)好東西,推薦大家收藏2008-04-04
Bootstrap 填充Json數(shù)據(jù)的實(shí)例代碼
本篇文章主要介紹了Bootstrap 填充Json數(shù)據(jù)的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
JavaScript表單驗(yàn)證實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了JavaScript表單驗(yàn)證的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
javascript間隔定時(shí)器(延時(shí)定時(shí)器)學(xué)習(xí) 間隔調(diào)用和延時(shí)調(diào)用
這篇文章主要介紹了javascript間隔調(diào)用和延時(shí)調(diào)用示例,介紹setInterval方法和clearInterval方法的使用方法,大家參考使用吧2014-01-01

