【问题标题】:How to visually horizontally center an emoji in Chrome?如何在 Chrome 中将表情符号在视觉上水平居中?
【发布时间】:2020-04-20 19:36:06
【问题描述】:

在谷歌浏览器中将表情符号在视觉上水平居中是非常困难的,因为表情符号右侧似乎不应该有空格。一个例子:

.avatar {
  width: 30px;
  
  padding: 10px;
  background-color: #eee;
  border-radius: 50%;
  
  display: grid;
  justify-items: center;
  align-items: center;
}
<div class="avatar">
  <div>&#x1F436;</div>
</div>

https://codepen.io/tommedema/pen/xxbXBRe

在 MacOS Catalina 10.15.2 上的 Chrome 79.0.3945.79 中,这呈现为:

显然,它在视觉上不是水平居中的。然而在 Safari 和 Firefox 71 等其他浏览器中却是:

关于 Carol 的使用 font-size 和 box-sizing 的回答,结果还是一样的。我选择了表情符号/文本,以便您可以更清楚地看到表情符号右侧有空格的问题,但仅限于 Chrome 而不是其他浏览器:

【问题讨论】:

  • 你试过display: flex;justify-content: center;align-items: center;吗?
  • @AkhiAkl 是的 (codepen.io/tommedema/pen/MWYExXz),效果一样。问题是表情符号似乎在视觉上占据了更大的宽度(就像表情符号后面有一个空间)
  • @Basil,一点也不。如果您阅读了我的问题,很明显这是特定于 Chrome 呈现表情符号的方式
  • 表情符号是文字,所以我看不出表情符号和其他任何东西之间有任何区别!!
  • 这似乎是特定于供应商的问题:有趣的是,Brave 和 Opera 等其他基于铬的浏览器没有这个问题。这似乎与 Chrome 如何调整 unicode 字符有关。

标签: html css unicode


【解决方案1】:

这似乎是一个旧的 Chromium 渲染错误,专门影响 Retina 设备。这或许可以解释为什么其他一些海报提出的解决方案对您不起作用!

在此处查看错误报告:https://bugs.chromium.org/p/chromium/issues/detail?id=551420。当然,修复中没有预计到达时间...

不过,我偶然发现了一些有趣的字体大小。在较大的字体大小(我的测试中大约为 22 像素,但这可能取决于多种因素)时,问题完全消失了。

因此,我建议的修复是一种解决方法,但对于其他浏览器也应该是安全的。将字体大小加倍,但使用 transform 再次缩小:

.avatar {
  font-size: 30px;  /* double the size you wanted */
  ...
}

.avatar div {
  transform: scale(0.5);  /* reduce size by 50%, back to originally intended size */
}

【讨论】:

  • 它确实修复了高 ppi 的 h 对齐,但似乎也打破了低 ppi 的对齐,至少对我而言。我建议在使用此解决方法发送代码之前检查它!
【解决方案2】:

在表情符号上使用position: absolute;,然后在顶部,向左到 50%,然后翻译 -50% 使其处于死点。

这里:

.container {
  display: flex;
  width: 100vw;
  justify-content: center;
}

.avatar {
  width: 30px;
  height: 30px;
  font-size: 15px;
  box-sizing: content-box;
  padding: 10px;
  background-color: #eee;
  border-radius: 50%;
  position: relative;
}

.avatar div {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.avatar.x2 {
  width: 45px;
  height: 45px;
  font-size: 30px;
}

.avatar.x3 {
  width: 60px;
  height: 60px;
  font-size: 45px;
}
<div class="container">
  <div class="avatar">
    <div>?</div>
  </div>
  <div class="avatar x2">
    <div>?</div>
  </div>
  <div class="avatar x3">
    <div>?</div>
  </div>
</div>

【讨论】:

    【解决方案3】:

    尝试使用display: block 的默认css 属性&lt;div&gt; 进行此操作,并使内容中心水平使用text-align: center

    为了更多的理解显示下面的sn-p:

    .avatar {
        box-sizing: border-box;
        width: 50px;
        height: auto;
        padding: 10px;
        background-color: #eee;
        border-radius: 50%;
        text-align: center;
        line-height: 30px;
    }
    <div class="avatar">
      <div>&#x1F436;</div>
    </div>

    我还检查了 Chrome 79。它工作正常。

    我希望这对您有用并有助于解决您的问题。

    谢谢...

    【讨论】:

    • 我运行了你的代码 sn-p 并且它没有在 Chrome 79 MacOS 上视觉上居中。表情符号的右侧有空格。
    • 你能分享我的代码的任何屏幕截图吗?因为我已经在 Windows 和 Mac OS (包括 safari)中检查了 mozila 和 chrome。它适用于操作系统和所有浏览器。
    【解决方案4】:

    每个浏览器的默认行高都不一样。

    使用标准行高:1;明确的。

    https://codepen.io/boralp/pen/wvByBXy

    .avatar {
      width: 30px;
    
      font-size: 15px;
      box-sizing: content-box;
    
      line-height: 1;
      padding: 10px;
      background-color: #eee;
      border-radius: 50%;
    
      display: grid;
      justify-items: center;
      align-items: center;
    }
    

    【讨论】:

    • 你自己在 chrome 79 上检查过吗?它绝对不是视觉居中的,不是水平的
    • 是的,我在 Mac 上使用 Chrome 79。尝试为盒子指定宽度和高度,它仍然是水平和垂直适合的。
    【解决方案5】:

    您需要添加字体大小和框大小:

      font-size:15px;
      box-sizing:content-box;
    

    总而言之:

    .avatar {
      width: 30px;
    
      font-size:15px; // new line of code
      box-sizing:content-box; // new line of code
    
      padding: 10px;
      background-color: #eee;
      border-radius: 50%;
    
      display: grid;
      justify-items: center;
      align-items: center;
    }
    

    【讨论】:

    • 这没有帮助。我在原始问题中添加了一个部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2014-12-18
    • 2016-11-04
    • 2019-10-21
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多