元素宽度的问题
date
Mar 27, 2023
slug
deepcss-box-width
status
Published
tags
深入解析CSS
summary
Element width
type
Post
元素宽度的问题
设置两个盒子的 css 使其在一行显示
.main {
float: left;
width: 70%;
background-color: #fff;
border-radius: .5em;
}
.sidebar {
float: left;
width: 30%;
padding: 1.5em;
background-color: #fff;
border-radius: .5em;
}
两列并没有并排出现,而是折行显示。虽然将两列宽度设置为 70%和 30%,但它们总共占据 的宽度超过了可用空间的 100%,这是因为盒模型的默认行为(如图 3-4 所示)。当给一个元素设 置宽或高的时候,指定的是内容的宽或高,所有内边距、边框、外边距都是追加到该宽度上的。
这种行为会让一个宽 300px、内边距 10px、边框 1px 的元素渲染出来宽 322px(宽度加左右 内边距再加左右边框)。侧边栏的宽度等于 30%宽度加上各 1.5em 的左右内边距,主 容器的宽度只占 70%。两列宽度加起来等于 100%宽度加上 3em。因为放不下,所以两列便折行 显示了。
避免魔术数值
若在本地调试出width值为26%是一个魔术数值,可以使用计算值进行计算
calc(30% - 3em)
调整盒模型
将 box-sizing 设置为 border-box 后,height 和 width 属性会设置内容、内边距以 及边框的大小总和
全局设置border-box
使用通用选择器
(*)
选中页面上所有元素,并用两个选择器选中网页的所有伪元素。height 和 width 会指定元素的实际宽和高*,
::before,
::after{
box-sizing:border-box;
}
当使用第三方组件时,全局设置回选中第三方组件里的元素
所以对全局修改盒模型进行修改
:root{
box-sizing:border-box;
}
*,
::before,
::after{
box-sizing:inherit;
}
并且可以 在必要时选中第三方组件的顶级容器
.third-party-component {
box-sizing: content-box;
}
给列之间加上间隔
基于百分比的外边距留白
给其中一列加上外边距,再调整元素的宽度,将多出来的空间减掉。
.main {
float: left;
width: 70%;
background-color: #fff;
border-radius: .5em;
}
.sidebar {
float: left;
width: 29%;/*从宽度中减去 1%将其添加到外边距留白*/
margin-left: 1%;/*间隔的宽度由外层容器的宽度决定,百分比是相对于父元素的完整宽度*/
padding: 1.5em;
background-color: #fff;
border-radius: .5em;
}
使用 calc()从宽度中减去间距
从宽度中减掉 1.5em 分给外边距,而不是完整宽度的 1%
.main {
float: left;
width: 70%;
background-color: #fff;
border-radius: .5em;
}
.sidebar {
float: left;
width: calc(30% - 1.5em);
margin-left: 1.5em;/*从宽度减去1.5添加到外边距*/
padding: 1.5em;
background-color: #fff;
border-radius: .5em;
}