html – 使用FontAwesome时,Flexbox大小调整不正确

我正在面对我的页面布局的flexbox非常奇怪的行为。我正在使用FontAwesome渲染某些符号。

基本上,我在另一个flexbox项目中有2个flexbox项目,这些子项目比父项目更宽。

1)我有一个.content__header对象,它被渲染为另一系列flexbox对象中的一个flexbox对象。

2).content__header对象包含2个子对象:.breadcrumb和.page_tools。这些子对象也被渲染为flex项。

3)在.breadcrumb对象中,我有一些span对象(.breadcrumb__test)的内容被一个FontAwesome图标替换。使用:: after伪元素的绝对定位完成替换。

4)当我删除所有.breadcrumb__text HTML元素,或者从我的样式表中删除.breadcrumb__text :: after定义后,它定义了FontAwesome字体的使用 – 子对象(.breadcrumb和.page_tools)以正确的宽度呈现。所以我想这与FontAwesome图标的替换有关。

.breadcrumb__text::after {
  font-family: "FontAwesome";
  font-weight: 400;
}

视觉表示的问题

绿线表示父宽度与实际内容之间的差异。

代码&小提琴下面。

浏览器:Google Chrome 47.0.2526.106 m

小提琴:

https://jsfiddle.net/44gymmw2/6/

更新

当我删除文本缩进:100%;从.breadcrumb__text CSS定义,.breadcrumb按照预期呈现。但是,当我离开文本缩进位置,并在样式表顶部的定义后删除.breadcrumb__text ::(如上所述),它也正确呈现。

可能这个问题与FontAwesome还是文本缩进和flexbox有关?

HTML

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

CSS

/* Removing this makes it work */
.breadcrumb__text::after {
  font-family: "FontAwesome";
  font-weight: 400;
}

/* Don't remove anything below */
.breadcrumb__text--first {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0,0);
  border: 0;
}

* {
    box-sizing: inherit;
}

html {
    box-sizing: border-box;
}

html,body {
    padding: 0;
    margin: 0;
}

body {
  display: flex;
  flex-flow: column nowrap;
  align-items: stretch;
}

.layout_wrapper {
  flex: 1 1 auto;
  display: flex;
  flex-flow: row nowrap;
  align-items: stretch;
}

.layout_container__content {
  flex: 0 0 75vw;
}

.layout_container__sidebar {
  flex: 0 0 25vw;
}

.content {
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
  align-items: stretch;
}

.content__header {
  outline: 1px solid blue;
  background-color: #434649;
  color: #ffffff;
  flex: 0 0 100%;
  display: flex;
  flex-flow: row nowrap;
}

.breadcrumb {
  outline: 3px dashed purple;
  flex: 1 1 auto;
  display: flex;
  flex-flow: row wrap;
  justify-content: flex-start;
}

.breadcrumb__text {
  flex: 0 0 2em;
  overflow: hidden;
  text-indent: 100%;
  white-space: nowrap;
  position: relative;
  text-align: center;
}

.breadcrumb__text::after {
  content: '\f105';
  padding: 0;
  text-indent: 0;
  position: absolute;
  top: 0;
  right: 0;
  width: 100%;
}

.breadcrumb__text--first {
  flex: 0 0 0;
}

.breadcrumb__text--first::after {
  content: none;
}

.breadcrumb__link {
  flex: 0 0 auto;
  display: inline-block;
  font-size: 0.8571rem;
}

.breadcrumb__current {
  flex: 0 0 100%;
  margin: 0;
}

.page_tools {
  outline: 3px dashed red;
  flex: 0 0 auto;
  display: flex;
  flex-flow: row nowrap;
  list-style: none outside none;
}

解决方法

我刚刚完成了对你的代码的审查,并注意到以下几点:

>有不必要的(嵌套的)Flex容器(由使用display:flex引起)。
>有不必要的flex相关声明(仅声明默认行为,如flex-flow:row no-wrap;和align-items:stretch)。
>在各种不相关的选择器的上下文中有几个不必要的声明。测试/调试时可能会遗留下来的声明。

也就是说,让我们继续你的问题。这不是很明显,所以需要一些介绍。

Pangloss引入了您的问题的一个重要组成部分,影响使用文本缩进。从W3

The box is indented with respect to the left (or right,for right-to-left layout) edge of the line box. User agents must render this indentation as blank space.

[…]

If the value of text-indent is either negative or exceeds the width of the block,that first box,described above,can overflow the block. The value of overflow will affect whether such text that overflows the block is visible.

换句话说:文本缩进影响您应用它的框的尺寸。

你已经声明了overflow:hidden;在.breadcrumb__text上。显然,为了使声明具有预期的效果,你应用它的框需要一个宽度,否则它不会有一个剪辑边。

.breadcrumb__text应该从应用于它的flex-based声明(特别是flex:0 0 2em;)获取它的宽度。嗯,这没有发生,至少,不完全是你所期望的。即使它的宽度似乎是2em,由于某种原因,它不会触发溢出行为,因为它应该。这似乎是您使用的特定Chrome版本的错误,因为它在加那利(例如版本49及更高版本)固定。

所以:这似乎是Chrome中Flexbox实现的一个问题。也就是说,有了这个知识,你的问题可以通过多种方式来解决。一些例子:

文本缩进:-100%

使用text-indent:-100%可以解决您的问题,因为它会占用受影响元素右侧的额外空格。 (→jsfiddle)

宽度:2em

您可以将声明宽度:2em添加到.breadcrumb__text。这将修复flex-based声明的意外行为。 (→jsfiddle)

溢出:隐藏;在父容器上

添加overflow:hidden;在.breadcrumbs修复你的问题。现在,父容器有一个裁剪边,并处理由使用text-indent:100%引起的空格。 (→jsfiddle)

最后言论

Flexbox是一个强大的布局模式,它确实是伟大的实验。但是,这些算法是复杂的,浏览器的实现还没有解决问题。确保在使用flexbox时考虑到这一点。

查看代码时的另一个问题是使用flexbox的方式。 Flexbox可供您使用,但不一定需要替换处理布局的其他方式。显示:inline-block;或显示:表;甚至浮动可以做这个工作,而不会引入嵌套的flex容器的复杂性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


HTML代码中要想改变字体颜色,常常需要使用CSS样式表。CSS是一门用来描述网页上样式的语言,通过编写CSS代码可以实现网页中各元素的大小、颜色、字体等各种样式的控制。那么如何在HTML代码中应用CSS样式来改变字体颜色呢?这里为大家介绍一下。 首先,在HTML代码...
HTML代码如何让字体盖住图片呢?需要使用CSS的position属性及z-index属性。 img { position: relative; z-index: -1; } p { position: absolute; to...
HTML代码字体设置 在HTML中,我们可以使用标签来设置网页中的文字字体。常用的字体标签是font和style,下面我们来学习如何使用这些标签。 1. font标签 使用font标签可以改变文字的字体、颜色和大小。它有三个属性font-family、color和...
在网页设计中,HTML代码的字体和字号选择是非常重要的一个环节,因为它们直接关系到页面的可读性和视觉效果。 要指定文本的字体和字号,可以使用HTML中的样式属性。使用样式属性设置字体和字号,如下所示: <p style="font-family: Aria...
HTML(Hypertext Markup Language,超文本标记语言)是一种用于创建网页的标准语言。它由许多标签(一对尖括号包围的关键字)组成,这些标签告诉浏览器如何显示内容。使用HTML代码,我们可以轻松地创建各种类型的图像和图形,如太极图。 在HTM...
外链是指在一个网页中添加一个指向其他网站的链接,用户可以通过这个链接直接跳转到其他网站。在HTML中,实现外链的方法很简单,只需要使用标签就可以了。 <a href="http://www.example.com">这是一个外链,点击跳转到www.ex...
HTML代码是实现网页界面的基础,而网页中的各种表单则是用户和网站进行交互的重要方式之一。下面我们来介绍如何使用HTML代码实现一个简单的报名表格。 <form action="submit.php" method="post"> &lt...
HTML是一种标记语言,用于开发网站和其他互联网内容。字体是网站设计中的关键元素之一,它可以决定网站的整体风格和呈现效果。HTML提供了字体编辑器,使网站设计变得更加容易。 <font face="Arial"> 这里是Arial字体 &...
HTML代码中,字体样式是开发者们必备的一部分。在HTML中,我们可以通过特定的标签和属性设置字体的样式、颜色和大小,以达到更好的排版效果。 <p style="font-size: 14px; color: #333; font-family:...
HTML中的字体可以设为粗体,以强调文本信息。我们可以通过使用一些标签来实现这一功能。其中,常用的标签包括: 1. 标签:该标签会把文本加粗显示,语法如下: 这是一段加粗的文本 2. 标签:与标签作用相同,但语义更强,表示该文本内容的重要性。语法如下:...
HTML代码可以实现文件的上传和下载,在网页开发中相当常见。通过使用<input>标签和<form>标签,我们可以轻松创建一个文件上传表单。 <form action="upload.php" method="post" enct...
HTML代码非常常见于网页设计中。在一些需要处理时间相关数据的场景下,可能需要将时间戳转换为实际时间,这时候就需要使用一些特定的HTML代码。 function timeStamp2Time(time){ var date = new Date(time...
HTML是一种用于创建网页的标记语言。在HTML中,我们可以使用超链接标签实现下载文件到本地的功能。 具体实现步骤如下: <a href="文件的URL" download="文件名">下载文件</a> 其中,href属性是文件...
在HTML代码中,对于字体靠左对齐有各种方法。其中最简单的方式之一是使用pre标签。 使用pre标签可以保留一段文本中的空格和换行符,从而使代码排版更加整齐。下面是一个例子: <p>这是一个段落。</p> &lt...
HTML代码字典是一本解释HTML标记和属性的参考文献。这本字典中包含了最常用的HTML代码以及它们的属性和值的详细描述。 例如,以下是HTML代码字典中的一部分内容: <a href="url">link text</a> 在...
在网页开发过程中,遇到一些需要用户复制的内容,我们通常都会提供复制按钮,让用户更方便地复制所需内容。下面我们来介绍如何使用html代码实现一键复制的功能。 var copyBtn = document.querySelector('#copy-bt...
用户登录 欢迎来到公司登录界面,请输入用户名和密码登录 用户名: 密码: 代码解释: 第1行:定义了一个 HTML 文档 第2行:开始了 HTML 头部 第3行:定义了...
HTML 代码是用来创建网页的语言,它包含了许多不同的元素和属性,让我们可以在网页中添加各种不同的元素和内容,如文字、图片、链接等等。在编写 HTML 代码时,我们可以使用各种不同的样式来美化我们的网页,例如更改字体、颜色、大小等等。 font-family:...
HTML代码中的字体转移 在编写HTML代码时,我们经常会使用各种字体来增强页面的可读性和视觉效果。但是,有些字符或特殊符号可能会在HTML中具有不同的含义,这就需要使用字体转义转换成HTML可以正常显示的字符。 在HTML中,使用"&"符号表示一个特殊字符将要被转...
HTML 编程语言中,你可以使用字体属性来更改文本的字体大小、颜色和样式。其中,字体颜色是最常用的样式更改。在 HTML 中,你可以使用 "color" 属性来更改文本的颜色。下面是一个使用 "pre" 标签的代码示例,演示如何使用 "color" 属性来更改字体颜色...