> 웹 프론트엔드 > HTML 튜토리얼 > 当transition遇上display_html/css_WEB-ITnose

当transition遇上display_html/css_WEB-ITnose

WBOY
풀어 주다: 2016-06-21 09:00:06
원래의
1105명이 탐색했습니다.

相信大家在试用css3动画时候一定用过transition属性,相对于js动画来说用起来更快速简单。代码如下:HTML结构:

<div id="box"></div><button>动画按钮</button>
로그인 후 복사

CSS代码:

.box {    background: goldenrod;    width: 300px;    height: 300px;    margin: 30px auto;    transition: all .4s linear;    /*display: block;*/}.hidden {    /*display: none;*/    opacity: 0;}
로그인 후 복사

JS代码

var box = $('#box');$('button').on('click', function () {    if(box.hasClass('hidden')){        box.removeClass('hidden');    }else{        box.addClass('hidden');    }});
로그인 후 복사

在点击按钮后可以看到淡入淡出的动画效果,但是在css代码中解除对于display属性的两段注释以后,再打开浏览器一看,淡入淡出的效果全没了。这简直是破坏性的作用,然后我度娘了一下总结了几个方法。

第一种方法:将display用visibility来替代,大家都知道visibility的效果其实跟display在一定程度上相似,那为什么说只是一定程度上相似呢,因为它仍然是占空间的,那你一定会说,这么用跟opacity没啥区别呀。但却可以避免遮挡下面的层比如按钮的点击事件。

第二种方法是相对于第一种方法的进阶,利用了js的setTimout和transitionend事件css代码 将class hidden类中的opacity分离出来

CSS代码:

.box {    background: goldenrod;    width: 300px;    height: 300px;    margin: 30px auto;    transition: all .4s linear;    visibility: visible;}.hidden {    display: none;}.visuallyhidden {    opacity: 0;}
로그인 후 복사

js代码

var box = $('#box');$('button').on('click', function () {    if (box.hasClass('hidden')) {        box.removeClass('hidden');        setTimeout(function () {            box.removeClass('visuallyhidden');        }, 20);    } else {        box.addClass('visuallyhidden');        box.one('transitionend', function(e) {            box.addClass('hidden');        });    }});
로그인 후 복사

第三种方法与第二种方法类似,用requestAnimationFrame来取代setTimeout,相应的修改了if条件里的js。requestAnimationFrame其实也就跟setTimeout/setInterval差不多,通过递归调用同一方法来不断更新画面以达到动起来的效果,但它优于setTimeout/setInterval的地方在于它是由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用,并且如果页面不是激活状态下的话,动画会自动暂停,有效节省了CPU开销。

js代码如下

var box = $('#box');$('button').on('click', function () {    if (box.hasClass('hidden')) {        box.removeClass('hidden');        requestAnimationFrame(function(){            box.removeClass('visuallyhidden');        });    } else {        box.addClass('visuallyhidden');        box.one('transitionend', function(e) {            box.addClass('hidden');        });    }});
로그인 후 복사

以上就是当transition遇上display时碰到的坑。

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿