English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Implementação de efeito de ampliador de imagem com código JavaScript nativo

Hoje, vou compartilhar com vocês um efeito de lupa de imagem que escrevi com JavaScript, fiz dois tipos de efeitos de ampliação, na verdade, seus princípios são semelhantes, ambos usam duas imagens para definir tamanhos correspondentes para duas imagens, e finalmente mostram em diferentes posições, realizando assim o efeito de ampliação.

O primeiro é uma cópia do efeito lupa da página de compras da Taobao, quando o mouse se move sobre a imagem do produto, uma área retangular aparecerá na imagem do produto, e essa área é a área que você deseja ampliar, e uma imagem do produto amplificada aparecerá ao lado direito da imagem do produto. Esse tipo de ampliação precisa calcular a proporção de ampliação, e então usar o valor de scrollLeft e scrollTop da área de ampliação para implementar o efeito de ampliação correspondente.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>图片放大器</title>
<style media="screen">
*{
margin: 0;
padding: 0;
}
/* 可视区域的父级标签 */
.wrap{
width: 400px;
height:auto;
border: 1px solid black;
display: inline-block;
position: absolute;
left: 0;
top: 0;
}
.wrap>img{
width: 100%;
height: auto;
}
/* 锁定放大的矩形区域 */
.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;
}
/* 要显示放大图片的父级 */
.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">
//obter os quatro objetos
var wrap=document.querySelector('.wrap');
var box=document.querySelector('.box');
var main=document.querySelector('.main');
var mainImg=document.querySelector('.main img');
//adicionar evento de movimento
wrap.onmousemove=function(){
//ao passar o mouse sobre a imagem visível, aparecerá a área de ampliação fixa e a imagem ampliada
box.style.display='block';
main.style.display='block';
var event=window.event || event;
//obter a distância do cursor até a borda da área visível
var disx=event.clientX-box.offsetWidth/2;
var disy=event.clientY-box.offsetHeight/2;
//a maior faixa de movimentação da área retangular
var distanceMaxX=wrap.offsetWidth-box.offsetWidth;
var distanceMaxY=wrap.offsetHeight-box.offsetHeight;
// julgar para que a área retangular de ampliação fixa não saia da caixa
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';
//obter a proporção de ampliação
var scalex=box.offsetLeft/distanceMaxX;
var scaley=box.offsetTop/distanceMaxY;
main.scrollLeft=(mainImg.clientWidth-main.clientWidth)*scalex;
main.scrollTop=(mainImg.clientHeight-main.clientHeight)*scaley;
}
//adicionar evento de saída
wrap.onmouseout=function(){
box.style.display='none';
main.style.display='none';
}
</script>
</body>
</html>

Visualização de Efeito:

A segunda opção é ampliar diretamente na imagem original, como uma lupa sobre ela, isso é uma extensão da primeira opção, os métodos anteriores não têm diferenças, apenas no final não é necessário definir uma área visível para ele, exibir diretamente na área de ampliação original a imagem ampliada, ao modificar os valores de left e top da área de ampliação, modificar automaticamente os valores de left e top da imagem correspondente, para implementar o efeito de ampliação sincronizada

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Amplificador</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;
}
//ampliar a imagem dar posição absoluta para que ela possa se mover ao longo do movimento
realizar a sincronização com a área que estamos bloqueando
#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');
//adicionar evento de movimento do mouse
main.addEventListener('mousemove',move,false);
function move(){
//exibir a área circular ampliada
box.style.display='block';
var event=window.event||event;
//obter a distância do cursor até a borda da área visível
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;
//a maior faixa de movimentação da área retangular
if (disx<=0) {
disx=0;
}
if (disx>=dismax) {
disx=dismax-2;
}
if(disy<=0){
disy=0;
}
if(disy>=dismay){
disy=dismay-2;
}
//Quando você move, altere os valores de left e top da área circular.
box.style.left=disx+'px';
box.style.top=disy+'px';
// var scalx=main.offsetWidth/box.offsetWidth
// var scaly=main.offsetHeight/box.offsetHeight;
//Da mesma forma, quando você move, a imagem ampliada também deve modificar os valores de left e 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);
}
// Adicionar evento de mouse sair
main.addEventListener('mouseout',out,false);
function out(){
box.style.display='none';
}
</script>

Visualização de Efeito:

Conclusão: Como você também pode ver, na verdade, as duas maneiras de ampliar não têm muita diferença. Primeiro, você precisa obter a área a ser ampliada, ou seja, o retângulo e o círculo mencionados anteriormente como a área de fixação da ampliação. Em seguida, dê uma área para exibir a imagem a ser ampliada. Espero que esses dois trechos de código sejam úteis para vocês, obrigado!!!

Você também pode gostar