原生js代碼實(shí)現(xiàn)圖片放大境效果
今天我給大家分享一下自己用js寫(xiě)的一個(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)文章
關(guān)于ES6中的箭頭函數(shù)超詳細(xì)梳理
箭頭函數(shù)可以說(shuō)是es6的一大亮點(diǎn),使用箭頭函數(shù),可以簡(jiǎn)化編碼過(guò)程,是代碼更加的簡(jiǎn)潔,下面這篇文章主要給大家介紹了關(guān)于ES6中箭頭函數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
Swiper.js實(shí)現(xiàn)移動(dòng)端元素左右滑動(dòng)
這篇文章主要為大家詳細(xì)介紹了Swiper.js實(shí)現(xiàn)移動(dòng)端元素左右滑動(dòng) ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
JavaScript繼承的實(shí)現(xiàn)方式詳解
JavaScript 是一門基于原型的語(yǔ)言,它的繼承機(jī)制與傳統(tǒng)的基于類的面向?qū)ο缶幊逃兴煌?盡管 ES6 引入了 class 語(yǔ)法,但本質(zhì)上仍然是基于原型鏈的繼承,本文將詳細(xì)介紹 JavaScript 繼承的幾種實(shí)現(xiàn)方式,需要的朋友可以參考下2025-03-03
微信小程序通過(guò)uni-app進(jìn)行全局分享
這篇文章主要介紹了微信小程序通過(guò)uni-app進(jìn)行全局分享,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,需要的朋友可以收藏下2021-11-11
JavaScript判斷兩個(gè)對(duì)象是否相等的方法總結(jié)
判斷兩個(gè)對(duì)象是否相等是js中的一個(gè)很常見(jiàn)的內(nèi)容,不同的編程語(yǔ)言和環(huán)境可能會(huì)有不同的方式來(lái)實(shí)現(xiàn)這一目標(biāo),在 JavaScript 中,判斷兩個(gè)對(duì)象是否相等主要有以下幾種方法,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-08-08
利用原生JS自動(dòng)生成文章標(biāo)題樹(shù)的實(shí)例
網(wǎng)上關(guān)于生成文章標(biāo)題樹(shù)的示例很多,這篇文章介紹的是利用原生JS實(shí)現(xiàn)自動(dòng)生成文章標(biāo)題樹(shù),實(shí)現(xiàn)過(guò)程很簡(jiǎn)單,有需要的可以參考借鑒。2016-08-08

