我有一个XHTML严格页面,它有一个由Javascript控制的不可见div。 div被设置为透明且可由脚本和鼠标悬停事件显示,以使div在悬停时不透明。
如果有人在没有javascript的情况下使用浏览器(或带有noscript的firefox),div就会保持不可见状态。这个问题是我不希望内容无法访问。我也不想让div可见,然后使用脚本使其透明,因为div位于文档的底部,并且只要页面加载就会引起明显的闪烁。
我已经尝试使用noscript标签来嵌入一个仅为没有Javascript奢侈品的人加载的附加样式表,但这无法通过XHTML严格验证。有没有其他方法可以在XHTML有效的noscript块中包含额外的样式信息?
版:
通过一个简单的测试用例,我得到一个验证错误:文档类型不允许元素“样式”。 这是一个空的XHTML Strict文档,在noscript元素中有一个样式元素。 noscript在体内。
答案 0 :(得分:61)
头部的noscript是有效的HTML5。它之前无效。我刚测试过它,它适用于当前的Firefox,Safari,Chrome,Opera和IE。
<!doctype html>
<html>
<head>
<noscript>
<style>body{background:red}</style>
</noscript>
</head>
<body>
<p>is this red? it should <script>document.writeln("not");</script> be. <noscript>indeed.</noscript></p>
</body>
</html>
答案 1 :(得分:12)
要清除验证问题:noscript
仅允许body
元素,style
仅允许head
。因此,前者不允许使用后者。
关于一般问题:您希望默认情况下显示div
元素,然后通过CSS + javascript隐藏它。这是“渐进增强”模型。我注意到你说你“因为闪烁而不想这样做”,但我不确定究竟是什么导致了这种情况 - 你有可能修复它,所以也许你应该发布那个作为一个问题。
答案 2 :(得分:11)
使用script
中的head
块添加style
元素document.write
:
<head>
...
<script type="text/javascript">
//<![CDATA[
document.write('<style type="text/css">.noscript{display:none}</style>');
//]]>
</script>
...
</head>
答案 3 :(得分:10)
我在意识到它可以追溯到2008年之后写了这篇文章
由于我有类似的问题,我想继续回答当前的答案。
就像Boby Jack所说的那样,身体中不允许使用style
标签。我自己就像你(约书亚)那样对待它。但杰克的“渐进式增强”让我没有非抽象的解决方案,但后来我意识到了一个解决方案,我没有在这个帖子上找到答案。
这完全取决于你的造型结构。
我的建议是在头脑开始时使用类似modernizr
的内容,并使用Paul Irish的HTML5Boilerplate建议。
class
属性为no-js
.hide-me
元素(display:none
).no-js .hide-me { display:block }
请参阅Paul Irish的HTML5boilerplate,如果您愿意,可将其改编为XHTML:)
.no-js
<!doctype html>
<!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
引自html5boilerplate.com
Modernizr执行将使用支持的内容构建html
属性。
将构建类似于此的东西:
<html class=" js flexbox canvas canvastext webgl no-touch geolocation postmessage websqldatabase indexeddb hashchange history draganddrop websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations csscolumns cssgradients cssreflections csstransforms csstransforms3d csstransitions fontface generatedcontent video audio localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths" lang="en">
注意这是来自Google Chrome modernizr
测试。
第一个是js
,但如果Modernizr没有运行(没有javascript),那么no-js
会留在那里。
.hide-me
元素(display:none
)......你知道其余的事情:)
答案 4 :(得分:0)
你得到什么验证错误?应该在XHTML中允许<noscript>
,但它是块级别,因此请确保它不在<p>
,<span>
等
答案 5 :(得分:0)
如果使用XHTML,诀窍是使用两个CSS文件。一个全局的一个js-one调整了支持JavaScript的浏览器的全局版本。
的style.css:
.hidden {
visibility:hidden;
}
样式js.css:
.hidden {
visibility:visible;
}
的test.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<title>Test page</title>
<link href='css/style.css' rel='stylesheet' type='text/css' />
<script type="text/javascript">
//<![CDATA[
//document.write("<link href='css/style-js.css' rel='styleSheet' type='text/css' />");
//is not legal in XHTML, we do the long way:
var l=document.createElementNS("http://www.w3.org/1999/xhtml","link");
l.setAttribute("rel", "stylesheet");
l.setAttribute("type", "text/css");
l.setAttribute("href", "/css/style-js.css");
document.getElementsByTagName("head")[0].appendChild(l);
//]]>
</script>
</head>
<body>
<div class="hidden">
<p>Only displayed at JavaScript enabled browsers</p>
</div>
</body>
</html>
tutorials.de的主要想法。 XHTML有效性提示Estelle Weyl's Blog。 create CodingForums提示创建元素。
答案 6 :(得分:0)
更新:
来自w3school:
HTML 4.01和HTML5之间的差异
在HTML 4.01中,
foldr (-) 0 . ( map (uncurry (*)) (coords 5 7) )
标记只能在<noscript>
内使用 元件。在HTML5中,
<body>
标记可以在<noscript>
和<head>
内使用<body>
。HTML和XHTML之间的差异
在XHTML中,不支持
<noscript>
标记。
我有扩展菜单(列表等等)的解决方案
我已经像这样放入了标题
<header>
<noscript>
<link rel="stylesheet" href="assets/css/x_no_script.css">
</noscript>
</header>
在x_no_script.css
我设置了我想要的选择器
max-height: 9999px;
overflow: visible;
通过这种方式,当 JavaScript 禁用或不存在时,我扩展了菜单。