動的な幅を持つ要素のtransform: translateX(-100%);
場合、水平方向のパーセンテージ値に対抗するために使用できます。これにより、次の 2 つの解決策が考えられます。
1. オプション: ビューポート全体で要素を移動する:
からの移行:
transform: translateX(0);
に
transform: translateX(calc(100vw - 100%));
#viewportPendulum {
position: fixed;
left: 0;
top: 0;
animation: 2s ease-in-out infinite alternate swingViewport;
/* just for styling purposes */
background: #c70039;
padding: 1rem;
color: #fff;
font-family: sans-serif;
}
@keyframes swingViewport {
from {
transform: translateX(0);
}
to {
transform: translateX(calc(100vw - 100%));
}
}
<div id="viewportPendulum">Viewport</div>
2.オプション:親コンテナ内の要素を移動:
からの移行:
transform: translateX(0);
left: 0;
に
left: 100%;
transform: translateX(-100%);
#parentPendulum {
position: relative;
display: inline-block;
animation: 2s ease-in-out infinite alternate swingParent;
/* just for styling purposes */
background: #c70039;
padding: 1rem;
color: #fff;
font-family: sans-serif;
}
@keyframes swingParent {
from {
transform: translateX(0);
left: 0;
}
to {
left: 100%;
transform: translateX(-100%);
}
}
.wrapper {
padding: 2rem 0;
margin: 2rem 15%;
background: #eee;
}
<div class="wrapper">
<div id="parentPendulum">Parent</div>
</div>
注:このアプローチは、垂直方向の配置にも簡単に拡張できます。例はこちらをご覧ください。