Bug?由于两个内联文本块之间有一个绝对定位的元素,因此在它们之间应用了CSS Flexbox间隙

ecfdbz9o  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(114)

我遇到了flexbox和gap属性的意外行为。令我惊讶的是,当我通过删除元素并将其添加回DOM来“刷新”时,一切都按预期进行。这让我相信第一次绘制会以某种方式出错,当我“强制重新加载”时,它会自行修复。
问题是一个简单的inline-flex元素,它包含内联单词和前两个单词之间的绝对定位span。gap应用于前两个单词之间,但我不应该这样做,因为它们不是实际的块子元素。没有span差距就不会创建。
下面的GIF最好地展示了奇怪的行为。这里发生了什么,有什么方法可以修复它吗?


的数据
Codepen demo
HTML

<div>
  Left <span class="show-for-sr">sr label&nbsp;</span>Right with SR label
</div>
<br>
<div>
  Left Right without SR label
</div>

字符串
CSS

.show-for-sr {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    padding: 0 !important;
    overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important;
    white-space: nowrap !important;
    border: 0 !important;
}

div {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: 3.5em;
}

m0rkklqb

m0rkklqb1#

差距应用于前两个单词之间,但我不应该这样做,因为它们不是实际的块子元素。
差距**应该被应用,这是正确的行为。position: absolute的使用无关紧要。HTML代码是你需要考虑的。
从规格来看:
Flex容器的每个流入子元素都成为一个Flex项,每个连续的子文本运行序列都 Package 在一个匿名块容器Flex项中。
因此,当具有:

<div>
  Left <span class="show-for-sr">sr label&nbsp;</span>Right with SR label
</div>

字符串
这意味着你有2个“连续的子文本序列”加上span元素。所以总共有3个flex项,如果你使span为position: absolute,那么只剩下2个flex项,你会得到你看到的结果。
flexbox的黄金法则是永远不要让文本容器成为flexbox容器:https://dev.to/afif/never-make-your-text-container-a-flexbox-container-m9p
您应该将内容 Package 在另一个容器中:

<div>
  <span>Left <span class="show-for-sr">sr label&nbsp;</span>Right with SR label</span>
</div>

相关问题