html - 了解对齐元素 : baseline

标签 html css flexbox

align-items: baseline 下,每行中基线最高的元素将“向下移动”以满足最低基线。

为什么当我只制作 item2 align-self: baseline; 时没有明显的变化?我可以看到 spec但我实际上很难理解它。

html {
    font-family: "Ranchers";
    font-size: 16px;
}

#flex-container {
    display: flex;
    width: 300px;
    height: 400px;
    border: 10px solid black;
    flex-direction: row;
    flex-wrap: wrap;
    align-content: flex-start;
    align-items: flex-start;  
}

#flex-container > div:nth-child(1) {
    padding: 10px;
    border: solid black 5px;
    margin: 8px;
    flex-basis: auto;
    width: 150px;
    height: 100px;
}

#flex-container > div:nth-child(2) {
    padding: 3px;
    border: solid black 10px;
    border-top: solid black 20px;
    margin: 4px;
    align-self: baseline;
}

#flex-container > div:nth-child(3) {
    padding: 10px;
    border: solid black 10px;
    flex-basis: auto;
    width: 150px;
}
<head>
   <link href="https://fonts.googleapis.com/css2?family=Ranchers&display=swap" rel="stylesheet">
</head>
  
 <div id="flex-container">
    <div style="background-color: blue;">I am div 1.</div>
    <div style="background-color: red;">I am div 2</div>
    <div style="background-color: green;">I am div 3</div>   
 </div>

最佳答案

It makes sense that under align-items: baseline, the items on each row whose baselines appear the highest will 'shift down' to meet the lowest baseline.

使用 align-items: baseline 会给你一个直观的结果,因为它会将基线对齐应用于所有元素(我坚持所有)。所以它的结果将与将 align-self:baseline 应用于所有元素相同

html {
  font-family: "Ranchers";
  font-size: 16px;
}

#flex-container {
  display: flex;
  width: 300px;
  height: 400px;
  border: 10px solid black;
  flex-direction: row;
  flex-wrap: wrap;
  align-content: flex-start;
}

#flex-container>div:nth-child(1) {
  padding: 10px 0;
  border: solid black 5px;
  margin: 8px;
  flex-basis: auto;
  width: 150px;
  height: 100px;
  align-self: baseline; /* here */
}

#flex-container>div:nth-child(2) {
  padding: 3px;
  border: solid black 10px;
  border-top: solid black 40px;
  margin: 4px;
  align-self: baseline; /* here */
}

#flex-container>div:nth-child(3) {
  padding: 10px;
  border: solid black 10px;
  flex-basis: auto;
  width: 150px;
}
<head>
  <link href="https://fonts.googleapis.com/css2?family=Ranchers&display=swap" rel="stylesheet">
</head>

<div id="flex-container">
  <div style="background-color: blue;">I am div 1.</div>
  <div style="background-color: red;">I am div 2</div>
  <div style="background-color: green;">I am div 3</div>
</div>

现在,仅将基线应用于一个元素是另一回事,因为另一个元素将具有其默认对齐方式或由 align-items(即 flex-start在你的情况下)。所以我们开始按照这个规则放置第一个元素:

flex-start

The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line. ref

然后我们放置第二个:

baseline

The flex item participates in baseline alignment: all participating flex items on the line are aligned such that their baselines align, and the item with the largest distance between its baseline and its cross-start margin edge is placed flush against the cross-start edge of the line.

因此,按照这两个规则,两个元素都被放置与线的交叉起点边缘齐平

html {
  font-family: "Ranchers";
  font-size: 16px;
}

#flex-container {
  display: flex;
  width: 300px;
  height: 400px;
  border: 10px solid black;
  flex-direction: row;
  flex-wrap: wrap;
  align-content: flex-start;
  align-items:flex-start;
}

#flex-container>div:nth-child(1) {
  padding: 10px 0;
  border: solid black 5px;
  margin: 8px;
  flex-basis: auto;
  width: 150px;
  height: 100px;
}

#flex-container>div:nth-child(2) {
  padding: 3px;
  border: solid black 10px;
  border-top: solid black 40px;
  margin: 4px;
  align-self: baseline; /* here */
}

#flex-container>div:nth-child(3) {
  padding: 10px;
  border: solid black 10px;
  flex-basis: auto;
  width: 150px;
}
<head>
  <link href="https://fonts.googleapis.com/css2?family=Ranchers&display=swap" rel="stylesheet">
</head>

<div id="flex-container">
  <div style="background-color: blue;">I am div 1.</div>
  <div style="background-color: red;">I am div 2</div>
  <div style="background-color: green;">I am div 3</div>
</div>

换句话说,将基线对齐应用于一个元素是无用的,因为它是唯一一个将参与基线对齐的元素,并且在逻辑上它将是具有 它的基线和它的 cross-start 边距边缘之间的最大距离,它将被放置在顶部。

如果您至少有两个元素具有基线对齐,您将看到不同之处:

html {
  font-family: "Ranchers";
  font-size: 16px;
}

#flex-container {
  display: flex;
  width: 300px;
  border: 10px solid black;
  flex-direction: row;
  flex-wrap: wrap;
  align-content: flex-start;
  align-items:flex-start;
}

#flex-container>div:nth-child(1) {
  padding: 10px 0;
  border: solid black 5px;
  margin: 4px;
  flex-basis: auto;
  height: 100px;
}

#flex-container>div:nth-child(2) {
  padding: 3px;
  border: solid black 10px;
  border-top: solid black 40px;
  margin: 4px;
  align-self: baseline; /* here */
}

#flex-container>div:nth-child(3) {
  padding: 10px;
  border: solid black 10px;
  align-self: baseline; /* here */
}
<head>
  <link href="https://fonts.googleapis.com/css2?family=Ranchers&display=swap" rel="stylesheet">
</head>

<div id="flex-container">
  <div style="background-color: blue;">I am div 1.</div>
  <div style="background-color: red;">I am div 2</div>
  <div style="background-color: green;">I am div 3</div>
</div>

<div id="flex-container">
  <div style="background-color: blue;">I am div 1.</div>
  <div style="background-color: red;border-top:0">I am div 2</div>
  <div style="background-color: green;padding-top:50px;">I am div 3</div>
</div>

请注意在这两种情况下,蓝色 div 将始终位于顶部并且永远不会参与基线对齐,并且只考虑其他两个。

关于html - 了解对齐元素 : baseline,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64112081/

相关文章:

javascript - 如何将html5 Canvas 保存到服务器

c# - 如何在 ASP 下拉列表列表项中使用彩色圆圈? (没有 jQuery)

javascript - iphone 浏览器上的以下代码有什么问题?

css - Flexbox 均匀大小的元素而不考虑内容

html - Flexbox - 行和列并排

html - 使用 flexbox 将文本添加到图像

html - body 元素是 block 级元素还是行内元素?

html - Symfony Assetic 错误的资源类型

html - 在 bootstrap 中划分列的最佳方法

javascript - 改变背景颜色