【问题标题】:Center a <span> relative to container div, align another span with right-aligned text left of it将 <span> 相对于容器 div 居中,将另一个 span 与左侧的右对齐文本对齐
【发布时间】:2019-07-02 22:34:37
【问题描述】:

我正在尝试在容器div 的中心对齐span 元素,并让另一个span 与左对齐文本右对齐:

+--------------------------------------------------------+
| <div>                                                  |
+----------------------+----------+                      |
| <span>               | <span>   |                      |
|                      |          |                      |
|                      |          |                      |
|                      |          |                      |
|        right-aligned | centered |                      |
|                      |          |                      |
|                      |          |                      |
|                      |          |                      |
|                      |          |                      |
+----------------------+----------+                      |
|                                                        |
+--------------------------------------------------------+

两个 span 的内容都是动态生成的,所以我希望尽可能避免使用任何绝对像素宽度。

知道如何实现这种类型的布局吗?

这是我最终根据 Persinj 的回答使用的标记:

HTML

<nav class="navbar">
  <span class="nav-aside">Right-aligned:&nbsp;</span>
  <span class="nav-menu">centered</span>
  <span class="nav-aside"></span>
</nav>

CSS

nav.navbar {
  display: flex;
}
span.nav-aside {
  flex-grow: 1;
  flex-basis: 0;
  text-align: right;
}
span.nav-menu {
  align-self: center;
  text-align: center;
}

由于我对浏览器的要求有限,因此我将供应商前缀排除在我的标记之外,并且我依靠 autoprefixer 来解决这个问题。如果需要,请查看已接受的答案。

【问题讨论】:

  • 向我们展示您迄今为止尝试过的标记和相关 css...
  • 好的,当前标记已添加。我已经尝试了几种方法,但到目前为止没有运气。

标签: html css alignment


【解决方案1】:

Flexbox 设计/布局

这可以使用 flex 解决:

设置树形框: 在旁边,居中和隐藏的将填充所需的空间。
设置flex-grow 将使它们占据页面的不同部分。
在每个上设置flex-grow: 1; 将使它们占用相等的空间。 将其中之一设置为flex-grow: 0.5;将减少这部分的成长空间。
添加一个带有 flex 属性的包装器,我们可以使用align-items:center 来确保它们位于包装器的中心。

Fiddle

.wrapper {
  height: 250px;
  display: -ms-flexbox;
  display: -webkit-flex;
  display: flex;
  -webkit-flex-flow: row wrap;
  flex-wrap: nowrap;
  flex-direction: row;
  align-items: center;
  text-align: center;
}

.center,
.aside,
.not-shown {
  -webkit-flex: 1;
  -ms-flex: 1;
  flex: 1;
}

.center {
  flex-grow: 0.5;
  background-color: lightblue;
  height: 50px;
}

.aside {
  text-align: right;
  background-color: 1;
  background: lightgreen;
  height: 50px;
}

.not-shown {
  visibility: hidden;
  flex-grow: 1.5;
  height: 50px;
}
<div class="wrapper">
  <div class="aside">
    aside
  </div>
  <div class="center">
    center
  </div>
  <div class="not-shown">
  </div>
</div>

【讨论】:

  • 谢谢!我只是略有不同,因为我希望中心列的宽度适合内容,但这解决了问题。我将编辑原始问题以显示标记以防其他人需要它。
  • 不同的显示属性不存在运行。 new 浏览器支持。我没有添加旧样式前缀。
  • 谢谢。该页面已经在我所有的目标浏览器上运行,并且我使用了自动前缀,所以我只是在我的标记中添加了一条评论。
【解决方案2】:

HTML:

<div class="wrapper">
  <span class="span-left">right-aligned</span>
  <span class="span-center">centered</span>
</div>

CSS:

.span-left, .span-center { display: inline-block; }

.span-left {
  width: 40%;
  text-align: right;
}

.span-center {
  width: 20%;
  text-align: center;
}

或者,在您的跨度上使用 display: blockfloat: left;(不要忘记在包装后清除)。

【讨论】:

  • 这可以正确对齐文本,但 span-center 相对于 wrapper 不在中心,但 span-left 和 span-center 一起居中。
  • 如果我离开包装器的 CSS,似乎可以正确对齐跨度中心。但是我需要根据动态生成的内容来调整 span-center 的大小。我尝试了 display: block 和 float:left,但也没有成功。
  • 嗨,yupp,我的解决方案仅在使用span-left 和(!)span-center 时有效。想象一下span-rightspan-left 的大小相同,因此您的中心跨度正确对齐(@9​​87654329@ + span-center + span-right 的宽度必须为 100%)。
  • 我明白了。谢谢,但不幸的是,我事先不知道中心/左侧所需的相对大小,所以我选择了弹性盒解决方案。
猜你喜欢
  • 2011-12-14
  • 2016-08-31
  • 2017-07-02
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多