溢出文字可以居中吗?


69

当我指定text-align:center一个宽度大于文本宽度的元素时,文本将居中于元素的内容框中(如预期的那样)。

当我指定text-align:center宽度小于文本宽度的元素时,文本将与内容框的左边缘对齐,并溢出内容框的右边缘。

您可以在此处查看这两种情况。

任何CSS魔术都可以使文本在内容框的左边缘和右边缘均相等地溢出,从而使其居中吗?


您需要white-space: nowrap;吗?如果不是,则文本居中。
Feeela 2011年

4
@feeela:我用来white-space:nowrap将文本保持在一行上,这是所需的行为。
内森·瑞安

Answers:


102

我知道这个问题很旧,但是我也遇到了同样的问题,并且发现了一个更简单的解决方案。 http://jsfiddle.net/7hy3w2jj/

<div>some text</div>
<div>
    <span class="text-overflow-center">some text that will overflow</span>
</div>

那你只需要这个定义

.text-overflow-center {
    margin-left: -100%;
    margin-right: -100%;
    text-align: center;
}

如果可以使用伪元素,则完全不需要html。只需将这些定义添加到您的文本容器即可。http://jsfiddle.net/7287L9a8/

div:before {
    content: "";
    margin-left: -100%;
}
div:after {
    content: "";
    margin-right: -100%;
}

伪变体的唯一缺点是它只能处理一行文本。


2
哦,感谢上帝给我们带来的负面利润!我用-99px一个比子元素小得多的子元素来代替%值,该子元素具有可变的尺寸,并且overflow: hidden无论如何
Aprillion '16

2
@Aziz可能。但是我只想定义我使用的属性。
Nemo64 '16

2
对于MSEdge,如果你可以使用Flexbox的-然后把display: flex; justify-content: center;div作品更好的跨浏览器。jsfiddle.net/jfroom/2u5x1hmj/1 @ Nemo64考虑更新吗?
jfroom

2
这根本不起作用,对吗?尝试将div的宽度改为15px而不是100px,这样事情就不会再居中了。
克莱门特

1
@Gaurav我认为没有所有行均等溢出就无法实现这一点,例如:jsfiddle.net/ew52qj7b/1您可以看一下连字符,但是浏览器对自动连字符的支持并不好:caniuse。 com /#feat = css-连字符,但根据情况,您可以使用&shy; 允许在特定位置使用连字符。
Nemo64

21

这看起来有些老问题。

现在,我认为flex有一些不错的答案。

您可以像这样简单地进行操作:

<div id="small_div">overflowing text</div>

#small_div {
    display: flex;
    justify-content: center;
}

而已。

希望对您有帮助!


只是抬起头。这在IE11和更早的版本中不起作用(即使使用自动前缀程序也是如此)。
塔兰

1
这应该是公认的答案,因为它允许多行溢出居中
Gabriel Llamas

14

魔术师来营救。如果有人感兴趣,您可以在此处查看解决方案。

HTML:

<div id="outer">
    <div id="inner">
        <div id="text">some text</div>
    </div>
</div>
<div id="outer">
    <div id="inner">
        <div id="text">some text that will overflow</div>
    </div>
</div>

CSS:

#outer {
    display: block;
    position: relative;
    left: 100px;
    width: 100px;
    border: 1px solid black;
    background-color: silver;
}
#inner {
    /* shrink-to-fit width */
    display: inline-block;
    position: relative;
    /* shift left edge of text to center */
    left: 50%;
}
#text {
    /* shift left edge of text half distance to left */
    margin-left: -50%;
    /* text should all be on one line */
    white-space: nowrap;
}

4
“把魔法救出来。” 好吧,也有DIV汤来营救…但是一个棘手的解决方案
Feeela 2011年

@feeela:同意div会变成混乱的混乱局面,这就是为什么我将它们放在HTML之外,并在加载页面时使用JavaScript构建更复杂的DOM的原因。
内森·瑞安

2
这可能是一个选项:jsfiddle.net/PdER5。我故意不将其发布为答案,因为需要对它进行严格的测试,以确保当它在您需要支持的任何浏览器中的实际页面上使用时,不会做任何奇怪的事情。
2011年

@thirtydot:如果文本的宽度大于“随机数”的两倍,则会中断,尽管实际上可以将其放大到足够大的程度,这不会成为问题
Nathan Ryan

@thirtydot恕我直言,这是一个更酷的解决方案,但是负边距不是“某个随机数”,而是左侧定位距离加上DIVs宽度的一半。
Feeela 2011年

0

奇怪的要求。我将框扩展到文本大小。

一个可能的解决方案可能涉及一个负的text-indent:,text-indent: -50px;但是不适用于较小的文本(DIV在您的示例中是第一个)。现在没有更好的主意了。


好主意text-indent。它可以用margin-left相同的结果替换我的解决方案。
内森·瑞安

0

尝试

word-wrap:break-word;

代替:

white-space:nowrap;

还是只想一行?


这是一个奇怪的要求。为什么您需要它从元素中溢出?
FraserK,2011年

1
元素实际上是形状,文本是标签。我正在尝试用最少的JavaScript制作某些类型的图表。
内森·瑞安

为什么不尝试将背景作为图像,然后将图像设置为不重复并居中。例如jsfiddle.net/C4BBS/1,您可以看到边框显示了div的实际宽度,但bg居中
FraserK 2011年

有些事情(如边框)​​仍然很凌乱,还需要一些其他代码来处理元素上的用户事件。
内森·瑞安

可能发生哪些事件?不需要边框,但我将其留在那里,因此您可以看到元素的实际宽度。
FraserK

0

这似乎很有效:添加一个包装块,其位置相对且为left:50%margin-left:-100%,您可以 此处看到以下代码:

<style>
div {
    display: block;
    position: relative;
    left: 100px;
    height:1.5em;
    width: 100px;
    text-align: center;
    white-space: nowrap;
    border: 1px solid black;
    background-color: silver;
}
span{
    display:block;
    position:relative;
    left:50%;
    margin-left:-100%;
}
</style>
<div><span>some text</span></div>
<div><span>some text that will overflow</span></div>

文本长度很不幸,它使您的解决方案似乎可以正常工作,直到像我在此处添加的那样添加更多文本为止:jsfiddle.net/LSpCS/2
2011年

不错,嵌套元素少一层。
内森·瑞安

@thirtydot:真是可惜。我想知道是否有办法使它起作用。
内森·瑞安

0

为了使解决方案适用于多行文本,您可以通过将左侧的#inner从50%更改为25%来修改Nathan的解决方案。


0

给内心div一些margin: 0 -50%。如果元素全部是显示块或内联块,并且文本居中对齐,则这为最里面的元素的文本提供了更多的肩膀空间。至少,它对我有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.