javascript - 在JS中插入CSS链接标签时阻止页面渲染

标签 javascript html css render-blocking

我希望允许我的用户在“浅色”主题(默认)和“深色”主题之间进行选择,“深色”主题是通过添加另一个 CSS 文件提供的。

这是 JavaScript 代码。正如您所看到的,我尝试在将来提供更多主题。

var themes = {
    "dark": "HTML/css/dark-theme.css"
};

var themeCssLink = document.createElement('link');
themeCssLink.setAttribute('rel', 'stylesheet');
document.getElementsByTagName('head')[0].appendChild(themeCssLink);

var theme = localStorage.getItem('theme');
if (!(theme in themes))
    theme = null;
if (theme !== null)
    themeCssLink.setAttribute('href', themes[theme])

问题是页面在深色主题 CSS 加载之前渲染,导致明亮的白色闪光,我想知道如何防止这种情况。

我尝试的另一件事是在 HTML 中放置一个虚拟 LINK 元素:

<link href='' rel='stylesheet' type='text/css' id='theme-css'>

然后只需修改 JavaScript 中的 href:

var themeCssLink = document.getElementById('theme-css');
var theme = localStorage.getItem('theme');
if (!(theme in themes))
    theme = null;
if (theme !== null)
    themeCssLink.setAttribute('href', themes[theme]);

不幸的是,这具有相同的效果。

如何说服浏览器阻止渲染,直到加载主题 CSS 文件?

最佳答案

只需将 javascript 脚本放在 css 之前,这样您的主题就会在主 css 之前加载。

如果你这样做,你必须小心你的 main.css,这样它就不会覆盖你之前加载的主题 css。

关于javascript - 在JS中插入CSS链接标签时阻止页面渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44750420/

相关文章:

javascript - 我应该如何捕获一堆下拉菜单(在表中)的变化并存储它?

javascript - 编辑字符串数组,只保留值的第一个字母

javascript - typescript :如何键入 Ramda R.prop(key) T' 不可分配给 '(s: {}) => {} 类型的参数

javascript - jQuery:将输入文本从选项卡传送到另一个选项卡

javascript - 打印多页 html,动态编号页面和页脚

javascript - 不透明度设置为 0 时显示的 Div 内容

html - 使用 CSS HTML 右对齐图像

javascript - 使 sap.m.CustomTile 可根据分辨率调整大小,例如从 500px 到 320px

html - <li>里面的<div>在IE中显示不正确

html - 绝对 flex 盒容器中 flex 元素中溢出隐藏元素的高度