以编程方式更改动画规则中的 webkit-transformation 值

发布于 2024-10-19 07:32:57 字数 704 浏览 2 评论 0原文

我有这个样式表:

        @-webkit-keyframes run {
            0% {
                -webkit-transform: translate3d(0px, 0px, 0px);
            }            
            100% {
                -webkit-transform: translate3d(0px, 1620px, 0px);
            }
        }

现在,我想根据一些参数修改 1620px 的值。像这样:

        @-webkit-keyframes run {
            0% {
                -webkit-transform: translate3d(0px, 0px, 0px);
            }            
            100% {
                -webkit-transform: translate3d(0px, height*i, 0px);
            }
        }

我更希望能够使用 JavaScript 和 jQuery,尽管纯 CSS 解决方案也可以。

这是一款在移动 Apple Safari 浏览器中运行的 iPhone 游戏。

I have this stylesheet:

        @-webkit-keyframes run {
            0% {
                -webkit-transform: translate3d(0px, 0px, 0px);
            }            
            100% {
                -webkit-transform: translate3d(0px, 1620px, 0px);
            }
        }

Now, I would like to modify the value of 1620px depending on some parameters. Like this:

        @-webkit-keyframes run {
            0% {
                -webkit-transform: translate3d(0px, 0px, 0px);
            }            
            100% {
                -webkit-transform: translate3d(0px, height*i, 0px);
            }
        }

I would prefer to be able to use JavaScript and jQuery, though a pure CSS solution would be ok.

This is for an iPhone game that runs in it's mobile Apple Safari browser.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

謌踐踏愛綪 2024-10-26 07:32:57

使用 CSSOM

var style = document.documentElement.appendChild(document.createElement("style")),
rule = " run {\
    0%   {\
        -webkit-transform: translate3d(0, 0, 0); }\
        transform: translate3d(0, 0, 0); }\
    }\
    100% {\
        -webkit-transform: translate3d(0, " + your_value_here + "px, 0);\
        transform: translate3d(0, " + your_value_here + "px, 0);\
    }\
}";
if (CSSRule.KEYFRAMES_RULE) { // W3C
    style.sheet.insertRule("@keyframes" + rule, 0);
} else if (CSSRule.WEBKIT_KEYFRAMES_RULE) { // WebKit
    style.sheet.insertRule("@-webkit-keyframes" + rule, 0);
}

如果要修改已包含的样式表中的关键帧规则,请执行以下操作:

var
      stylesheet = document.styleSheets[0] // replace 0 with the number of the stylesheet that you want to modify
    , rules = stylesheet.rules
    , i = rules.length
    , keyframes
    , keyframe
;

while (i--) {
    keyframes = rules.item(i);
    if (
        (
               keyframes.type === keyframes.KEYFRAMES_RULE
            || keyframes.type === keyframes.WEBKIT_KEYFRAMES_RULE
        )
        && keyframes.name === "run"
    ) {
        rules = keyframes.cssRules;
        i = rules.length;
        while (i--) {
            keyframe = rules.item(i);
            if (
                (
                       keyframe.type === keyframe.KEYFRAME_RULE
                    || keyframe.type === keyframe.WEBKIT_KEYFRAME_RULE
                )
                && keyframe.keyText === "100%"
            ) {
                keyframe.style.webkitTransform =
                keyframe.style.transform =
                    "translate3d(0, " + your_value_here + "px, 0)";
                break;
            }
        }
        break;
    }
}

如果您不知道顺序但知道 CSS 文件的 URL,请替换 document.styleSheets[0]document.querySelector("link[href='your-css-url.css']") .sheet

Use the CSSOM

var style = document.documentElement.appendChild(document.createElement("style")),
rule = " run {\
    0%   {\
        -webkit-transform: translate3d(0, 0, 0); }\
        transform: translate3d(0, 0, 0); }\
    }\
    100% {\
        -webkit-transform: translate3d(0, " + your_value_here + "px, 0);\
        transform: translate3d(0, " + your_value_here + "px, 0);\
    }\
}";
if (CSSRule.KEYFRAMES_RULE) { // W3C
    style.sheet.insertRule("@keyframes" + rule, 0);
} else if (CSSRule.WEBKIT_KEYFRAMES_RULE) { // WebKit
    style.sheet.insertRule("@-webkit-keyframes" + rule, 0);
}

If you want to modify a keyframe rule in a stylesheet that's already included, do the following:

var
      stylesheet = document.styleSheets[0] // replace 0 with the number of the stylesheet that you want to modify
    , rules = stylesheet.rules
    , i = rules.length
    , keyframes
    , keyframe
;

while (i--) {
    keyframes = rules.item(i);
    if (
        (
               keyframes.type === keyframes.KEYFRAMES_RULE
            || keyframes.type === keyframes.WEBKIT_KEYFRAMES_RULE
        )
        && keyframes.name === "run"
    ) {
        rules = keyframes.cssRules;
        i = rules.length;
        while (i--) {
            keyframe = rules.item(i);
            if (
                (
                       keyframe.type === keyframe.KEYFRAME_RULE
                    || keyframe.type === keyframe.WEBKIT_KEYFRAME_RULE
                )
                && keyframe.keyText === "100%"
            ) {
                keyframe.style.webkitTransform =
                keyframe.style.transform =
                    "translate3d(0, " + your_value_here + "px, 0)";
                break;
            }
        }
        break;
    }
}

If you don't know the order but do know the URL of the CSS file, replace document.styleSheets[0] with document.querySelector("link[href='your-css-url.css']").sheet.

划一舟意中人 2024-10-26 07:32:57

您是否尝试过在 html 文档头部的

<style id="keyframes">
        @-webkit-keyframes run {
            0%    { -webkit-transform: translate3d(0px,0px,0px); }            
            100%  { -webkit-transform: translate3d(0px, 1620px, 0px); }
        }
</style>

然后你的jquery可以像平常一样改变它:

$('#keyframes').text('whatever new values you want in here');

Have you tried declaring the keyframe portion of your css in a <style> element in the head of your html document. You can then give this element an id or whatever and change it's content whenever you like with javaScript. Something like this:

<style id="keyframes">
        @-webkit-keyframes run {
            0%    { -webkit-transform: translate3d(0px,0px,0px); }            
            100%  { -webkit-transform: translate3d(0px, 1620px, 0px); }
        }
</style>

Then your jquery can change this as normal:

$('#keyframes').text('whatever new values you want in here');
蓝梦月影 2024-10-26 07:32:57

从你的例子来看,我认为 CSS 动画可能有点矫枉过正。使用过渡:

-webkit-transition: -webkit-transform .4s linear; /* you could also use 'all' instead of '-webkit-transform' */

然后通过 js 对元素应用新的转换:

$("<yournode>")[0].style.webkitTransform = "translate3d(0px,"+ (height*i) +"px,0px)";

它应该为该元素设置动画。

Well from your example it seems to me that CSS animations may be overkill. Use transitions instead:

-webkit-transition: -webkit-transform .4s linear; /* you could also use 'all' instead of '-webkit-transform' */

and then apply a new transform to the element via js:

$("<yournode>")[0].style.webkitTransform = "translate3d(0px,"+ (height*i) +"px,0px)";

It should animate that.

狼亦尘 2024-10-26 07:32:57

我不知道你什么时候想修改这些值(即使用变量),但尽管如此,这里有 3 到 4 个解决方案和 1 个不可能的解决方案(目前)。

  • 服务器端计算:为了不时提供不同的 CSS,您可以告诉 PHP 或任何服务器端语言将 .css 文件解析为以及 .php.html,然后在 PHP 标记之间使用 PHP 变量。注意文件缓存:为了避免它,您可以加载一个样式表,如 style.css?1234567890随机或时间它会产生一个明显不同的文件,因此不会被缓存

  • SASS 也是一个需要 Ruby 的服务器端解决方案,将为您提供现有的语法,可能比手工制作的解决方案,就像其他人已经关于问题和解决方案一样

  • LESS 是一个客户端解决方案,它将加载您的 .less 文件和一个 less.js 文件,该文件将解析前者并为您提供变量在 CSS 中,无论你的服务器是什么。它还可以在服务器端与node.js一起工作

  • 在显示页面时动态修改 CSS
    对于 2D,有 jquery-animate-enhanced 来自 Ben Barnett,2d-transformCSS3 旋转 的方向相反(它们在可能的情况下使用 CSS3,并且在没有此类功能的情况下,它们回退到现有的 jQuery .animate() 和 IE 矩阵过滤器)但仅此而已。
    您可以创建一个 jQuery 插件,它可以使用一些参数来管理您想要通过 3D 实现的目标转换并避免在 DOM 中修改又长又复杂的 CSS 规则的麻烦

  • 仅 CSS:您可以使用 -moz-calc [1][2] 仅适用于 Firefox 4.0,而 -webkit-transform 仅适用于...好吧没关系:-)

I didn't get when you wanted to modify these values (i.e. use variables) but nevertheless here are 3 to 4 solutions and 1 impossible solution (for now).

  • server-side calculation: in order to serve a different CSS from time to time, you can tell PHP or any server-side language to parse .css files as well as .php or .html and then use PHP variables in-between PHP tags. Beware of file caching: to avoid it, you can load a stylesheet like style.css?1234567890random-or-time it will produce an apparent different file and thus won't be cached

  • SASS is also a server-side solution that needs Ruby and will provide you an existing syntax, probably cleaner than a hand-made solution as others have already about problems and solutions

  • LESS is a client-side solution that will load your .less file and a less.js file that will parse the former and provide you variables in CSS whatever your server is. It can also work server-side with node.js

  • CSS being dynamically modified while your page is displayed?
    For 2D there are jquery-animate-enhanced from Ben Barnett, 2d-transform or CSS3 rotate are pitched the other way around (they use CSS3 where possible and where there are no such functions, they fallback to existing jQuery .animate() and IE matrix filter) but that's it.
    You could create a plugin for jQuery that would manage with a few parameters what you want to achieve with 3D Transformation and avoid the hassle of modifying long and complex CSS rules in the DOM

  • CSS only: you could use -moz-calc [1][2] that works only in Firefox 4.0 with -webkit-transform that works only in ... OK nevermind :-)

红焚 2024-10-26 07:32:57

尝试这样的事情:

var height = {whatever height setting you want to detect};
element.style.webkitTransform = "translate3d(0px," + height*i + ",0px)";

Try something like this:

var height = {whatever height setting you want to detect};
element.style.webkitTransform = "translate3d(0px," + height*i + ",0px)";
╄→承喏 2024-10-26 07:32:57

一个“厚重”的解决方案?

在您选择的粒度内创建高度变换,例如 0-99、100-199、200-299 等。每个变换都有一个唯一的动画名称标识符,例如:

@-webkit-keyframes run100 {
        0%    { -webkit-transform: translate3d(0px,0px,0px); }            
        100%  { -webkit-transform: translate3d(0px,100px,0px); }
}

@-webkit-keyframes run200 {
        0%    { -webkit-transform: translate3d(0px,0px,0px); }            
        100%  { -webkit-transform: translate3d(0px,200px,0px); }
}

然后创建匹配的 css 类:

.height-100 div { 
    -webkit-animation-name: run100;  
}

.height-200 div { 
    -webkit-animation-name: run200;  
}

然后使用 javascript 决定您所在的块并将适当的类分配给周围的元素。

$('#frame').attr('class', '').addClass('height-100');

如果粒度不是太细的话可能还可以!

A 'Chunky' solution?

Create transforms for heights within your chosen granularity, say 0-99, 100-199, 200-299, etc. Each with a unique animation name identifier like:

@-webkit-keyframes run100 {
        0%    { -webkit-transform: translate3d(0px,0px,0px); }            
        100%  { -webkit-transform: translate3d(0px,100px,0px); }
}

@-webkit-keyframes run200 {
        0%    { -webkit-transform: translate3d(0px,0px,0px); }            
        100%  { -webkit-transform: translate3d(0px,200px,0px); }
}

then create matching css classes:

.height-100 div { 
    -webkit-animation-name: run100;  
}

.height-200 div { 
    -webkit-animation-name: run200;  
}

then with javascript decide which chunk you're in and assign the appropriate class to the surrounding element.

$('#frame').attr('class', '').addClass('height-100');

Might be ok if the granularity doesn't get too fine!

以歌曲疗慰 2024-10-26 07:32:57

我使用了 warmanp 的解决方案并且它有效,但进行了一些非常重要的调整。

$('#ticket-marquee-css').text(
    "@-webkit-keyframes marqueeR{ 0%{text-indent: -" + distanceToMove + "px;} 100%{text-indent: 0;} }" + 
    "@-webkit-keyframes marqueeL{ 0%{text-indent: 0;} 100%{text-indent: -" + distanceToMove + "px;} }"
);

为了更新 CSS 过渡,我必须停止动画,然后重新启动,而不是使用之前定义的值。为此,我在元素上放置了一个“active”类,并使 CSS 仅将过渡应用于具有该类的元素

#marquee1.active {-webkit-animation-name: marqueeL;}
#marquee2.active {-webkit-animation-name: marqueeR;}

然后我只需关闭“active”类,等待它应用DOM(因此是 setTimeout),然后重新应用它。

$('.ticket-marquee').removeClass('active');
setTimeout(function() { $('.ticket-marquee').addClass('active'); },1);

效果很好!现在我可以动态改变文本移动的距离!

I used warmanp's solution and it worked, but with a bit of very important tweaking.

$('#ticket-marquee-css').text(
    "@-webkit-keyframes marqueeR{ 0%{text-indent: -" + distanceToMove + "px;} 100%{text-indent: 0;} }" + 
    "@-webkit-keyframes marqueeL{ 0%{text-indent: 0;} 100%{text-indent: -" + distanceToMove + "px;} }"
);

In order to get the CSS transition to update, instead of using the previously-defined values, I had to make the animation stop, then restart. To do this, I placed a class of "active" on the elements, and made the CSS only apply the transition to the elements that had that class

#marquee1.active {-webkit-animation-name: marqueeL;}
#marquee2.active {-webkit-animation-name: marqueeR;}

Then I just had to toggle the "active" class off, wait for it to apply in the DOM (hence the setTimeout), then reapply it.

$('.ticket-marquee').removeClass('active');
setTimeout(function() { $('.ticket-marquee').addClass('active'); },1);

And that works great! Now I can dynamically change the distance the text moves!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文