2017-11-17 11 views
1

振り子のように左から右に釘を振りながら2本の紐で貼り付けたパネルのアニメーションを作ろうとしています。ここにアニメーションコードとトランジション関数があります。デモのために、あなたは以下のスニペット確認することができます。アニメーションをスムーズに移行させるにはどうすればよいですか?

.headline { 
 
    display: flex; 
 
    justify-content: center; 
 
    margin-bottom: 40px; 
 
    margin-top: 150px; 
 
} 
 

 
.headline .box { 
 
    position: relative; 
 
    top: 10px; 
 
    left: -70px; 
 
} 
 

 
.headline .box:after { 
 
    content: ""; 
 
    width: 45px; 
 
    height: 45px; 
 
    background: black; 
 
    position: absolute; 
 
    border-radius: 50%; 
 
    top: -85px; 
 
    left: 105px; 
 
    z-index: 10; 
 
} 
 

 
.headline .panel { 
 
    background: white; 
 
    color: #ff004f; 
 
    font-size: 46px; 
 
    font-family: "Quicksand", sans-serif; 
 
    padding: 10px; 
 
    font-weight: 700; 
 
    max-width: 250px; 
 
    display: block; 
 
    line-height: 46px; 
 
    position: relative; 
 
} 
 

 
.headline .panel:hover { 
 
    animation-timing-function: cubic-bezier(0.120, 0.485, 0.950, 0.475); 
 
    animation: pendulum 2s infinite; 
 
} 
 

 
.headline .panel:before { 
 
    content: ""; 
 
    width: 155px; 
 
    height: 10px; 
 
    background: white; 
 
    display: block; 
 
    transform: translateX(8px) rotate(148deg); 
 
    position: absolute; 
 
    top: -40px; 
 
    left: -16px; 
 
    border-radius: 5px; 
 
} 
 

 
.headline .panel:after { 
 
    content: ""; 
 
    width: 150px; 
 
    height: 10px; 
 
    background: white; 
 
    display: block; 
 
    transform: translateX(-10px) rotate(-148deg); 
 
    position: absolute; 
 
    top: -40px; 
 
    right: -18px; 
 
} 
 

 
@keyframes pendulum { 
 
    0%, 
 
    50%, 
 
    100% { 
 
    transform: rotate(0deg); 
 
    transform-origin: 50% -50%; 
 
    } 
 
    25% { 
 
    transform: rotate(-25deg); 
 
    transform-origin: 50% -50%; 
 
    } 
 
    75% { 
 
    transform: rotate(25deg); 
 
    transform-origin: 50% -50%; 
 
    } 
 
} 
 

 
body { 
 
    background-color: #EEE; 
 
}
<div class="headline"> 
 
    <div class="box"> 
 
    <span class="panel">Test Panel</span> 
 
    </div> 
 
</div>

をそれは何らかの形で働いていたが、アニメーションは非常に滑らかで自然なロボットとではありません。このアニメーションを改善する方法を教えてください。

JSを使用する必要がある場合は、このケースでもjQueryを使用できます。

+0

追加 "アニメーション:すべての無限;"あなたの@keyframeのすぐ下に、あなたはループを改善したいかもしれません。ちょうど更新:https://jsfiddle.net/ns1carpp/1/ –

+0

Pauloありがとう!それは期待どおりに動作しませんでした、あなたはそれが各フレームの間に不具合を持っていたことがわかります、それは停止し続けました –

+0

他の誰かがあなたを助けてくれることを嬉しく思って、私はCSSのアニメーションにも新しく、 http://autoprefixer.github.io/で最終的なCSSファイルを実行します。これは、ブラウザごとに異なるflexやその他の機能を使用しているため、古い/クロスブラウザのサポートです。 –

答えて

5

同様にこれを試してみてください、私はそう振り子が下からスイングではなく、突然のジャンプを開始することを否定animation-delayを追加しました-25deg。このテクニックを使用すると、途中でアニメーションを開始することができます。ここでは、関連する変更のルールは以下のとおりです。

.headline .panel:hover { 
     animation-timing-function: cubic-bezier(0.120, 0.485, 0.950, 0.475); 
     animation: pendulum 2s infinite; 
     animation-delay: -1.3s /* I added this */ 
} 

@keyframes pendulum { 
    0% { 
    transform: rotate(-25deg); 
    transform-origin: 50% -50%; 
    } 
    50% { 
    transform: rotate(25deg); 
    transform-origin: 50% -50%; 
    } 
    100% { 
    transform: rotate(-25deg); 
    transform-origin: 50% -50%; 
    } 
} 

とフィドル:https://jsfiddle.net/125wps7s/

animation-delay時間が権利を取得するために試行錯誤が必要です。私はちょうど十分に近いと思われる価値を選んだ。

+0

'animation-delay'はキーです、多くのありがとう、ジョナサン! –

+0

私の喜び。私はこれまでにアニメーション遅延の値が負の値になっていることは一度もなかったので、新しいことを学びました。 –

+0

負のアニメーション遅延を使用してくれてありがとう。私はそれが必要でした。 –

1

多分このようなものでしょうか?

.headline { 
 
    display: flex; 
 
    justify-content: center; 
 
    margin-bottom: 40px; 
 
    margin-top: 150px; 
 
} 
 

 
.headline .box { 
 
    position: relative; 
 
    top: 10px; 
 
    left: -70px; 
 
} 
 

 
.headline .box:after { 
 
    content: ""; 
 
    width: 45px; 
 
    height: 45px; 
 
    background: black; 
 
    position: absolute; 
 
    border-radius: 50%; 
 
    top: -85px; 
 
    left: 105px; 
 
    z-index: 10; 
 
} 
 

 
.headline .panel { 
 
    background: white; 
 
    color: #ff004f; 
 
    font-size: 46px; 
 
    font-family: "Quicksand", sans-serif; 
 
    padding: 10px; 
 
    font-weight: 700; 
 
    max-width: 250px; 
 
    display: block; 
 
    line-height: 46px; 
 
    position: relative; 
 
} 
 

 
.headline .panel:hover { 
 
    animation-timing-function: cubic-bezier(0.120, 0.485, 0.950, 0.475); 
 
    animation: pendulum 2s infinite; 
 
} 
 

 
.headline .panel:before { 
 
    content: ""; 
 
    width: 155px; 
 
    height: 10px; 
 
    background: white; 
 
    display: block; 
 
    transform: translateX(8px) rotate(148deg); 
 
    position: absolute; 
 
    top: -40px; 
 
    left: -16px; 
 
    border-radius: 5px; 
 
} 
 

 
.headline .panel:after { 
 
    content: ""; 
 
    width: 150px; 
 
    height: 10px; 
 
    background: white; 
 
    display: block; 
 
    transform: translateX(-10px) rotate(-148deg); 
 
    position: absolute; 
 
    top: -40px; 
 
    right: -18px; 
 
} 
 

 
@keyframes pendulum { 
 
    0%{ 
 
    transform: rotate(-25deg); 
 
    transform-origin: 50% -50%; 
 
    } 
 
    50%{ 
 
    transform: rotate(25deg); 
 
    transform-origin: 50% -50%; 
 
    } 
 
    100%{ 
 
    transform: rotate(-25deg); 
 
    transform-origin: 50% -50%; 
 
    } 
 
} 
 

 
body { 
 
    background-color: #EEE; 
 
}
<div class="headline"> 
 
    <div class="box"> 
 
    <span class="panel">Test Panel</span> 
 
    </div> 
 
</div>

+0

私より滑らかですが、中心点でアニメーションを開始し、左に上がり、左から上に動くことがあります。あなたのアニメーションは左から開始し、右に移動します。 –

2

@ Kushtrimの答えに

headline { 
    display: flex; 
    justify-content: center; 
    margin-bottom: 40px; 
    margin-top: 150px; 
} 

.headline .box { 
    position: relative; 
    top: 10px; 
    left: -70px; 
} 

.headline .box:after { 
    content: ""; 
    width: 45px; 
    height: 45px; 
    background: black; 
    position: absolute; 
    border-radius: 50%; 
    top: -85px; 
    left: 105px; 
    z-index: 10; 
} 

.headline .panel { 
    background: white; 
    color: #ff004f; 
    font-size: 46px; 
    font-family: "Quicksand", sans-serif; 
    padding: 10px; 
    font-weight: 700; 
    max-width: 250px; 
    display: block; 
    line-height: 46px; 
    position: relative; 
} 

.headline .panel:hover { 
    animation-timing-function: cubic-bezier(0.120, 0.485, 0.950, 0.475); 
    animation: pendulum 2s infinite; 
} 

.headline .panel:before { 
    content: ""; 
    width: 155px; 
    height: 10px; 
    background: white; 
    display: block; 
    transform: translateX(8px) rotate(148deg); 
    position: absolute; 
    top: -40px; 
    left: -16px; 
    border-radius: 5px; 
} 

.headline .panel:after { 
    content: ""; 
    width: 150px; 
    height: 10px; 
    background: white; 
    display: block; 
    transform: translateX(-10px) rotate(-148deg); 
    position: absolute; 
    top: -40px; 
    right: -18px; 
} 

@keyframes pendulum { 
animation: all infinite; 
    0%{ 
    transform: rotate(-25deg); 
    transform-origin: 50% -50%; 
    } 
    50%{ 
    transform: rotate(25deg); 
    transform-origin: 50% -50%; 
    } 
    100%{ 
    transform: rotate(-25deg); 
    transform-origin: 50% -50%; 
    } 
} 

body { 
    background-color: #EEE; 
} 
0

.headline { 
 
     display: flex; 
 
     justify-content: center; 
 
     margin-bottom: 40px; 
 
     margin-top: 150px; 
 
    } 
 

 
    .headline .box { 
 
     position: relative; 
 
     top: 10px; 
 
     left: -70px; 
 
    } 
 

 
    .headline .box:after { 
 
     content: ""; 
 
     width: 45px; 
 
     height: 45px; 
 
     background: black; 
 
     position: absolute; 
 
     border-radius: 50%; 
 
     top: -85px; 
 
     left: 105px; 
 
     z-index: 10; 
 
    } 
 

 
    .headline .panel { 
 
     background: white; 
 
     color: #ff004f; 
 
     font-size: 46px; 
 
     font-family: "Quicksand", sans-serif; 
 
     padding: 10px; 
 
     font-weight: 700; 
 
     max-width: 250px; 
 
     display: block; 
 
     line-height: 46px; 
 
     position: relative; 
 
    } 
 

 
    .headline .panel:hover { 
 
     animation-timing-function: cubic-bezier(0.97, 0.96, 0.01, 0.01); 
 
     animation: pendulum 3s infinite; 
 
     -webkit-transition: 15s; 
 
    } 
 

 
    .headline .panel:before { 
 
     content: ""; 
 
     width: 155px; 
 
     height: 10px; 
 
     background: white; 
 
     display: block; 
 
     transform: translateX(8px) rotate(148deg); 
 
     position: absolute; 
 
     top: -40px; 
 
     left: -16px; 
 
     border-radius: 5px; 
 
    } 
 

 
    .headline .panel:after { 
 
     content: ""; 
 
     width: 150px; 
 
     height: 10px; 
 
     background: white; 
 
     display: block; 
 
     transform: translateX(-10px) rotate(-148deg); 
 
     position: absolute; 
 
     top: -40px; 
 
     right: -18px; 
 
    } 
 

 
    @keyframes pendulum { 
 
     0%{ 
 
      transform: rotate(-25deg); 
 
      transform-origin: 50% -50%; 
 
     } 
 
     50%{ 
 
      transform: rotate(25deg); 
 
      transform-origin: 50% -50%; 
 
     } 
 
     100%{ 
 
      transform: rotate(-25deg); 
 
      transform-origin: 50% -50%; 
 
     } 
 
    } 
 

 
    body { 
 
     background-color: #EEE; 
 
    }
<div class="headline"> 
 
    <div class="box"> 
 
     <span class="panel">Test Panel</span> 
 
    </div> 
 
</div>

関連する問題