这可能不是非常实用,但如果您希望字体直接与父元素相关联,而不需要任何监听/循环(间隔)来读取div /页面大小的JavaScript,则有一种方法。 IFrame。
iframe中的任何内容都将考虑到iframe的大小作为视口的大小。因此,诀窍就是制作一个iframe,其宽度是您希望文本的最大宽度,并且其高度等于特定文本的纵横比*最大高度。
撇开视口单位不能与文本的父级单位并存(例如,使%大小像其他人一样行为)的限制,视口单位确实提供了一个非常强大的工具:能够获取最小/最大维度。在其他任何地方都无法做到这一点-您不能说...将此div的高度设置为父元素的宽度*某个值。
话虽如此,诀窍是使用vmin,并设置iframe大小,以便在高度是限制维度时[fraction]*总高度是良好的字体大小,在宽度是限制维度时[fraction]*总宽度。这就是为什么高度必须是宽度和纵横比的乘积的原因。
对于我的特定示例,您有
.main iframe{
position: absolute;
top: 50%;
left: 50%;
width: 100%;
height: calc(3.5 * 100%);
background: rgba(0, 0, 0, 0);
border-style: none;
transform: translate3d(-50%, -50%, 0);
}
使用这种方法的小麻烦在于您必须手动设置iframe的CSS。如果您附加整个CSS文件,那么对于许多文本区域来说,这将占用大量带宽。因此,我直接从我的CSS中附加所需的规则。
var rule = document.styleSheets[1].rules[4];
var iDoc = document.querySelector('iframe').contentDocument;
iDoc.styleSheets[0].insertRule(rule.cssText);
您可以编写一个小函数,以获取影响文本区域的CSS规则/所有CSS规则。
我无法想到另一种方法来完成它,而不需要一些循环/监听JavaScript。真正的解决方案是浏览器提供一种作为父容器函数的文本缩放方式,并提供相同的vmin/vmax类型功能。
JSFiddle:
https://jsfiddle.net/0jr7rrgm/3/
(单击一次将红色正方形锁定到鼠标上,再次单击将其释放)
大多数在小提琴中的JavaScript只是我的自定义单击拖动函数。