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

原生jsコードで画像拡大鏡効果を実現

今日は、自分でjsを使って作成した画像拡大器効果をシェアします。私は2つの効果の拡大を行いましたが、実際のところ、その原理はほぼ同じで、2つの画像を使用して2つの画像に適切なサイズを設定し、最終的に異なる位置で表示することで、拡大効果を実現しています。

最初の一种是淘宝のショッピングページの拡大鏡効果を真似て、マウスを商品画像に移動すると、画像上に矩形エリアが表示され、このエリアが拡大するエリアです。そして、商品画像の右側に拡大した商品画像が表示されます。この拡大方法は、拡大率を計算し、拡大エリアのscrollLeftとscrollTop値を変更して、必要な拡大効果を実現するだけです。

<!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">
//4つのオブジェクトを取得
var wrap=document.querySelector('.wrap');
var box=document.querySelector('.box');
var main=document.querySelector('.main');
var mainImg=document.querySelector('.main img');
//移動イベントを追加
wrap.onmousemove=function(){
//マウスが可視画像に移動した後、拡大矩形区域と拡大画像が表示されます
box.style.display='block';
main.style.display='block';
var event=window.event || event;
//マウスの距離可視エリアの端のオフセットを取得
var disx=event.clientX-box.offsetWidth/2;
var disy=event.clientY-box.offsetHeight/2;
//矩形区域の最大可動範囲
var distanceMaxX=wrap.offsetWidth-box.offsetWidth;
var distanceMaxY=wrap.offsetHeight-box.offsetHeight;
// ボックス内に拡大矩形区域を固定するための判定
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>

効果プレビュー:

第二种は元の画像上で直接拡大することで、拡大鏡のように使用されます。これは最初の方法の拡張であり、前の方法と違いはありません。ただし、最後に視覚的な領域を設定する必要がなく、元の指定された拡大エリア上に直接拡大画像を表示します。拡大エリアのleftとtop値を変更した場合、画像の対応するleftとtop値も同時に自動的に変更し、同期拡大効果を実現します。

<!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;
}
//画像を拡大し、絶対位置を指定して移動時もそれに従うようにする
锁定区域と同期させるために実装
#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
//マウス移動イベントを追加
main.addEventListener('mousemove',move,false);
function move(){
//拡大された円形エリアを表示
box.style.display='block';
var event=window.event||event;
//マウスの距離可視エリアの端のオフセットを取得
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;
//矩形区域の最大可動範囲
if (disx<=0) {
disx=0;
}
if (disx>=dismax) {
disx=dismax-2;
}
if(disy<=0){
disy=0;
}
if(disy>=dismay){
disy=dismay-2;
}
//移動中に円形の領域のleftおよびtop値を変更します。
box.style.left=disx+'px';
box.style.top=disy+'px';
// var scalx=main.offsetWidth/box.offsetWidth
// var scaly=main.offsetHeight/box.offsetHeight;
//同様に、移動中に拡大された画像の画像も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);
}
// マウスアウトイベントを追加
main.addEventListener('mouseout',out,false);
function out(){
box.style.display='none';
}
</script>

効果プレビュー:

結論:皆さんもご覧の通り、実際には2つの拡大方法にはあまり違いはありません。まず、拡大する領域、つまり先ほど言ったロック拡大領域の矩形と円を取得する必要があります。次に、拡大する画像に対して表示する領域を設定します。この2つのコードが皆さんの助けになることを願っています。ありがとうございます!!!

おすすめ