正如已经说过的那样,它们做同样的事情,无论如何你都不应该使用 frame 属性。
要了解为什么同一事物有两个不同的值,有必要阅读RFC 1942 HTML Tables,它说:
包含值“Border”是为了向后兼容已部署的浏览器。如果文档包含<TABLE BORDER>
用户代理,则会看到 FRAME=BORDER 和 BORDER= implicit。如果文档包含<TABLE BORDER=_n_>
,则用户代理应将其视为 FRAME=BORDER,除非n=0适合 FRAME=VOID。
注意:最好为 FRAME 选择与 RULES 属性和用于对齐的值一致的值。例如:none、top、bottom、topbot、left、right、leftright、all。不幸的是,SGML 要求枚举的属性值对于每个元素都是唯一的,与属性名称无关。这会导致“none”、“left”、“right”和“all”立即出现问题。已选择 FRAME 的值以避免与 RULES、ALIGN 和 VALIGN 属性发生冲突。这提供了一种对未来进行验证的措施,因为预计在本规范的未来修订中,FRAME 和 RULES 属性将被添加到其他表格元素中。另一种方法是使 FRAME 成为 CDATA 属性。
因此,在编写规范之前,浏览器已经使用了“边框”,但与 SGML 的细微之处不兼容,因此添加了“框”以提供一种与 SGML 兼容的方式来做同样的事情。
因为浏览器实际上并不遵循 SGML 规则,所以不容易看到上面的效果,但是 HTML5 之前的验证器做到了,并且可能会看到很小的效果。考虑这个标记:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<title>Test</title>
<table border border=5>
<tr><td>Test</td></tr>
</table>
通常有两个同名的属性会导致验证器报告错误,但是在 W3C HTML 验证器上尝试一下,您会看到它通过了验证。那是因为验证器将第一个border
属性视为的缩写形式,frame="border"
因此没有名称冲突。
另一方面,浏览器确实会看到名称冲突并且会忽略该border=5
属性。