我很难理解字体缩放。
我目前有一个字体大小为100%的网站。但这是100%的吗?这似乎是在16个像素处计算出来的。
我的印象是,100%会以某种方式指代浏览器窗口的大小,但显然不是因为无论窗口大小调整为移动宽度还是宽屏桌面,都是16像素。
如何使站点上的文本与其容器相关?我尝试过使用它们,但这也无法扩展。
我的理由是,当你调整大小时,像我的菜单这样的东西会变得压扁,所以我需要减少.menuItem等元素相对于容器宽度的px字体大小。(例如,在大型桌面上的菜单中,22px的效果非常好。向下移动到平板电脑宽度,16px更合适。)
我知道我可以添加断点,但我真的希望文本能够缩放并具有额外的断点,否则,我将以每100像素宽度减少数百个断点来控制文本。
带有calc()、CSS单位和数学的纯CSS解决方案
这并不是OP所要求的,但可能会让某人过得很愉快。这个答案并不容易,需要在开发者端进行一些研究。
我终于得到了一个纯CSS解决方案,它使用了不同单位的calc()。您需要对公式有一些基本的数学理解,才能计算出calc()的表达式。
当我完成这项工作时,我必须得到一个全页面宽度的响应标头,在DOM中填充一些父级。我将在这里使用我的值,用你自己的值替换它们。
数学
您需要:
在某些视口中,比例调整得很好。我使用了320个像素,因此我得到了24个像素高和224个像素宽,因此比率为9.333…或28/3容器宽度,我有填充物:3em和全宽,因此达到100wv-2*3em
X是容器的宽度,因此请用自己的表达式替换它,或调整值以获得整页文本。R是你的比率。您可以通过调整某些视口中的值、检查元素宽度和高度并将其替换为自己的值来获得它。此外,它是宽度/高度;)
x = 100vw - 2 * 3em = 100vw - 6em
r = 224px/24px = 9.333... = 28 / 3
y = x / r
= (100vw - 6em) / (28 / 3)
= (100vw - 6em) * 3 / 28
= (300vw - 18em) / 28
= (75vw - 4.5rem) / 7
砰!成功了!我写了
font-size: calc((75vw - 4.5rem) / 7)
到我的标题,它在每个视口中都调整得很好。
但它是如何工作的?
我们需要一些常量。100vw表示视口的全宽,我的目标是建立带有一些填充的全宽标头。
比率。在一个视口中获得一个宽度和高度,我就得到了一个可以使用的比例,而通过这个比例,我知道在其他视口宽度中的高度应该是多少。用手计算它们需要大量的时间,至少需要大量的带宽,所以这不是一个好答案。
结论
我想知道为什么没有人知道这一点,有些人甚至告诉我,这是不可能修补CSS的。我不喜欢在调整元素时使用JavaScript,所以我不接受JavaScript(并忘记jQuery)的答案而不进行更多挖掘。总而言之,这很好,这是在网站设计中实现纯CSS的一步。
我很抱歉,我的文本中有任何不寻常的惯例,我不是英语母语,而且我对编写Stack Overflow答案也很陌生。
还应该注意的是,我们在一些浏览器中有邪恶的滚动条。例如,当使用Firefox时,我注意到100vw表示视口的全宽,在滚动条下延伸(内容无法扩展。
在艺术上,如果您需要在相同的宽度内放置两行或多行文本,而不管它们的字符数如何,那么您有很好的选择。
最好找到一个动态解决方案,这样无论输入什么文本,我们都会得到一个很好的显示。
让我们看看我们可以如何接近。
var els=document.querySelectorAll(“.divtext”),refWidth=els[0].clientWidth,refFontSize=parseFloat(window.getComputedStyle(els[0],null).getPropertyValue(“字号”);els.forEach((el,i)=>el.style.fontSize=refFontSize*refWidth/els[i].clientWidth+“px”)#集装箱{显示:内联块;背景色:黑色;衬垫:0.6vw 1.2vw;}.div文本{显示:表格;颜色:白色;字体系列:影响;字体大小:4.5vw;}<div id=“container”><div class=“divtext”>这只是一个</div><div class=“divtext”>示例</div><div class=“divtext”>向您展示</div><div class=“divtext”>您想要</div></div>
我们所做的只是获取第一行的宽度(els[0].clientWidth)和字体大小(parseFloat(window.getComputedStyle(els[0],null).getPropertyValue(“字体大小”))作为引用,然后计算后续行的字体大小。
如果容器不是主体,CSS技巧将覆盖“将文本适配到容器”中的所有选项。
如果容器是主体,则要查找的是视口百分比长度:
视口百分比长度与初始包含块的大小相关。当初始包含块的高度或宽度更改时,将相应地缩放它们。但是,当根元素上的溢出值为auto时,假设不存在任何滚动条。
值为:
vw(视口宽度的%)vh(视口高度的%)vi(根元素内联轴方向上视口大小的1%)vb(根元素块轴方向上视口大小的1%)vmin(vw或vh中较小的一个)vmax(较大或vw或vh)
1v*等于初始包含块的1%。
使用它看起来像这样:
p {
font-size: 4vw;
}
如您所见,当视口宽度增加时,字体大小也会增加,而无需使用媒体查询。
这些值是一个大小调整单位,就像px或em一样,因此它们也可以用于调整其他元素的大小,例如宽度、边距或填充。
浏览器支持非常好,但您可能需要一个后备方案,例如:
p {
font-size: 16px;
font-size: 4vw;
}
查看支持统计信息:http://caniuse.com/#feat=viewport-单位。
此外,请查看CSS技巧以获得更广泛的外观:视口大小的版式
这是一篇关于设置最小/最大尺寸并对尺寸进行更多控制的好文章:精确控制响应式印刷
下面是一篇关于使用calc()设置大小以使文本填充视口的文章:http://codepen.io/CrocoDillon/pen/fBJxu
此外,请查看这篇文章,它使用了一种称为“熔化引线”的技术来调整线条高度。CSS中的熔融铅
这是一个纯CSS解决方案,您承认断点是必要的,但也希望文本缩放:
我知道我可以添加断点,但我真的希望文本能够缩放还有额外的断点,否则。。。。
以下是一种方法:
自定义财产媒体查询断点clamp()(2022年2月的浏览器支持率为93%)计算()
如果可以使用一个通用的缩放因子来控制每个屏幕最大宽度容器内的所有文本缩放,则只需按最大宽度缩放自定义属性,并将此因子应用于1计算。
基本设置如下所示:
:root {
--scaling-factor: 1
}
.parent {
font-size: 30px
}
.largest {
font-size: clamp(60%, calc(var(--scaling-factor) * 100%), 100%);
}
.middle {
font-size: clamp(60%, calc(var(--scaling-factor) * 85%), 100%);
}
.smallest {
font-size: clamp(60%, calc(var(--scaling-factor) * 70%), 100%);
}
然后嵌套您的媒体查询,如下所示(或断点所需的任何内容):
@media (max-width: 1200px) {
:root {
--scaling-factor: 0.9
}
@media (max-width: 800px) {
:root {
--scaling-factor: 0.8
}
@media (max-width: 600px) {
:root {
--scaling-factor: 0.5 /* nope, because the font-size is floored at 60% thanks to clamp() */
}
}
}
}
这将最小化媒体查询标记。
优势
一个自定义属性控制所有缩放。。。无需为每个媒体断点添加多个声明使用clamp()设置了字体大小的下限,这样可以确保文本永远不会太小(这里的下限是父字体大小的60%)
请查看此JSFiddle演示。调整窗口大小,直到宽度最小,段落的字体大小都相同。