Chrome 扩展 - 如何正确(尽快)应用暗模式 CSS?
Chrome extension - how to apply dark mode CSS correctly (as soon as possible)?
好的,所以我想制作一个“深色模式”附加组件,但问题是我无法足够快地应用深色 CSS。当我重新加载网页时,它以白色背景加载了 1/2 秒,然后加载了我的深色 css。这不是问题,但在晚上我的显示器在每次重新加载页面时都会闪烁(这不是很好的用户体验)。
这是我到目前为止所拥有的:
清单(脚本加载部分):
"permissions": [
"activeTab",
"storage",
"https://www.example.com/*"
],
"content_scripts": [
{
"js": [ "jquery.min.js", "content.js" ],
"matches": [ "https://www.example.com/*"],
"run_at": "document_start"
},
{
"css": ["style.css"],
"matches": [ "https://www.example.com/*"]
}
],
"background": {
"scripts": ["background.js"],
"persistent": false
},
这是content.js
chrome.storage.sync.get({
dark: true
}, function(items) {
init(items.dark);
});
function init(options) {
var dark = options;
if(dark){
$( "body" ).addClass( "darkmode" );
if (document.readyState == 'loading') {
$( "body" ).addClass( "darkmode" );
document.addEventListener('DOMContentLoaded', function(){
$( "body" ).addClass( "darkmode" );
});
}
}
}
你看这里我在每个页面加载阶段添加了“addClass”只是为了确定。第一个工作正常,但问题是有时那行代码不会执行,因为 DOM 加载速度不够快。
在 style.css 文件中,我正在使用 css 更改样式,如下所示:
.darkmode .somediv .etc a {
color:#fff;
}
我只需要在页面加载后立即将网站背景更改为黑色,这样我就不会在开始时出现白色闪光。其余 CSS 可以在 1/2 秒后加载,没关系。
删除所有 document.readyState、DOMContentLoaded、jQuery 内容并替换为:
document.documentElement.classList.add('darkmode');
它将在 <html>
节点上添加 document_start
上已存在的 class。
请注意,更有效的方法是 register/unregister 根据存储中的开关变量动态地通过 chrome.declarativeContent API 和 RequestContentScript 操作而不是声明 content_scripts
在 manifest.json 中。此操作被标记为实验性的,但它实际上在稳定 Chrome.
中有效
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<style>
.darkmode {
background-color: #fff;
}
</style>
<link rel="preload" as="script" href="darkmode.js" crossorigin />
<script type="module" src="darkmode.js"></script>
...<!-- content script and CSS files... -->
darkmode.js
document.body.classList.add('darkmode');
好的,所以我想制作一个“深色模式”附加组件,但问题是我无法足够快地应用深色 CSS。当我重新加载网页时,它以白色背景加载了 1/2 秒,然后加载了我的深色 css。这不是问题,但在晚上我的显示器在每次重新加载页面时都会闪烁(这不是很好的用户体验)。 这是我到目前为止所拥有的: 清单(脚本加载部分):
"permissions": [
"activeTab",
"storage",
"https://www.example.com/*"
],
"content_scripts": [
{
"js": [ "jquery.min.js", "content.js" ],
"matches": [ "https://www.example.com/*"],
"run_at": "document_start"
},
{
"css": ["style.css"],
"matches": [ "https://www.example.com/*"]
}
],
"background": {
"scripts": ["background.js"],
"persistent": false
},
这是content.js
chrome.storage.sync.get({
dark: true
}, function(items) {
init(items.dark);
});
function init(options) {
var dark = options;
if(dark){
$( "body" ).addClass( "darkmode" );
if (document.readyState == 'loading') {
$( "body" ).addClass( "darkmode" );
document.addEventListener('DOMContentLoaded', function(){
$( "body" ).addClass( "darkmode" );
});
}
}
}
你看这里我在每个页面加载阶段添加了“addClass”只是为了确定。第一个工作正常,但问题是有时那行代码不会执行,因为 DOM 加载速度不够快。
在 style.css 文件中,我正在使用 css 更改样式,如下所示:
.darkmode .somediv .etc a {
color:#fff;
}
我只需要在页面加载后立即将网站背景更改为黑色,这样我就不会在开始时出现白色闪光。其余 CSS 可以在 1/2 秒后加载,没关系。
删除所有 document.readyState、DOMContentLoaded、jQuery 内容并替换为:
document.documentElement.classList.add('darkmode');
它将在 <html>
节点上添加 document_start
上已存在的 class。
请注意,更有效的方法是 register/unregister 根据存储中的开关变量动态地通过 chrome.declarativeContent API 和 RequestContentScript 操作而不是声明 content_scripts
在 manifest.json 中。此操作被标记为实验性的,但它实际上在稳定 Chrome.
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<style>
.darkmode {
background-color: #fff;
}
</style>
<link rel="preload" as="script" href="darkmode.js" crossorigin />
<script type="module" src="darkmode.js"></script>
...<!-- content script and CSS files... -->
darkmode.js
document.body.classList.add('darkmode');