妙用:focus解决0到auto高度过渡的边界场景

各位网友大家好,之前我己为大家介绍了0到auto的过渡,其核心是 height:calc-size(auto,size)

css 复制代码
.collapsible{
    overflow-y: hidden;
}
.hide {
    display: none;
}
@media (prefers-reduced-motion: no-preference) {
    @supports (height: calc-size(auto, size)) {
        /* 展开状态 */
        .collapsible {
            height: calc-size(auto, size);
            transition: height .3s;
        }
        /* 折叠状态 */
        .collapsible.hide {
            display: block;
            height: 0;
        }
    }
}

在线演示 https://linsk1998.github.io/ting/components/collapsible.html

上面代码表面上能用,但是有两个边界场景

  • 首先容器含有overflow:hidden,会导致内部内容被截断,如果内部内容还有box-shadow,很容易被截掉。最好是只在过渡时含有overflow:hidden。
  • 还有收起后应当含有disaplay:none,否则收起后仍然占据体积,在一些情况下会出现不必要的滚动条。比如下图的这个树形组件,折叠后由于仍然占据体积,水平滚动条并没有消失。

上述问题可以用animation或@starting-style解决。但是又产生了新的问题------------初始动画。

有没有一种技巧,只在用户操作时才播放过渡效果?

没有通用解法,但是特定dom结构可以实现。

比如上面的树形组件,我们可以用展开按钮的:focus伪类来实现

css 复制代码
@media (prefers-reduced-motion: no-preference) {
    @supports (height: calc-size(auto, size)) {
        .tree li {
            min-width: fit-content;
        }
        .tree .tree-collapsible{
            height: calc-size(auto, size);
            overflow: hidden;
            transition: height 0s, display 0s allow-discrete;
        }
        .collapsed>.tree-collapsible{
            height: 0;
            display: none;
        }
        @starting-style {
            .tree .tree-collapsible{
                height: 0;
            }
        }
        .tree-toggler:focus ~ .tree-collapsible{
            transition-duration: .3s;
        }
    }
}

在线演示 https://linsk1998.github.io/ting/components/tree.html

原理拆解一下:

  1. 默认情况下 transition-duration: 0s,此时无论样式如何变化,视觉上都是瞬时完成,不会播放任何动画------包括页面加载时的初始动画。
  2. 当用户点击 .tree-toggler 按钮时,按钮获得 :focus,相邻兄弟选择器 ~ 命中 .tree-collapsible,过渡时长被替换成 .3s,于是展开/折叠就带上了平滑的过渡。
  3. 配合 display 0s allow-discrete 和 @starting-style,display: none 与高度过渡可以无缝衔接,彻底消除折叠后残留的占位问题。
相关推荐
feixing_fx3 小时前
CSS Grid 入门:二维布局时代的降维打击
前端·css·前端框架·css3
iCxhust3 天前
模型:500kW飞轮 10kV输电线路 油田抽油机 同时考虑无功补偿 统计:全年节电量 结果56万度电
前端·css·css3·电力·飞轮
keyipatience4 天前
TypeScript学习(1)
前端·javascript·学习·typescript·html·css3
王大师王文峰4 天前
HTML 入门到进阶:语义化标签、表单与多媒体一篇打通【语义化布局、表单校验、video/audio、Canvas、无障碍与 SEO】
前端·css·node.js·html·css3·jquery·html5
keyipatience9 天前
CSS学习(2)|元素显示模式、盒模型、Flex 布局
javascript·css·html·css3
溪语流沙11 天前
【Web全栈进阶】Vue3起步:组件、模板语法、响应式数据
前端·javascript·vue.js·css3
百度一下吧11 天前
CSS3 之后新增的特性:从 CSS4 到现代 CSS 的演进
前端·css·css3
tryCbest11 天前
第二篇:CSS3 全部知识点全解 + 项目样式实现
前端·css·css3
溪语流沙14 天前
【每天一个CSS | Day18】会摆动的拟物怀表:黄铜、皮革与催眠摆
前端·css3·html5
传人once14 天前
选择文件按钮样式如何美化
前端·html·css3·jquery·html5