CSS日历布局问题:如何让日期块宽度匹配头部宽度?
如何让日历日期区块宽度匹配头部并实现规整布局?
我正在学习CSS,想要编写一个小型日历,尝试模板后写出了如下代码,但目前无法让days区块的宽度匹配头部,只能靠百分比勉强调整周布局,请问该怎么正确实现?期望的样式是头部与日期区宽度完全一致,日期按7列整齐排列,支持当前日期高亮、过期日期灰化的效果。
现有代码
CSS代码
ul {list-style-type: none;} .header { color: white; width: 320px; height: 40px; background: #1abc9c; text-align: center; } .header ul { margin: 0; padding: 0; } .header ul li { padding-top: 7px; color: white; font-size: 20px; letter-spacing: 3px; } /* Month header */ .month { width: 320px; height: 40px; background: black; text-align: center; } /* Month list */ .month ul { margin: 0; padding: 0; } .month ul li { padding-top: 7px; color: white; font-size: 20px; letter-spacing: 3px; } /* Previous button inside month header */ .month .prev { color: #1abc9c; float: left; padding-top: 5px; } /* Next button */ .month .next { color: #1abc9c; float: right; padding-top: 5px; } /* Days (1-31) */ .days { padding: 10px 10px; background: white; margin: 0; } .days li { margin: px; /* 此处存在语法错误,值为空 */ list-style-type: none; display: inline-block; width: 13.5%; text-align: left; margin-bottom: 5px; font-size: 12px; color: black; font-weight: bold; } /* Highlight the "current" day */ .days li .active { padding: 5px; background: #1abc9c; color: white !important } .days li .left { padding: 5px; color: gray !important }
HTML代码
<head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" href="styles.css"> <title>Sample</title> </head> <div class="header"> <ul> <li>Archive<span style="font-size:18px"></span></li> </ul> </div> <div class="month"> <ul> <li class="prev">❮</li> <li class="next">❯</li> <li>December 2022</li> </ul> </div> <ul class="days"> <li>1</li> <li>2</li> <li>3</li> <li><span class="active">4</span></li> <li><span class="left">5</span></li> <li><span class="left">6</span></li> <li><span class="left">7</span></li> <li><span class="left">8</span></li> <li><span class="left">9</span></li> <li><span class="left">10</span></li> <li><span class="left">11</span></li> <li><span class="left">12</span></li> <li><span class="left">13</span></li> <li><span class="left">14</span></li> <li><span class="left">15</span></li> <li><span class="left">16</span></li> <li><span class="left">17</span></li> <li><span class="left">18</span></li> <li><span class="left">19</span></li> <li><span class="left">20</span></li> <li><span class="left">21</span></li> <li><span class="left">22</span></li> <li><span class="left">23</span></li> <li><span class="left">24</span></li> <li><span class="left">25</span></li> <li><span class="left">26</span></li> <li><span class="left">27</span></li> <li><span class="left">28</span></li> <li><span class="left">29</span></li> <li><span class="left">30</span></li> <li><span class="left">31</span></li> </ul>
解决方案
核心调整思路
- 统一容器宽度:给整个日历加外层容器,固定宽度320px,让内部所有区块继承该宽度,避免重复设置,同时确保days与头部宽度完全匹配。
- Flex布局实现7列均分:将days设为flex容器,开启自动换行,每个日期li设置
flex:1和最小宽度calc(100%/7),实现完美7列均分,无需手动调整百分比。 - 修复样式细节:移除无效语法,调整日期单元格的内边距、文本对齐方式,优化视觉规整度。
修改后的完整代码
CSS代码
/* 外层容器,统一控制宽度 */ .calendar-container { width: 320px; } ul {list-style-type: none;} .header { color: white; height: 40px; background: #1abc9c; text-align: center; } .header ul { margin: 0; padding: 0; } .header ul li { padding-top: 7px; color: white; font-size: 20px; letter-spacing: 3px; } /* Month header */ .month { height: 40px; background: black; text-align: center; } /* Month list */ .month ul { margin: 0; padding: 0; } .month ul li { padding-top: 7px; color: white; font-size: 20px; letter-spacing: 3px; } /* Previous button inside month header */ .month .prev { color: #1abc9c; float: left; padding-top: 5px; } /* Next button */ .month .next { color: #1abc9c; float: right; padding-top: 5px; } /* Days (1-31) */ .days { padding: 10px 0; background: white; margin: 0; display: flex; /* 启用Flex布局 */ flex-wrap: wrap; /* 自动换行 */ gap: 5px 0; /* 行间距 */ } .days li { flex: 1; /* 均分剩余空间 */ min-width: calc(100% / 7); /* 确保每列占1/7宽度 */ text-align: center; /* 文本居中,符合日历视觉习惯 */ font-size: 12px; color: black; font-weight: bold; padding: 5px 0; } /* Highlight the "current" day */ .days li .active { padding: 5px 8px; background: #1abc9c; color: white !important; border-radius: 50%; /* 可选:圆形高亮效果 */ } .days li .left { padding: 5px 8px; color: gray !important; }
HTML代码
<head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" href="styles.css"> <title>Sample</title> </head> <!-- 新增外层容器,统一控制宽度 --> <div class="calendar-container"> <div class="header"> <ul> <li>Archive<span style="font-size:18px"></span></li> </ul> </div> <div class="month"> <ul> <li class="prev">❮</li> <li class="next">❯</li> <li>December 2022</li> </ul> </div> <ul class="days"> <li>1</li> <li>2</li> <li>3</li> <li><span class="active">4</span></li> <li><span class="left">5</span></li> <li><span class="left">6</span></li> <li><span class="left">7</span></li> <li><span class="left">8</span></li> <li><span class="left">9</span></li> <li><span class="left">10</span></li> <li><span class="left">11</span></li> <li><span class="left">12</span></li> <li><span class="left">13</span></li> <li><span class="left">14</span></li> <li><span class="left">15</span></li> <li><span class="left">16</span></li> <li><span class="left">17</span></li> <li><span class="left">18</span></li> <li><span class="left">19</span></li> <li><span class="left">20</span></li> <li><span class="left">21</span></li> <li><span class="left">22</span></li> <li><span class="left">23</span></li> <li><span class="left">24</span></li> <li><span class="left">25</span></li> <li><span class="left">26</span></li> <li><span class="left">27</span></li> <li><span class="left">28</span></li> <li><span class="left">29</span></li> <li><span class="left">30</span></li> <li><span class="left">31</span></li> </ul> </div>
效果说明
- 外层容器
calendar-container固定宽度320px,内部所有区块自动匹配该宽度,彻底解决days与头部宽度不一致的问题。 - Flex布局让日期自动按7列均分,无需手动调整百分比,布局更稳定且适配性更强。
- 调整了日期文本居中、内边距等细节,视觉效果更接近规整的日历样式。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

