问题简述:
我正在寻找一种在影子DOM中设置基于字体大小的值的方法(类似于将某些属性设置为em值),以使元素相对于影子宿主进行缩放,无论影子DOM中父元素的字体大小如何。与rem值类似的某些东西,但以影子作为根,而不是HTML根。
这样做的原因是为了能够在一个地方缩放内容(例如使用影子DOM插入的小部件)。如果基于字体大小的属性可以通过这种方式进行缩放,则整个小部件就可以在每个上下文中缩放,而无需设置大量CSS值以使其适合于每个位置。
问题详述:
我正在寻找一种根据DOM中给定元素调整文本(字体大小)大小的方法,以便根据此包装元素缩放内容的不同部分(适用于小部件等)。这不仅适用于实际文本,还经常基于字体大小来调整许多CSS值,因此元素的视觉布局随着文本的大小而缩放(例如填充,边框半径和阴影)。如果所有内容都基于em值,这可能会有点混乱。如果元素内存在多级字体大小继承,并且我想扩大第一级而不更改第二级,则需要在DOM中放大第一级的em,同时减少任何第二级元素(基于该第一级计算)以使子元素的文本保持相同大小。在许多情况下,这是不太理想的。
Root EM(rem)上的一个好解决方案是基于东西,因此更改DOM的一个级别不会影响子元素。但是,如果我想在一个地方放大/缩小包裹元素内所有文本的大小(而不影响页面上的其他元素),则需要放大/缩小包裹元素内所有字体大小的REM值。
我最近开始研究带有Shadow DOM和模板的Web组件。在模板标记中,CSS被封装,这很棒,因为可以单独为该框/小部件/组件设计其样式,而无需考虑其余设计,不需要继承的值等等。最后,一种制作独立组件以构建网页的好方法。但是,如果我可以为模板本身设置一种模板根字体大小就好了。因此,如果我将模板内的某个元素设置为字体大小2rem(或任何其他类似单位),则该元素的字体大小将是该模板的根字体大小的2倍,而不管该模板在哪个主机元素中使用,也不管页面根(html元素)的字体大小如何。
我尝试在模板中使用REM值时,它仍然基于页面根(HTML标记)的字体大小。我还尝试使用vw值,但这也基于整个视口,而不仅仅是封装区域(影子根)。
我查看了许多关于Shadow DOM的文章,但我无法找到任何解决此问题的方法。有什么建议吗?
发生了什么(简化的例子):
<html style="font-size: 16px">
<body style="font-size: 12px">
I am 12px large
<!-- em, based on the body in this case -->
<div style="font-size: 1.5em">
I am 18px large
<div style="font-size: 1.5em">
I am 27px large
</div>
</div>
<!-- rem, based on the styles of the html element -->
<div style="font-size: 1.5rem">
I am 24px large
<div style="font-size: 1.5rem">
I am 24px large
</div>
</div>
</body>
</html>
我想要的是:
<html style="font-size: 16px">
<body style="font-size: 12px">
I am 12px large
<div style="font-size: 1.5em">
I am 18px large
</div>
<div style="font-size: 1.5rem">
I am 24px large
</div>
<template> <!-- Simulates that it is inserted into the DOM by using shadow elements -->
<style>
:root{ /* Or something like that */
font-size: 20px; /* This is the simulated "template root fontsize" */
}
</style>
<div style="font-size: 1.5trem"> <!-- Based on the template root fontsize -->
I am 30px large
<div style="font-size: 2trem">
I am 40px large
</div>
</div>
</template>
</body>
</html>
这将为组件内所有相对字体大小提供一个控制位置(如上例中的 :root 部分),然后可以将其与 px 或其他常规 CSS 值等非相对字体大小结合使用。