原生js代碼實(shí)現(xiàn)圖片放大境效果
今天我給大家分享一下自己用js寫的一個(gè)圖片放大器效果,我做了兩種效果的放大,其實(shí)它們的原理都差不多,都是采用了兩張圖片給兩張圖片設(shè)定相應(yīng)的尺寸,最后顯示在不同位置,最終實(shí)現(xiàn)放大效果。
第一種是我仿照淘寶購(gòu)物頁(yè)面的一個(gè)放大鏡效果,當(dāng)鼠標(biāo)移動(dòng)到商品圖片上時(shí),圖片上會(huì)出現(xiàn)一個(gè)矩形區(qū)域,而這個(gè)區(qū)域就是你要放大的區(qū)域,然后商品圖片的右側(cè)會(huì)出現(xiàn)一個(gè)放大后的商品圖片。這種放大方式只需要你計(jì)算好放大的比例,然后通過(guò)修改放大區(qū)域的scrollLeft和scrollTop值實(shí)現(xiàn)相應(yīng)的放大效果。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>圖片放大器</title>
<style media="screen">
*{
margin: 0;
padding: 0;
}
/*可視區(qū)域的父級(jí)標(biāo)簽*/
.wrap{
width: 400px;
height:auto;
border: 1px solid black;
display: inline-block;
position: absolute;
left: 0;
top: 0;
}
.wrap>img{
width: 100%;
height: auto;
}
/*鎖定放大的矩形區(qū)域*/
.box{
border: 1px solid black;
width: 100px;
height: 100px;
background: rgba(0, 0, 0, 0.5);
opacity: 0.8;
position: absolute;
cursor: pointer;
display: none;
}
/*要顯示放大圖片的父級(jí)*/
.main{
width: 700px;
height: 700px;
margin-left: 420px;
overflow:hidden;
display:none;
position: absolute;
top: 0;
}
.main>img{
width:2800px;
height:auto;
}
</style>
</head>
<body>
<div class="wrap">
<img src="dog.jpg" alt="" />
<div class="box"></div>
</div>
<div class="main">
<img src="dog.jpg"alt="" />
</div>
<script type="text/javascript">
//獲取四個(gè)對(duì)象
var wrap=document.querySelector('.wrap');
var box=document.querySelector('.box');
var main=document.querySelector('.main');
var mainImg=document.querySelector('.main img');
//添加移動(dòng)事件
wrap.onmousemove=function(){
//鼠標(biāo)移入可視圖片后出現(xiàn) 鎖定放大區(qū)域及放大圖片
box.style.display='block';
main.style.display='block';
var event=window.event || event;
//獲取鼠標(biāo)距離可視區(qū)域邊緣的偏移量
var disx=event.clientX-box.offsetWidth/2;
var disy=event.clientY-box.offsetHeight/2;
//矩形區(qū)域的最大可移動(dòng)范圍
var distanceMaxX=wrap.offsetWidth-box.offsetWidth;
var distanceMaxY=wrap.offsetHeight-box.offsetHeight;
// 判斷讓鎖定放大的矩形區(qū)域不能出框
if (disx<=0) {
disx=0;
}
if (disy<=0) {
disy=0;
}
if(disx>=distanceMaxX) {
disx=distanceMaxX;
}
if(disy>=distanceMaxY) {
disy=distanceMaxY;
}
box.style.left=disx+'px';
box.style.top=disy+'px';
//獲取放大比例
var scalex=box.offsetLeft/distanceMaxX;
var scaley=box.offsetTop/distanceMaxY;
main.scrollLeft=(mainImg.clientWidth-main.clientWidth)*scalex;
main.scrollTop=(mainImg.clientHeight-main.clientHeight)*scaley;
}
//添加移出事件
wrap.onmouseout=function(){
box.style.display='none';
main.style.display='none';
}
</script>
</body>
</html>
效果預(yù)覽:

第二種是直接在原圖上放大,像放大鏡在上面一樣,這是在第一種上的一個(gè)擴(kuò)展,前面的方法沒(méi)有什么區(qū)別,只是最后不需要給它放置一個(gè)可視區(qū)域,直接在你原來(lái)所定放大的區(qū)域上顯示放大圖片,當(dāng)你修改放大區(qū)域的left和top值時(shí)同時(shí)自動(dòng)修改圖片相應(yīng)的left和top值,實(shí)現(xiàn)同步放大效果
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>放大鏡</title>
<style type="text/css">
.main{
width: 500px;
height: 570px;
border: 2px solid black;
position: relative;
/*overflow: hidden;*/
}
#img1{
width: 100%;
height: 100%;
}
.box{
width: 200px;
height: 200px;
border-radius: 200px;
/*border: 1px solid black;*/
display: none;
position: absolute;
overflow: hidden;
cursor:move;
}
//放大圖片 給絕對(duì)定位讓移動(dòng)時(shí)它也能跟著移動(dòng)
實(shí)現(xiàn)和我們鎖定的區(qū)域同步
#img2{
width: 1200px;
height: 1400px;
position: absolute;
/*left: 0;
top: 0;*/
/*display: none;*/
}
</style>
</head>
<body>
<div class="main">
<img id="img1" src="dog.jpg"/>
<div class="box">
<img id="img2" src="dog.jpg"/>
</div>
</div>
</body>
</html>
<script type="text/javascript">
var main=document.querySelector('.main');
var box=document.querySelector('.box');
var boximg=document.querySelector('#img2');
//添加鼠標(biāo)移動(dòng)事件
main.addEventListener('mousemove',move,false);
function move(){
//顯示放大的圓形區(qū)域
box.style.display='block';
var event=window.event||event;
//獲取鼠標(biāo)距離可視區(qū)域邊緣的偏移量
var disx=event.clientX-box.offsetWidth/2;
var disy=event.clientY-box.offsetHeight/2;
var dismax=main.offsetWidth-box.offsetWidth;
var dismay=main.offsetHeight-box.offsetHeight;
//矩形區(qū)域的最大可移動(dòng)范圍
if (disx<=0) {
disx=0;
}
if (disx>=dismax) {
disx=dismax-2;
}
if(disy<=0){
disy=0;
}
if(disy>=dismay){
disy=dismay-2;
}
//當(dāng)你移動(dòng)的時(shí)候修改圓形區(qū)域的left以及 top值。
box.style.left=disx+'px';
box.style.top=disy+'px';
// var scalx=main.offsetWidth/box.offsetWidth
// var scaly=main.offsetHeight/box.offsetHeight;
//同理當(dāng)你移動(dòng)時(shí)放大的圖片它的圖片也要修改left和top值
boximg.style.left=-event.clientX*2+'px';
boximg.style.top=-event.clientY*2+'px';
// box.scrollLeft=(boximg.offsetWidth-box.offsetWidth);
// box.scrollTop=(boximg.offsetHeight-box.offsetHeight);
}
// 添加鼠標(biāo)移出事件
main.addEventListener('mouseout',out,false);
function out(){
box.style.display='none';
}
</script>
效果預(yù)覽:

結(jié)語(yǔ):大家也看到了,其實(shí)兩種放大方式其實(shí)沒(méi)有什么區(qū)別,首先你要獲取要放大的區(qū)域也就是剛才說(shuō)的鎖定放大區(qū)域的矩形和圓形。然后把要放大的圖片給定一個(gè)區(qū)域顯示。希望這兩段代碼對(duì)大家有所幫助,謝謝?。?!
- js實(shí)現(xiàn)圖片旋轉(zhuǎn) js滾動(dòng)鼠標(biāo)中間對(duì)圖片放大縮小
- js圖片放大鏡效果實(shí)現(xiàn)方法詳解
- angularjs點(diǎn)擊圖片放大實(shí)現(xiàn)上傳圖片預(yù)覽
- JS實(shí)現(xiàn)圖片放大縮小的方法
- js自制圖片放大鏡功能
- 利用javascript實(shí)現(xiàn)的三種圖片放大鏡效果實(shí)例(附源碼)
- 原生js實(shí)現(xiàn)圖片放大縮小計(jì)時(shí)器效果
- 原生javascript實(shí)現(xiàn)圖片放大鏡效果
- JS圖片放大效果簡(jiǎn)單實(shí)現(xiàn)代碼
- js實(shí)現(xiàn)圖片放大展示效果
相關(guān)文章
js 判斷計(jì)算字符串長(zhǎng)度/判斷空的簡(jiǎn)單方法
這篇文章介紹了判斷計(jì)算字符串長(zhǎng)度/判斷空的簡(jiǎn)單方法,有需要的朋友可以參考一下2013-08-08
教學(xué)演示-UBB,剪貼板,textRange及其他
教學(xué)演示-UBB,剪貼板,textRange及其他...2006-07-07
簡(jiǎn)單實(shí)用的反饋表單無(wú)刷新提交帶驗(yàn)證
表單無(wú)刷新提交帶驗(yàn)證,非常適用于反饋,具體的實(shí)現(xiàn)如下包含各個(gè)功能代碼,喜歡的朋友可以參考下2013-11-11
關(guān)于事件mouseover ,mouseout ,mouseenter,mouseleave的區(qū)別
mouseover ,mouseout ,mouseenter,mouseleave,都是鼠標(biāo)點(diǎn)擊而觸發(fā)的事件,各自代表什么意思,有哪些區(qū)別呢?下面跟著腳本之家小編一起看看吧2015-10-10
js實(shí)現(xiàn)緩沖運(yùn)動(dòng)效果的方法
這篇文章主要介紹了js實(shí)現(xiàn)緩沖運(yùn)動(dòng)效果的方法,涉及javascript操作元素運(yùn)動(dòng)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
JavaScript中實(shí)現(xiàn)數(shù)組分組功能的方法詳解
最近,JavaScript引入了一個(gè)備受期待的功能:原生支持?jǐn)?shù)組分組,這一特性使得在處理復(fù)雜的數(shù)據(jù)集時(shí)變得更加簡(jiǎn)單和高效,本文將深入探討這一全新的JavaScript特性,希望對(duì)大家有所幫助2023-12-12
JS實(shí)現(xiàn)橫向拉伸動(dòng)感伸縮菜單效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)橫向拉伸動(dòng)感伸縮菜單效果,涉及javascript基于定時(shí)函數(shù)及鼠標(biāo)事件操作頁(yè)面元素動(dòng)態(tài)變換的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09

