ページ上のすべての要素を拡大する方法を見つけようとしていますが、拡大の中心をウィンドウの中心に保ちます。
このページでは、画像がウィンドウの上部または左側に達すると、拡大の中心が変わります。画像を動かすと変化します。(まさにあなたが期待するもの)
私が望むものを達成するには、まったく異なるアプローチを取る必要があると考えています。しかし、私はそのアプローチが何であるかわかりません..
何か案は?
ページ上のすべての要素を拡大する方法を見つけようとしていますが、拡大の中心をウィンドウの中心に保ちます。
このページでは、画像がウィンドウの上部または左側に達すると、拡大の中心が変わります。画像を動かすと変化します。(まさにあなたが期待するもの)
私が望むものを達成するには、まったく異なるアプローチを取る必要があると考えています。しかし、私はそのアプローチが何であるかわかりません..
何か案は?
さて、これが私の見解です。
唯一のことは、あなたが使用していたコンテナを捨てたことです。それは不正行為ですか?画像を中央に配置するためだけに存在していたようです。必要なし。
これは期待どおりに機能し、副作用はありません。
テストできる実際のデモは次のとおりです。
(最初にヒヒのペインをクリックする必要があります。)
HTML
<body>
<img src="http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon.png" />
</body>
CSS
html, body {
width: 100%;
height: 100%;
overflow: hidden;
}
jQuery
編集:冗長性を整理するためのリマインダーをくれた@stagasに感謝します。
var $img = $('img'); // Cache the image. Better for performance.
$img.draggable();
$img.css({left: ($('body').width() / 2) - ($img.width() / 2)})
.css({top: ($('body').height() / 2) - ($img.height() / 2)})
$(document).keydown(function(event) {
if (event.keyCode == 38) {
var adjustment = 1.25;
} else if (event.keyCode == 40) {
var adjustment = 0.8;
} else {
return;
}
var offset = $img.offset();
var width = $img.width();
var height = $img.height();
var newWidth = width * adjustment;
var newHeight = height * adjustment;
var diffWidth = newWidth - width;
var diffHeight = newHeight - height;
var hcenter = $('body').width() / 2;
var vcenter = $('body').height() / 2;
var leftPercent = (hcenter - offset.left) / width;
var topPercent = (vcenter - offset.top) / height;
$img.offset({top: offset.top - (diffHeight * topPercent), left: offset.left - (diffWidth * leftPercent)});
$img.width(newWidth).height(newHeight);
});
これは私が思いついたものです。ズームインまたはズームアウトした後、画像が常に中央に移動することを除いて、あなたが言うように機能します:
$('document').ready(function() {
zoomimg=$('#zoomimg'); // we store this in a variable since we don't need to traverse the DOM every time -- this is faster
var viewportWidth = $(window).width();
var viewportHeight = window.innerHeight ? window.innerHeight : $(window).height(); // this is to work with Opera
zoomimg.css({'position': 'absolute', 'left': (viewportWidth/2)-(zoomimg.width()/2), 'top' : (viewportHeight/2)-(zoomimg.height()/2)}).draggable();
$(document).keydown(function(event) {
event = event || window.event;
var viewportWidth = $(window).width();
var viewportHeight = window.innerHeight ? window.innerHeight : $(window).height(); // this is to work with Opera
if (event.keyCode == 38) {
width = zoomimg.width();
height = zoomimg.height();
zoomimg.width(width*1.2).height(height*1.2);
var viewportWidth = $(window).width();
var viewportHeight = window.innerHeight ? window.innerHeight : $(window).height();
zoomimg.css({'left': (viewportWidth/2)-(zoomimg.width()/2), 'top' : (viewportHeight/2)-(zoomimg.height()/2)});
} else if (event.keyCode == 40) {
width = zoomimg.width();
height = zoomimg.height();
zoomimg.width(width*0.8).height(height*0.8);
var viewportWidth = $(window).width();
var viewportHeight = window.innerHeight ? window.innerHeight : $(window).height();
zoomimg.css({'left': (viewportWidth/2)-(zoomimg.width()/2), 'top' : (viewportHeight/2)-(zoomimg.height()/2)});
} else {
return
}
});
});
機能させるには、タグに ID 'zoomimg' を配置し、 #container に overflow:hidden を配置する必要があります。また、display:table と display:table-cell は使い物にならなくなりました。Javascript を中心に据えているからです。また、下矢印キーを押すとコンテナーが下にスクロールするため、ビューポートをスクロールするためにブラウザーによって矢印が予約されているため、他のキーを使用する必要があります。