使用Flex实现无序列表4列转2列响应式布局问题求助
你的代码核心问题在于给ul设置了固定计算宽度,这种写法容错性极低,窗口尺寸、内容边距的微小变化都会破坏排布规则,和你将p标签替换为a标签的操作没有直接关联。
修改思路
- 移除ul的固定宽度设置,改用列表项的百分比宽度控制列数,适配性更强
- 统一盒模型规则,避免padding撑宽元素导致宽度计算误差
- 优化图片自适应规则,避免内容溢出容器
- 用gap属性控制列表项间距,简化布局计算逻辑
完整修改后代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Fruit List</title> <style> * { box-sizing: border-box; margin: 0; padding: 0; } body { display: flex; justify-content: center; padding: 20px; } .container { width: 100%; max-width: 960px; } .headline { display: flex; flex-direction: column; justify-content: center; align-items: center; margin-bottom: 24px; text-align: center; } .headline p { margin-top: 8px; } ul.flex-list { list-style: none; display: flex; flex-wrap: wrap; gap: 20px; justify-content: center; } ul.flex-list img { width: 100%; height: auto; aspect-ratio: 1/1; object-fit: cover; display: block; } li.flex-list-item { text-align: center; width: calc(50% - 10px); } a { display: inline-block; width: 100%; margin-top: 8px; text-decoration: none; color: inherit; } @media screen and (min-width: 991px) { li.flex-list-item { width: calc(25% - 15px); } } </style> </head> <body> <div class="container"> <div class="headline"> <h2>Best fruit</h2> <p>Consectetur adipiscing elit, sed do eiusmod tempor incididunt.</p> </div> <ul class="flex-list"> <li class="flex-list-item"> <img src="https://via.placeholder.com/200" alt="" /> <a href="/">Apples</a> </li> <li class="flex-list-item"> <img src="https://via.placeholder.com/200" alt="" /> <a href="/">Oranges</a> </li> <li class="flex-list-item"> <img src="https://via.placeholder.com/200" alt="" /> <a href="/">Strawberries</a> </li> <li class="flex-list-item"> <img src="https://via.placeholder.com/200" alt="" /> <a href="/">Blueberries</a> </li> <li class="flex-list-item"> <img src="https://via.placeholder.com/200" alt="" /> <a href="/">Nectarines</a> </li> <li class="flex-list-item"> <img src="https://via.placeholder.com/200" alt="" /> <a href="/">Bananas</a> </li> <li class="flex-list-item"> <img src="https://via.placeholder.com/200" alt="" /> <a href="/">Rasberries</a> </li> <li class="flex-list-item"> <img src="https://via.placeholder.com/200" alt="" /> <a href="/">Blackberries</a> </li> </ul> </div> </body> </html>
效果说明
修改后991px以上宽度自动展示4列布局,991px及以下宽度自动切换为2列布局,所有元素自适应容器宽度,不会出现排布错位的问题,同时保留了无序列表的结构满足可访问性要求。
内容的提问来源于stack exchange,提问作者Shannon H
相关产品推荐
相关产品推荐

