Скрипка: http://jsfiddle.net/uQAmQ/2/
Вы не должны «панорамировать» на абсолютно позиционированном элементе , потому что ширина и высота окна постоянно меняются в зависимости от изображения. Более плавное решение предполагает использование фонового изображения. Посмотрите середину моего ответа на использованную логику.
Рассмотрим этот JavaScript (читайте комментарии; HTML + CSS на скрипке):
(function(){ //Anonymous function wrapper for private variables
/* Static variables: Get the true width and height of the image*/
var avatar = document.getElementById("avatar");
var avatarWidth = avatar.width;
var avatarHeight = avatar.height;
var windowWidth = window.innerWidth;
var windowHeight = window.innerHeight;
/* Logic: Move */
var ratioY = (avatarHeight - windowHeight) / windowHeight;
var ratioX = (avatarWidth - windowWidth) / windowWidth;
function updateImgPosition( e ) {
var mouseY = e.pageX; //e.pageX, NOT e.x
var mouseX = e.pageY;
var imgTop = ratioY*(-mouseY);
var imgLeft = ratioX*(-mouseX);
document.body.style.backgroundPosition = imgLeft + "px " + imgTop + "px";
}
/* Add event to WINDOW, NOT "document"! */
window.onmousemove = updateImgPosition;
})();
Логика, стоящая за этим:
- Относительные единицы нельзя использовать , поскольку размер изображения указан в абсолютных единицах.
- Смещения должны изменяться в соответствии с определенным соотношением, которое похоже на:
image size
, деленное на window size
.
Однако это соотношение не является полным: изображение исчезает при нижний / левый угол окна. Чтобы исправить это, вычтите размер окна из размера изображения. Результат можно найти в коде в переменных ratioX
и ratioY
.
<ч />
Предыдущий код должен был быть загружен при событии window.onload
, потому что размер изображения был рассчитан динамически. По этой причине в тело был включен элемент HTML.
Один и тот же код может быть написан намного меньше и эффективнее, если указать размер фона в коде. Смотрите этот улучшенный код. Скрипка: http://jsfiddle.net/uQAmQ/3/
(function(){ //Anonymous function wrapper for private variables
/* Static variables: Get the true width and height of the image*/
var avatarWidth = 1690;
var avatarHeight = 1069;
var windowWidth = window.innerWidth;
var windowHeight = window.innerHeight;
/* Logic: Move */
var ratioY = (avatarHeight - windowHeight) / windowHeight;
var ratioX = (avatarWidth - windowWidth) / windowWidth;
function updateImgPosition( e ) {
var mouseX = e.pageX; //e.pageX, NOT e.x
var mouseY = e.pageY;
var imgTop = ratioY*(-mouseY);
var imgLeft = ratioX*(-mouseX);
document.body.style.backgroundPosition = imgLeft + "px " + imgTop + "px";
}
/* Add event to WINDOW, NOT "document"! */
window.onmousemove = updateImgPosition;
})();
<ч />
Если вы не против снижения читабельности кода, лучшим решением будет следующий код: Fiddle: http://jsfiddle.net/uQAmQ/4/:
(function(){ //Anonymous function wrapper for private variables
/* Static variables: Get the true width and height of the image*/
var windowWidth = window.innerWidth;
var windowHeight = window.innerHeight;
var ratioY = (windowHeight - 1069) / windowHeight;
var ratioX = (windowWidth - 1690) / windowWidth;
window.onmousemove = function( e ) {
document.body.style.backgroundPosition = ratioX * e.pageX + "px " + ratioY * e.pageY + "px";
}
})();