动态替换css文件(并将新样式应用于页面)

Xeo*_*eos 56 html javascript css jquery

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

如何删除对light.cssJS的引用并删除所有应用的样式,然后dark.css从中加载并应用所有样式?我不能简单地重置所有元素,因为一些样式是通过不同的css文件应用的,有些是由JS动态生成的.没有重新加载页面,有没有一种简单而有效的方法呢?香草JS是首选,但我会使用jQuery进行后续处理,所以jQ也没关系.

sam*_*sam 73

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

在我阅读规范时,您应该能够通过将其disabled属性从true 更改为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>
Run Code Online (Sandbox Code Playgroud)

设置和切换 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>
Run Code Online (Sandbox Code Playgroud)

切换 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>
Run Code Online (Sandbox Code Playgroud)

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

(避免非标准<link disabled>.虽然设置HTMLLinkElement#disabled是好的.)

  • 不幸的是,设置`disabled`作为一个属性被推文:"使用禁用作为HTML属性是非标准的,仅供某些浏览器使用(W3#27677).不要使用它." - > https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-disabled (8认同)
  • 只是为了澄清@Daniel所说的,HTML属性是非标准的,但根据Mozilla,DOM属性IS.因此,以上述方式使用javascript切换它实际上是符合标准的.除非我遗漏了一些东西,否则这应该是公认的答案. (3认同)
  • 改为`rel = alternate`,谢谢@Daniel (2认同)

Mat*_*son 54

您可以创建一个新链接,并用新链接替换旧链接.如果将它放在一个函数中,您可以在需要的地方重用它.

Javascript:

function changeCSS(cssFile, cssLinkIndex) {

    var oldlink = document.getElementsByTagName("link").item(cssLinkIndex);

    var newlink = document.createElement("link");
    newlink.setAttribute("rel", "stylesheet");
    newlink.setAttribute("type", "text/css");
    newlink.setAttribute("href", cssFile);

    document.getElementsByTagName("head").item(0).replaceChild(newlink, oldlink);
}
Run Code Online (Sandbox Code Playgroud)

HTML:

<html>
    <head>
        <title>Changing CSS</title>
        <link rel="stylesheet" type="text/css" href="positive.css"/>
    </head>
    <body>
        <a href="#" onclick="changeCSS('positive.css', 0);">STYLE 1</a> 
        <a href="#" onclick="changeCSS('negative.css', 0);">STYLE 2</a>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

为简单起见,我使用了内联javascript.在制作中,您可能希望使用不显眼的事件侦听器.

  • 我认为简单地更新`href`属性也可以起作用:`oldlink.href = cssFile; //完成 (6认同)
  • 在切换 css 文件时,下载文件和渲染样式之间的间隙会导致 html 没有样式。我想,应该有一个默认样式表,它添加基本样式,始终存在。移动浏览器需要花费很多时间来替换 CSS 样式表。此外,给定 jekyll 生成的静态网站,不同页面的链接索引可能会有所不同 (3认同)

dav*_*rey 9

如果在link元素上设置ID

<link rel="stylesheet" id="stylesheet" href="stylesheet1.css"/>
Run Code Online (Sandbox Code Playgroud)

你可以用Javascript来定位它

document.getElementsByTagName('head')[0].getElementById('stylesheet').href='stylesheet2.css';
Run Code Online (Sandbox Code Playgroud)

要不就..

document.getElementById('stylesheet').href='stylesheet2.css';
Run Code Online (Sandbox Code Playgroud)

这是一个更彻底的例子:

<head>
    <script>
    function setStyleSheet(url){
       var stylesheet = document.getElementById("stylesheet");
       stylesheet.setAttribute('href', url);
    }
    </script>

    <link id="stylesheet" rel="stylesheet" type="text/css" href="stylesheet1.css"/>
</head>
<body>
    <a onclick="setStyleSheet('stylesheet1.css')" href="#">Style 1</a>
    <a onclick="setStyleSheet('stylesheet2.css')" href="#">Style 2</a>
</body>
Run Code Online (Sandbox Code Playgroud)


Kri*_*hna 7

使用jquery你绝对可以交换css文件.按下按钮执行此操作.

var cssLink = $('link[href*="light.css"]');
cssLink.replaceWith('<link href="dark.css" type="text/css" rel="stylesheet">');
Run Code Online (Sandbox Code Playgroud)

或者作为山姆的答案,这也有效.这是jquery语法.

$('link[href*="light.css"]').prop('disabled', true);
$('link[href*="dark.css"]').prop('disabled', false);
Run Code Online (Sandbox Code Playgroud)


voi*_*oid 5

这个问题已经很老了但是我建议一种这里没有提到的方法,你将在HTML中包含两个CSS文件,但CSS会像

light.css

/*** light.css ***/

p.main{
   color: #222;
}

/*** other light CSS ***/
Run Code Online (Sandbox Code Playgroud)

dark.css会是一样的

/*** dark.css ***/

.dark_layout p.main{
   color: #fff;
   background-color: #222;
}

/*** other dark CSS ***/
Run Code Online (Sandbox Code Playgroud)

basicall在dark.css中的每个选择器都将是一个孩子 .dark_layout

然后,如果有人选择更改网站的主题,您需要做的就是更改body元素的类.

$("#changetheme").click(function(){
   $("body").toggleClass("dark_layout");
});
Run Code Online (Sandbox Code Playgroud)

现在,一旦用户点击,您的所有元素都将具有暗css #changetheme.如果您使用任何类型的CSS预处理器,这很容易做到.

您还可以为背景和颜色添加CSS动画,这使得过渡非常平滑.