【问题标题】:Is there a way to make a variable width font act like a fixed width font in HTML? [duplicate]有没有办法让可变宽度字体像 HTML 中的固定宽度字体一样工作? [复制]
【发布时间】:2013-01-05 23:02:37
【问题描述】:

有没有办法让可变宽度字体像 HTML 中的固定宽度字体一样工作?

例如,如果我在固定宽度字体“Courier New”中显示句子“The quick gray fox jumped over the lazy dog”,那么它总体上会比在可变宽度字体中更宽,例如, “宋体”。我想使用“Arial”而不是“Courier New”,但字符的宽度是固定的。

可变宽度示例:
敏捷的灰狐狸跳过了懒惰的狗。

固定宽度示例:

敏捷的灰狐跳过了懒狗

请注意在每个示例中,单词“quick”和“grey”中的字符是多么接近。

【问题讨论】:

  • HTML 还是 TLF?你想要哪一个?这是两种完全不同的渲染技术,需要不同的解决方案。
  • 确实如此。我开始的是一个文本列表。在这种情况下,我可以选择使用任何一种技术。但我可以创建一个新问题。
  • 你似乎得到了很多 HTML 答案,我想不出一个快速修复 TLF 的方法。因此,也许您可​​以以此为基础选择技术。
  • 看起来是这样的。我为 TLF 创建了一个单独的问题,因为将来访问此帖子的人可能会发现两种不同技术的答案令人困惑。
  • HTML 方法也可能适用于 TLF。我必须创建 span 元素,并设置每个元素的宽度和文本对齐方式。不幸的是,TLF 中的 HTML 导入非常慢(TLF 2.0)。

标签: html css typography


【解决方案1】:

不仅仅是 CSS。我建议你使用流行的Lettering.js(你需要jQuery)在每个字符周围生成span标签,然后设置所有字符的宽度。

.monospace > span {
  display: inline-block; /* Enable widths */
  width: 1em;            /* Set width across all characters */
  text-align: center;    /* Even out spacing */
}

Test Case

【讨论】:

  • 我可以通过预先添加跨度标签来删除要求吗? body { font: 16px/1.5 Arial, sans-serif } 有什么作用?
  • 如果您想将span 标签手动编码到文档中,那也可以。你不需要 Lettering.js。 font 声明在整个文档上设置了 16 像素的基础 font-size、1.5em(或 24 像素)的基础 line-height 和 Arial 的 font-family,并带有无衬线的备份。它是分别使用所有这些属性的简写。
  • @JoeJ,否决了这个,因为我无法让它工作并且测试用例不再存在。
【解决方案2】:

我唯一能想到的就是将每个字母放在一个 HTML 元素中,并为该元素设置如下样式:

width: 8px;         /* Whatever fixed width you want here */
display: block;     /* Force the width to be respected. See also: inline-block */
float: left;        /* So it won't be 1-per-line. Not needed for inline-block */
text-align: center; /* So the character appears in the middle of the block */

我不熟悉 Flex,但如果我要实现这种方法,我会整理一些 Javascript 来为我生成所有元素。

【讨论】:

  • 每个字符已经在它自己的 span 标签中,所以我认为这可能会起作用。 :)
  • 这符合问题的要求,但这意味着字母不会看起来是均匀分布的;例如,在“World”中,前两个字母似乎比其他字母更接近。关键是要创造等宽的印象,你需要一个真正的等宽字体。
  • @AshleyRoss 您可以使用 inline-block 并摆脱浮动。内联块允许您在元素上设置大小,但内联显示它(没有新行)。
  • @JukkaK.Korpela 如果字母居中并手动设置为宽度,它应该看起来像等宽。我得看一个例子。
【解决方案3】:

这是一个老问题,但我建议寻找一种合适的固定宽度字体,它可以用作具有您想要的功能的网络字体。例如,我是 Inconsolata 的忠实粉丝。

我会从Google Fonts 开始并取消选择所有类别,只留下等宽。

【讨论】:

    【解决方案4】:

    您也许可以使用 letter-spacing CSS 属性来获得您想要的。根据定义,等宽字体与 serif 或 sans-serif 具有相同的字符宽度。使用字母间距是你最好的选择W3C Reference

    【讨论】:

    • 字母间距值不是刚刚添加到给定字体的默认字距中吗?虽然它会增加或减少每个字母之间的间距,但它不会使间距均匀,对吗?但如果这能满足 1.21 吉瓦的需求,那绝对是比我的建议更好的选择。 :)
    • 我认为阿什利是对的。我认为它会增加或减少字体字距调整表中的值。
    • letter-spacing 值指定了字符之间的附加间距(字距调整完全不同),因此它根本不会使间距均匀。
    • 我认为这是一个很好的补充,虽然不完全是“固定宽度”,但它可能有助于解决一个主要问题,即仅因为文本太难而需要固定宽度读成一堆。很高兴提到 letter-spacing 作为一个考虑因素
    【解决方案5】:

    结果应该很糟糕,因为比例字体不是为此而设计的。

    尽管如此,您可以使用单独的 span 围绕字符来实现:http://jsfiddle.net/rvYES/

    body {
      font: normal 100%/1.5 Arial;
    }
    
    span {
      outline: 1px dotted darkred;
    }
    span:nth-of-type(even) {
      outline-color: blue;
    }
    
    .w-fixed span {
      display: inline-block;
      min-width: 1em;
    }
    

    我添加了视觉线索(大纲)以查看发生了什么,并使用min-width 以防万一,而不是width
    对于使用这些辅助技术的盲人和视力不佳的人来说,这种方法将导致屏幕阅读器的可访问性存在巨大问题。输入个人span的字母将被拼写/读出
    o
    n
    e

    b
    是的

    o
    n
    e

    w
    h

    l
    e

    一个

    n
    o
    r

    一个
    l

    p
    一个
    r
    一个
    g
    r
    一个
    p

    w
    o
    u
    l

    b
    e

    r
    电子
    一个

    一个

    一个

    s
    电子
    n
    t
    电子
    n
    c
    电子
    ,

    一个


    s
    u
    一个
    l
    .

    P
    r
    电子
    t
    t
    是的

    一个
    n
    n
    o
    是的

    n

    e
    h
    ?

    双关语

    【讨论】:

    • 从排版上看,结果会很糟糕,但没有理由让屏幕阅读器拼出每个字母。 (不过,糟糕的屏幕阅读器可能会做一些奇怪的事情。)
    • :) body 标签中的 CSS 是做什么的?我现在已经在不止几个地方看到它了。
    • @JukkaK.Korpela 如果你正在开发一个 AT,你可能有理由在看到单个 span 而不是正常句子中的字母时表现出不同的行为,尽管我没有测试来自现实世界的案例导致他们做出这个决定。如果你想为段落的第一个字母设置样式,至少 CSS 有 :first-letter
    • @1.21gigawatts font 是一组font-something 属性和line-height 的简写属性。对font-size 使用百分比是由于使用em 单位(不是像素)和大多数版本的IE 的错误,在这个特定元素em 上使用clagnut.com/blog/348 单位(IE 可以在任何其他元素上使用ems元素...)。 /1.5 是将在整个文档中继承的 line-height 值 (unitless)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多