如何按(100/12)*n规则实现CSS Grid布局?求优化方案
问题描述
需要实现一个CSS Grid布局,列宽严格遵循公式(100/12)*n计算(其中100为网格容器宽度,12为最大列数,n为对应行的列数)。目前自己写的代码存在问题,实际效果不符合预期,希望得到正确且更优的实现方案。
自己的HTML代码:
<div class="grid-container"> <div class="row-1 row"> <div class="column-12">12 kollonas</div> </div> <div class="row-2 row"> <div class="column-6">6 kollonas</div> <div class="column-6">6 kollonas</div> </div> <div class="row-3 row"> <div class="column-4">4 kollonas</div> <div class="column-4">4 kollonas</div> <div class="column-4">4 kollonas</div> </div> <div class="row-4 row"> <div class="column-3">3 kollonas</div> <div class="column-3">3 kollonas</div> <div class="column-3">3 kollonas</div> <div class="column-3">3 kollonas</div> </div> <div class="row-5 row"> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> </div> <div class="row-6 row"> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> </div> </div>
自己的CSS代码:
[class*='column-']{ width: 100%; float: left; min-height: 1px; padding: 15px 0; box-sizing: border-box; } body{ background-color: rgb(255, 219, 245); font-family: Arial, Helvetica, sans-serif; } .grid-container{ display: grid; grid-gap: 4px; text-align: center; width: 90%; margin: auto; row-gap: 20px; } .column-12{ grid-column-start: 1; grid-column-end: 12; } .row{ display: grid; grid-column-start: 1; grid-column-end: 12; grid-gap: 20px; } .row div{ background-color: white; height: 50px; border-radius: 5px; box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.205); color: rgb(158, 58, 167) } .row-2{ grid-template-columns: repeat(2, 1fr); } .row-3{ grid-template-columns: repeat(3, 1fr); } .row-4{ grid-template-columns: repeat(4, 1fr); } .row-5{ grid-template-columns: repeat(6, 1fr); } .row-6{ grid-template-columns: repeat(12, 1fr); }
问题分析
原代码存在以下问题:
- 混合使用
float和CSS Grid布局,float会干扰Grid的正常排列逻辑; - 网格容器
grid-container未定义12列基础网格结构,导致column-12的grid-column-end:12设置无效; - 冗余的
row类设置grid-column-start/end,且每个row-n单独定义列模板,不符合12列网格的统一逻辑,也未落实(100/12)*n的列宽公式; [class*='column-']中的width:100%会覆盖Grid的列宽计算,导致布局混乱。
正确实现方案
优化后的HTML代码(无冗余row结构)
<div class="grid-container"> <div class="column-12">12 kollonas</div> <div class="column-6">6 kollonas</div> <div class="column-6">6 kollonas</div> <div class="column-4">4 kollonas</div> <div class="column-4">4 kollonas</div> <div class="column-4">4 kollonas</div> <div class="column-3">3 kollonas</div> <div class="column-3">3 kollonas</div> <div class="column-3">3 kollonas</div> <div class="column-3">3 kollonas</div> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> </div>
对应CSS代码
* { margin: 0; padding: 0; box-sizing: border-box; } body { background-color: rgb(255, 219, 245); font-family: Arial, Helvetica, sans-serif; } .grid-container { display: grid; /* 定义12列基础网格,每列宽度为100%/12,匹配公式基础 */ grid-template-columns: repeat(12, 1fr); /* 列间距20px,行间距20px */ gap: 20px; text-align: center; width: 90%; margin: 0 auto; padding: 20px 0; } /* 统一列元素样式 */ .grid-container > div { background-color: white; height: 50px; border-radius: 5px; box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.205); color: rgb(158, 58, 167); padding: 15px 0; } /* 按列数定义占比,严格遵循(100/12)*n公式 */ .column-1 { grid-column: span 1; } .column-2 { grid-column: span 2; } .column-3 { grid-column: span 3; } .column-4 { grid-column: span 4; } .column-6 { grid-column: span 6; } .column-12 { grid-column: span 12; }
方案说明
- 移除冗余的
row结构,直接将列元素作为网格容器的子项,结构更简洁; - 网格容器通过
repeat(12,1fr)定义12列基础布局,每列宽度为100%/12,column-n通过grid-column: span n占据n列,宽度正好是n*(100%/12),完美符合要求的公式; - 统一重置盒模型,去掉干扰布局的
float属性,确保Grid布局正常工作; - 用
gap统一设置间距,替代原代码中混乱的间距设置; - 列样式统一设置,避免重复代码,维护性更强。
保留原row结构的实现方案
如果需要保留原有的行分组结构,可以使用以下代码:
HTML代码
<div class="grid-container"> <div class="row"> <div class="column-12">12 kollonas</div> </div> <div class="row"> <div class="column-6">6 kollonas</div> <div class="column-6">6 kollonas</div> </div> <div class="row"> <div class="column-4">4 kollonas</div> <div class="column-4">4 kollonas</div> <div class="column-4">4 kollonas</div> </div> <div class="row"> <div class="column-3">3 kollonas</div> <div class="column-3">3 kollonas</div> <div class="column-3">3 kollonas</div> <div class="column-3">3 kollonas</div> </div> <div class="row"> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> <div class="column-2">2 kollonas</div> </div> <div class="row"> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> <div class="column-1">1</div> </div> </div>
CSS代码
* { margin: 0; padding: 0; box-sizing: border-box; } body { background-color: rgb(255, 219, 245); font-family: Arial, Helvetica, sans-serif; } .grid-container { display: grid; grid-template-columns: repeat(12, 1fr); row-gap: 20px; text-align: center; width: 90%; margin: 0 auto; padding: 20px 0; } .row { grid-column: span 12; display: grid; grid-template-columns: repeat(12, 1fr); gap: 20px; } .row > div { background-color: white; height: 50px; border-radius: 5px; box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.205); color: rgb(158, 58, 167); padding: 15px 0; } .column-1 { grid-column: span 1; } .column-2 { grid-column: span 2; } .column-3 { grid-column: span 3; } .column-4 { grid-column: span 4; } .column-6 { grid-column: span 6; } .column-12 { grid-column: span 12; }
这个版本保留了原有的行结构,同时依然遵循12列网格和列宽公式,适合需要按行分组的场景。
内容的提问来源于stack exchange,提问作者user21702443
相关产品推荐
相关产品推荐

