javascript - 即时替换 css 文件(并将新样式应用于页面)

标签 javascript jquery html css

我有一个页面有 <link>在加载名为 light.css 的 CSS 的 header 中.我还有一个名为 dark.css 的文件.我想要一个按钮来一起交换页面的样式(css 文件中使用了 40 个选择器,有些在两个文件中不匹配)。

如何删除对 light.css 的引用使用 JS 并删除所有应用的样式,然后加载 dark.css并应用其中的所有样式?我不能简单地重置所有元素,因为有些样式是通过不同的 css 文件应用的,有些是由 JS 动态生成的。有没有一种简单而有效的方法可以在不重新加载页面的情况下做到这一点? Vanilla JS 更可取,但无论如何我都会使用 jQuery 进行后续处理,所以 jQ 也可以。

最佳答案

您可以在文档中包含所有样式表,然后根据需要激活/停用它们。

在我阅读规范时,您应该能够 activate an alternate stylesheet by changing its disabled property from true to false , 但似乎只有 Firefox 能正确地做到这一点。

所以我认为您有几个选择:

切换rel=alternate

<link rel="stylesheet"           href="main.css">
<link rel="stylesheet alternate" href="light.css" id="light" title="Light">
<link rel="stylesheet alternate" href="dark.css"  id="dark"  title="Dark">

<script>
function enableStylesheet (node) {
  node.rel = 'stylesheet';
}

function disableStylesheet (node) {
  node.rel = 'alternate stylesheet';
}
</script>

设置和切换disabled

<link rel="stylesheet" href="main.css">
<link rel="stylesheet" href="light.css" id="light" class="alternate">
<link rel="stylesheet" href="dark.css"  id="dark"  class="alternate">

<script>
function enableStylesheet (node) {
  node.disabled = false;
}

function disableStylesheet (node) {
  node.disabled = true;
}

document
  .querySelectorAll('link[rel=stylesheet].alternate')
  .forEach(disableStylesheet);
</script>

切换media=none

<link rel="stylesheet" href="main.css">
<link rel="stylesheet" href="light.css" media="none" id="light">
<link rel="stylesheet" href="dark.css"  media="none" id="dark">

<script>
function enableStylesheet (node) {
  node.media = '';
}

function disableStylesheet (node) {
  node.media = 'none';
}
</script>

您可以使用 getElementById 选择样式表节点, querySelector

(避免使用非标准的 <link disabled> 。不过设置 HTMLLinkElement#disabled 没问题。)

关于javascript - 即时替换 css 文件(并将新样式应用于页面),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19844545/

相关文章:

javascript - 如何从组件 <video></video> 获取帧

javascript - 正则表达式日期中的斜杠和反斜杠

javascript - 尝试生成特定范围内的随机整数,然后将其显示为内联

javascript - 使用 jQuery 创建新元素的正确方法是什么?

html - 如何使用 CSS 为所有浏览器垂直居中 div 元素?

javascript - 无法使用 jQuery 删除带有 id 的 div

javascript - 有什么方法可以保持按下 html 按钮?

javascript - 如何在可用时使 Angular.js 应用离线并与服务器同步

jquery - 将 jQuery 单击事件分配给正文中除少数 div 及其子元素之外的所有内容

html - 如何强制 Flash 崩溃以进行测试?