【问题标题】:"text-align: justify;" inline-block elements properly?“文本对齐:对齐;”内联块元素正确吗?
【发布时间】:2012-07-20 08:01:57
【问题描述】:

其他一些问题已经解决了如何最好地应用text-align: justify 以使内联块元素均匀分布……例如,How do I *really* justify a horizontal menu in HTML+CSS?

但是,“清除”行内块元素行的 100% 宽度元素由浏览器赋予其自己的行。如果不在父元素上使用line-height: 0;,我无法弄清楚如何摆脱那个空的垂直空间。

有关问题的示例,请参阅this fiddle

对于我使用line-height: 0; 的解决方案,请参阅this fiddle

我使用的解决方案要求将新的line-height 应用于子元素,但之前设置的任何line-height 都会丢失。有人知道更好的解决方案吗?我想避免使用表格,以便在必要时可以包装元素,还想避免使用 flexbox,因为还没有浏览器支持。我也想避免浮动,因为间隔的元素数量是任意的。

【问题讨论】:

    标签: css text-align justify


    【解决方案1】:

    更新了下面的“未来”解决方案信息;仍未完全支持。

    目前的解决方法(IE8+、FF、Chrome 测试)

    See this fiddle.

    相关 CSS

    .prevNext {
        text-align: justify;
    }
    
    .prevNext a {
        display: inline-block;
        position: relative;
        top: 1.2em; /* your line-height */
    }
    
    .prevNext:before{
        content: '';
        display: block;
        width: 100%;
        margin-bottom: -1.2em; /* your line-height */
    }
    
    .prevNext:after {
        content: '';
        display: inline-block;
        width: 100%;
    }
    

    说明

    :before 元素上带有负下边距的 display: block 将文本行拉高一个行高,这消除了多余的行,但替换了文本。然后使用inline-block 元素上的position: relative 抵消位移,但不添加额外的线。

    尽管 css 本身不能直接访问 line-height“单元”,但在 margin-bottomtop 设置中使用 em 很容易适应作为 multiplier values 之一给出的任何 line-height。所以1.2120%1.2em在计算中等于相对于line-height,这使得使用em成为一个不错的选择在这里,即使设置了line-height: 1.2,那么margin-bottomtop1.2em 也会匹配。对站点外观进行规范化的良好编码意味着在某些时候应该明确定义line-height,因此如果使用任何乘法器方法,则等效的em 单元将给出与line-height 相同的值。如果line-height 设置为非em 长度,例如px,则可以设置。

    使用诸如 LESS 或 SCSS 之类的 css 预处理器肯定有一个变量或 mixin 可以帮助保持这些值与适当的 line-height 匹配,或者 javascript 可以用于动态读取此类,但实际上,line-height 应该是已知的在使用 this 的上下文中,并在此处进行了适当的设置。

    更新缩小文本(无空格)问题

    Kubi 的评论指出,缩小了 html 以删除 <a> 元素 causes the justification to fail 之间的空格。一个pseudo-space within the <a> tag does not help(但这是意料之中的,因为空间发生在inline-block元素内),一个<wbr> added between the <a> tags does not help(可能是因为下一行不需要中断),所以如果需要缩小,那么@987654326 @--thin spaceen space 等其他空格字符不起作用(令人惊讶)。

    接近未来的清洁解决方案

    A solution 其中webkit was behind the times(在第一次写这篇文章时)是:

    .prevNext {
        text-align: justify;
        -moz-text-align-last: justify;
        -webkit-text-align-last: justify; /* not implemented yet, and will not be */
        text-align-last: justify; /* IE */
    }
    

    It works in FF 12.0+ and IE8+(IE7 中的错误)。

    对于 Webkit,从第 39 版开始(至少,可能更早出现)它确实支持它没有 -webkit- 扩展但如果用户启用了实验性功能(可以在chrome://flags/#enable-experimental-web-platform-features完成)。有传言说版本 41 或 42 应该得到完全支持。由于 webkit 尚未无缝支持它,它仍然只是部分解决方案。但是,我认为我应该发布它,因为它可能对某些人有用。

    【讨论】:

    • @RoddyoftheFrozenPeas——不是根据我发布的第一个链接。我自己还没有正式检查过。
    • 我花了一个小时才发现这种方法只有在子元素之间有空格时才有效。它不适用于我的 xsl 生成的formatOutput = true“缩小”HTML。参照。 jsfiddle.net/QaS5J/1 我猜,一串无空格的内联块被视为一个单词,因此不合理。
    • @kubi:如果需要缩小 html,有一种解决方法。我已经更新了我的答案。基本上,在 html 中需要一个硬编码的不间断空格(在缩小时不应消除)。
    • 只是在元素之间的nbsp; 上做一点说明。添加nbsp; 会导致内联块定位的微小偏移。为防止这种情况,请将每个 nbsp; 包装在 aspan.inivisible-space 中,并使用 font-size: 0; 创建一个类
    • IE 中,只有当容器(在本例中为 .prevNext)的 font-size 属性大于 0 时才会起作用。如果等于0,则无效
    【解决方案2】:

    考虑以下几点:

    .prevNext {
        display: table;
        width: 100%
    }
    
    .prevNext a {
        display: table-cell;
        text-align: center
    }
    

    ​(另见edited fiddle。)这就是您要找的吗?这种技术的优点是您可以添加更多项目,并且它们都将自动居中。所有现代 Web 浏览器都支持。

    【讨论】:

    • 如果你的内容长度不等,这种技术并不是它看起来的神奇解决方案。我修改了小提琴来展示这一点。您可以清楚地看到短链接周围的间距远小于长链接周围的间距。 jsfiddle.net/arkid77/5vcgpkeL/2
    • 不完全“合理”。
    【解决方案3】:

    首先,我喜欢pseudo-element 的方法,以保持标记语义。我认为你应该坚持整体方法。这比使用表格、不必要的标记或顶级脚本来获取定位数据要好得多。

    对于每个强调 text-align 是 hacky 的人 - 来吧!以牺牲 CSS 为代价让 html 具有语义比反之更好。

    所以,据我了解,您正在尝试实现这种合理的内联块效果,而不必担心每次都重置 line-height 对吗?我认为你只是添加

    .prevNext *{
        line-height: 1.2;  /* or normal */
    }
    

    然后你可以像什么都没发生一样开始编码。如果您担心性能,下面是 Paul Irish 关于 * 选择器的引用:

    "...你不能关心 * 的性能,除非你连接你所有的 javascript,把它放在底部,缩小你的 css 和 js,gzip 你所有的资产,无损压缩你所有的图像。如果您没有获得 90+ 的 Page Speed 分数,现在考虑选择器优化还为时过早。”

    希望这会有所帮助!

    -J科尔·莫里森

    【讨论】:

    • 我真的很喜欢line-height: normal; :-p 它与我正在尝试做的事情非常吻合。它并没有摆脱line-height: 0;,而是将行高重置为标准化值。如果其他人想要覆盖 line-height,他们可以......仍在尝试探索 @MoinZaman 的 Sitepoint 链接,并希望可能有其他不需要 line-height: 0; 的答案,但这感觉很接近。
    • 嘿第三者!是的,我查看了一些不同的东西,但我经常发现,尤其是对于 CSS,最简单的方法效果最好。很高兴围绕display: tabledisplay: table-cell 进行更改工作,但这些会导致更广泛的潜在后代css 冲突。在我看来,追求可维护和可理解的(并为flexbox祈祷)!
    • 可能有助于性能一些使用:.prevNext > *所以它只查看直接子代而不是.prevNext所有后代.当然,这仍然是 line-height 重置,在问题中 OP 说他试图避免。
    • 同意性能的事情!关于重置问题:OP 询问是否有更好的解决方案,并试图避免使用表格、flexbox 和浮动 - 不是特别是行高重置。
    • 是的……我试图避免重置行高(因为它应该从父元素继承),但更重要的是我试图避免指定固定的行高。 line-height: 1.2emline-height: 1.2 接近 line-height: normal,但每种字体都定义了自己的“正常”行高,因此 1.2 只是一个近似值。我没有意识到 line-height: normal 可以作为一个选项使用(我尝试了“默认”和“自动”,但在我的 Google 搜索中错过了“正常”)。我仍然想要一个更好的解决方案,但我认为这适用于 9/10 用例(适用于我的 SCSS mixin)。
    【解决方案4】:

    尝试text-align 解决这个问题是相当骇人听闻的。 text-align 属性用于对齐块的内联内容(特别是文本)——它并不意味着对齐 html 元素。

    我了解您正在尝试避免浮动,但我认为浮动是完成您想要做的事情的最佳方式。

    【讨论】:

    • 我也在想同样的事情;这是为了不使用实际上为此目的而制作的另一个属性而滥用一个属性。
    • @VinnyBurgh——我倾向于不同意。浮点数并非旨在“证明”一行上的元素。浮点数可以强制对元素进行伪对齐,但前提是涉及固定宽度。根据他对 Ali Gajani 的回答的评论,他的用例要求允许的不仅仅是两个元素,一个是右一个,一个是左。它似乎也不涉及固定宽度的元素。
    • 我同意浮动不是为对齐元素而设计的,但 text-align:justify 也不是为此目的而设计的。这两个属性都是在 CSS1 中引入的,我确信这种用例在撰写本文时既不合适也没有必要。无论如何,我很喜欢 OP 的问题。
    • @VinnyBurgh,新的 [CSS3 flexbox 标准] (w3.org/TR/css3-flexbox) 完美地满足了要求,但最后一个 flexbox 实现不足,并且从未支持 IE(除了一个 JS shim,它给了我一些问题)...
    【解决方案5】:

    在您的示例中,您有line-height:1.2,没有单位。这可能会导致问题。如果你不使用边框,你可以给父母和孩子一个line-height 0

    我能想到的其他选择是:

    1. 在父级上使用display:table,在子级上使用display:table-cell 来模拟类似表格的行为。你将第一个项目左对齐,最后一个右对齐。看到这个fiddle
    2. 使用 javascript 对导航子项进行计数,然后为它们分配均匀分布的宽度。例如。 4 个孩子,每个孩子 25% width。并分别左右对齐第一项和最后一项。
    3. 有一种方法可以均匀分布项目,但这是一种复杂的方法,需要在 html 中小心放置一些不间断的空格以及负边距和text-align:justify。您可以尝试将其调整为 nav 元素。请参阅示例 here

    【讨论】:

    • 边框只是用来显示父容器的边界框。此外,为所有元素提供line-height: 0 对布局来说是个坏主意(它可能导致文本呈现在前一个和下一个兄弟元素之上,请参阅this fiddle)。对于#1,如问题中所述,我试图避免使用表格,以便在必要时可以包装元素。对于#2,真正尝试避免使用 Javascript 并使其成为纯 CSS 解决方案。我想要一些我可以推出、设置和忘记的东西,而不用担心 JavaScript 是否/何时可用。
    • @thirdender--找到了一个可以满足您需求的解决方案并更新了我的答案以显示它。
    • @MoinZaman,你的链接都不起作用......它们都指向jsbin.com/edison/1/edit
    【解决方案6】:

    你的小提琴非常具体。在我看来,对于你的情况,这个 CSS 会很好用:

    .prevNext {
        border: 1px solid #ccc;
        position: relative;
        height: 1.5em;
    }
    
    .prevNext a {
        display: block;
        position: absolute;
        top: 0;
    }
    
    .prevNext a:first-child {
        left: 0;
        text-align: left;
    }
    .prevNext a:last-child {
        right: 0;
        text-align: right;
    }
    ​
    

    【讨论】:

      【解决方案7】:

      正如@Scotts 所说,以下内容已在 Chrome 中实现,没有 -webkit 部分,我真的很喜欢顺便说一句,特别是因为我们需要尽快摆脱 -browser-specific-shǐt

      .prevNext {
          text-align: justify;
          -moz-text-align-last: justify;
          -webkit-text-align-last: justify; /* not implemented yet, and will not be */
          text-align-last: justify; /* IE + Chrome */
      }
      

      注意:虽然仍然是 Safari 和 Opera don't support it yet (08-SEPT-16)。

      【讨论】:

        【解决方案8】:

        我认为最好的方法是使用特定的class/id 创建可点击元素,然后相应地分配float:leftfloat:right。希望有帮助。

        【讨论】:

        • 我试图避免浮动...对于小提琴,我链接浮动会起作用,因为只有两个元素(“上一个”,“下一个”)。我创建了一个 new fiddle 显示 4 个元素。目标是使用任意数量的元素。
        猜你喜欢
        • 2013-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-29
        • 1970-01-01
        相关资源
        最近更新 更多