很早的时候就听说overflow-y:hidden;
和overflow-x:visible;
混用时有问题。今天果然就遇到了。折腾了一通,还是惹不起躲得起了。
场景:一个可折叠面板,利用class
和css3
来实现toggle
效果,同时面板上还内嵌有tooltip
的效果。(此处可能实现方式有很多种,也算是为了引到“双transition”,故采用了其中一种,请自动忽略其他细节?)
最终效果:
实现好html+css
布局后,首次实现时,是通过添加class
改变container
的高度,这时,意料之中的bug
出现了:
由于container
未设置overflow
所以虽然容器的高度改变了,但是内容并没有隐藏。此时自然而然地去设置了overflow:hidden;
。
设置完之后:
然后,哦?,右边也被hidden
了,那试一试分着写吧,此时就踩坑了
.container {
overflow-y: hidden;
overflow-x: visible;
...
}
设置完之后,What!?没作用?和设置overflow:hidden;
效果一样。于是乎,唤醒了以前的记忆,再加之Google,原来是W3C上定义的特性导致的:
The computed values of ‘overflow-x’ and ‘overflow-y’ are the same as their specified values, except that some combinations with ‘visible’ are not possible: if one is specified as ‘visible’ and the other is ‘scroll’ or ‘auto’, then ‘visible’ is set to ‘auto’. The computed value of ‘overflow’ is equal to the computed value of ‘overflow-x’ if ‘overflow-y’ is the same; otherwise it is the pair of computed values of ‘overflow-x’ and ‘overflow-y’
有一种方法是利用添加wrapper容器,然后利用max-width
来解决。(试了一下,不好用,不知道是不是姿势不对)
于是乎,避坑,采用transition来解决问题。
为了达到展开的效果,通过添加transition: height 0.5s;
来给一个动画执行时间。初始代码
.container {
height: 340px;
transition: all 0.5s;
}
.container.close {
height: 40px;
}
.container .wrapper {
opacity: 1;
transition: all 0.5s;
}
.container.close .wrapper {
opacity: 0;
}
但是此时还是有视觉上的瑕疵,在折叠时,opacity的变化依然能够看出来重叠的影子在下一个container之上。
于是乎,稍微改了一下:
.container .wrapper {
opacity: 1;
transition: opacity 0.3s;
transition-delay: 0.3s;
}
.container.close .wrapper {
opacity: 0;
transition: opacity 0.1s; /* 第二个 transition */
}
平时用css时经常是在其中一个状态的选择器中写一个,这样toggleClass时,就执行同样的动画。这里利用transition-delay
和两个不同时长的transition
来达到视觉上的效果。在文字消失时立即消失,出现时则加入延迟执行。
终于不用踩overflow
的坑了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。