border-radius 属性和 border-collapse:collapse 不能混合。 如何使用边框半径创建带有圆角的折叠表格?
我正在尝试使用 CSS border-radius
属性制作一个带有圆角的表格。 我正在使用的表格样式看起来像这样:
table {
-moz-border-radius:10px;
-webkit-border-radius:10px;
border-radius:10px
}
这就是问题所在。 我还想设置 border-collapse:collapse
属性,设置后 border-radius
不再起作用。 有没有一种基于 CSS 的方法可以在不实际使用的情况下获得与 border-collapse:collapse 相同的效果?
看来问题很大一部分在于将表格设置为圆角并不会影响角 td
元素的边角。 如果表格都是一种颜色,这不会成为问题,因为我可以分别将第一行和最后一行的顶部和底部 td
角设置为圆角。 但是,我对表格使用不同的背景颜色来区分标题和条纹,因此内部的 td 元素也会显示其圆角。
用另一个带圆角的元素包围桌子是行不通的,因为桌子的方角会“渗透”。
将边框宽度指定为 0 不会折叠表格。
将单元格间距设置为零后,底 td
角仍为方形。
这些表是用 PHP 生成的,因此我可以对每个外部 th/tds 应用不同的类,并分别设置每个角的样式。 我不想这样做,因为它不是很优雅,而且应用于多个表有点痛苦,所以请继续提出建议。
我想在不使用 JavaScript 的情况下完成此操作。
I am trying to make a table with rounded corners using the CSS border-radius
property. The table styles I'm using look something like this:
table {
-moz-border-radius:10px;
-webkit-border-radius:10px;
border-radius:10px
}
Here's the problem. I also want to set the border-collapse:collapse
property, and when that is set border-radius
no longer works. Is there a CSS-based way I can get the same effect as border-collapse:collapse
without actually using it?
It seems that a large part of the problem is that setting the table to have rounded corners does not affect the corners of the corner td
elements. If the table was all one color, this wouldn't be a problem since I could just make the top and bottom td
corners rounded for the first and last row respectively. However, I am using different background colors for the table to differentiate the headings and for striping, so the inner td
elements would show their rounded corners as well.
Surrounding the table with another element with round corners doesn't work because the table's square corners "bleed through."
Specifying border width to 0 doesn't collapse the table.
Bottom td
corners still square after setting cellspacing to zero.
The tables are generated in PHP, so I could just apply a different class to each of the outer th/tds and style each corner separately. I'd rather not do this, since it's not very elegant and a bit of a pain to apply to multiple tables, so please keep suggestions coming.
I'd like to do this without JavaScript.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(29)
我想到了。 您只需要使用一些特殊的选择器即可。
圆化表格角的问题是
td
元素也没有变成圆角。 您可以通过执行以下操作来解决该问题:现在一切都正常了,除了仍然存在
border-collapse:collapse
破坏一切的问题。解决方法是添加
border-spacing: 0
并在表格上保留默认的
border-collapse:separate
。I figured it out. You just have to use some special selectors.
The problem with rounding the corners of the table was that the
td
elements didn't also become rounded. You can solve that by doing something like this:Now everything rounds properly, except that there's still the issue of
border-collapse: collapse
breaking everything.A workaround is to add
border-spacing: 0
and leave the defaultborder-collapse: separate
on the table.以下方法通过使用扩展为
1px
的box-shadow
而不是“真实”边框来工作(在 Chrome 中测试)。The following method works (tested in Chrome) by using a
box-shadow
with a spread of1px
instead of a "real" border.如果您想要一个仅 CSS 的解决方案(无需在 HTML 中设置
cellspacing=0
),允许 1px 边框(您不能使用border-spacing: 0< /code> 解决方案),我更喜欢执行以下操作:
border-right
和border-bottom
(td
和th
)border-top
first-child
和last-child
选择器,将四个角的表格单元格的相应角圆化。在此处查看演示。
给定以下 HTML:
请参阅下面的示例:
If you want a CSS-only solution (no need to set
cellspacing=0
in the HTML) that allows for 1px borders (which you can't do with theborder-spacing: 0
solution), I prefer to do the following:border-right
andborder-bottom
for your table cells (td
andth
)border-top
border-left
first-child
andlast-child
selectors, round the appropriate corners for the table cells in the four corners.See a demo here.
Given the following HTML:
See example below:
您是否尝试过使用
table{border-spacing: 0}
而不是table{border-collapse:collapse}
???Have you tried using
table{border-spacing: 0}
instead oftable{border-collapse: collapse}
???您可能需要在表格周围放置另一个元素,并使用圆形边框设计该元素。
工作草案指定
border-radius
不适用当border-collapse
的值为collapse
时,转换为表格元素。You'll probably have to put another element around the table and style that with a rounded border.
The working draft specifies that
border-radius
does not apply to table elements when the value ofborder-collapse
iscollapse
.正如 Ian 所说,解决方案是将表格嵌套在 div 内并进行如下设置:
使用
overflow:hidden
,方角不会渗透到 div 中。As Ian said, the solution is to nest the table inside a div and set it like that:
With
overflow:hidden
, the square corners won't bleed through the div.这是一个方法:
或者
Here is a way:
Or
据我所知,唯一的方法是修改所有单元格,如下所示:
然后将边框置于底部和右后
:last-child
无效在 ie6 中,但如果您使用的是 border-radius 我认为您不在乎。编辑:
查看示例页面后,您似乎可以通过单元格间距和填充来解决此问题。
您看到的粗灰色边框实际上是表格的背景(如果将边框颜色更改为红色,您可以清楚地看到这一点)。 如果将单元格间距设置为零(或等效:
td, th { margin:0; }
),灰色“边框”将会消失。编辑2:
我找不到一种方法来只用一张表来做到这一点。 如果将标题行更改为嵌套表,您可能能够获得所需的效果,但这会增加工作量,而且不是动态的。
To the best of my knowledge, the only way you could do it would be to modify all the cells like so:
And then to get the border on the bottom and right back
:last-child
is not valid in ie6, but if you are usingborder-radius
I assume you don't care.EDIT:
After looking at your example page, it appears that you may be able to work around this with cell spacing and padding.
The thick gray borders you are seeing are actually the background of the table (you can see this clearly if you change the border color to red). If you set the cellspacing to zero (or equivalently:
td, th { margin:0; }
) the grey "borders" will disappear.EDIT 2:
I can't find a way to do this with only one table. If you change your header row to a nested table, you might possibly be able to get the effect you want, but it'll be more work, and not dynamic.
实际上,您可以将
table
添加到div
中作为其包装。 然后将这些CSS
代码分配给包装器:Actually you can add your
table
inside adiv
as its wrapper. and then assign theseCSS
codes to wrapper:我尝试了在
thead th:first-child
和thead th:last 上使用伪元素
:before
和:after
的解决方法-child与使用
包裹表格相结合,
请参阅jsFiddle
在 chrome (13.0.782.215) 中适用于我,请告诉我这是否适用于其他浏览器。
I tried a workaround using the pseudo elements
:before
and:after
on thethead th:first-child
andthead th:last-child
In combination with wrapping the table with a
<div class="radius borderCCC">
see jsFiddle
Works for me in chrome (13.0.782.215) Let me know if this works for you in other browsers.
我刚刚为此编写了一组疯狂的 CSS,看起来效果很好:
I just wrote a crazy set of CSS for this that seems to work perfectly:
给出的答案仅在桌子周围没有边框时才有效,这是非常有限的!
我在 SASS 中有一个宏来执行此操作,它完全支持外部和内部边框,实现与 border-collapse:collapse 相同的样式,而无需实际指定它。
在 FF/IE8/Safari/Chrome 中测试。
在除 IE8 之外的所有浏览器中以纯 CSS 提供漂亮的圆形边框(优雅地降级),因为 IE8 不支持 border-radius :(
有些 较旧的浏览器可能需要供应商前缀才能使用
border-radius
,因此请根据需要随意将这些前缀添加到您的代码中。这个答案不是最短的 - 但它。 为
要应用此样式,只需将标记更改
以下内容:
并确保在 HTML 中包含上述 CSS 样式,
希望这会有所帮助。
The given answers only work when there are no borders around the table, which is very limiting!
I have a macro in SASS to do this, which fully supports external and internal borders, achieving the same styling as border-collapse: collapse without actually specifying it.
Tested in FF/IE8/Safari/Chrome.
Gives nice rounded borders in pure CSS in all browsers but IE8 (degrades gracefully) since IE8 doesn't support border-radius :(
Some older browsers may require vendor prefixes to work with
border-radius
, so feel free to add those prefixes to your code as necessary.This answer is not the shortest - but it works.
To apply this style simply change your
tag to the following:
and be sure to include the above CSS styles in your HTML.
Hope this helps.
对于有边框且可滚动的表格,
如果您使用
thead
、tfoot
或th<, 请使用此选项(替换变量、
$
起始文本) /code>,只需用它们替换tr:first-child
和tr-last-child
和td
即可。HTML:
For a bordered and scrollable table, use this (replace variables,
$
starting texts)If you use
thead
,tfoot
orth
, just replacetr:first-child
andtr-last-child
andtd
with them.HTML:
在遇到同样的问题后找到了这个答案,但发现它非常简单:只需给表溢出:隐藏
不需要包装元素。 诚然,我不知道 7 年前这个问题最初提出时是否有效,但现在有效。
Found this answer after running into the same problem, but found it's pretty simple: just give the table overflow:hidden
No need for a wrapping element. Granted, I don't know if this would have worked 7 years ago when the question was initially asked, but it works now.
我有同样的问题。
完全删除
border-collapse
并使用:cellspacing="0" cellpadding="0"
在 html 文档中。
例子:
I had the same problem.
remove
border-collapse
entirely and use:cellspacing="0" cellpadding="0"
in the html document.
example:
我看到很多奇怪的黑客和解决方法,所以我想建议我的解决方案来创建一个带有
border-radius
的表格,并且与border:collapse;
具有相同的视觉效果只需定位嵌套行和单元格即可关闭边框。您可以使用其他伪选择器(例如第一个子级等)更深入地满足您的需求,但这是最小的解决方案:
I see a lot of weird hacks and workarounds so I would like to suggest my solution for creating a table with
border-radius
and the same visual effect asborder: collapse;
by simply targeting nested rows and cells to turn borders off.You can get more in-depth to suit your needs using other pseudo selectors like first-child, etc, but this is the minimal solution:
只需使用轮廓替换边框:
Just use outline replace border:
我开始尝试“显示”,发现:
border-radius
、border
、margin
、padding
、在table
中显示为:例如
但是我们需要设置每列的
width
I started experiment with "display" and I found that:
border-radius
,border
,margin
,padding
, in atable
are displayed with:For example
But we need set a
width
of every columnborder-collapse:separate for table and display:inline-table for tbody and thead 的解决方案。
Solution with border-collapse:separate for table and display:inline-table for tbody and thead.
我是 HTML 和 CSS 新手,我也在寻找解决方案,这里是我找到的。
我尝试一下,猜猜它有什么作用:)
I am new with HTML and CSS and I was also looking for solution for this, here what I find.
I try it, guess what it works :)
这是使用 SCSS 的解决方案。 它创建一个带有圆角和边框单元格的表格。
该解决方案使用了@Ramon Tayag的方法。 正如他指出的,关键是使用
border-spacing: 0
。Here is a solution using SCSS. It creates a table with rounded corners and bordered cells.
This solution uses the approach from @Ramon Tayag. The key is to use
border-spacing: 0
, as he points out.以下是如何实现带有圆角的表格的最新示例,来自 http:// /medialoot.com/preview/css-ui-kit/demo.html。 它基于上面 Joel Potter 建议的特殊选择器。 正如你所看到的,它还包含一些让 IE 高兴一点的魔法。 它包括一些额外的样式来交替行的颜色:
Here is a recent example of how to implement a table with rounded-corners from http://medialoot.com/preview/css-ui-kit/demo.html. It's based on the special selectors suggested by Joel Potter above. As you can see, it also includes some magic to make IE a little happy. It includes some extra styles to alternate the color of the rows:
最简单的方法...
easiest way...
其他一些答案都很好,但没有一个答案考虑您使用
thead
、tbody
和tfoot
。 或者情况,你可以将这些组合起来。 当您应用它们时,您可能会得到一些不必要的舍入或边框。因此,我尝试调整 @NullUserException 的仅 css 答案,这就是我得到的:
darkgreen
用于清楚地显示整个表格中各处的边框都是正确的。 本质上,无论您在哪里看到深绿色
- 都是您设置表格边框样式的地方。此 codepen 显示常规表格和带有
thead
的表格,tbody
和tfoot
。 CSS 与上面的 CSS 相同,只是添加了th
的样式重置。 在撰写本文时,您可以看到它们的渲染效果相同。Some of the other answers are good, but none of them consider you using
thead
,tbody
andtfoot
. Or cases, when you can either combination of those. And when you apply them, you can get some unnecessary rounding or borders.Thus I tried adjusting css-only answer from @NullUserException and this is what I got:
darkgreen
is used to clearly show that borders are correct everywhere across the whole table. Essentially, wherever you seedarkgreen
- is where you style the table's borders.This codepen shows regular table and the one with
thead
,tbody
andtfoot
. CSS is identical to the one above with only the addition of style reset forth
. At the moment of writing, you can see, that they both render identically.所有单元格均带有圆角和边框的表格的工作示例:
在 Codepen 中打开示例
Working example of a table with rounded corners and borders on all cells:
Open example in Codepen
我总是使用 Sass 这样做
I always do this way using Sass
迄今为止最好的解决方案来自您自己的解决方案,如下所示:
The best solution so far comes from your own solution and it goes like this:
使用“overflow:hidden”和“border-radius”
这也适用于“折叠”
表示例:
border-radius: 1em;
溢出:隐藏;
Use "overflow: hidden" with "border-radius"
This works with "collapse" table as well
Example:
border-radius: 1em;
overflow: hidden;