Посмотрите на фрагмент ниже.
HTML-часть очень проста. У вас есть несколько изображений на экране с классом .image .
CSS-часть также очень проста. У вас есть два класса:
- класс изображения
- и класс клонированного изображения
Я не прокомментировал часть JS, но идея заключается в следующем:
- Я использую закрытие и использую документ в качестве параметра для лучшей производительности
- , затем функция docReady прослушивает состояние документа, чтобы быть готовым
Для получения дополнительной информации о функции docReady см. эту ссылку
- после загрузки содержимого документа, получите все изображения с getElementsByClassName function
- затем в цикле for, выполните итерацию по ним и создайте прослушиватель событий для mouseenter и mouseleave
- in mouseenter событие, создайте элемент, затем добавьте id , class и src к нему и манипулировать top и left (зависит от того, где вы хотите, чтобы это было. Используйте позиционный двигатель!). После того, как все добавят / добавят его в тело.
- и в mouseleave прослушиватель событий, найдите клонированное изображение и удалите его из тела документа.
Возможно, он не совместим со всеми браузерами! используйте для этого jQuery.
Улучшите его и исправьте мелкие ошибки, тогда вы можете просто использовать его.
Надеюсь, это поможет. извините за мой плохой английский:)
// This is a closure
(function(document) {
function docReady(fn) {
// see if DOM is already available
if (document.readyState === "complete" || document.readyState === "interactive") {
// call on next available tick
setTimeout(fn, 1);
} else {
document.addEventListener("DOMContentLoaded", fn);
}
}
docReady(function() {
var images, image, id, clone;
var i, len;
var clone_cls = 'clone-image';
var bound;
images = document.getElementsByClassName('image');
len = images.length;
for (i = 0; i < len; i++) {
image = images[i];
// Mouse enter event
image.addEventListener('mouseenter', function() {
id = uniqueId();
//-----
this.setAttribute('data-clone-id', id);
//-----
clone = document.createElement('IMG');
clone.src = this.src;
clone.classList.add(clone_cls);
clone.id = id;
//-----
bound = this.getBoundingClientRect();
clone.style.top = (bound.top + pageYOffset) + 'px';
// clone.style.right = document.body.offsetWidth - (bound.right + pageXOffset) + 'px';
clone.style.left = (bound.left + pageXOffset) + 'px';
document.body.appendChild(clone);
});
// Mouse leave event
image.addEventListener('mouseleave', function() {
id = this.getAttribute('data-clone-id');
if (id) {
this.removeAttribute('data-clone-id');
clone = document.getElementById(id);
if (typeof clone !== 'undefined') {
clone.remove();
}
}
});
}
function uniqueId() {
var name, num, str, test;
//-----
name = 'clone';
do {
num = Math.floor(Math.random() * 100000);
str = name + num;
test = document.getElementById(str);
} while (test && test.length);
return str;
}
});
})(document);
.image {
display: inline-block;
width: 300px;
height: 300px;
}
.clone-image {
position: absolute;
max-width: 100%;
width: auto;
height: auto;
max-height: 100%;
z-index: 1001;
pointer-events: none;
}
<div>
<img src="https://dummyimage.com/900x900/40495c/ffffff.jpg&text=Image 1" alt="dummy image" class="image">
<img src="https://dummyimage.com/900x900/40495c/ffffff.jpg&text=Image 2" alt="dummy image" class="image">
<img src="https://dummyimage.com/900x900/40495c/ffffff.jpg&text=Image 3" alt="dummy image" class="image">
<img src="https://dummyimage.com/900x900/40495c/ffffff.jpg&text=Image 4" alt="dummy image" class="image">
</div>