フィドル: 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
。
ただし、この比率は完全ではありません。画像はウィンドウの左下隅に表示されなくなります。これを修正するには、画像のサイズからウィンドウのサイズを引きます。結果は、コードの variableratioX
および にあり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";
}
})();