編集 - 元のタイトル:CSS
でborder-collapse:collapse
を達成する別の方法はありますか?
単に表の枠を折りたたんでも根本的な問題は解決されないことがわかったので、私は議論をよりよく反映するようにタイトルを更新しました。
CSS3
border-radius
プロパティを使って角の丸いのテーブルを作成しようとしています。私が使っているテーブルスタイルはこんな感じです:
table {
-moz-border-radius:10px;
-webkit-border-radius:10px;
border-radius:10px
}
これが問題です。私はborder-collapse:collapse
プロパティも設定したいのですが、それが設定されるとborder-radius
は動作しなくなります。実際に使わなくてもborder-collapse:collapse
と同じ効果が得られるCSSベースの方法はありますか?
編集:
ここで問題を説明するための簡単なページを作成しました(Firefox/Safariのみ)。
問題の大部分は、丸みのある角を持つようにテーブルを設定しても角のtd
要素の角に影響を与えないことです。テーブルがすべて1色の場合は、最初の行と最後の行についてそれぞれtd
の上と下の角を丸くすることができるので、これは問題になりません。ただし、見出しと区別のために表の背景色を変えているので、内側のtd
要素にも丸みのある角が表示されます。
提案された解決策の要約:
丸い角を持つ別の要素でテーブルを囲むと、テーブルの四角い角が「にじみて」しまうため、機能しません。
ボーダー幅を0に指定してもテーブルは縮小されません。
セルスペースをゼロに設定した後も、下のtd
コーナーはまだ正方形です。
代わりにJavaScriptを使用すると、問題を回避できます。
考えられる解決策:
テーブルはPHPで生成されるので、外側のそれぞれに異なるクラスを適用し、各コーナーを別々にスタイルすることができます。あまりエレガントではなく、複数のテーブルに適用するのは少し面倒なので、私はこれをしない方がいいでしょう。
考えられる解決策2は、コーナーのスタイルを設定するためにJavaScript(特にjQuery)を使用することです。この解決策も機能しますが、それでも私が探しているものとは異なります(私はうるさいと思います)。私は2つの予約があります:
今日CSS3でこれをやろうとするのは無用に思えるかもしれませんが、私には理由があります。私はまた、この問題はw3c仕様によるものであり、貧弱なCSS3サポートではないことを指摘したいと思います。そのため、CSS3がより広範にサポートされている場合は、どの解決策も適切で有用です。
私はそれを考え出した。あなただけのいくつかの特別なセレクタを使用する必要があります。
テーブルの角を丸めることの問題は、td要素も丸くならないことでした。これを解決するには、次のようにします。
table tr:last-child td:first-child {
border-bottom-left-radius: 10px;
}
table tr:last-child td:last-child {
border-bottom-right-radius: 10px;
}
今ではborder-collapse: collapse
がすべてを壊しているという問題がまだあることを除いて、すべてが正しく丸められています。この問題を回避するには、代わりにhtmlにcellspacing="0"
を設定します(ありがとう、 Joel )。
次の方法は、「実際の」境界線の代わりにbox-shadow
の広がりを持つ1px
を使用することで機能します(Chromeでテスト済み)。
table {
border-collapse: collapse;
border-radius: 30px;
border-style: hidden; /* hide standard table (collapsed) border */
box-shadow: 0 0 0 1px #666; /* this draws the table border */
}
td {
border: 1px solid #ccc;
}
CSSのみのソリューション(HTMLでcellspacing=0
を設定する必要はありません)で1pxの境界線(border-spacing: 0
ソリューションでは実行できない)が必要な場合は、次のようにします。 :
border-right
およびborder-bottom
を設定します(td
およびth
)border-top
border-left
を与えますfirst-child
およびlast-child
セレクターを使用して、4つのコーナーのテーブルセルの適切なコーナーを丸めます。次のHTMLがあるとします。
以下の例を参照してください。
.custom-table{margin:30px;}
table {
border-collapse: separate;
border-spacing: 0;
min-width: 350px;
}
table tr th,
table tr td {
border-right: 1px solid #bbb;
border-bottom: 1px solid #bbb;
padding: 5px;
}
table tr th:first-child, table tr th:last-child{
border-top:solid 1px #bbb;}
table tr th:first-child,
table tr td:first-child {
border-left: 1px solid #bbb;
}
table tr th:first-child,
table tr td:first-child {
border-left: 1px solid #bbb;
}
table tr th {
background: #eee;
text-align: left;
}
table.Info tr th,
table.Info tr:first-child td
{
border-top: 1px solid #bbb;
}
/* top-left border-radius */
table tr:first-child th:first-child,
table.Info tr:first-child td:first-child {
border-top-left-radius: 6px;
}
/* top-right border-radius */
table tr:first-child th:last-child,
table.Info tr:first-child td:last-child {
border-top-right-radius: 6px;
}
/* bottom-left border-radius */
table tr:last-child td:first-child {
border-bottom-left-radius: 6px;
}
/* bottom-right border-radius */
table tr:last-child td:last-child {
border-bottom-right-radius: 6px;
}
<div class="custom-table">
<table>
<tr>
<th>item1</th>
<th>item2</th>
</tr>
<tr>
<td>item1</td>
<td>item2</td>
</tr>
<tr>
<td>item1</td>
<td>item2</td>
</tr>
<tr>
<td>item1</td>
<td>item2</td>
</tr>
</table>
</div>
table{border-spacing: 0}
??の代わりにtable{border-collapse: collapse}
を使ってみましたか。
おそらくテーブルの周りに別の要素を配置して、丸みを帯びた境界線でスタイルを設定する必要があります。
ワーキングドラフト は、border-radius
の値がcollapse
の場合、border-collapse
をテーブル要素に適用しないことを指定します。
Ianが言ったように、解決策はdiv内にテーブルをネストして次のように設定することです。
.table_wrapper {
border-radius: 5px;
overflow: hidden;
}
overflow:hidden
を使うと、四角い角はdivからはみ出しません。
私の知る限りでは、次のようにすべてのセルを変更することが唯一の方法です。
table td {
border-right-width: 0px;
border-bottom-width: 0px;
}
そして、下と右後ろの境界線を取得する
table tr td:last-child {
border-right-width: 1px;
}
table tr:last-child td {
border-bottom-width: 1px;
}
:last-child
はie6では無効ですが、もしあなたがborder-radius
を使っているのなら私はあなたが気にしないと思います。
編集:
あなたの例のページを見た後、それはあなたがセル間隔とパディングでこれを回避することができるかもしれないように見えます。
見ている濃い灰色の枠線は、実際にはテーブルの背景です(枠線の色を赤に変更すると、これをはっきりと見ることができます)。セルスペースをゼロ(または同等にtd, th { margin:0; }
)に設定すると、灰色の「枠線」が消えます。
編集2:
1つのテーブルだけでこれを実行する方法が見つかりません。ヘッダー行をネストした表に変更すると、おそらく必要な効果が得られる可能性がありますが、動的ではなく、もっと効果的になります。
:before
と:after
の擬似要素thead th:first-child
とthead th:last-child
を使用して回避策を試しました
テーブルを<div class="radius borderCCC">
でラップすることと組み合わせて
table thead th:first-child:before{
content:" ";
position:absolute;
top:-1px;
left:-1px;
width:15px;
height:15px;
border-left:1px solid #ccc;
border-top:1px solid #ccc;
-webkit-border-radius:5px 0px 0px;
}
table thead th:last-child:after{
content:" ";
position:absolute;
top:-1px;
right:-1px;
width:15px;
height:15px;
border-right:1px solid #ccc;
border-top:1px solid #ccc;
-webkit-border-radius:0px 5px 0px 0px;
}
jsFiddle を参照してください。
これは他のブラウザであなたのために働くかどうか私に知らせてください。
実際には、ラッパーとしてtable
内にdiv
を追加できます。そして、これらのCSS
コードをwrapperに代入します。
.table-wrapper {
border: 1px solid #f00;
border-radius: 5px;
overflow: hidden;
}
table {
border-collapse: collapse;
}
私は同じ問題を抱えていました。 border-collapse
を完全に削除して、html文書で:cellspacing="0" cellpadding="0"
を使用してください。例:
<table class="top_container" align="center" cellspacing="0" cellpadding="0">
境界のあるスクロール可能な表の場合は、これを使用します(変数の置換、$
開始テキスト)
thead
、tfoot
またはth
を使用する場合は、tr:first-child
およびtr-last-child
およびtd
をそれらに置き換えてください。
#table-wrap {
border: $border solid $color-border;
border-radius: $border-radius;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
table td { border: $border solid $color-border; }
table td:first-child { border-left: none; }
table td:last-child { border-right: none; }
table tr:first-child td { border-top: none; }
table tr:last-child td { border-bottom: none; }
table tr:first-child td:first-child { border-top-left-radius: $border-radius; }
table tr:first-child td:last-child { border-top-right-radius: $border-radius; }
table tr:last-child td:first-child { border-bottom-left-radius: $border-radius; }
table tr:last-child td:last-child { border-bottom-right-radius: $border-radius; }
HTML:
<div id=table-wrap>
<table>
<tr>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>4</td>
</tr>
</table>
</div>
私はちょうどこれのために完璧に動作するように思えるCSSの狂ったセットを書きました:
table {
border-collapse: separate;
border-spacing: 0;
width: 100%;
}
table td,
table th {
border-right: 1px solid #CCC;
border-top: 1px solid #CCC;
padding: 3px 5px;
vertical-align: top;
}
table td:first-child,
table th:first-child {
border-left: 1px solid #CCC;
}
table tr:last-child td,
table tr:last-child th {
border-bottom: 1px solid #CCC;
}
table thead + tbody tr:first-child td {
border-top: 0;
}
table thead td,
table th {
background: #EDEDED;
}
/* complicated rounded table corners! */
table thead:first-child tr:last-child td:first-child {
border-bottom-left-radius: 0;
}
table thead:first-child tr:last-child td:last-child {
border-bottom-right-radius: 0;
}
table thead + tbody tr:first-child td:first-child {
border-top-left-radius: 0;
}
table thead + tbody tr:first-child td:last-child {
border-top-right-radius: 0;
}
table tr:first-child td:first-child,
table thead tr:first-child td:first-child {
border-top-left-radius: 5px;
}
table tr:first-child td:last-child,
table thead tr:first-child td:last-child {
border-top-right-radius: 5px;
}
table tr:last-child td:first-child,
table thead:last-child tr:last-child td:first-child {
border-bottom-left-radius: 5px;
}
table tr:last-child td:last-child,
table thead:last-child tr:last-child td:last-child {
border-bottom-right-radius: 5px;
}
/* end complicated rounded table corners !*/
与えられた答えは、テーブルの周囲に境界がない場合にのみ機能します。これは非常に制限的です。
これを行うためのSASSのマクロがあります。これは外部および内部境界を完全にサポートし、border-collapseと同じスタイルを実現します。
FF/IE8/Safari/Chromeでテスト済み。
IE8ではborder-radius :(をサポートしていないため、すべてのブラウザで純粋なCSSで素敵な丸みのあるボーダーを使用できますが、IE8(グレースフルに低下)
古いブラウザの中にはborder-radius
を扱うのにベンダのプレフィックス を必要とするものがありますので、必要に応じてこれらのプレフィックスをコードに追加してください。
この答えは最短ではありません - しかしうまくいきます。
.roundedTable {
border-radius: 20px / 20px;
border: 1px solid #333333;
border-spacing: 0px;
}
.roundedTable th {
padding: 4px;
background: #ffcc11;
border-left: 1px solid #333333;
}
.roundedTable th:first-child {
border-left: none;
border-top-left-radius: 20px;
}
.roundedTable th:last-child {
border-top-right-radius: 20px;
}
.roundedTable tr td {
border: 1px solid #333333;
border-right: none;
border-bottom: none;
padding: 4px;
}
.roundedTable tr td:first-child {
border-left: none;
}
このスタイルを適用するには、単にあなたの
<table>
次のタグを付けます。
<table class="roundedTable">
また、HTMLに上記のCSSスタイルを含めるようにしてください。
お役に立てれば。
同じ問題に遭遇した後にこの答えを見つけましたが、それは非常に簡単であることがわかりました:ただテーブルオーバーフローを与えてください:隠されて
ラッピング要素は不要です。確かに、この質問が最初に出されたときに7年前に機能したかどうかはわかりませんが、現在は機能します。
丸みを帯びた角と枠線のセルのテーブル。 @ Ramon Tayagソリューションを使用する。
彼が指摘するようにキーはborder-spacing: 0
を使うことです。
SCSSを使った解法。
$line: 1px solid #979797;
$radius: 5px;
table {
border: $line;
border-radius: $radius;
border-spacing: 0;
th,
tr:not(:last-child) td {
border-bottom: $line;
}
th:not(:last-child),
td:not(:last-child) {
border-right: $line;
}
}
私はHTMLとCSSに慣れていませんが、その解決策も探していました。
table,th,td {
border: 1px solid black;
border-spacing: 0
}
/* add border-radius to table only*/
table {
border-radius: 25px
}
/* then add border-radius to top left border of left heading cell */
th:first-child {
border-radius: 25px 0 0 0
}
/* then add border-radius to top right border of right heading cell */
th:last-child {
border-radius: 0 25px 0 0
}
/* then add border-radius to bottom left border of left cell of last row */
tr:last-child td:first-child {
border-radius: 0 0 0 25px
}
/* then add border-radius to bottom right border of right cell of last row */
tr:last-child td:last-child {
border-radius: 0 0 25px 0
}
私はそれを試して、それが何をするのか推測します:)
Border-collapseを使った解決策:tableとdisplayを分けてください:tbodyとtheadのinline-table。
table {
width: 100%;
border-collapse: separate;
border-spacing: 0px;
background: transparent;
}
table thead {
display: inline-table;
width: 100%;
background: #fc0 url(../images/bg-heading.png) repeat-x 0% 0;
-webkit-border-top-left-radius: 7px;
-moz-border-radius-topleft: 7px;
-webkit-border-top-right-radius: 7px;
-moz-border-radius-topright: 7px;
border-radius: 7px 7px 0px 0px;
padding: 1px;
padding-bottom: 0;
}
table tbody {
border: 1px solid #ddd;
display: inline-table;
width: 100%;
border-top: none;
}
これは http://medialoot.com/preview/css-ui-kit/demo.html から角の丸いテーブルを実装する方法の最近の例です。それは上記のJoel Potterによって提案された特別なセレクターに基づいています。ご覧のとおり、IEをちょっと幸せにするための魔法も含まれています。行の色を変えるためのいくつかの追加スタイルが含まれています。
table-wrapper {
width: 460px;
background: #E0E0E0;
filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#E9E9E9', endColorstr='#D7D7D7');
background: -webkit-gradient(linear, left top, left bottom, from(#E9E9E9), to(#D7D7D7));
background: -moz-linear-gradient(top, #E9E9E9, #D7D7D7);
padding: 8px;
-webkit-box-shadow: inset 0px 2px 2px #B2B3B5, 0px 1px 0 #fff;
-moz-box-shadow: inset 0px 2px 2px #B2B3B5, 0px 1px 0 #fff;
-o-box-shadow: inset 0px 2px 2px #B2B3B5, 0px 1px 0 #fff;
-khtml-box-shadow: inset 0px 2px 2px #B2B3B5, 0px 1px 0 #fff;
box-shadow: inset 0px 2px 2px #B2B3B5, 0px 1px 0 #fff;
-webkit-border-radius: 10px;
/*-moz-border-radius: 10px; firefox doesn't allow rounding of tables yet*/
-o-border-radius: 10px;
-khtml-border-radius: 10px;
border-radius: 10px;
margin-bottom: 20px;
}
.table-wrapper table {
width: 460px;
}
.table-header {
height: 35px;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
text-align: center;
line-height: 34px;
text-decoration: none;
font-weight: bold;
}
.table-row td {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
text-align: left;
text-decoration: none;
font-weight: normal;
color: #858585;
padding: 10px;
border-left: 1px solid #ccc;
-khtml-box-shadow: 0px 1px 0px #B2B3B5;
-webkit-box-shadow: 0px 1px 0px #B2B3B5;
-moz-box-shadow: 0px 1px 0px #ddd;
-o-box-shadow: 0px 1px 0px #B2B3B5;
box-shadow: 0px 1px 0px #B2B3B5;
}
tr th {
border-left: 1px solid #ccc;
}
tr th:first-child {
-khtml-border-top-left-radius: 8px;
-webkit-border-top-left-radius: 8px;
-o-border-top-left-radius: 8px;
/*-moz-border-radius-topleft: 8px; firefox doesn't allow rounding of tables yet*/
border-top-left-radius: 8px;
border: none;
}
tr td:first-child {
border: none;
}
tr th:last-child {
-khtml-border-top-right-radius: 8px;
-webkit-border-top-right-radius: 8px;
-o-border-top-right-radius: 8px;
/*-moz-border-radius-topright: 8px; firefox doesn't allow rounding of tables yet*/
border-top-right-radius: 8px;
}
tr {
background: #fff;
}
tr:nth-child(odd) {
background: #F3F3F3;
}
tr:nth-child(even) {
background: #fff;
}
tr:last-child td:first-child {
-khtml-border-bottom-left-radius: 8px;
-webkit-border-bottom-left-radius: 8px;
-o-border-bottom-left-radius: 8px;
/*-moz-border-radius-bottomleft: 8px; firefox doesn't allow rounding of tables yet*/
border-bottom-left-radius: 8px;
}
tr:last-child td:last-child {
-khtml-border-bottom-right-radius: 8px;
-webkit-border-bottom-right-radius: 8px;
-o-border-bottom-right-radius: 8px;
/*-moz-border-radius-bottomright: 8px; firefox doesn't allow rounding of tables yet*/
border-bottom-right-radius: 8px;
}
"display"で実験を始めたところ、border
内のborder-radius
、margin
、padding
、table
が次のように表示されることがわかりました。
display: inline-table;
例えば
table tbody tr {
display: inline-table;
width: 960px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
}
しかし、列ごとにwidth
を設定する必要があります。
tr td.first-column {
width: 100px;
}
tr td.second-column {
width: 860px;
}
私はいつもSassを使ってこうやっています
table {
border-radius: 0.25rem;
thead tr:first-child th {
&:first-child {
border-top-left-radius: 0.25rem;
}
&:last-child {
border-top-right-radius: 0.25rem;
}
}
tbody tr:last-child td {
&:first-child {
border-bottom-left-radius: 0.25rem;
}
&:last-child {
border-bottom-right-radius: 0.25rem;
}
}
}