絶対配置された要素のプロパティをjavacript transform-origin
で計算しようとしているので、ホバー上のビューポート全体が満たされます。ビューポートの中央に変換原点を計算する
xをウィンドウ幅で、yをウィンドウの高さで割って計算しようとしました。ここでxは左側のビューポートエッジからの要素の中心までの距離で、yはvieportのトップと要素の中心の距離です。残念なことに、要素はそのように完全に中央揃えされておらず、画面を塗りつぶすには適切なサイズを持っていますが、画面全体を満たしません。/
transform-origin
のピボット位置を正しく計算する方法?ここで
あなたはデモを持っている:
let blocks = document.querySelectorAll("a.block");
console.log(blocks);
Array.prototype.slice.call(blocks).forEach((block) => {
\t console.log(block);
let blockRect = block.getBoundingClientRect();
\t
let originX = (blockRect.left + blockRect.width /2)/window.innerWidth * 100,
\t originY = (blockRect.top + blockRect.height /2)/window.innerHeight * 100;
\t block.style.transformOrigin = `${originX}% ${originY}%`;
});
.block{
position: absolute;
left: 5%;
top: 10%;
width: 10%;
height: 10%;
background: red;
-webkit-transition: transform 1s;
transition: transform 1s;
}
.block.second{
left: 87%;
top: 26%;
}
.block:hover{
-webkit-transform: scale3d(10,10,1);
transform: scale3d(10,10,1);
}
<a href="#" class="block"></a>
<a href="#" class="block second"></a>
私はその場合には、本当にスムーズな移行を必要とする原因3Dトランスフォームを使用する必要がありますすることができますパーセントの距離をピクセル単位で変換するに
。すべての要素はjsでランダムに配置されているので、実行時の要素位置がわからないので、私は純粋なCSSを使用できません。さらに、あなたのソリューションは下端に取り付けられた要素に対しては機能しません:[JsFiddle](https://jsfiddle.net/4LxuyaoL/2/) – Kuba
実際にはバグがありました。あなたは最初の.block定義の上、左、右および下の値を設定する必要があります。私は正しいバージョンに私の答えを変更しました。その上にキャッチがあります:これらのボックスを配置する場合、正しいパーセンテージを計算して、top + height + bottom = 100%にする必要がありますが、これは簡単です。また、組み込みのブラウザ機能を使用しているため、スムーズに実行する必要があります。しかし、これは十分に滑らかであることを確認する必要があります。 –
ありがとうございました。自分のやり方で正しい数式を見つけました。私はパフォーマンスの点で両方のソリューションをテストし、最良の答えを選ぶでしょう;) – Kuba