How to make hover state on row table with CSS grid layout

后端 未结 5 1033
伪装坚强ぢ
伪装坚强ぢ 2020-12-14 16:52

This a table that created with CSS Grid Layout, but I have a problem with it, I can\'t make hover state on each row.

I only want use CSS for this.

Can anyone

相关标签:
5条回答
  • 2020-12-14 17:31

    I have solution for your problem. The example below:

    .grid .row {
      display: grid;
      grid-template-columns: repeat(4, 1fr);
      border-bottom: 1px solid gray;
    }
    .grid .row div {
      padding: 10px;
      display: flex;
      align-items: center;
    }
    .grid .row:last-child {
      border: none;
    }
    .grid .row:hover {
      background-color: #cccccc;
      transition: .2s all;
    }
    <div class='grid'>
      <div class='row'>
        <div>Header</div>
        <div>Header</div>
        <div>Header</div>
        <div>Header</div>
      </div>
      <div class='row'>
        <div>Content</div>
        <div>Content</div>
        <div>Content</div>
        <div>Content</div>
      </div>
      <div class='row'>
        <div>Content</div>
        <div>Content</div>
        <div>Content</div>
        <div>Content</div>
      </div>
      <div class='row'>
        <div>Content</div>
        <div>Content</div>
        <div>Content</div>
        <div>Content</div>
      </div>
    </div>

    0 讨论(0)
  • 2020-12-14 17:32

    Here's my solution, based on sibling combinators.
    The main part is:

    .datacell:hover ~ .datarow {
        background-color: rgba(255,255,0,0.5);
    }
    .datacell:hover ~ .datarow + .datacell ~ .datarow{
        background-color: transparent;
    }
    

    Snippet:

    .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>

    The html must be structured so that a .datarow element closes the virtual grid row and spans all the preceding cells. Explicitation of the positioning inside the grid is needed in order to let cells and rows overlap.

    0 讨论(0)
  • 2020-12-14 17:45

    I had this problem. First, I'm curious to know why if you are using display grid, how come you are not using the grid-item class? is that not necessary? I think it is. Anyway, the answer is, you need to give all your div elements the grid-item class and set the position to Relative.

    .grid-item {
      position: relative;
    }
    
    0 讨论(0)
  • 2020-12-14 17:46

    Here is a trick using pseudo-element. The idea is to use the element as a background and make it overflow on the left and right so that it will cover all the row. Like that if you hover on any element inside a row you change the color and it's like you changed the color of the whole row.

    This trick involve few changes on the markup and also more 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>

    0 讨论(0)
  • 2020-12-14 17:48

    Since you are treating this as a table, where the elements stay in the same row, you can also wrap each row in a DIV with "display" set to "contents." This forms an innocuous parent element that you use for hover, and then style the child elements. (display: contents is not yet supported in Edge, though.)

    .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>

    0 讨论(0)
提交回复
热议问题