CSS焦点处理:0到auto高度过渡的边界解决方案

Feng 2 阅读 AI技术

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

linsk 1998 2026-09-07 79 1 收录于大前端专区

之前介绍过渡中枢代码表面可用,但存在内部内容被截断的界限情形。收起后若仍占体积会导致不必需的滚动条出现,如树形组件水平滚动条未消失的难题。本文提出借助:focus伪类技巧实现仅在用户操作时才播放过渡成效的特殊DOM结构。默认设置过渡时长为零秒让页面加载时不播放初始动画,点击按钮取得焦点后激活平滑过渡。配合展现属性允许离散变化及起始样式规则,可无缝衔接折叠状态并彻底消除残留占位难题。
总结由社区平台通过AI大范式技术产出

各位网友大家好,之前我己为大家讲述了0到auto的过渡,其中枢是 height:calc-size(auto,size)

.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
;
 }
 }
}

Css




配图

在线演示
上面代码表面上能用,不过是有两个界限场景

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

配图

上述问题能够用animation或@starting-style化解。不过是又产生了新的难题————初始动画。

配图

有没有一种技巧,只在使用者运维时才播放过渡效果?
没有通用解法,但是特定dom结构可以实现。
比如上面的树形组件,我们能够用展开按钮的:focus伪类来落地

@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
;
 }
 }
}

Css




配图

在线演示
原理拆解一下:

此时无论样式怎样变化,视觉上都是瞬时做完,1. 默认情况下 P0。
按钮取得 P1,相邻兄弟选择器 P2 命中 P3,过渡时长被替换成 P4,2. 当使用者点击 P0 按钮时。
3. 协作 P0 和 P1,P2 与高度过渡能够无缝衔接,彻底消除折叠后残留的占位问题

Feng
这位作者很神秘,还没有填写简介。