【问题标题】:How to determine the height of flex-lines? [duplicate]如何确定柔性线的高度? [复制]
【发布时间】:2020-06-17 03:23:32
【问题描述】:

感谢我在此处 (How do I determine the height of a row?) 对我的问题的回答,我现在明白(查看下面的示例),通过在第一个 flex 行中的 flex-item 上设置 60px 的显式高度,它可以降低高度align-content: stretch 必须从 200 像素(容器的高度)到 140 像素“播放”。由于有 2 条 flex-line,它被分成两半,第一个 flex-line 为 70px,第二个 flex-line 为 70px。现在第一个 flex-line 的高度是该行上最高的 flex-item 的高度(60px)加上 70px 得到 130px。第二条flex-line的高度是70px。

实际上,每个 flex-line 的高度略有不同(第一个 flex-line 大约 122px,第二个 78px)我被告知这与文本内容的高度有关。

有人能详细说明吗?

.flex-container {
  display: flex;
  flex-wrap: wrap;
  width: 400px;
  height: 200px;
  border: 1px solid black;
}

.flex-container> :nth-child(1) {
  background-color: darkorchid;
  height: 60px;
}

.flex-container> :nth-child(2) {
  background-color: darkkhaki;
}

.flex-container> :nth-child(3) {
  background-color: dodgerblue;
}

.flex-container> :nth-child(4) {
  background-color: darkgoldenrod;
}

.flex-container> :nth-child(5) {
  background-color: darkcyan;
}
<div class="flex-container">
  <span>I am number 1</span>
  <div>I am number 2</div>
  <div>I am number 3</div>
  <div>I am number 4</div>
  <span>I am number 5</span>
</div>

【问题讨论】:

    标签: html css


    【解决方案1】:

    编辑了与Temani Afif's 相关的整个答案,我什至没有考虑过。


    要确定多行伸缩容器中单条伸缩线的高度,我们只需要找到空闲空间。

    要找到可用空间,我们需要在应用拉伸之前找到每行中最高 flex 项的高度。

    假设我们知道每个 flex 行中所有最高 flex 项目的高度,然后我们遵循公式

    1. 可用空间:容器高度 - 所有最高 flex 项高度的总和
    2. 平均分布的可用空间:可用空间/柔性线数

    然后我们获取Equally Distributed free space 并将最高的 flex 项的高度添加到它的高度,这将给我们该 flex 线的高度。


    示例

    参数:

    • 容器高度为300px
    • 3 条柔性线
    • 第一个 flex 行中最高的 flex 项的高度是 30px
    • 第二个 flex 行中最高的 flex 项的高度是 20px
    • 第三个 flex 行中最高的 flex 项的高度是 70px

    可用空间为180px

    Free Space: Container height - Sum of all tallest flex item's heights
    300px - (30px + 20px + 70px) = 180px
    

    平均分配的可用空间是60px

    Equally Distributed free space: Free space / Number of flex lines
    180px / 3 = 60px
    

    现在我们将平均分布的可用空间添加到每行中最高 flex 项的高度

    • 第一条柔性线的高度是30px + 60px = 90px
    • 第二条柔性线的高度是20px + 60px = 80px
    • 第三条柔性线的高度是70px + 60px = 130px

    [flex]{
        display: flex;
        flex-wrap: wrap;
        height: 300px;
        width: 200px;
        background-color: #0000008f;
    /*     align-items:flex-start; */
    }
    
    [flex] * {
        width: 100px;
    }
    
    [flex] :nth-child(1) {
        background-color: darkorchid;
    }
    
    [flex] :nth-child(2) {
        background-color: darkkhaki;
        height: 30px;
    }
    
    [flex] :nth-child(3) {
        background-color: dodgerblue;
    }
    
    [flex] :nth-child(4) {
        background-color: darkgoldenrod;
        height: 20px;
    }
    
    [flex] :nth-child(5) {
        background-color: darkcyan;
    }
    
    [flex] :nth-child(6) {
        background-color: darkred;
        height: 70px;
    }
    <div flex>
      <div></div>
      <div>height : 30px</div>
      <div></div>
      <div>height : 20px</div>
      <div></div>
      <div>height : 70px</div>
    </div>

    使用 devTool 检查拉伸的 flex 项的高度。


    现在我们知道如何计算弹性线的高度了,我们只需要找到参数。

    容器高度

    这很简单,如果我们没有在容器上设置高度,它将等于内容,因此最高的 flex 项将定义 flex 线的高度,如果容器高度为更短。


    弯曲线数

    这可能很棘手,因为flex-wrap:wrap; 的行数会一直变化


    每条伸缩线中最高伸缩项的高度

    这是最重要的信息,也是最难找到的

    我能想到的方法有两种:

    第一种方法

    应用 align-items:flex-start 并简单地获取所有弹性项目的高度并比较它们,然后重置回 align-items:stretch

    第二种方法

    我们需要在align-items:stretch 之前获取所有弹性项目的高度,这是文本的高度或者是否有设置的高度。

    如果有设定的高度,只需得到那个高度。

    要确定实际文字的高度需要考虑很多因素,

    1. 有多少行文字
    2. 行高
      • 如果line-height:normal; 帐户为font-familyfont-size
      • 如果line-height:1; (无单位值)font-size
      • 如果line-height:30px;(固定值)只占line-height
      • 如果line-height:30%; (相对值) 占父母的font-size
    3. 任何可以增加高度的 CSS 属性,例如嵌套内联元素上的 padding border vertical-align
    4. 可能还有更多,我将在以后的编辑中添加到此列表中。

    【讨论】:

    • 简单而且有效 - 谢谢!展望未来,我将使用这个轻微的变化来改变公式。你怎么看?可用空间 = 容器高度 - 每条柔性线上的最高项目。平均分布空间=可用空间/行数。 Flexline-height = 每个 flex-line 上最高的项目 + 分布式空间。
    • tallest-item on every flex-line 似乎更准确但不适合最后的计算,因为那是内容的高度不是最高的项目(我从来不擅长命名) 注意: 你忘了包括字体大小来查找可用空间,
    • 抱歉,您的公式并非 100% 正确。我们不应该考虑字体大小来找到高度,我们应该只考虑行高。它是关于 line-boxes 的高度,它仅由 line-height 定义,默认情况下 line-height 是 font-size 的乘数(不等于 1,而是大约 1.2)。为 line-height 设置一个显式的像素值,你会看到 font-size 在这里没有任何作用,因为它只定义了内容区域的高度,而不是行框的高度(我们需要在这里考虑)。
    • @TemaniAfif 在我测试时这实际上是准确的,我只使用了font: 20px/1 ahem;,因为我几乎没有改变行高也没有使用像素,我认为这与它没有任何关系任何东西
    • 它是准确的,因为您处于一种特殊情况,其中 (1) 您将 line-height 设置为 1,因此等于 font-size (2) 您只有 1 行文本(所以只有一个 linebox ) (3) 你没有涉及垂直对齐。这是一个垂直对齐会破坏计算的示例:jsfiddle.net/5zcteap6。另请注意,字体系列对此没有影响,并且结果应该与任何字体相同。这是一个相关问题,表明计算涉及的不仅仅是字体大小:stackoverflow.com/a/61835863/8620333
    猜你喜欢
    • 1970-01-01
    • 2017-12-27
    • 2011-12-02
    • 1970-01-01
    • 2013-04-28
    • 2020-10-02
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多