Javascript 以编程方式使用JS中的CSS转换的干净方法?
正如标题所暗示的,是否有一种正确的方法来设置一些初始CSS属性(或类),并告诉浏览器将这些属性转换为另一个值 例如():Javascript 以编程方式使用JS中的CSS转换的干净方法?,javascript,css,css-transitions,transition,Javascript,Css,Css Transitions,Transition,正如标题所暗示的,是否有一种正确的方法来设置一些初始CSS属性(或类),并告诉浏览器将这些属性转换为另一个值 例如(): var el=document.querySelector('div'), st=el.style; 不透明度=0; st.transition='opacity 2s'; st.opacity=1; 这不会为Chrome 29/Firefox 23中元素的不透明度设置动画。这是因为(): […]您会发现,如果同时应用这两组属性,则会立即应用一组属性 之后,浏览器会尝试优化
var el=document.querySelector('div'),
st=el.style;
不透明度=0;
st.transition='opacity 2s';
st.opacity=1;
这不会为Chrome 29/Firefox 23中元素的不透明度设置动画。这是因为():
[…]您会发现,如果同时应用这两组属性,则会立即应用一组属性
之后,浏览器会尝试优化属性
更改,忽略初始属性并阻止转换。
在后台,浏览器会在绘制前批量更改属性
这通常会加快渲染速度,但有时会产生不利影响
影响
解决方案是强制在应用两组
财产。一个简单的方法就是访问DOM
元素的offsetHeight
属性[…]
事实上,这种攻击在当前的Chrome/Firefox版本中确实有效。更新的代码(-打开小提琴后单击Run
,再次运行动画):
var el=document.querySelector('div'),
st=el.style;
不透明度=0;
远视//强制重画
st.transition='opacity 2s';
st.opacity=1;
然而,这是相当黑客的,据报道在一些android设备上不起作用
另一个建议使用setTimeout
,这样浏览器就有时间执行重画,但它也会失败,因为我们不知道重画需要多长时间。猜测一个合适的毫秒数(30-100?)以确保重画发生意味着牺牲性能,不必要地空转,希望浏览器在这段时间内发挥一些魔力
通过测试,我发现了另一个在最新的Chrome上运行良好的解决方案,使用():
var el=document.querySelector('div'),
st=el.style;
不透明度=0;
requestAnimationFrame(函数(){
st.transition='opacity 2s';
st.opacity=1;
});
我假设requestAnimationFrame
在执行回调之前等待,直到下一次重新绘制开始之前,因此浏览器不会批处理属性更改。这里不完全确定,但在Chrome 29上运行良好
更新:经过进一步测试后,requestAnimationFrame
方法在Firefox23上运行不太好-它似乎大部分时间都失败了。()
有没有合适的或推荐的(跨浏览器)方法来实现这一点?这是一个有效的版本。你自己看吧 在Chrome、Firefox和Opera上测试 在我的firefox版本中,它不支持style.transition,因此,如果标准名称不可用,我会使用特定于供应商的名称
var el=document.querySelector('div');
var供应商=['Moz'、'Webkit'、'Ms'、'O'];
函数getVendorSpecificName(el,prop){
var-style=el.style;
如果(以样式支持){
返回道具;
}
prop=ucfirst(prop);
对于(var i=0,l=VENDORS.length,name;i0?ucfirst(str):str;
}).加入(“”);
}
函数animateCss(el、prop、from、to、duration){
var style=el.style,
驼峰=toCamelCase(道具),
vendorSpecific=getVendorSpecificName(el,驼峰);
如果(!供应商特定){
console.log(此浏览器不支持prop+');
返回false;
}
var transitionPropName=getVendorSpecificName(el,“transition”);
if(!(样式中的transitionPropName)){
log('此浏览器不支持转换');
返回false;
}
样式[vendorSpecific]=来自;
setTimeout(函数(){
风格[transitionPropName]=道具+''+持续时间+'轻松';
setTimeout(函数(){
样式[vendorSpecific]=至;
}, 1);
}, 1);
返回true;
}
animateCss(el,‘不透明度’、0、1、2);
让我解释一下发生了什么:
- 制作了一些辅助函数,比如ucfirst,toCamelCase
- style属性使用大小写名称
- 如果标准名称不可用,请尝试查找供应商特定的样式属性名称
- 利用setTimeout功能确保浏览器重新绘制
- 据我所知,所有浏览器总是在超时时重新绘制
希望这有帮助 你不需要太多的JavaScript来实现你想要的,只需使用CSS关键帧和动画就可以达到同样的效果
div {
opacity: 0;
}
div.fadeIn {
-webkit-animation: fadeIn 2s forwards;
animation: fadeIn 2s forwards;
}
@keyframes fadeIn {
0% {opacity: 0;}
100% {opacity: 1;}
}
@-webkit-keyframes fadeIn {
0% {opacity: 0;}
100% {opacity: 1;}
}
如图所示,它可以从页面加载(已添加类)开始工作,也可以在动态添加类以触发动画时工作。
$(文档).ready(函数(){
$('a.hiw*')。单击(函数(){
id=this.id;
dval=$('#'+id).attr('data-value');
如果(dval==0){
$('a.hiw*').attr('data-value','0');
$(“.hiw popup”).remove();
$('#'+id).attr('data-value','1');
$('1
block12
BLOCK33
BLOCK24
BLOCK5
BLOCK')。后面插入('#'+id);
}否则{
$('#'+id).attr('data-value','0');
$(“.hiw popup”).remove();
}
});
});
var ahiw=函数(id){
dval=$('#'+id).attr('data-value');
如果(dval==0){
$('a.hiw*').attr('data-value','0');
$(“.hiw popup”).remove();
$('#'+id).attr('data-value','1');
$('1
block12
BLOCK33
BLOCK24
BLOCK5
BLOCK')。后面插入('#'+id);
}否则{
$('#'+id).attr('data-value','0'
div {
opacity: 0;
}
div.fadeIn {
-webkit-animation: fadeIn 2s forwards;
animation: fadeIn 2s forwards;
}
@keyframes fadeIn {
0% {opacity: 0;}
100% {opacity: 1;}
}
@-webkit-keyframes fadeIn {
0% {opacity: 0;}
100% {opacity: 1;}
}
window.getComputedStyle(elem).opacity;
var player = snowFlake.animate([
{transform: 'translate(' + snowLeft + 'px, -100%)'},
{transform: 'translate(' + snowLeft + 'px, ' + window.innerHeight + 'px)'}
], 1500);
// less than 1500ms later...changed my mind
player.cancel();