【发布时间】:2020-08-11 04:19:07
【问题描述】:
目前正在研究暗模式功能。
我在研究暗模式功能时有一个问题。
单击深色模式按钮会更改其他标记,但不会更改 iframe 标记。
我也想对 iframe 标签应用深色模式。
我该怎么办?
下面的源码是文件中的源码。
01.文件:index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<style>
iframe {
margin:0;
padding:0;
}
.layout-01 {
border: 1px solid #ddd;
padding:10px;
margin-bottom: 20px;
background: var(--bg-color);
color: var(--font-color);
}
.iframe-layout {
border: 1px solid #ddd;
background: var(--bg-color);
color: var(--font-color);
}
.iframe-layout iframe html p {
color: var(--font-color);
}
:root {
--bg-color: #fff;
--font-color: #000;
}
html.darkmode:root {
--bg-color: #000;
--font-color: #fff;
}
</style>
</head>
<body>
<div>
<button onClick="userTheme(true);">Toogle Theme</button>
</div>
<script>
function userTheme(toggle = false) {
let userMode = localStorage.userThemeMode || 'auto';
const osMode = !!window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches ? 'dark' : 'light';
if(toggle) {
switch(userMode) {
case 'auto':
userMode = 'dark'; break;
case 'dark':
userMode = 'light'; break;
default:
userMode = 'auto';
}
localStorage.userThemeMode = userMode;
}
console.log(`current mode : ${userMode}`);
window.__THEME_MODE = userMode === 'auto' ? osMode : userMode;
document.getElementsByTagName('html')[0].classList[window.__THEME_MODE === 'dark' ? 'add' : 'remove']('darkmode');
//document.querySelectorAll('iframe')[0].classList[window.__THEME_MODE === 'dark' ? 'add' : 'remove']('darkmode');
}
if (!!window.matchMedia) {
['light', 'dark'].forEach(mode => {
window.matchMedia(`(prefers-color-scheme: ${mode})`).addListener(e => {
if(!!e.matches) {
userTheme();
}
});
});
}
userTheme();
</script>
<div>
<div class="layout-01">
<p>text</p>
</div>
<div i="iframe-layout">
<iframe src="test.html" frameborder="0" sandbox="allow-same-origin allow-scripts" seamless></iframe>
</div>
</div>
</body>
</html>
02. test.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<style>
iframe {
margin:0;
padding:0;
}
.layout-01 {
border: 1px solid #ddd;
padding:10px;
margin-bottom: 20px;
background: var(--bg-color);
color: var(--font-color);
}
.iframe-layout {
border: 1px solid #ddd;
background: var(--bg-color);
color: var(--font-color);
}
.iframe-layout iframe html p {
color: var(--font-color);
}
:root {
--bg-color: #fff;
--font-color: #000;
}
html.darkmode:root {
--bg-color: #000;
--font-color: #fff;
}
</style>
</head>
<body>
<div>
<button onClick="userTheme(true);">Toogle Theme</button>
</div>
<script>
function userTheme(toggle = false) {
let userMode = localStorage.userThemeMode || 'auto';
const osMode = !!window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches ? 'dark' : 'light';
if(toggle) {
switch(userMode) {
case 'auto':
userMode = 'dark'; break;
case 'dark':
userMode = 'light'; break;
default:
userMode = 'auto';
}
localStorage.userThemeMode = userMode;
}
console.log(`current mode : ${userMode}`);
window.__THEME_MODE = userMode === 'auto' ? osMode : userMode;
document.getElementsByTagName('html')[0].classList[window.__THEME_MODE === 'dark' ? 'add' : 'remove']('darkmode');
//document.querySelectorAll('iframe')[0].classList[window.__THEME_MODE === 'dark' ? 'add' : 'remove']('darkmode');
}
if (!!window.matchMedia) {
['light', 'dark'].forEach(mode => {
window.matchMedia(`(prefers-color-scheme: ${mode})`).addListener(e => {
if(!!e.matches) {
userTheme();
}
});
});
}
userTheme();
</script>
<div>
<div class="iframe-layout">
<p>sdfsdfsdf</p>
</div>
</div>
</body>
</html>
【问题讨论】:
标签: javascript html jquery css