修复 FSE Group 块 layout 属性覆盖自定义 CSS 的问题
· 阅读需 3 分钟
TL;DR
WordPress FSE Group 块的 layout 属性会自动生成 is-layout-* CSS 类,这些类的样式优先级高于普通自定义 CSS,导致尺寸设置失效。解决方案:1) 块注释中使用 "layout":{"type":"default"} 避免生成额外布局类;2) CSS 中使用 !important 强制覆盖;3) 关键:添加 padding: 0 !important 清除 Group 块默认内边距。
问题现象
Timeline 组件的年份圆点应显示为 80px 正圆,实际却呈现为椭圆:
<!-- 块注释中的尺寸设置 -->
<!-- wp:group {"style":{"dimensions":{"width":"80px","height":"80px"}},"layout":{"type":"flex",...}} -->
/* 自定义 CSS */
.cclee-timeline-dot {
width: 80px;
height: 80px;
border-radius: 50%;
}
无论调整 CSS 还是块属性,圆点始终被拉伸变形。
根因
WordPress FSE 的 Group 块会根据 layout 属性自动添加布局相关的 CSS 类:
<div class="wp-block-group cclee-timeline-dot is-layout-flow">
这些 is-layout-* 类来自 WordPress 核心样式表,其样式规则会覆盖自定义 CSS。同时,Group 块存在默认 padding,会撑大元素导致尺寸计算偏差。
关键问题点:
layout: {"type": "flex"}生成is-layout-flex类,子元素受 flexbox 拉伸影响- 块注释中的
style.dimensions转为 inline style,但被布局类样式覆盖 - Group 块默认 padding 增加了元素实际尺寸
解决方案
1. 修改块注释,使用 default layout
<!-- wp:group {"className":"cclee-timeline-dot","style":{"border":{"radius":"50%"}},"backgroundColor":"accent","textColor":"base","layout":{"type":"default"}} -->
<div class="wp-block-group cclee-timeline-dot has-base-color has-accent-background-color has-text-color has-background" style="border-radius:50%">
移除 style.dimensions 和复杂的 flex layout,改用 "layout":{"type":"default"}。
2. CSS 强制覆盖 + 清除默认 padding
/* Timeline: Fixed circle dot */
.wp-block-group.cclee-timeline-dot {
width: 80px !important;
height: 80px !important;
min-width: 80px !important;
min-height: 80px !important;
flex-shrink: 0 !important;
aspect-ratio: unset !important;
border-radius: 50% !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
align-self: center !important;
box-sizing: border-box !important;
text-align: center !important;
padding: 0 !important; /* 关键:清除默认 padding */
}
.wp-block-group.cclee-timeline-dot p {
margin: 0 !important;
white-space: nowrap !important;
line-height: 1 !important;
overflow: visible !important;
}
3. 使用 :has() 控制父容器
防止父级 Column 被 flexbox 拉伸:
.wp-block-columns .wp-block-column:has(.cclee-timeline-dot) {
flex-shrink: 0 !important;
flex-basis: 100px !important;
width: 100px !important;
}