你同时面临很多事情的组合。
首先,与填充一起使用的百分比会将父元素宽度视为参考(而不是元素本身)
百分比是根据生成框的包含块的宽度计算的,即使对于“padding-top”和“padding-bottom”也是如此ref
在我们的例子中,包含块是父元素。
其次,对内联元素应用填充与对块元素应用填充不同。内联元素的顶部和底部填充不会影响布局,但您会有一种重叠:
内联非替换框的垂直内边距、边框和边距从内容区域的顶部和底部开始,与“行高”无关。但在计算行框高度时只使用“行高”。 ref
第三,在使用 flexbox 时,您必须考虑默认的 nowrap 行为 ref 以及 flex 项目被阻止的事实(即使它们的显示设置为内联)
flex item的显示值被blockified .. ref
现在,如果我们考虑使用 flexbox 的第一种情况。这些项目被阻止并且百分比将父宽度视为参考但是您有一个复杂的循环行为案例,因为父(也是弹性项目)的宽度基于其内容。我知道消化所有这些信息并不容易,所以这里有一个分步说明来理解:
.container {
display: flex;
background-color: lightblue;
justify-content: space-between;
}
.flex {
display: flex;
border:2px solid red;
}
.container a {
color: #000;
background-color: rgba(0, 0, 0, 0.3)
}
.container.two a {
padding: 30%;
}
Before padding
<div class="container">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
After padding
<div class="container two">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
仔细查看我添加的红色边框,以及在这两种情况下它的宽度是如何相同的。诀窍是浏览器将首先忽略填充(因为它是一个百分比值)来计算父宽度,然后将使用该宽度来查找填充的值,并且逻辑上你会溢出。溢出等于您拥有的填充(宽度正好是30%*4)。由于默认的 nowrap 行为,元素不会换行,但您可以禁用此功能:
.container {
display: flex;
background-color: lightblue;
justify-content: space-between;
}
.flex {
display: flex;
border:2px solid red;
flex-wrap:wrap;
}
.container a {
color: #000;
background-color: rgba(0, 0, 0, 0.3)
}
.container.two a {
padding: 30%;
}
Before padding
<div class="container">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
After padding
<div class="container two">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
现在,如果您从父级中删除 display:flex,您将不再拥有弹性项目,现在您处理内联元素并获得以下内容
.container {
display: flex;
background-color: lightblue;
justify-content: space-between;
}
.flex {
border:2px solid red;
}
.container a {
color: #000;
background-color: rgba(0, 0, 0, 0.3)
}
.container.two a {
padding: 30%;
}
Before padding
<div class="container">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
After padding
<div class="container two">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
与以前相同的逻辑,首先定义宽度,然后用作参考,但您不会溢出,因为内联元素将换行到下一行并且您将在行之间重叠,因为 padding-top/bottom 没有' t 适用于内联元素。
添加inline-block 看看区别
.container {
display: flex;
background-color: lightblue;
justify-content: space-between;
}
.flex {
border:2px solid red;
}
.container a {
color: #000;
display:inline-block;
background-color: rgba(0, 0, 0, 0.3)
}
.container.two a {
padding: 30%;
}
Before padding
<div class="container">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
After padding
<div class="container two">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
最后,如果你从导航栏中移除 flexbox,作为 flex 项目的父元素现在是一个块元素,它的宽度不再基于它的内容,但它现在默认是全宽,你有
.container {
background-color: lightblue;
justify-content: space-between;
width:100px;
}
.flex {
border:2px solid red;
}
.container a {
color: #000;
background-color: rgba(0, 0, 0, 0.3)
}
.container.two a {
padding: 30%;
}
Before padding
<div class="container">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
After padding
<div class="container two">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
bigger width
<div class="container two" style="width:300px">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
full width
<div class="container two" style="width:auto">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
所以我们的父元素是全宽的,padding:30% 就是基于那个宽度。想象一下它会有多大,因为每个元素都有 60% 的填充(左 + 右),所以总共有 120%。而且我们的元素是内联元素,所以顶部和底部不会应用,只会重叠
使用inline-block 并禁用overalp,现在顶部和底部是布局的一部分:
.container {
background-color: lightblue;
justify-content: space-between;
width:100px;
}
.flex {
border:2px solid red;
}
.container a {
color: #000;
display:inline-block;
background-color: rgba(0, 0, 0, 0.3)
}
.container.two a {
padding: 30%;
}
Before padding
<div class="container">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
After padding
<div class="container two">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
bigger width
<div class="container two" style="width:300px">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>
full width
<div class="container two" style="width:auto">
<div class="flex">
<a href="#">Item 5</a>
<a href="#">Item 6</a>
</div>
<div class="flex">
<a href="#">Item 7</a>
<a href="#">Item 8</a>
</div>
</div>