我正在面对我的页面布局的非常奇怪的flexbox行为。我使用FontAwesome来呈现某些符号。
基本上,我在另一个弹性箱项目中有2个弹性箱项目,这些子项目比父项目更宽。
1)我有一个.content__header
对象,它在另一系列flexbox对象中呈现为flexbox对象。
2).content__header
对象包含2个子对象:.breadcrumb
和.page_tools
。这些子对象也会呈现为弹性项目。
3)在.breadcrumb
对象中,我有一些span
个对象(.breadcrumb__test
),其内容被FontAwesome图标取代。替换是使用::after
伪元素的绝对定位完成的。
4)当我删除所有.breadcrumb__text
HTML元素或从样式表中删除.breadcrumb__text::after
定义时 - 定义FontAwesome字体的使用 - 子对象({{1} }和.breadcrumb
)以正确的宽度渲染。所以我猜它与FontAwesome图标的替换有关。
.page_tools
绿线表示父宽度与其实际内容之间的差异。
代码&小提琴下面。
浏览器:谷歌浏览器47.0.2526.106米
https://jsfiddle.net/44gymmw2/6/
当我从.breadcrumb__text::after {
font-family: "FontAwesome";
font-weight: 400;
}
CSS定义中删除text-indent: 100%;
时,.breadcrumb__text
按预期呈现。但是,当我离开.breadcrumb
并删除样式表顶部的text-indent
定义时(如上所述),它也会正确呈现。
这个问题可能与FontAwesome或.breadcrumb__text::after
和flexbox有关吗?
HTML
text-indent
CSS
<body>
<div class="layout_wrapper">
<div class="layout_container__content">
<div class="content">
<header class="content__header">
<div class="breadcrumb">
<span class="breadcrumb__text breadcrumb__text--first">From </span><a class="breadcrumb__link" href="#">Dashboard</a><span class="breadcrumb__text"> to </span><a class="breadcrumb__link" href="#">Find records</a><span class="breadcrumb__text"> to </span>
<h1 class="breadcrumb__current">Kylo Ren’s Command Shuttle™</h1>
</div>
<ul class="page_tools">
<li class="page_tools__item">
<button type="button" class="button button--primary">Save</button>
</li>
<li class="page_tools__item">
<button type="button" class="button">Cancel</button>
</li>
</ul>
</header>
</div>
</div>
<div class="layout_container__sidebar">
<div class="sidebar">
<article class="widget">
<h2 class="widget__title">Widget</h2>
</article>
</div>
</div>
</div>
</body>
答案 0 :(得分:8)
我刚刚审核完您的代码并注意到以下内容:
display: flex;
引起)。flex-flow: row no-wrap;
和align-items: stretch
)。那就是说,让我们继续你的问题。这不明显,所以需要一些介绍。
Pangloss介绍了您问题的一个重要因素,它会影响您使用text-indent
。来自W3:
该框相对于线框的左边(或右边,右边到左边的布局)边缘缩进。用户代理必须将此缩进呈现为空格。
[...]
如果
text-indent
的值为负或超过块的宽度,则上述第一个框可以溢出块。overflow
的值将影响溢出块的文本是否可见。
换句话说:text-indent
会影响您应用它的框的尺寸。
您已在overflow: hidden;
上声明.breadcrumb__text
。显然,为了使该声明具有所需效果,您应用它的框需要width
,否则它将没有剪切边缘。
.breadcrumb__text
应该从应用于它的flex-basis
声明(特别是flex: 0 0 2em;
)获取其宽度。嗯...至少没有发生,而不是像你期望的那样完全。尽管它的宽度似乎是2em
,但由于某种原因它不会触发溢出行为。这似乎是您使用的特定Chrome版本中的一个错误,因为它在Canary中已修复(例如,版本49及更高版本)。
所以:这似乎是Chrome中的flexbox实现的一个问题。也就是说,凭借这些知识,您的问题可以通过多种方式得到解决。一些例子:
text-indent: -100%
使用text-indent: -100%
修复了您的问题,因为它会占用受影响元素右侧的额外空格。 (→jsfiddle)
width: 2em
您可以将声明width: 2em
添加到.breadcrumb__text
。这将解决flex-basis
声明的意外行为。 (→jsfiddle)
overflow: hidden;
在overflow: hidden;
上添加.breadcrumbs
可以解决您的问题。现在,父容器具有剪切边缘并处理由text-indent: 100%
引起的空白。 (→jsfiddle)
Flexbox是一种功能强大的布局模式,非常适合尝试。但是,算法很复杂,浏览器实现还没有解决问题。确保在使用flexbox时考虑到这一点。
查看代码时的另一个问题是您使用flexbox的方式。 Flexbox可供您使用,但它不一定要替换处理布局的其他方式。 display: inline-block;
或display: table;
,甚至float
可能会在不引入嵌套Flex容器的复杂性的情况下完成工作。
答案 1 :(得分:3)
FontAwesome字体不是根本原因。它是您浏览器中默认设置的H1“块”布局定义。将此样式添加到breadcrumb__current类中。见https://jsfiddle.net/44gymmw2/9/
Int32Array
H1标签是一个块级元素,它会使整个页面上的内容被推送。另一个修复方法是将其从块更改为内联,如下所示:
word-wrap:break-word
或者您可以将该文本包装在另一个元素中,例如span。
答案 2 :(得分:1)
我认为这个问题是由text-indent:100%
规则引起的,它在右侧增加了额外的空间。
text-indent
属性指定应该有多少水平空间 留在文本内容第一行开头之前 一个元素。相对于包含块的<percentage>
值 宽度即可。 - MDN
看到这个简单的演示:
body {
width: 200px;
border: 1px solid red;
}
span {
text-indent: 100%;
display: inline-block;
}
&#13;
<span>text</span>
&#13;
在您的示例中,您只需将text-indent:100%
更改为text-indent:-9999px
,它的工作方式类似,但不会创建溢出。
<强> Updated jsfiddle 强>
答案 3 :(得分:1)
尝试使用内联块属性,它运行良好。
.content {
display:inline-block;
flex-flow: row wrap;
justify-content: space-between;
align-items: stretch;
}