如何将带有不均匀图标的文本居中对齐?

Posted

技术标签:

【中文标题】如何将带有不均匀图标的文本居中对齐?【英文标题】:How can I center-align text with uneven icons either side? 【发布时间】:2016-04-24 06:11:30 【问题描述】:

我正在尝试使该图像中的文本居中对齐,最好使用尽可能少的 CSS/html。如您所见,左侧的图标将其推离中心:

这是此顶部的相关 HTML 和 CSS:

<div class="navbarheader">
    <div class="header-left">
        <button type="button" class="pull-left btn-nav-menu">
            <i class="navbar-text fa fa-fw fa-navicon"></i>
        </button>
        <button type="button" class="pull-left" ng-click="ui.showSearch()">
            <i class="navbar-text fa fa-fw fa-search"></i>
        </button>
    </div>
    <div class="header-title">
        <div class="navbar-brand">ui.headerTitle</div>
    </div>
    <div class="header-right">
        <button class="btn-watchlist pull-right" ng-click="ui.toggleWatchlists()">
            <i class="navbar-text fa fa-fw fa-binoculars"></i>
        </button>
    </div>
</div>

CSS:

.navbarheader 
  display: flex;
  flex-direction: row;
  justify-content: space-around;

.navbarheader .header-left 
  margin-left: -0.5rem;

.navbarheader .header-title 
  flex-grow: 2;
  text-align: center;

.navbarheader .header-right 
  margin-right: -0.5rem;

任何想法如何保持文本中心对齐,但在必要时允许它占据所有空白空间?

值得一提的是,这是在 Bootstrap 4.0 alpha 代码库中。

【问题讨论】:

有点hacky,但你不能把同样的图标放在右边,这样可以平衡,但不会被看到? 不确定要居中的文本是什么? 有什么方法可以发布足够的代码来重现问题或工作演示? 将左右图标容器设为flex-basisflex-growflex-shrink,将white-space:nowrap 添加到标题中即可。 感谢 cmets 伙计们 - 下面有很多很好的答案目前有效,因此不再对问题进行更新。 【参考方案1】:

您需要确保.header-right.header-left.header-title 施加相同的“弹性”压力。他们的flex-growflex-shrinkflex-basis 需要相等。默认情况下,它们具有flex:0 1 auto;,因此您无需担心flex-grow[0] 和flex-shrink[1]。

但是,您需要将auto 更改为实际值(浏览器可在px 中翻译的任何内容:%pxemrem、...),更大比50% (如果您在.header-left.header-right 上设置flex-grow:1;,则可以低于50% - 请记住使它们相等)。

您的标题,即使会产生 flex-basis0,也会从左右宽度相等地增长。当然,您需要通过添加white-space:nowrap 来确保它始终保持在第一行(如果它真的很长并且您认为它应该在一些非常窄的屏幕上换行,请将white-space 规则放在@media 查询中;另外,当你允许它换行时,记得给你的.header-title 足够的flex-basis,这样它就不会换行太多 - 如果你的总flex-basis 大于100%,请不要担心,所有浏览器如果父级的flex-wrap 设置为nowrap,将按比例缩小所有元素。

如果你更喜欢 CSS 而不是英文,这里是代码:

.navbarheader 
  display: flex;
  align-items: center;
  white-space: nowrap;
  flex-wrap: nowrap;

.header-right,
.header-left 
  flex-basis: 50%;

.header-right 
  text-align: right;

以及前缀(生产就绪)版本:

.navbarheader 
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  white-space: nowrap;

.header-right,
.header-left 
  -webkit-flex-basis: 50%;
      -ms-flex-preferred-size: 50%;
          flex-basis: 50%;

.header-right 
  text-align: right;

但相关部分是

.header-right, .header-left  flex-basis: 50%; 

【讨论】:

很好解释。多种解决方案。 +1 @GustvandeWal 理论太多,实践太少。我最终选择了一个可行的解决方案,因为猜测它会帮助一些不熟悉 Bootrasp 4 可选 flex 版本的人。我希望你不介意:)。 这正是我想要的解决方案——使用 flex 模型并且没有 hack。谢谢【参考方案2】:

您必须在header-title 上使用position: absolute 并将其从元素的自然流中移除,这样它就始终居中 相对于navbarheader

nav 
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 25px;
  border: 1px solid black;
  position: relative;


.title 
  position: absolute;
  left: 50%;
  transform: translateY(-50%);


a 
  font-size: 30px;
  padding: 0 10px;
<nav>
  <div class="left">
    <a href="">Icon</a>
    <a href="">Icon</a>
  </div>
  
  <div class="title">Title</div>
  
  <div class="right">Icon</div>
</nav>

【讨论】:

你不是说translate(-50%)吗?【参考方案3】:

您可以添加与缺少图标大小相同的间隙:

.navbarheader > :last-child
  margin-left:2.5rem;

demo

/* background gradient added to visualize centers */

.navbarheader 
  display: flex;
  flex-direction: row;
  justify-content: space-around;
  max-width: 600px;
  padding: 1em 0;
  margin: auto;
  background: linear-gradient(to left, gray 50%, lightgray 50%);

.navbarheader .header-left 
  margin-left: -0.5rem;

.navbarheader .header-title 
  flex-grow: 2;
  text-align: center;
  background: linear-gradient(to right, gray 50%, lightgray 50%);

.navbarheader .header-right 
  margin-right: -0.5rem;

.navbarheader >:last-child 
  margin-left: 2.5rem;
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
<div class="navbarheader">
  <div class="header-left">
    <button type="button" class="pull-left btn-nav-menu">
      <i class="navbar-text fa fa-fw fa-navicon"></i>
    </button>
    <button type="button" class="pull-left" ng-click="ui.showSearch()">
      <i class="navbar-text fa fa-fw fa-search"></i>
    </button>
  </div>
  <div class="header-title">
    <div class="navbar-brand">whatever text</div>
  </div>
  <div class="header-right">
    <button class="btn-watchlist pull-right" ng-click="ui.toggleWatchlists()">
      <i class="navbar-text fa fa-fw fa-binoculars"></i>
    </button>
  </div>
</div>

【讨论】:

【参考方案4】:

在不破坏响应能力的情况下以您可以承受的数量分配您的标题。这样您就有一个完美的居中量,并且每边都有相等的量用作排水沟或边距。

.navbarheader .header-left 
  margin-left: -0.5rem;
    width:20%; /* adjust accordingly if it's too much. do the same in the other to complete 100% total */
    background: red;

.navbarheader .header-title 
  flex-grow: 2;
  text-align: center;
    width:60%;
    background: yellow;

.navbarheader .header-right 
  margin-right: -0.5rem;
    width:20%;
    background: green;

查看demo(我为背景着色,以便您区分距离)

【讨论】:

【参考方案5】:

用负边距修复它...将文本和margin-left 居中以减去左侧图标宽度的一半。

【讨论】:

成功了。不敢相信我没想到。我现在感觉很笨! 真的应该使用正数margin-right,因为当您缩小视口时,左侧的负边距会使文本与左侧的图标重叠

以上是关于如何将带有不均匀图标的文本居中对齐?的主要内容,如果未能解决你的问题,请参考以下文章

带有图标的按钮中文本的垂直对齐方式不正确

Swift iOS 8+ UISearchBar图标,占位符和文本居中

如何将图像彼此对齐,以使它们沿页面宽度均匀分布? [关闭]

如何在 Bootstrap 4 中将 Font-Awesome 图标与一行文本垂直对齐?

Flutter中的居中对齐前导图标

Bootstrap 将图标对齐到左侧,将文本对齐到顶部栏的中心