(X)HTML Strict 下的嵌套规则

本文介绍了HTML4Strict和XHTML1.0Strict下标签的正确嵌套方式,明确了哪些标签可以相互嵌套以及哪些标签不可以直接或间接地嵌套在一起。

JunChen Wu / 标准

下面是一份在 HTML 4 Strict 和 XHTML 1.0 Strict 下必须遵守的标签嵌套规则,比如你不能在 <a> 里面再嵌入一个 <a> 这样的约定。

说明:

  • 为了方便读者阅读,本文中的标签使用了大写(根据 XHTML 的规则,元素名必须小写,比如 <html> 而不应是 <HTML>
  • 小写的单词表明一组或一系列 HTML 标签
  • 每一项条目(标签)后都跟随一组标签列表,如果没有这个列表,那么表明该条目(标签)内部不允许包含任何标签。这意味着该条目内部只能包含纯文本内容(#PCDATA,见下文)。如果注明 (empty),这意味着该条目内部不允许包含任何形式的内容。对于 flow,inline,block,OBJECT 和 BODY,其内部允许包含的内容在文中会单独给出。
  • #PCDATA 的意思是“parsed character data”,即纯文本内容(不包括任何 HTML 标签,但是转义内容可以存在,比如 &auml;和 &#228;
  • CDATA 的意思是“character data”,这意味着不包括转义内容的纯文本内容,详细内容可以参考CDATA Confusion
  • excluding ... 意即不得直接或者间接的包含所列的元素

Allowed Nesting of elements in (X)HTML Strict

注1. 以上内容基于 [HTML 4.01 Specification] 的 Strict DTDJunChen 翻译自 Allowed nesting of elements in HTML 4 Strict (and XHTML 1.0 Strict)

注2. 对于 XHTML 1.0,基本上一致,不同点如下:

  • 对于 <script> 和 <style> 的内容,在 HTML 4 里是 CDATA 而在 XHTML 里是 #PCDATA
  • 在 XHTML 中,<table> 标签后可以紧跟一个 <tr>,而在 HTML 4.01 里,不允许这样,不过 <tbody> 标签又是可以省略的。意思就是说,如果代码中的 <table> 后紧跟 <tr>,对于 HTML 4.01,会隐性的生成一个 <tbody> 标签,而在 XHTML 里面就没有。这会影响到样式表使用 tbody 作为选择器。
Warm Regards,
J.

评论(17)

yyq123 -  2007年01月11日 16:05

好东西,长久以来的疑惑终于有标准了!

沈蚊 -  2007年01月11日 17:59

这个图实在太帅了!

JunChen -  2007年01月11日 18:09

匆忙翻译,还未来得及详细思考。其实很多都可以通过validator.w3.org来试验出来。本图仅作为开发过程中的参考而已。:)

david -  2007年01月11日 21:31

酷!有时还真没在意,所以经常都乱套。

JunChen -  2007年01月11日 22:25

这份文档不仅仅告诉我们 A 能包含什么,也告诉我们 A 不能包含什么(直接或间接)。比如 body 下不能直接跟 img。

mesher -  2007年01月17日 16:08

我在经典里给你回帖了,希望和你交流关于网页标准方面的知识,联系mail:mesher100@gmail.com 也是gtalk的帐号。

TommyFan -  2007年02月27日 13:29

> JunChen 说:

> 这份文档不仅仅告诉我们 A 能包含什么,也告诉我们 A 不能包含什么(直接或间接)。比如 body 下不能直接跟 img。

图上写着body可以直接跟block元素.应该可以直接跟img吧~!

JunChen -  2007年02月27日 14:25

@TommyFan: 注意有层级限制,不能直接跟。

Jsti -  2007年02月28日 13:52

>图上写着body可以直接跟block元素.应该可以直接跟img吧~!
img不是Block Element啊~~

水晶烟灰缸 -  2007年03月13日 23:54

非常感谢。
我就是遇到 p里面包括div 标签 提示 div不能放在p里面。

删除密码 -  2007年04月06日 16:51

总算有了一定的标准,收藏了

加减乘除888 -  2008年07月12日 11:48

请教JunChen,上面列表里的flow是什么意思?

JunChen -  2008年07月12日 12:37

@加减乘除888 文档流,包括inline和block

omiga -  2008年07月31日 13:49

这个表是抛开了web标准的?

flydong.com -  2008年10月14日 21:32

非常感谢, 终于让找到了

宇义 -  2008年12月17日 08:59

应该是有错误,LABEL excluding enclosed LABEL??

bohetang -  2009年10月23日 14:52

能不能翻译过来,再具体点啊。水平不行啊。

 

 

附:

html标签的嵌套

南宮瑞揚2011-02-19 21:46发表于:(x)html&CSS@前端|Tags:html

块级元素和内嵌元素的区别:

· 块级元素 一般用来搭建网站架构、布局、承载内容……像这些大体力活都属于块级元素的,它包括以下这些标签:

div、ul、li、dl、dt、dd、h1~h6、p、address……

 

· 内嵌元素 一般用在网站内容之中的某些细节或部位,用以“强调、区分样式、上标、下标、锚点”等等,下面这些标签都属于内嵌元素:

a、span、strong、sub、sup、img……

 

· 块元素 和 内嵌元素 是可以互相转换的,转换的代码如下:

display: block; /* 转成块元素 */

display: inline; /* 转成内嵌元素 */

· 块元素 和 内嵌元素 对于 CSS 的调用规则是不一样的(这篇文章讨论的是标签嵌套,所以对这个知识点不展开说明)。

 

简单认识了块元素和内嵌元素以后,下面就可以罗列 XHTML 标签的嵌套规则了:

1. 块元素可以包含内联元素或某些块元素,但内联元素却不能包含块元素,它只能包含其它的内联元素:

<div><h1></h1><p></p></div> —— 对
<a href=”#”><span></span></a> —— 对
<span><div></div></span> —— 错

2. 块级元素不能放在<p>里面:

<p><ol><li></li></ol></p> —— 错

<p><div></div></p> —— 错

3. 有几个特殊的块级元素只能包含内嵌元素,不能再包含块级元素,这几个特殊的标签是:

h1、h2、h3、h4、h5、h6、p、dt。

4. li 内可以包含 div 标签 —— 这一条其实不必单独列出来的,但是网上许多人对此有些疑惑,就在这里略加说明:

li 和 div 标签都是装载内容的容器,地位平等,没有级别之分(例如:h1、h2 这样森严的等级制度^_^),要知道,li 标签连它的父级 ul 或者是 ol 都可以容纳的,为什么有人会觉得 li 偏偏容纳不下一个 div 呢?别把 li 看得那么小气嘛,别看 li 长得挺瘦小,其实 li 的胸襟很大滴……

5. 块级元素与块级元素并列、内嵌元素与内嵌元素并列:

<div><h2></h2><p></p></div> —— 对
<div><a href=”#”></a><span></span></div> —— 对

<div><h2></h2><span></span></div> —— 错

 

 

<a>标签不能包含其他<a>标签

<pre>标签不能包含<img>,<object>,<big>,<samll>,<sub>和<sup>标签

<button>标签不能包含<input>,<select>,<textarea>,<label>,<button>,<form>,<fieldset>,<iframe>和<isindex>标签

<label>标签不能包含其他<label>标签

<form>标签不能包含其他<form>标签

 

 

嵌套规则.jpg


转载请注明:南宫瑞扬 http://www.nangongruiyang.com

转载于:https://www.cnblogs.com/kei0/archive/2012/07/17/2595124.html

这是我的配置,直接帮我加入结构server { listen 80; #listen 443 ssl; server_name 172.16.229.164; index index.html; # root /www/wwwroot/virtualization-web; #CERT-APPLY-CHECK--START # 用于SSL证书申请时的文件验证相关配置 -- 请勿删除 # include /www/server/panel/vhost/nginx/well-known/172.16.250.210.conf; #CERT-APPLY-CHECK--END # SSL 配置 # ssl_certificate /www/server/nginx/cert/public.crt; # 证书路径 # ssl_certificate_key /www/server/nginx/cert/private.key; # 私钥路径 # SSL 配置优化 #ssl_session_timeout 1d; #ssl_session_cache shared:SSL:50m; #ssl_session_tickets off; #ssl_protocols TLSv1.2 TLSv1.3; #ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; #ssl_prefer_server_ciphers off; # 强制 HTTPS #if ($server_port !~ 443){ # rewrite ^(/.*)$ https://$host$1 permanent; #} #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效 #include /www/server/panel/vhost/rewrite/172.16.250.210.conf; #REWRITE-END #禁止访问的文件或目录 location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md) { return 404; } #一键申请SSL证书验证目录相关设置 # location ~ \.well-known{ # allow all; #} #禁止在证书验证目录放入敏感文件 # if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) { # return 403; #} # 前端页面路由配置 location / { # 安全相关的响应头配置 # HSTS: 强制客户端使用 HTTPS 连接,有效期为 2 年 # add_header Strict-Transport-Security "max-age=63072000" always; # X-Frame-Options: 防止网页被嵌入到 iframe 中,只允许同源网站嵌入 #add_header X-Frame-Options "SAMEORIGIN" always; # X-Content-Type-Options: 禁止浏览器猜测资源的 MIME 类型 #add_header X-Content-Type-Options "nosniff" always; # Referrer-Policy: 控制 HTTP Referer 头的内容,只在 HTTPS 降级到 HTTP 时不发送 #add_header Referrer-Policy "no-referrer-when-downgrade" always; # CORS 跨域配置 # 允许所有域名访问 add_header Access-Control-Allow-Origin * always; # 允许的 HTTP 方法 #add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS' always; # 允许的请求头 #add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization' always; #proxy_pass http://localhost:5173/; proxy_pass http://localhost:5173; # 使用 HTTP/1.1 协议 proxy_http_version 1.1; # WebSocket 支持 #proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection ''; # 传递原始请求信息 #proxy_set_header Host $host; #proxy_cache_bypass $http_upgrade; proxy_set_header Host $proxy_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 前端项目根目录 # root /www/wwwroot/virtualization-web; # 处理前端路由,将所有请求重定向到 index.html # 解决 Vue Router history 模式刷新 404 的问题 # try_files $uri $uri/ /index.html; } # API 接口代理配置 # 将 /api 开头的请求代理到后端服务 location /api/ { # 代理目标地址 proxy_pass http://localhost:3000/api/; # 使用 HTTP/1.1 协议 proxy_http_version 1.1; # WebSocket 支持 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; # 传递原始请求信息 proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 上传文件相关配置 # 最大允许上传 10MB 的文件 client_max_body_size 10m; # 超时时间设置为 300 秒 proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; } # 静态资源代理配置 # 将 /files 开头的请求代理到后端服务 # location /files/ { # 代理目标地址 # proxy_pass http://localhost:3000/files/; # 传递原始请求信息 # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_set_header X-Forwarded-Proto $scheme; #} # access_log /www/wwwlogs/172.16.229.164.log; # error_log /www/wwwlogs/172.16.229.164.error.log; }
05-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值