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然后删除它,你可以在新css中的所有元素前添加一个Class / an id,然后只需切换css基本节点的class / id(如body标签) .
您可以使用此解决方案初始加载更多css文件,但您有一种更动态的切换css布局的方法 .
60
如果您想知道(或等待)样式本身已加载,这将起作用:
// 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);
});
};
function LoadCSS( cssURL ) {
// 'cssURL' is the stylesheet's URL, i.e. /css/styles.css
return new Promise( function( resolve, reject ) {
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.href = cssURL;
document.head.appendChild( link );
link.onload = function() {
resolve();
console.log( 'CSS has loaded!' );
};
} );
}
那么显然你想在CSS加载后完成一些事情 . 您可以调用CSS加载后需要运行的函数,如下所示:
LoadCSS( 'css/styles.css' ).then( function() {
console.log( 'Another function is triggered after CSS had been loaded.' );
return DoAfterCSSHasLoaded();
} );
15 回答
这是"old school"这样做的方式,希望能在所有浏览器中使用 . 从理论上讲,你会使用
setAttribute
,不幸的是,IE6并不支持它 .此示例检查是否已添加CSS,因此仅添加一次 .
将该代码放入javascript文件中,让最终用户只包含javascript,并确保CSS路径是绝对的,以便从服务器加载 .
VanillaJS
下面是一个使用普通JavaScript根据URL的文件名部分将CSS链接注入
head
元素的示例:在结束
head
标记之前插入代码,并在呈现页面之前加载CSS . 使用外部JavaScript(.js
)文件将导致出现无格式内容(FOUC)的Flash .如果你使用jquery:
我想像这样的脚本会做的事情:
该JS文件包含以下语句:
如果要引用您的网站,javascript和css的地址必须是绝对的 .
本文"Say no to CSS hacks with branching techniques"文章讨论了许多CSS导入技术 .
但"Using JavaScript to dynamically add Portlet CSS stylesheets"文章还提到了CreateStyleSheet的可能性(IE的专有方法):
调用以下函数以动态加载CSS或JavaScript文件 .
传递名称为
filename
参数的完整文件路径 .我知道这是一个非常古老的线程,但这是我的5美分 .
根据您的需求,还有另一种方法可以做到这一点 .
我有一个案例,我希望css文件只活动一段时间 . 像css切换 . 激活css然后在另一个事件之后将其取消激活 .
不是动态加载css然后删除它,你可以在新css中的所有元素前添加一个Class / an id,然后只需切换css基本节点的class / id(如body标签) .
您可以使用此解决方案初始加载更多css文件,但您有一种更动态的切换css布局的方法 .
如果您想知道(或等待)样式本身已加载,这将起作用:
Element.insertAdjacentHTML具有非常好的浏览器支持,并且可以在一行中添加样式表 .
有一个通用的jquery插件可以根据需要加载css和JS文件同步和asych . 它还会跟踪已经加载的内容:)请参阅:http://code.google.com/p/rloader/
这里's a way with jQuery'的元素创建方法(我的偏好)和回调
onLoad
:在现代浏览器中,您可以像这样使用
promise
. 创建一个带有promise的加载器函数:那么显然你想在CSS加载后完成一些事情 . 您可以调用CSS加载后需要运行的函数,如下所示:
有用的链接,如果你想深入了解它的工作原理:
Official docs on promises
Useful guide to promises
A great intro video on promises
YUI library可能就是你要找的东西 . 它还支持跨域加载 .
如果你使用jquery,this plugin会做同样的事情 .
使用此代码:
您可以使用此YUI library或使用此article to implement
下面是一个用于加载JS和/或CSS的完整代码
我正在使用百里香,这很好用 . 谢谢