Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 以编程方式使用JS中的CSS转换的干净方法?_Javascript_Css_Css Transitions_Transition - Fatal编程技术网

Javascript 以编程方式使用JS中的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中元素的不透明度设置动画。这是因为(): […]您会发现,如果同时应用这两组属性,则会立即应用一组属性 之后,浏览器会尝试优化

正如标题所暗示的,是否有一种正确的方法来设置一些初始CSS属性(或类),并告诉浏览器将这些属性转换为另一个值

例如():

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();