【问题标题】:Dynamically load stylesheets动态加载样式表
【发布时间】:2017-06-26 19:31:35
【问题描述】:

我知道您可以将样式表放在页面的头部,但我喜欢将它们放在单独的文件中。现在我正在使用单页应用程序。

在 SPA 中,内容是动态的,对吧?所以我不想用链接标签导入头部的所有样式表。我可以在需要时以某种方式导入样式表吗?

我的意思是,我可以在正文中有一个链接,这样每当我的 SPA 加载一些动态内容时,样式表也会被加载?这样即使没有加载动态内容,我也不必加载所有样式表..

我再次强调:只要加载内容,就会加载样式。

我知道我可以借助这样的内联样式来做到这一点:

~PSEUDO CODE 
<tagname style="somestyle"></tagname>

但是我也可以导入一些动态文件吗?我也可以在正文中添加link 标签吗?就算有效,是标准的吗?

【问题讨论】:

    标签: html css import


    【解决方案1】:

    您应该研究异步加载资产,例如著名的 google-analytics 代码。您可以使用 Javascript 加载外部样式表。

    JavaScript

    (function(){
      var styles = document.createElement('link');
      styles.rel = 'stylesheet';
      styles.type = 'text/css';
      styles.media = 'screen';
      styles.href = 'path/to/css/file';
      document.getElementsByTagName('head')[0].appendChild(styles);
    })();
    

    第 1 行和第 7 行为变量创建了一个新范围,这样局部变量就不会与全局范围的变量发生冲突或覆盖。这不仅仅是最佳实践。此解决方案还假设您的 html 中有 &lt;head&gt; 标记。

    【讨论】:

    • 好的,谢谢,但它会实际加载它还是只是在文档中创建一个虚拟节点。结构?
    • 它将加载,使用开发工具将其放入控制台,并带有示例链接,例如来自 cdnjs.com 的 cdn CSS 文件,并在网络选项卡中查看证明
    • 总有一个头,即使你没有明确地创建一个。
    • 有什么方法可以知道动态添加的样式表何时实际加载?我正在添加受样式表影响的内容,这看起来很糟糕,因为它在样式表完成加载之前没有样式可见
    【解决方案2】:

    您可以使用 java 脚本在头部区域添加/删除/编辑链接标签以添加/删除样式表文件。

    代码示例:

    在头部添加样式表:

    var newstyle = document.createElement("link"); // Create a new link Tag
    // Set some attributes:
    newstyle.setAttribute("rel", "stylesheet");
    newstyle.setAttribute("type", "text/css");
    newstyle.setAttribute("href", "filename.css"); // Your .css File
    document.getElementsByTagName("head")[0].appendChild(newstyle);
    

    要删除或编辑样式表,您可以为每个样式表指定一个 id 属性并通过以下方式访问它:

    document.getElementById('styleid')
    

    或者您可以遍历头部区域中的所有链接标签并找到正确的标签,但我建议使用 ID 的解决方案;)

    现在您可以更改 href 属性:

    document.getElementById('styleid').setAttribute("href", "newfilename.css");
    

    或者你可以删除完整的标签:

    var styletorem = document.getElementById('styleid');
    styletorem.parentNode.removeChild(styletorem)
    

    【讨论】:

    • 我可以动态地做到这一点吗?我的意思是,一开始我会导入“main.css”,但是如何在加载内容时动态导入文件
    • 是的。浏览器应重新呈现有关 dom 更改的当前视图。因此,如果您添加或删除样式表,更改会直接在浏览器中发生。您也可以使用浏览器的开发者控制台对此进行测试。只需在此处删除、添加或更改样式表的链接标签,即可直接看到样式更改
    • 你能举个例子吗,我更理解你看到的代码:)
    【解决方案3】:

    我只是尝试为我的网页添加动态样式。我用了一个按钮。单击它后,CSS 将使用 Javascript 中的方法导入。

    在我的 html 中,我有:

    <button type="button" onclick="changeStyle()"> CLICK TO SEE THE MAGIC!! </button>
    

    然后在 Javascript 中,我有一个名为 changeStyle() 的方法:

      function changeStyle()
      {
        var styles = document.createElement('link');
        styles.type="text/css";
        styles.rel="stylesheet";
        styles.href="./css/style.css";
        document.head.appendChild(styles);
     }
    

    完美地工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多