CSS网格布局问题:两列转两行失效求助
问题根源
你当前代码的核心问题是所有网格项都通过grid-column-start/end、grid-row-start/end硬绑定了固定的网格位置,相当于把每个元素钉死在指定的单元格里。即便你调整容器的列数,这些元素也不会自动重新排列,只会在固定位置收缩,自然无法实现换行效果。
解决方案1:媒体查询实现响应式
在特定屏幕宽度下(比如768px),修改容器的列数为1列,同时重置顶部和底部左右模块的网格定位属性,让它们自动占据整行:
* { margin: 0; padding: 0; box-sizing: border-box; } body { height: 100vh; width: 100vw; background-color: #E6E6E3; overflow-x: hidden; } .container { height: 100%; display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: auto; gap: 0px; } .top_left { height: 100px; background-color: white; grid-column: 1 / 2; grid-row: 1 / 2; border: 1px solid red; } .top_mid { background-color: #36454F; grid-column: 1 / 3; grid-row: 2 / 3; } .top_right { height: 100px; background-color: white; grid-column: 2 / 3; grid-row: 1 / 2; border: 1px solid blue; } .main { max-width: 80%; margin: auto; background-color: white; grid-column: 1 / 3; grid-row: 3 / 5; border-left: 1px solid #78BE21; border-right: 1px solid #78BE21; } .bot_left { height: 150px; background-color: #BCD9ED; grid-column: 1 / 2; grid-row: 5 / 6; border-top: 1px solid #191919; border-bottom: 1px solid #191919; } .bot_right { height: 150px; background-color: #7F8778; grid-column: 2 / 3; grid-row: 5 / 6; border-top: 1px solid #191919; border-bottom: 1px solid #191919; } .bot { height: 250px; background-color: deepskyblue; grid-column: 1 / 3; grid-row: 6 / 8; } /* 添加媒体查询,小屏幕下调整布局 */ @media (max-width: 768px) { .container { grid-template-columns: 1fr; /* 改为1列 */ } .top_left, .top_right, .bot_left, .bot_right { grid-column: 1 / -1; /* 占满整列 */ grid-row: auto; /* 取消固定行定位,自动排列 */ } /* 重新调整小屏幕下的行顺序(可选,根据需求调整) */ .top_left { grid-row: 1; } .top_right { grid-row: 2; } .top_mid { grid-row: 3; } .main { grid-row: 4 / 6; } .bot_left { grid-row: 6; } .bot_right { grid-row: 7; } .bot { grid-row: 8 / 10; } }
解决方案2:无媒体查询的自适应网格(推荐)
使用repeat(auto-fit, minmax(300px, 1fr))让网格自动根据屏幕宽度调整列数,同时移除所有元素的固定grid-row定位,仅对需要跨列的元素设置grid-column: 1 / -1(占满整行):
* { margin: 0; padding: 0; box-sizing: border-box; } body { height: 100vh; width: 100vw; background-color: #E6E6E3; overflow-x: hidden; } .container { height: 100%; display: grid; /* 自动适配列数,最小宽度300px,超出自动均分 */ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); grid-template-rows: auto; gap: 0px; } .top_left { height: 100px; background-color: white; border: 1px solid red; } .top_mid { background-color: #36454F; grid-column: 1 / -1; /* 占满整行 */ } .top_right { height: 100px; background-color: white; border: 1px solid blue; } .main { max-width: 80%; margin: auto; background-color: white; grid-column: 1 / -1; /* 占满整行 */ border-left: 1px solid #78BE21; border-right: 1px solid #78BE21; /* 保持原有高度范围,用grid-row: auto / span 2; 代替固定行 */ grid-row: auto / span 2; } .bot_left { height: 150px; background-color: #BCD9ED; border-top: 1px solid #191919; border-bottom: 1px solid #191919; } .bot_right { height: 150px; background-color: #7F8778; border-top: 1px solid #191919; border-bottom: 1px solid #191919; } .bot { height: 250px; background-color: deepskyblue; grid-column: 1 / -1; /* 占满整行 */ grid-row: auto / span 2; }
这种方案不需要媒体查询,网格会自动根据屏幕宽度调整列数:当屏幕宽度大于600px(300px*2)时显示两列,小于600px时自动切换为一列,顶部和底部的左右模块会自动换行。
内容的提问来源于stack exchange,提问作者user20045789
相关产品推荐
相关产品推荐

