web-dev-qa-db-ja.com

CSS3のborder-radiusプロパティとborder-collapse:collapseは混同しないでください。どのようにボーダー半径を使用して角の丸い折りたたみテーブルを作成できますか?

編集 - 元のタイトル:CSSborder-collapse:collapseを達成する別の方法はありますか?

単に表の枠を折りたたんでも根本的な問題は解決されないことがわかったので、私は議論をよりよく反映するようにタイトルを更新しました。

CSS3border-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つの予約があります:

  1. これは非常に軽量なサイトです。JavaScriptを最小限に抑える
  2. border-radiusを使うことが私にとって魅力的な部分は、グレースフルデグラデーションとプログレッシブエンハンスメントです。丸みを帯びたすべての角にborder-radiusを使用することで、CSS3対応のブラウザでは一貫して丸みのあるサイトを、他のブラウザでは一貫して正方形のサイトを使用したいと思います(IEを見ています)。

今日CSS3でこれをやろうとするのは無用に思えるかもしれませんが、私には理由があります。私はまた、この問題はw3c仕様によるものであり、貧弱なCSS3サポートではないことを指摘したいと思います。そのため、CSS3がより広範にサポートされている場合は、どの解決策も適切で有用です。

288
vamin

私はそれを考え出した。あなただけのいくつかの特別なセレクタを使用する必要があります。

テーブルの角を丸めることの問題は、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 )。

213
vamin

次の方法は、「実際の」境界線の代わりに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;
}
74
cmrd.Kaash

CSSのみのソリューション(HTMLでcellspacing=0を設定する必要はありません)で1pxの境界線(border-spacing: 0ソリューションでは実行できない)が必要な場合は、次のようにします。 :

  • テーブルセルにborder-rightおよびborder-bottomを設定します(tdおよびth
  • 最初の行のセルを指定しますa 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>
57
vxsx

table{border-spacing: 0} ??の代わりにtable{border-collapse: collapse}を使ってみましたか。

27
Cesar

おそらくテーブルの周りに別の要素を配置して、丸みを帯びた境界線でスタイルを設定する必要があります。

ワーキングドラフト は、border-radiusの値がcollapseの場合、border-collapseをテーブル要素に適用しないことを指定します。

23
user59200

Ianが言ったように、解決策はdiv内にテーブルをネストして次のように設定することです。

.table_wrapper {
  border-radius: 5px;
  overflow: hidden;
}

overflow:hiddenを使うと、四角い角はdivからはみ出しません。

14
Chris

私の知る限りでは、次のようにすべてのセルを変更することが唯一の方法です。

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つのテーブルだけでこれを実行する方法が見つかりません。ヘッダー行をネストした表に変更すると、おそらく必要な効果が得られる可能性がありますが、動的ではなく、もっと効果的になります。

7
Joel

:before:afterの擬似要素thead th:first-childthead 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 を参照してください。

これは他のブラウザであなたのために働くかどうか私に知らせてください。

6
adardesign

実際には、ラッパーとしてtable内にdivを追加できます。そして、これらのCSSコードをwrapperに代入します。

.table-wrapper {
  border: 1px solid #f00;
  border-radius: 5px;
  overflow: hidden;
}

table {
  border-collapse: collapse;
}
5
AmerllicA

私は同じ問題を抱えていました。 border-collapseを完全に削除して、html文書で:cellspacing="0" cellpadding="0"を使用してください。例:

<table class="top_container" align="center" cellspacing="0" cellpadding="0">
5
lars

境界のあるスクロール可能な表の場合は、これを使用します(変数の置換、$開始テキスト)

theadtfootまたは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>
4
brauliobo

私はちょうどこれのために完璧に動作するように思える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 !*/
4
JacobTheDev

与えられた答えは、テーブルの周囲に境界がない場合にのみ機能します。これは非常に制限的です。

これを行うための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スタイルを含めるようにしてください。

お役に立てれば。

4
robbie613

同じ問題に遭遇した後にこの答えを見つけましたが、それは非常に簡単であることがわかりました:ただテーブルオーバーフローを与えてください:隠されて

ラッピング要素は不要です。確かに、この質問が最初に出されたときに7年前に機能したかどうかはわかりませんが、現在は機能します。

3
Akexis

丸みを帯びた角と枠線のセルのテーブル。 @ 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;
  }
}
3
Pere Pages

私は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
}

私はそれを試して、それが何をするのか推測します:)

3
ahmed ghanayem

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;        
}
3
Tommer

これは 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;
}
2
Mac Cowell

"display"で実験を始めたところ、border内のborder-radiusmarginpaddingtableが次のように表示されることがわかりました。

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;
}
2
Astro

私はいつも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;
    }
  }
}
0
Diego Mello