// presenting an array of images
// each with RANDOM IDs!
const images = [{
id: Date.now() - 400,
src: 'https://loremflickr.com/1200/960/girl/all?random=1'
},
{
id: Date.now() - 200,
src: 'https://loremflickr.com/1200/960/girl/all?random=2'
},
{
id: Date.now() + 200,
src: 'https://loremflickr.com/1200/960/girl/all?random=3'
},
{
id: Date.now() + 400,
src: 'https://loremflickr.com/1200/960/girl/all?random=4'
},
];
// displaying the images dynamically
(function(images) {
let html = ''
images.forEach(image => {
html += `
<h2>ID: ${ image.id }</h2>
<div class="img-zoom-container d-flex">
<img id="${ image.id }" src="${image.src}" width="300" height="240" alt="Girl">
<div id="${ image.id }-result" class="img-zoom-result"></div>
</div>
<hr />
`
})
const container = document.getElementById('container')
container.innerHTML = html
const imagelist = document.querySelectorAll('.img-zoom-container > img')
// adding event listener for the random IDs
imagelist.forEach(image => {
image.addEventListener('mouseenter', function(e) {
imageZoom(e.target.id, `${ e.target.id }-result`)
})
})
})(images);
// code courtesy of W3 Schools
// https://www.w3schools.com/howto/howto_js_image_zoom.asp
function imageZoom(imgID, resultID) {
var img, lens, result, cx, cy;
img = document.getElementById(imgID);
result = document.getElementById(resultID);
/* Create lens: */
lens = document.createElement("DIV");
lens.setAttribute("class", "img-zoom-lens");
/* Insert lens: */
img.parentElement.insertBefore(lens, img);
/* Calculate the ratio between result DIV and lens: */
cx = result.offsetWidth / lens.offsetWidth;
cy = result.offsetHeight / lens.offsetHeight;
/* Set background properties for the result DIV */
result.style.backgroundImage = "url('" + img.src + "')";
result.style.backgroundSize = (img.width * cx) + "px " + (img.height * cy) + "px";
/* Execute a function when someone moves the cursor over the image, or the lens: */
lens.addEventListener("mousemove", moveLens);
img.addEventListener("mousemove", moveLens);
/* For touch screens as well: */
lens.addEventListener("touchmove", moveLens);
img.addEventListener("touchmove", moveLens);
function moveLens(e) {
var pos, x, y;
/* Prevent any other actions that may occur when moving over the image */
e.preventDefault();
/* Get the cursor's x and y positions: */
pos = getCursorPos(e);
/* Calculate the position of the lens: */
x = pos.x - (lens.offsetWidth / 2);
y = pos.y - (lens.offsetHeight / 2);
/* Ensure the lens stays within the boundaries of the image: */
if (x > img.width - lens.offsetWidth) {
x = img.width - lens.offsetWidth;
}
if (x < 0) {
x = 0;
}
if (y > img.height - lens.offsetHeight) {
y = img.height - lens.offsetHeight;
}
if (y < 0) {
y = 0;
}
/* Position the lens accordingly: */
lens.style.left = x + "px";
lens.style.top = y + "px";
/* Show what the lens "sees": */
result.style.backgroundPosition = "-" + (x * cx) + "px -" + (y * cy) + "px";
}
function getCursorPos(e) {
var a, x = 0,
y = 0;
e = e || window.event;
/* Find the x and y positions of the image: */
a = img.getBoundingClientRect();
/* Calculate the cursor's x and y coordinates relative to the image: */
x = e.pageX - a.left;
y = e.pageY - a.top;
/* Consider any page scrolling: */
x = x - window.pageXOffset;
y = y - window.pageYOffset;
return {
x: x,
y: y
};
}
}
* {
box-sizing: border-box;
}
.d-flex {
display: flex;
}
.img-zoom-container {
position: relative;
}
.img-zoom-lens {
position: absolute;
border: 1px solid #d4d4d4;
/* Set dimensions for the lens: */
width: 40px;
height: 40px;
}
.img-zoom-result {
border: 1px solid #d4d4d4;
/* Set size for the result div: */
width: 300px;
height: 300px;
}
<div id="container"></div>