このサンプルを検討してください。
http://jsfiddle.net/dfabulich/ncbzz5zu/3/
<html>
<body>
<style>
.container {
position: relative;
width: 80%;
height: 100px;
border: 1px solid black;
}
@keyframes slide {
from { background-color: red; left: 0; }
to { background-color: blue; right: 0; }
}
.animated {
position: absolute;
width: 20%;
height: 100%;
top: 0;
background-color: red;
animation-duration: 3s;
animation-name: slide;
animation-iteration-count: infinite;
}
</style>
<div class=container>
<div class=animated>
</div></div>
予想:色が赤から青に変わると、赤い長方形は左から右にスムーズにアニメーション化されます。
実際:Chrome/Firefoxでは、赤い長方形の色がゆっくりと紫に変わり、アニメーション化せずに左から右にテレポートし、次に紫から青にゆっくりと変化します。 Safariでは、長方形が右側に表示され、そこから移動することはなく、赤から青にアニメーション化されます。
なんでこんなことが起こっているの?どうすれば修正できますか? (CSSで修正する必要があります…JSもjQueryもありません。)
いずれかのプロパティをアニメーション化する必要があります。左にアニメーション化して、left: calc(100% - elemWidth)
(elemWidth
は要素の幅)を使用するか、要素の幅が不明な場合はleft: 100%; transform: translateX(-100%);
を使用できます。
また、背景色をアニメーション化する必要があります。
.container {
position: relative;
width: 80%;
height: 100px;
border: 1px solid black;
}
.animated {
position: absolute;
width: 20%;
height: 100%;
top: 0;
background-color: red;
animation: 3s linear 0s slide infinite;
}
@keyframes slide {
from { left: 0; }
to {
left: 100%;
transform: translateX(-100%);
background: blue;
}
}
<div class=container>
<div class=animated>
</div></div>
問題は、プロパティleft
のアニメーション化を開始し、アニメーションの最後でそれをright
に置き換えることです。これが、ジャンプする理由です。ステップバイステップのアニメーション進行を取得するには、同じプロパティをアニメーション化し続ける必要があります。
.container {
position: relative;
width: 80%;
height: 100px;
border: 1px solid black;
}
@keyframes slide {
from { background-color: red; left: 0; }
to { background-color: blue; left: 80%; }
}
.animated {
position: absolute;
width: 20%;
height: 100%;
top: 0;
background-color: red;
animation-duration: 3s;
animation-name: slide;
animation-iteration-count: infinite;
}
<div class="container"><div class="animated"></div></div>
@keyframes slide {
from { left: 0;}
to { left: 80%; } // edit: actually endpoint should point to left:100% minus width of the element so in your case 100%-20% = 80%. In case of width of the element in px use CSS calc like: left: calc(100% - ##px);
}
right
を使用したとき、まったく異なるプロパティを変更するように移行に指示しました。そのため、画面の左側にあるleft: 0
から画面の右側にあるright: 0
にジャンプしていました。
<html>
<body>
<style>
.container {
position: relative;
width: 80%;
height: 100px;
border: 1px solid black;
}
@keyframes slide {
0% { background-color: red; left: 0; }
100% { background-color: blue; left: 100%; margin-left: -20%; }
}
.animated {
position: absolute;
width: 20%;
height: 100%;
top: 0;
background-color: red;
animation-duration: 3s;
animation-name: slide;
animation-iteration-count: infinite;
}
</style>
<div class=container>
<div class=animated>
</div></div>
このスニペットを参照してください...
これはどのように見えるべきかです:
http://jsfiddle.net/ncbzz5zu/11/
そして、これはそれに対する修正です:
@keyframes slide {
from { background-color: red;
left:0%;}
to { background-color:blue;
left:80%;}
}
基本的に、最初の左プロパティを指定したがターゲット値を指定しなかったため、アニメーションは何をすべきかを知りませんでした。 left:0
からleft:initial
にアニメーション化されました。右は左と同様の機能を果たしますが、さらに別の特性を備えています。