我在使用FlexBox和gap属性时遇到意外行为.令我惊讶的是,当我通过删除元素并将其添加回来来"刷新"DOM时,一切都按预期工作.这让我相信,第一个油漆不知何故出了问题,当我"强制重新加载"时,它会自动修复.

问题在于一个简单的inline-flex元素,它包含内联单词和前两个单词之间的绝对位置跨度.gap应用于前两个单词之间,但我不应该这样做,因为它们不是实际的块子元素.如果没有跨度,则不会创建间隙.

下面的GIF最好地展示了这种奇怪的行为.这是怎么回事,有什么办法可以解决吗?

enter image description here

Codepen demo

超文本标记语言

<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;
}

推荐答案

在前两个单词之间应用了间隙,但我不应该这样,因为它们不是实际的块子元素.

应用间隙should,这是正确的行为.使用position: absolute并不重要.您需要考虑的是HTML代码.

the specification人起:

Flex容器的每个流中的子项都变成了Flex项,并且每个连续的子文本串序列都包装在一个匿名块容器Flex项中.

因此,当您有以下情况时:

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

这意味着你有2个"子文本的连续序列"加上span元素.所以总共有3个Flex项目,如果你让跨度position: absolute,那么只剩下2个Flex项目,你会得到你看到的结果.


Flexbox的黄金法则是永远不要将文本容器变成Flexbox容器:https://dev.to/afif/never-make-your-text-container-a-flexbox-container-m9p

您应该将内容包装在另一个容器中:

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

Html相关问答推荐

HTML CSS如何使用图像作为中心点将元素置于中心

角|将动态html属性添加到子组件

如何打破长URL,包含连字符在HTML与CSS

css网格区域的布局不展开,也不显示滚动条

我需要主页按钮出现在中间

通过动态div的对角线

如何使用HTML和css代码在vb.net上打印POS

Html视频标签:圆角像素化

带有图标和悬停过渡的CSS按钮

如何使VS代码支持以模仿嵌套的方式对已经包含注释的HTML进行注释?

CSS:双面元素未正确显示边框

如何使活动选项卡背景作为父背景图像

如何为高度较小的块制作边框动画?

模拟另一个输入值设置表单输入的数值

将现有内容拆分为三列或部分

HTML画布放大/缩小算法与CSS(图像处理)

我如何使用 CSS nth-child(odd) nth-child(even) 来对齐 CSS 网格中的列?

如何使具有两个元素的 div 行在移动设备中响应

如何使列表的第一个元素比 css 中的其他元素大?

在 Vue 3 中使用 JavaScript 数组显示 FontAwesome 图标