-- HTML --
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>돋보기</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" media="screen" href="css/main2.css" />
</head>
<body>
<h1>돋보기 2</h1>
<div class="wrap">
<img class="target" src="https://i.imgur.com/zEZCgJC.jpg" />
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="js/main2.js"></script>
</body>
</html>
-- CSS --
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
h1{
text-align: center;
}
.wrap {
position: relative;
width: 500px;
margin: 0 auto;
}
.magnifier {
width: 150px;
height: 150px;
position: absolute;
border-radius: 100%;
box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.85), 0 0 3px 3px rgba(0, 0, 0, 0.25);
display: none;
}
.target {
display: block;
width: 100%;
}
-- JS --
//주의 : hTML에서 보여지는 이미지 크기가 본래 이미지 크기보다 작아야 함. ( width , height )
window.onload = function () {
$(".wrap")
.on('mousemove', magnify)
.prepend("<div class='magnifier'></div>")
.children('.magnifier').css({
"background": "url('" + $(".target").attr("src") + "') no-repeat"
});
var target = $('.target');
var magnifier = $('.magnifier');
function magnify(e) {
// 마우스 위치에서 .magnify의 위치를 차감해 컨테이너에 대한 마우스 좌표를 얻는다.
var mouseX = e.pageX - $(this).offset().left;
var mouseY = e.pageY - $(this).offset().top;
// 컨테이너 밖으로 마우스가 벗어나면 돋보기를 없앤다.
if (mouseX < $(this).width() && mouseY < $(this).height() && mouseX > 0 && mouseY > 0) {
magnifier.fadeIn(100);
} else {
magnifier.fadeOut(100);
}
//돋보기가 존재할 때
if (magnifier.is(":visible")) {
/* 이미지에 대한 마우스 포인터 아래의 픽셀 비율(본래 이미지 크기에 대한)을 얻고
이를 사용하여 돋보기 내부에 큰 이미지를 배치한다. */
var rx = -(mouseX / target.width() * target[0].naturalWidth - magnifier.width() / 2);
var ry = -(mouseY / target.height() * target[0].naturalHeight - magnifier.height() / 2);
//돋보기를 마우스 위치에 따라 움직인다.
//돋보기의 width, height 절반을 마우스 좌표에서 차감해 마우스와 돋보기 위치를 일치시킨다.
var px = mouseX - magnifier.width() / 2;
var py = mouseY - magnifier.height() / 2;
//적용
magnifier.css({
left: px,
top: py,
backgroundPosition: rx + "px " + ry + "px"
});
}
}
};
|