如何使用 Javascript 加载 CSS 文件?

IT技术 javascript html css dhtml
2021-02-07 02:18:32

是否可以使用 Javascript 将 css 样式表导入 html 页面?如果是这样,怎么做?

PS javascript 将托管在我的网站上,但我希望用户能够放入<head>他们网站标签,并且它应该能够将托管在我的服务器上的 css 文件导入当前网页。(css 文件和 javascript 文件都将托管在我的服务器上)。

6个回答

这是做这件事的“老派”方式,希望它适用于所有浏览器。理论上,setAttribute不幸的是,您会使用IE6 并不一致地支持它。

var cssId = 'myCss';  // you could encode the css path itself to generate id..
if (!document.getElementById(cssId))
{
    var head  = document.getElementsByTagName('head')[0];
    var link  = document.createElement('link');
    link.id   = cssId;
    link.rel  = 'stylesheet';
    link.type = 'text/css';
    link.href = 'http://website.com/css/stylesheet.css';
    link.media = 'all';
    head.appendChild(link);
}

此示例检查 CSS 是否已添加,因此只添加一次。

将该代码放入 javascript 文件中,让最终用户简单地包含 javascript,并确保 CSS 路径是绝对路径,以便从您的服务器加载。

香草JS

这是一个使用纯 JavaScripthead根据 URL 的文件名部分将 CSS 链接注入元素的示例

<script type="text/javascript">
var file = location.pathname.split( "/" ).pop();

var link = document.createElement( "link" );
link.href = file.substr( 0, file.lastIndexOf( "." ) ) + ".css";
link.type = "text/css";
link.rel = "stylesheet";
link.media = "screen,print";

document.getElementsByTagName( "head" )[0].appendChild( link );
</script>

在结束head标记之前插入代码,CSS 将在页面呈现之前加载。使用外部 JavaScript ( .js) 文件将导致出现无样式内容 ( FOUC )的 Flash

@jchook 我能够通过link.onload = function(){ ... }在附加之前添加来附加回调
2021-03-15 02:18:32
@jonnybojangles 使用 jQuery.noConflict 意味着将对 jQuery 的所有引用重命名为 $。为 CSS 加载器使用不同的变量名会简单得多。
2021-03-26 02:18:32
也许在文档快捷方式中使用与 $ 不同的字符会更好,因为它很容易干扰 jQuery(就像我的情况一样);)
2021-03-27 02:18:32
加载 CSS 文件后运行回调怎么样?
2021-04-05 02:18:32
要可靠地做到这一点要复杂得多。流行的 Javascript 库现在通常具有某种形式的加载 javascript 和带有回调的样式表。例如,请参阅YUI Get
2021-04-05 02:18:32

如果您使用 jquery:

$('head').append('<link rel="stylesheet" type="text/css" href="style.css">');
这仅在页面加载之前注入样式表时才有效,对吗?当我在已加载页面上的控制台内运行此命令时,该页面带有我托管在 dropbox 上的 css 文件,它将无法正常工作。知道我如何使这项工作:$('head').append('<link rel="stylesheet" type="text/css" href="https://dl.dropboxusercontent.com/s/ep1nzckmvgjq7jr/remove_transitions_from_page.css">');
2021-03-15 02:18:32

我想这样的脚本会做:

<script type="text/javascript" src="/js/styles.js"></script>

这个JS文件包含以下语句:

if (!document.getElementById) document.write('<link rel="stylesheet" type="text/css" href="/css/versions4.css">');

如果要引用您的站点,javascript 和 css 的地址需要是绝对地址。

这篇“对使用分支技术的 CSS hacks 说不”文章中讨论了许多 CSS 导入技术

但是“使用 JavaScript 动态添加 Portlet CSS 样式表”一文也提到了 CreateStyleSheet 的可能性(IE 的专有方法):

<script type="text/javascript">
//<![CDATA[
if(document.createStyleSheet) {
  document.createStyleSheet('http://server/stylesheet.css');
}
else {
  var styles = "@import url(' http://server/stylesheet.css ');";
  var newSS=document.createElement('link');
  newSS.rel='stylesheet';
  newSS.href='data:text/css,'+escape(styles);
  document.getElementsByTagName("head")[0].appendChild(newSS);
}
//]]>
这是我想添加document.createStyleSheet()到没有它的浏览器中的内容:stackoverflow.com/questions/524696/...
2021-03-17 02:18:32
@VonC,是否有一个函数可以直接获取<style>元素而不是假设它是<head>via的第一个子元素("head")[0]
2021-03-25 02:18:32
不确定在哪种情况下,但在某些情况下,document.write不推荐这样做,因为它会覆盖您网站的整个主体。
2021-04-02 02:18:32
@Pacerier 我相信你会发现在groups.google.com/forum/# ! topic/prototype-scriptaculous/... 中讨论过例如:var style = document.getElementsByTagName("style")[0];
2021-04-09 02:18:32

Element.insertAdjacentHTML具有很好的浏览器支持,可以在一行中添加样式表。

document.getElementsByTagName("head")[0].insertAdjacentHTML(
    "beforeend",
    "<link rel=\"stylesheet\" href=\"path/to/style.css\" />");

如果您想知道(或等待)样式本身已加载,则此方法有效:

// this will work in IE 10, 11 and Safari/Chrome/Firefox/Edge
// add ES6 poly-fill for the Promise, if needed (or rewrite to use a callback)

let fetchStyle = function(url) {
  return new Promise((resolve, reject) => {
    let link = document.createElement('link');
    link.type = 'text/css';
    link.rel = 'stylesheet';
    link.onload = function() { resolve(); console.log('style has loaded'); };
    link.href = url;

    let headScript = document.querySelector('script');
    headScript.parentNode.insertBefore(link, headScript);
  });
};
我如何使用这个
2021-03-13 02:18:32
你会做 fetchStyle(url).then(function() {stuff go here}) 阅读Promise
2021-03-28 02:18:32