web-dev-qa-db-ja.com

JavaScriptを使用してwebkit-keyframesfrom / toパラメーターを設定します

JavaScriptを使用してWebkitキーフレームのfromまたはtoを設定する方法はありますか?

19
Ricardo

ある種の解決策:

var cssAnimation = document.createElement('style');
cssAnimation.type = 'text/css';
var rules = document.createTextNode('@-webkit-keyframes slider {'+
'from { left:100px; }'+
'80% { left:150px; }'+
'90% { left:160px; }'+
'to { left:150px; }'+
'}');
cssAnimation.appendChild(rules);
document.getElementsByTagName("head")[0].appendChild(cssAnimation);

ヘッダーにスタイル定義を追加するだけです。可能であれば、DOMを介して定義する方がはるかにクリーンで優れています。

編集:Chrome古い方法でのエラー

11
Adam Heath

CSSDOMインターフェースを使用できます。例えば:

<html>
    <body>
        <style>
        @keyframes fadeout {
            from { opacity:1; }
            to { opacity:0; }
        }
        </style>
        <script text="javascript">
            var stylesheet = document.styleSheets[0];
            var fadeOutRule = stylesheet.cssRules[0];
            alert( fadeOutRule.name ); // alerts "fadeout"

            var fadeOutRule_From = fadeOutRule.cssRules[0];
            var fadeOutRule_To = fadeOutRule.cssRules[1];
            alert( fadeOutRule_From.keyText ); // alerts "0%" ( and not "from" as you might expect)
            alert( fadeOutRule_To.keyText ); // alerts "100%"

            var fadeOutRule_To_Style = fadeOutRule_To.style;

            alert( fadeOutRule_To_Style.cssText ); // alerts "opacity:0;"

            fadeOutRule_To_Style.setProperty('color', 'red'); // add the style color:red
            fadeOutRule_To_Style.removeProperty('opacity'); // remove the style opacity

            alert( fadeOutRule_To_Style.cssText ); // alerts "color:red;"
        </script>
    </body>
</html>
11

この例では、いくつかの異なるブラウザーについて説明します。

var keyFramePrefixes = ["-webkit-", "-o-", "-moz-", ""];
var keyFrames = [];
var textNode = null;

for (var i in keyFramePrefixes){

keyFrames = '@'+keyFramePrefixes[i]+'keyframes cloudsMove {'+
'from {'+keyFramePrefixes[i]+'transform: translate(0px,0px);}'+
'to {'+keyFramePrefixes[i]+'transform: translate(1440px'
'px,0px);}}';

textNode = document.createTextNode(keyFrames);
document.getElementsByTagName("style")[0].appendChild(textNode);
}
5

これを処理する方法は、cssファイルで操作している要素スタイルのfromまたはtoを設定しないことです。アニメーションをトリガーする前に、javascriptで使用する要素スタイルを設定します。このようにして、jsで直接管理できるようになるまで、何をすべきかを動的に管理できます。 2つのうちの1つを指定するだけで済みます。 setTimeoutを使用すると、アニメーションがトリガーされる前にcssルールを要素に適用できます。そうしないと、競合状態が発生し、アニメーション化されません。


#someDiv.slideIn {
    -webkit-animation: slideIn 0.5s ease;
}

@-webkit-keyframes slideIn {
    0% {
        left:0px;
    }

    100% {}
}


var someDiv = document.getElementById('someDiv');
someDiv.style.left = '-50px';
setTimeout(function(){
    someDiv.addClass('slideIn');
},0);
4
mroy

これを解決するために、CSSセレクターに「webkitアニメーション名」を追加し、オプション用に個別のルールを作成しました。例では、赤と黄色の色を使用しています。

.spinner {
-webkit-animation-name: spinnerColorRed;
}

@-webkit-keyframes spinnerColorRed {
  from {
    background-color: Black;
  }
  to {
    background-color: Red;
  }
}

@-webkit-keyframes spinnerColorYellow {
  from {
    background-color: Black;
  }
  to {
    background-color: Yellow;
  }
}

次に、jQueryを使用します。

$("#link").click(function(event) { 
  event.preventDefault();
  $(".spinner").css("-webkit-animation-name", "spinnerColorYellow");
});
1
Lucy Luge