CSS的条件包含,但不作为最后一个(或第一个)CSS
Conditional include of CSS, but not as last (or first) CSS
此问题有条件地添加一个CSS作为最后一个CSS链接(有效地覆盖了所有其他链接),并使用以下javascript:
<link rel="stylesheet" href="website/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="website/reveal/css/reveal.min.css">
<link rel="stylesheet" href="website/reveal/css/theme/simple.css" id="theme">
<!-- Conditionally add <link rel="stylesheet" href="website/reveal/css/print/pdf.css"> -->
<script type="text/javascript">
if (...) {
var lnk = document.createElement('link');
lnk.type='text/css';
lnk.href='website/reveal/css/print/pdf.css';
lnk.rel='stylesheet';
document.getElementsByTagName('head')[0].appendChild(lnk);
}
</script>
<link rel="stylesheet" href="website/highlight/highlight.css">
<link rel="stylesheet" href="website/optaplannerPresentation.css">
问题是:它将其添加为最后一个CSS链接,覆盖后面的2个CSS文件(包括highlight.CSS)。有没有办法将其添加到simple.css
之后,但在highlight.css
之前
有两个选项可供选择:
-
如果您正在测试的条件是使用即时可用的信息,而您的脚本元素不使用
async
或defer
,则这可能是document.write
是合理选择的罕见情况之一:<link rel="stylesheet" href="website/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="website/reveal/css/reveal.min.css"> <link rel="stylesheet" href="website/reveal/css/theme/simple.css" id="theme"> <!-- Conditionally add <link rel="stylesheet" href="website/reveal/css/print/pdf.css"> --> <script type="text/javascript"> if (...) { document.write('<link type="text/css" rel="stylesheet" href="website/reveal/css/print/pdf.css">'); } </script> <link rel="stylesheet" href="website/highlight/highlight.css"> <link rel="stylesheet" href="website/optaplannerPresentation.css">
-
如果您使用的是
async
/defer
脚本或内联不可用的信息,或者您只是不想使用document.write
,您仍然可以这样做:您可以使用以选择器结尾的属性找到通过querySelector
添加highlight.css
的link
,然后使用其parentNode
和父级的insertBefore
在其前面插入新的link
。var lnk = document.createElement('link'); lnk.type='text/css'; lnk.href='website/reveal/css/print/pdf.css'; lnk.rel='stylesheet'; var highlight = document.querySelector('link[href$="highlight.css"]'); highlight.parentNode.insertBefore(lnk, highlight);
querySelector
适用于所有现代浏览器,也适用于IE8。它返回与您给它的CSS选择器匹配的第一个元素。(还有querySelectorAll
,它返回所有匹配元素的列表。)不过,要做到这一点,代码必须在
highlight.css
的link
之后(除非它正在运行async
或在某个事件处理程序中):<link rel="stylesheet" href="website/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="website/reveal/css/reveal.min.css"> <link rel="stylesheet" href="website/reveal/css/theme/simple.css" id="theme"> <link rel="stylesheet" href="website/highlight/highlight.css"> <!-- Conditionally add <link rel="stylesheet" href="website/reveal/css/print/pdf.css"> --> <script type="text/javascript"> if (...) { var lnk = document.createElement('link'); lnk.type='text/css'; lnk.href='website/reveal/css/print/pdf.css'; lnk.rel='stylesheet'; var highlight = document.querySelector('link[href$="highlight.css"]'); highlight.parentNode.insertBefore(lnk, highlight); } </script> <link rel="stylesheet" href="website/optaplannerPresentation.css">
因为JavaScript不与页面渲染一起执行,所以您需要添加一个占位符,然后替换:
function changeCSS(cssFile) {
document.getElementById('stylesheetReplace').href='cssFile';
}
和css占位符:
<link rel="stylesheet" href="website/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="website/reveal/css/reveal.min.css">
<link rel="stylesheet" href="website/reveal/css/theme/simple.css" id="theme">
<link rel="stylesheet" href="" id="stylesheetReplace>
相关文章:
- 而循环只设置php中输入字段中的第一个值
- CSS第n个子条件使用LESS
- 错误:$injector:modulerr模块错误(我的第一个SPA应用程序)
- IE11中的第二个调用取消了第一个Fetch API调用
- Javascript XMLHttpRequest——只有第一个POST请求有效
- 使用javascript或angularjs特定过滤器搜索字符串中第一个img标记的json值
- 将OnClick函数设置为<ul>,最后一个ul是擦除第一个ul-s
- RxJS油门行为;立即获取第一个值
- Angular UI网格:如何通过第一个UI网格中的按钮使第二个UI网格可见
- 选择多个实例中的第一个
- 如何在调用下一个请求之前完成第一个Ajax Get请求
- Lodash:返回对象的第一个键,该对象的值(即数组)中有一个给定的元素(即字符串)
- 如何使用javascript/css创建一个弹出屏幕的表单
- 看起来第一个console.log是'It’不太对
- 仅将 CSS 规则应用于
中的第一个 ,而不分配类/ID - 为什么我添加的第二个jQuery代码部分/新的CSS部分导致第一个jQuery代码在我的页面上不起作用
- CSS的条件包含,但不作为最后一个(或第一个)CSS
- 更改每个 H4 标签之后的第一个 p 标签的 CSS
- 如何将页面上所有被屏蔽的谷歌广告(用图片)替换为第一个?CSS选择器出现问题
- jQuery + CSS:如何检测第一个“移出”将光标移出元素