默认情况下,元素是如何布局的?
首先,取得元素的内容来放在一个独立的元素盒子中,然后在其周边加上内边距、边框和外边距 — 就是我们之前看到的盒子模型。
默认的,一个块级元素的内容宽度是其父元素的 100%,其高度与其内容高度一致。内联元素的 height width 与内容一致。
<h1>Basic document flowh1>
<p>I am a basic block level element. My adjacent block level elements sit on new lines below me.p>
<p>By default we span 100% of the width of our parent element, and we are as tall as our child content. Our total width and height is our content + padding + border width/height.p>
<p>We are separated by our margins. Because of margin collapsing, we are separated by the width of one of our margins, not both.p>
<p>inline elements <span>like this onespan> and <span>this onespan> sit on the same line as one another, and adjacent text nodes, if there is space on the same line. Overflowing inline elements will <span>wrap onto a new line if possible (like this one containing text)span>, or just go on to a new line if not, much like this image will do: <img src="/en-US/docs/Learn/CSS/CSS_layout/Normal_Flow/long.jpg" alt="snippet of cloth" />p>
body {
width: 500px;
margin: 0 auto;
}
p {
background: rgba(255,84,104,0.3);
border: 2px solid rgb(255,84,104);
padding: 10px;
margin: 10px;
}
span {
background: white;
border: 1px solid black;
}
弹性盒子是一种用于按行或按列布局元素的一维布局方法。元素可以膨胀以填充额外的空间,收缩以适应更小的空间。
长久以来,CSS 布局中唯一可靠且跨浏览器兼容的创建工具只有 floats 和 positioning:
首先,我们需要选择将哪些元素将设置为弹性的盒子。我们需要给这些 flexible 元素的父元素 display 设置一个特定值。
flex模型说明:
当元素表现为 flex 框时,它们沿着两个轴来布局:
弹性盒子提供了 flex-direction 这样一个属性,它可以指定主轴的方向(弹性盒子子类放置的地方)——它默认值是 row,浏览器的默认语言方向排成一排(在英语/中文浏览器中是从左到右)。
flex-direction: column;
这会将那些元素设置为列布局。
flex-wrap: wrap
flex-direction 和 flex-wrap——的缩写 flex-flow。比如说,可以将
flex-direction: row;
flex-wrap: wrap;
替换为
flex-flow: row wrap;
article {
flex: 1;
}
这是一个无单位的比例值,表示每个 flex 项沿主轴的可用空间大小。我们设置 元素的 flex 值为 1,这表示每个元素占用空间都是相等的,占用的空间是在设置 padding 和 margin 之后剩余的空间。因为它是一个比例,这意味着将每个 flex 项的设置为 400000 的效果和 1 的时候是完全一样的。
article:nth-of-type(3) {
flex: 2;
}
你还可以指定 flex 的最小值。尝试修改现有的 article 规则:
article {
flex: 1 200px;
}
article:nth-of-type(3) {
flex: 2 200px;
}
这表示“每个 flex 项将首先给出 200px 的可用空间,然后,剩余的可用空间将根据分配的比例共享”。弹性盒子的真正价值可以体现在它的灵活性/响应性。
flex 是一个可以指定最多三个不同值的缩写属性:
可以使用弹性盒子的功能让 flex 项沿主轴或交叉轴对齐。
div {
display: flex;
align-items: center;
justify-content: space-around;
}
align-items 控制 flex 项在交叉轴上的位置。
justify-content 控制 flex 项在主轴上的位置。
弹性盒子也有可以改变 flex 项的布局位置的功能,而不会影响到源顺序(即 dom 树里元素的顺序)。
button:first-child {
order: 1;
}
它实现的一些细节:
也可以给 order 设置负值使它们比值为 0 的元素排得更前面。比如,可以设置“Blush”按钮排在主轴的最前面:
button:last-child {
order: -1;
}
弹性盒子也能创建一些颇为复杂的布局。设置一个元素为 flex 项,那么它同样成为一个 flex 容器,它的孩子(直接子节点)也表现为弹性盒子。
用一个 布局用到的代码。 首先,我们设置 下面给 选择了第一个 最后,我们给按钮设置大小,有意思的是我们给它一个值为 1 的 flex 属性。按钮将尽可能占用最多的空间,尽可能多的堆在同一条线上,但是当它们不再适合在同一条线上,他们中的一些会到下一行去。 元素包含了三个
元素。第三个
元素包含了三个
section - article
article
article - div - button
div button
div button
button
button
的子节点布局为弹性盒子。
section {
display: flex;
}
元素设置 flex 值。特别注意这里的第二条 CSS 规则——我们设置第三个
元素的子节点的布局同样为 flex,但是属性值为列布局。
article {
flex: 1 200px;
}
article:nth-of-type(3) {
flex: 3 200px;
display: flex;
flex-flow: column;
}
元素)为 flex 项。在这里我们将它们放在一个包装行(wrap row)中,使它们居中对齐,就像我们在前面看到的单个按钮示例中做的那样。
article:nth-of-type(3) div:first-child {
flex: 1 100px;
display: flex;
flex-flow: row wrap;
align-items: center;
justify-content: space-around;
}
button {
flex: 1;
margin: 5px;
font-size: 18px;
line-height: 1.5;
}