web 组件 shadow dom 中的 rem

Eri*_*ric 3 javascript css font-size web-component shadow-dom

我们知道我们可以将font-sizeon设置htmlrem普通 DOM 节点的基础,我使用这个技巧使我的应用程序的字体更加灵活,可以通过 js 动态更改。

然而,当我创建一个 web 组件时,我发现rem里面的 shadow DOM 总是指 16px,即使我尝试*{ font-size:72px }在 shadow DOM 内部添加一个样式。16px 是常见的浏览器默认字体大小。

这是一个简单的演示:https : //jsfiddle.net/qmacwb6r/

<html>
<head>
<script>
var template =`
<style>
* {
    font-size: 72px;
}
div {
    font-size:2rem;
}
</style>
<div>
    I am 2rem = 2*broser default
</div>
`
class TestTemplate extends HTMLElement {
    constructor(){
        super();
        this.rt = this.attachShadow({mode:"open"});
        this.rt.innerHTML = template;
    }
}
customElements.define("test-component", TestTemplate);
</script>
</head>
<body>
<test-component></test-component>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我也尝试getRootNode()在控制台中调用。

对于普通 DOM 节点,它返回 HTMLElement,而对于影子 DOM 节点,它返回 ShadowRoot,与 HTMLElement 不同,它不能设置样式。

是否可以使 shadow DOM 中节点的 rem 基础字体可变且可控?

Int*_*lia 6

除非我遗漏了某些东西,否则rem总是基于为<html>标签设置的字体大小,如下所示:

html {
  font-size: 100px;
}
Run Code Online (Sandbox Code Playgroud)

与上面的大小1rem相等100px

这是我将font-sizefor设置为html4px的示例。然后rem在组件中使用值。

html {
  font-size: 100px;
}
Run Code Online (Sandbox Code Playgroud)
var template = `
<style>
:host, :root { font-size: 48px; }
.rem2 { font-size:2rem; }
.rem3 { font-size:3rem; }
</style>
<p>I am 48px Times</p>
<div class="rem2">I am 2rem = 2*browser default</div>
<div class="rem3">I am 3rem = 3*browser default</div>
`;

class TestTemplate extends HTMLElement {
  constructor(){
    super();
    this.rt = this.attachShadow({mode:"open"});
    this.rt.innerHTML = template;
  }
}
customElements.define("test-component", TestTemplate);
Run Code Online (Sandbox Code Playgroud)
html {
  font: 4px Courier;
}

body {
 font: 24px Tahoma;
}
Run Code Online (Sandbox Code Playgroud)

运行它,然后查看 DevTools 计算选项卡。您将看到: 1. 文本I am 2rem = 2*browser default的字体大小仅为 8px 2.文本的字体大小为I am 3rem = 3*browser default12px;

font-size用于body:host上没有任何影响rem的大小。只有font-size<html>标签一样。