Web组件影子DOM中的REM

rem in web component shadow dom(Web组件影子DOM中的REM)
本文介绍了Web组件影子DOM中的REM的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们知道可以将font-sizeon[2-1]>设置为正常DOM节点中的rembase,我使用这个技巧使我的应用程序的字体更灵活,随js动态更改。 然而,当我创建一个Web组件时,我发现阴影DOM中的rem总是指向16px,即使我尝试在阴影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>

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

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

是否可以使阴影DOM中节点的rem基本字体可变且可控?

推荐答案

除非我遗漏了什么rem始终基于为<html>标记设置的字体大小:

html {
  font-size: 100px;
}

以上大小1rem等于100px

这里有一个我将htmlfont-size设置为4px的示例。然后在组件中使用rem值。

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
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);
html {
  font: 4px Courier;
}

body {
 font: 24px Tahoma;
}
<div>Before</div>
<test-component></test-component>
<div>After</div>

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

font-size:hostfont-sizerem大小没有任何影响。只有<html>标记中的font-size才有。

这篇关于Web组件影子DOM中的REM的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

layui表格:设置表头居中,内容居左的实例代码:表头在属性中控制,内容直接用css样式控制 { field: 'Result', title: '结果', align: 'center', width: '60%', templet: function (d) { return 'div style="text-align:left"' + d.Result + '/div' }},
本文给大家介绍Javascript js中实现和PHP一样的时间戳格式化函数的方法,具有一定的参考借鉴价值,需要的朋友可以参考下,我们知道在php中有一个date()函数,可以方便的把时间戳格式化为时间字符串。可是在js中,我们要想实现这种效果,要写好
需求是模板字符串中不允许出现script 标签、不允许有javascript: 和 .js 文件引用,主要方法如下: clearScriptTag (str) { const reg = /script[^]*([\S\s]*?)\/script/gim; // 清除标签内 相关 xss 安全代码 const reg1 = /javascript:/gim; const reg2 = / *.js/gim; if (reg.test(str)) { str
javascript中Replace全部替换字符用法实例代码,替换1次和多次,主要是正则表达式 var r= "1\n2\n3\n";//将字母\n替换成分号alert(r.replace("\n",";"));//结果:1;2\n3\n 只替换了第一个var r= "1\n2\n3\n";//将字母\n替换成分号alert(r.replace(/\n/g, ";"));//结果:1;2;3; replac
js输出当前日期和时间的实例代码,具体实例代码如下,有兴趣的朋友可以尝试运行下。 !doctype htmlhtml lang="en" head meta charset="UTF-8" title获取当前时间/title /head body script type="text/javascript" /** *获取当前时间 *format=1精确到天 *format=2精确到秒 */ function
p您的性别:/p div class="radio-sex" input type="radio" id="sex1" name="sex" label for="sex1"/label span男/span /div div class="radio-sex" input type="radio" id="sex2" name="sex" label for="sex2"/label 女 /divstyle.radio-sex { position: relative; display: inline-