如何从 JavaScript 设置和触发 css 转换

Posted

技术标签:

【中文标题】如何从 JavaScript 设置和触发 css 转换【英文标题】:How to set and trigger an css transition from JavaScript 【发布时间】:2012-07-12 03:03:43 【问题描述】:

我是 html5、css 和 javascript 的新手,而且大部分时间我只是在玩。 我想要做的是设置和触发 div 的转换。加载页面后,我设法通过设置转换来做到这一点。但这感觉不是很有活力,而且似乎也不是正确的方法。感谢您的帮助

<!DOCTYPE html>
<html>
<head>   
    <style> 
        body
            text-align: center;
        

        #dialPointer
        
            position:relative;
            margin-left: auto;
            margin-right: auto;
            width:23px;
            height:281px;
            background:url(pointer.png);
            background-size:100% 100%;
            background-repeat:no-repeat;

            transform: rotate(-150deg);
            transition-duration: 2s;
            transition-delay: 2s;

            -webkit-transform: rotate(-150deg);
            -webkit-transition-duration:2s;
            -webkit-transition-delay: 2s;
        


        /* I want to call this once */
        .didLoad
        
            width:23px;
            height:281px;
            transform:rotate(110deg);
            -moz-transform:rotate(110deg); /* Firefox 4 */
            -webkit-transform:rotate(110deg); /* Safari and Chrome */
            -o-transform:rotate(110deg); /* Opera */
        

        </style>
</head>

<body>
    <div id="dialPointer"></div>
    <script language="javascript" type="text/javascript">
        window.onload=function () 
            //But instead of using rotate(110deg), I would like to call "didLoad"

            document.getElementById("dialPointer").style.webkitTransform = "rotate(110deg)";


        ;
        </script>
</body>
</html>

【问题讨论】:

你想说什么你想调用类 didLoad 一次?你想实现它还是改造它?在 javascript 中你不能“调用”一个 html 类...? 好吧,所以我想做的是让我的 div 带有背景 img,加载页面后旋转。但是我必须在body中声明transition,这似乎很奇怪。所以我想在我的 div 上触发一个已经声明的转换。另外,我正在使用 Safari 浏览器。 【参考方案1】:

您可以随时使用以下 JavaScript 将您的类添加到元素中:

document.getElementById("dialPointer").className += " didLoad";

或者可以说更好,如果你想保证跨浏览器支持,像这样使用 jQuery:

$(function() 
 // Handler for .ready() called.
 $('#dialPointer').addClass('didLoad');
);

编辑:

在此处查看fiddle,我已在 Windows 上的 Chrome 和 Safari 中进行了测试。我不得不注释掉 dialPointer 样式中的转换代码并将其移至您的 didLoad 类。我还用填充替换了您的背景图像,以使其在小提琴中正常工作。

【讨论】:

添加类的时候需要在字符串的开头有一个空格,否则如果已经有其他类就不行了。 啊哈!好的!如果 div 已经旋转,那么它是否无法转换? 似乎您可以将其旋转到最初想要的点,然后只要在类中设置初始旋转,就可以为旋转设置动画:jsfiddle.net/jvpmq【参考方案2】:

触发过渡的方式是使元素与 CSS 选择器匹配。最简单的方法是将过渡分配给一个类,然后使用 Javascript 添加该类。所以在你的例子中:

document.getElementById('dialPointer').classList.add('didLoad');

并且您选择的元素将具有动画效果。 (为此,我使用了标准补充 Javascript,但它不适用于旧版浏览器,所以我将由您来完成它)。

要让它在页面加载时产生动画,请将其放入加载事件中:

window.addEventListener('load', function () 
    document.getElementById('dialPointer').classList.add('didLoad');
);

【讨论】:

感谢您的回复,我尝试替换 document.getElementById("dialPointer").style.webkitTransform = "rotate(110deg)"; with document.getElementById('dialPointer').classList.add('didLoad');但后来什么也没发生,可能是因为我正在使用 safari? 我以为我已经为类 didLoad 分配了一个过渡。否则你能告诉我怎么做吗?【参考方案3】:

可能是这样的:

document.getElementById("dialPointer").className += "didLoad";

【讨论】:

感谢您的回复!虽然当我用您的代码替换我的代码行时没有任何反应。有任何想法吗?我正在使用 Safari 网络浏览器 检查调试控制台是否有错误。您是否在 onLoad 函数中添加了该行? 没有错误,我正在使用 safari 的网络检查器和错误控制台。是的,我只替换了 document.getElementById("dialPointer").style.webkitTransform = "rotate(110deg)"; with document.getElementById("dialPointer").className += "didLoad";

以上是关于如何从 JavaScript 设置和触发 css 转换的主要内容,如果未能解决你的问题,请参考以下文章

普通 javascript 触发 css 淡出,ajax 加载内容,使用 CSS 淡入

CSS3使用JAVASCript触发过渡效果

如何通过JavaScript重新触发WebKit CSS动画?

在 JavaScript 中触发 CSS 动画

尝试使用 JavaScript 触发 CSS 转换

如何从不同区域触发复选框? css,html