これはCSSグリッドレイアウトで作成されたテーブルですが、問題があり、各行でホバー状態にすることはできません。
これにはCSSのみを使用します。
誰も私にこの解決策を教えてもらえますか?
.table {
display: grid;
grid-template-columns: [col-start] auto [col-end];
grid-template-rows: [header-start] 50px [header-end row-start] auto [row-end];
grid-auto-rows: auto;
grid-auto-columns: auto;
grid-gap: 1px;
}
.table>* {
background: gray;
padding: 10px;
}
.heading {
background: navy;
color: #fff;
grid-row: header;
}
<div class="table">
<div class="heading">Title 1</div>
<div class="heading">Title 2</div>
<div class="heading">Title 3</div>
<div class="heading">Title 4</div>
<div class="heading">Title 5</div>
<div class="row">Row 1</div>
<div class="row">Row 1</div>
<div class="row">Row 1</div>
<div class="row">Row 1</div>
<div class="row">Row 1</div>
<div class="row">Row 2</div>
<div class="row">Row 2</div>
<div class="row">Row 2</div>
<div class="row">Row 2</div>
<div class="row">Row 2</div>
<div class="row">Row 3</div>
<div class="row">Row 3</div>
<div class="row">Row 3</div>
<div class="row">Row 3</div>
<div class="row">Row 3</div>
</div>
擬似要素を使用したトリックを次に示します。アイデアは、要素を背景として使用し、すべての行をカバーするように左右にオーバーフローさせることです。そのように、行内の要素にカーソルを合わせると色が変わり、行全体の色が変わったようになります。
このトリックには、マークアップの変更がほとんどなく、より多くのCSSが含まれます。
.table {
display: grid;
grid-template-columns: [col-start] auto [col-end];
grid-template-rows: [header-start] 50px [header-end row-start] auto [row-end];
grid-auto-rows: auto;
grid-auto-columns: auto;
grid-gap: 1px;
overflow: hidden;
background: gray;
}
.table>* {
padding: 10px;
position: relative;
}
.heading {
background: navy;
color: #fff;
grid-row: header;
}
.row span {
position: relative;
z-index: 2;
}
.row:before {
content: "";
position: absolute;
top: 0;
bottom: 0;
right: -1000%;
left: -1000%;
z-index: 1;
}
.row:after {
content: "";
position: absolute;
top: 0;
bottom: 0;
right: -1px;
width: 1px;
z-index: 2;
background-color: #fff;
}
.row:nth-child(5n+5)::after {
bottom: -1px;
right: 0;
left: -1000%;
height: 1px;
z-index: 3;
width: auto;
top: auto;
background-color: #fff;
}
.row:hover::before {
background-color: red;
}
<div class="table">
<div class="heading">Title 1</div>
<div class="heading">Title 2</div>
<div class="heading">Title 3</div>
<div class="heading">Title 4</div>
<div class="heading">Title 5</div>
<div class="row"><span>Row 1</span></div>
<div class="row"><span>Row 1</span></div>
<div class="row"><span>Row 1</span></div>
<div class="row"><span>Row 1</span></div>
<div class="row"><span>Row 1</span></div>
<div class="row"><span>Row 2</span></div>
<div class="row"><span>Row 2</span></div>
<div class="row"><span>Row 2</span></div>
<div class="row"><span>Row 2</span></div>
<div class="row"><span>Row 2</span></div>
<div class="row"><span>Row 3</span></div>
<div class="row"><span>Row 3</span></div>
<div class="row"><span>Row 3</span></div>
<div class="row"><span>Row 3</span></div>
<div class="row"><span>Row 3</span></div>
</div>
これをテーブルとして扱い、要素が同じ行にとどまるため、「表示」を「コンテンツ」に設定してDIVの各行をラップすることもできます。これは、ホバーに使用する無害な親要素を形成し、子要素をスタイルします。 (表示:コンテンツはまだEdgeでサポートされていません。)
.table {
display: grid;
grid-template-columns: [col-start] auto [col-end];
grid-template-rows: [header-start] 50px [header-end row-start] auto [row-end];
grid-auto-rows: auto;
grid-auto-columns: auto;
grid-gap: 1px;
overflow: hidden;
background: gray;
}
.table .row, .table .heading{
padding: 10px;
position: relative;
}
.heading {
background: navy;
color: #fff;
grid-row: header;
}
.row span {
position: relative;
z-index: 2;
}
.rowWrapper{
display: contents;
}
.rowWrapper:hover div{
background-color: orange;
}
<div class="table">
<div class="heading">Title 1</div>
<div class="heading">Title 2</div>
<div class="heading">Title 3</div>
<div class="heading">Title 4</div>
<div class="heading">Title 5</div>
<div class="rowWrapper">
<div class="row"><span>Row 1</span></div>
<div class="row"><span>Row 1</span></div>
<div class="row"><span>Row 1</span></div>
<div class="row"><span>Row 1</span></div>
<div class="row"><span>Row 1</span></div>
</div>
<div class="rowWrapper">
<div class="row"><span>Row 2</span></div>
<div class="row"><span>Row 2</span></div>
<div class="row"><span>Row 2</span></div>
<div class="row"><span>Row 2</span></div>
<div class="row"><span>Row 2</span></div>
</div>
<div class="rowWrapper">
<div class="row"><span>Row 3</span></div>
<div class="row"><span>Row 3</span></div>
<div class="row"><span>Row 3</span></div>
<div class="row"><span>Row 3</span></div>
<div class="row"><span>Row 3</span></div>
</div>
</div>
兄弟コンビネーターに基づいた私のソリューションです。
主な部分は次のとおりです。
.datacell:hover ~ .datarow {
background-color: rgba(255,255,0,0.5);
}
.datacell:hover ~ .datarow + .datacell ~ .datarow{
background-color: transparent;
}
スニペット:
.datatable{
display:grid;
grid-gap: 0;
grid-template-columns: auto 1fr auto;
position: relative;
}
.datarow{
grid-column: 1 / 4;
z-index: 0;
}
.datacell{
z-index: 1;
padding: 8px;
border-bottom: 1px solid #c0c0c0;
}
.datacell:hover ~ .datarow {
background-color: rgba(255,255,0,0.5);
}
.datacell:hover ~ .datarow + .datacell ~ .datarow{
background-color: transparent;
}
.row-1{ grid-row: 1;}
.row-2{ grid-row: 2;}
.row-3{ grid-row: 3;}
.col-1{ grid-column: 1;}
.col-2{ grid-column: 2;}
.col-3{ grid-column: 3;}
<div class="datatable">
<div class="datacell col-1 row-1">Row 1 Column 1</div>
<div class="datacell col-2 row-1">Row 1 Column 2</div>
<div class="datacell col-3 row-1">Row 1 Column 3</div>
<div class="datarow row-1"></div>
<div class="datacell col-1 row-2">Row 2 Column 1</div>
<div class="datacell col-2 row-2">Row 2 Column 2</div>
<div class="datacell col-3 row-2">Row 2 Column 3</div>
<div class="datarow row-2"></div>
<div class="datacell col-1 row-3">Row 3 Column 1</div>
<div class="datacell col-2 row-3">Row 3 Column 2</div>
<div class="datacell col-3 row-3">Row 3 Column 3</div>
<div class="datarow row-3"></div>
</div>
Htmlは、.datarow
要素は、仮想グリッド行を閉じ、先行するすべてのセルにまたがります。セルと行をオーバーラップさせるには、グリッド内の位置を明示する必要があります。
この問題がありました。まず、表示グリッドを使用している場合、なぜグリッド項目クラスを使用しないのかを知りたいのですが。それは必要ではないのですか?私はそう思う。とにかく、答えは、すべてのdiv要素にgrid-itemクラスを与え、位置をRelativeに設定する必要があるということです。
.grid-item {
position: relative;
}