如何在浏览器宽度变化时使字体始终居中?
How to make font always in the middle when browser width changes?
我有以下示例来演示试图停留在 div 中间的字体,使用普通文本操作和 flex 显示操作。两者似乎都将字体放在中间,但是,当您的浏览器未最大化并且您尝试更改浏览器的宽度时,两种字体都会在 div 范围内摆动(您必须慢慢地这样做才能看到效果).
我制作了一个动画 GIF 来展示我在说什么:
由于字体大小是固定的,并且封闭 div 的宽度和高度也是固定的,因此更改浏览器的宽度应该不会影响封闭 div 中字体的位置.
如何使字体在中间绝对稳定(必须是字体,不是图像,可以是 SVG,但如果需要的话),从而在浏览器宽度变化时不摆动?
div {
display: flex;
justify-content: center;
margin: 10px;
}
span.text {
height: 30px;
width: 30px;
line-height: 30px;
text-align: center;
font-size: 30px;
font-weight: bold;
color: white;
background: green;
}
span.flex {
height: 30px;
width: 30px;
display: flex;
align-items: center;
justify-content: center;
font-size: 30px;
font-weight: bold;
color: white;
background: green;
}
<div>
<span class="text">+</span>
</div>
<div>
<span class="flex">+</span>
</div>
p{
text-align: center;
}
<div>
<span class="text"><p>+</p></span>
</div>
<div>
<span class="flex"><p>+</p></span>
</div>
您可以通过将文本放入“p”或不同的“h”标签来指定您的文本,并全局应用给定的 css
这是字体的子像素渲染问题。通过创建一个转换层,我们可以以某种方式修复这种抖动。尝试 backface-visibility: hidden;
跨度元素
span.text {
backface-visibility: hidden;
}
span.flex {
backface-visibility: hidden;
}
理由
让我们假设视口宽度为 1000 像素。中心点是 500px。
如果视口宽度为1001px,中心点为500.5px
这个十进制像素值称为子像素。浏览器以子像素值呈现元素。但是,它不会以子像素呈现字体。
因此,在 1000 像素和 1001 像素视口情况下,字体 char(+) 的中心点均为 500 像素。而对于绿框的中心点是 500px & 500.5px.
要解决这个问题,我们可以为绿框创建一个图层。将图层视为缓存区域,除非必要,否则不会重新渲染。通过对元素应用变换,您可以在图层中绘制它。在这里,我使用了backface-visibility: hidden;
,这是一个与转换相关的属性。您还可以使用产生类似结果的变换 属性。
现在,当您调整视口大小时,绿色区域内的字体不会重新呈现。所以,你看不到紧张情绪
您可以阅读 https://dassur.ma/things/forcing-layers/ 这篇文章以更加清楚。
我有以下示例来演示试图停留在 div 中间的字体,使用普通文本操作和 flex 显示操作。两者似乎都将字体放在中间,但是,当您的浏览器未最大化并且您尝试更改浏览器的宽度时,两种字体都会在 div 范围内摆动(您必须慢慢地这样做才能看到效果).
我制作了一个动画 GIF 来展示我在说什么:
由于字体大小是固定的,并且封闭 div 的宽度和高度也是固定的,因此更改浏览器的宽度应该不会影响封闭 div 中字体的位置.
如何使字体在中间绝对稳定(必须是字体,不是图像,可以是 SVG,但如果需要的话),从而在浏览器宽度变化时不摆动?
div {
display: flex;
justify-content: center;
margin: 10px;
}
span.text {
height: 30px;
width: 30px;
line-height: 30px;
text-align: center;
font-size: 30px;
font-weight: bold;
color: white;
background: green;
}
span.flex {
height: 30px;
width: 30px;
display: flex;
align-items: center;
justify-content: center;
font-size: 30px;
font-weight: bold;
color: white;
background: green;
}
<div>
<span class="text">+</span>
</div>
<div>
<span class="flex">+</span>
</div>
p{
text-align: center;
}
<div>
<span class="text"><p>+</p></span>
</div>
<div>
<span class="flex"><p>+</p></span>
</div>
您可以通过将文本放入“p”或不同的“h”标签来指定您的文本,并全局应用给定的 css
这是字体的子像素渲染问题。通过创建一个转换层,我们可以以某种方式修复这种抖动。尝试 backface-visibility: hidden;
跨度元素
span.text {
backface-visibility: hidden;
}
span.flex {
backface-visibility: hidden;
}
理由
让我们假设视口宽度为 1000 像素。中心点是 500px。 如果视口宽度为1001px,中心点为500.5px
这个十进制像素值称为子像素。浏览器以子像素值呈现元素。但是,它不会以子像素呈现字体。
因此,在 1000 像素和 1001 像素视口情况下,字体 char(+) 的中心点均为 500 像素。而对于绿框的中心点是 500px & 500.5px.
要解决这个问题,我们可以为绿框创建一个图层。将图层视为缓存区域,除非必要,否则不会重新渲染。通过对元素应用变换,您可以在图层中绘制它。在这里,我使用了backface-visibility: hidden;
,这是一个与转换相关的属性。您还可以使用产生类似结果的变换 属性。
现在,当您调整视口大小时,绿色区域内的字体不会重新呈现。所以,你看不到紧张情绪
您可以阅读 https://dassur.ma/things/forcing-layers/ 这篇文章以更加清楚。