从表格中删除 `border` 属性不会删除边框

Posted

技术标签:

【中文标题】从表格中删除 `border` 属性不会删除边框【英文标题】:Removing `border` attribute from table doesn't remove the border 【发布时间】:2015-01-25 00:06:16 【问题描述】:

为什么在做removeAttr("border")的时候边框没有去掉(属性去掉了,但是样式保留了)?

演示

$("#button1").on("click", function() 
  $("table").removeAttr("border");
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table border="1">
  <tbody>
    <tr>
      <td>Hello</td>
      <td>World</td>
    </tr>
  </tbody>
</table>

<table>
  <tbody>
    <tr>
      <td>Not</td>
      <td>Initially</td>
      <td>Bordered</td>
    </tr>
  </tbody>
</table>

<input type="button" id="button1" value="Click to remove border via javascript">

我在 Chrome 和 Chromium 上复制了这个。

【问题讨论】:

这是因为没有任何属性或用户 css 样式的默认表将占用用户代理样式,即浏览器样式。创建一个未装饰的简单表,看看会发生什么。 而不是删除边框现在做一个$("table").attr("border", "0");然后看看。 @abhitalks 不,默认表没有任何边框,除非添加了border="1"(参见第一个表)。第二个表格没有任何边框。 小提琴jsfiddle.net/Lqj2qcjs @abhitalks attr("border", "0") 解决了这个问题,但它没有解释为什么 removeAttr 不能正常工作。 【参考方案1】:

您需要担心的不仅仅是元素本身的border 属性。

每个浏览器都带有一个“默认样式表”,它将为常见的 html 元素配置基本表示。表格是需要网站设置样式以便从浏览器覆盖此“基本样式”的元素之一。浏览器实现这一点是为了提高网站的默认可读性,但它也引入了一种设备,Web 开发人员在生成自己的样式表时必须注意这一点。

设置以下规则:

table 
  border: none;
  border-spacing: 0;
  border-collapse: collapse;

将为您解决这个问题。

jQuery 可以删除该属性,但是当它被删除而不是更新时,它不会触发元素的重绘。由于默认 CSS 上没有覆盖样式元素,因此保留了初始样式。

设置属性后,您始终可以克隆并重新应用(或简单地通过 $('table').appendTo($('table').parent()); 之类的傻事重新插入元素以查看所需的行为。


编辑:

恭喜,您发现了一个 Chrome 错误

CSS 渲染器仍然尊重边框属性,即使它已被删除。不应该。其他浏览器在运行 cmets 中提供的 fiddle 时,会适当地移除元素上的边框。

但是!在 Chrome 中,您会注意到这个小傻瓜挂在您的桌子上,并设置了边框属性:

注意 table[Attributes Style] 此处为空选择器

Chrome 正在呈现此表,就好像它是在您的 HTML 中这样编写的:&lt;table border&gt;&lt;/table&gt; 尽管这并未反映 DOM 中的信息。

您绝对应该将此提交给 Chromium Issues List

查看下面 Ismael Miguel 的评论以获得进一步的解释,复制到这里

我能想到的是 Chrome 有一个与处理有关的错误 的边框属性(不推荐使用,在 html5 中不受支持)。 这可能是因为边框属性未链接到 整体 CSS 样式。一个例子是 value 属性。当你跑 element.value=5;,value属性会保持不变,但是当 你把 value="6",运行 element.value 将返回 6。这个 关系可能会被破坏:它使用边框属性设置 颜色和边框大小。当您删除该属性时,它删除 尺寸而已。

恭喜!

【讨论】:

那么为什么第二个表格没有任何默认边框呢? @BoltClock – 检查评论的第二部分。第二个表上没有任何边框,因为他最初在元素上将其设置为border=0(隐式)。当他通过 jQuery 删除该属性时,表格已经呈现无边框。删除属性本身不会像添加 CSS 规则那样触发元素的重绘。 那么jsfiddle.net/Lqj2qcjs/3 呢?我最初将边框设置为 0,然后通过 jquery 将其删除,但还是有边框大声笑 @Huangism - 哇,这对我来说是新的。似乎边框属性的存在足以触发呈现边框。我会用我在这里看到的内容更新我的答案。 @JoshBurgess 我能想到的是 Chrome 有一个与处理 border 属性相关的错误(不推荐使用,在 html5 中不支持)。这可能是因为border 属性未链接到整个 CSS 样式。一个例子是value 属性。当你运行element.value=5; 时,value 属性将保持不变,但是当你放置value="6" 时,运行element.value 将返回6。这种关系可能会被打破:使用border 属性,它设置颜色和边框大小。删除属性时,它仅删除大小【参考方案2】:
$("table").attr("border", "0");

会成功的

【讨论】:

【参考方案3】:

在某些浏览器中,表格默认有边框,因此您可能需要将边框设置为 0。

【讨论】:

【参考方案4】:

你应该使用

.attr("border", "")

这是一个例子jsFiddle

【讨论】:

以上是关于从表格中删除 `border` 属性不会删除边框的主要内容,如果未能解决你的问题,请参考以下文章

由于边框折叠属性,表格的边框半径不起作用

如何从 HTML 表格中删除特定单元格?

边框折叠不删除表格标题单元格边框

在html中 怎样改变表格边框线的颜色?

从欢迎图片中删除边框和填充

如何删除表格中的边框间距