Border style do not work with sticky position element

后端 未结 11 2252
攒了一身酷
攒了一身酷 2020-12-01 13:41

I don\'t know why my border style do not work with position: sticky; attribute. I would like to set border styles on my sticky table header. But I don\'t want t

相关标签:
11条回答
  • 2020-12-01 13:57

    Use ::after pseudo selector to emulate, lets say, right border

    Example:

    th::after {
      content: '';
      position: absolute;
      top: 0;
      right: 0;
      height: 100%;
      border-right: 1px solid #e7e7e7;
    }
    
    
    
    0 讨论(0)
  • 2020-12-01 14:05

    The problem occurs because of the use of border-collapse: collapse. When browsers collapse the borders, the top and bottom border on the <th> must be getting applied to surrounding elements—the top border to the <table> and the bottom border to the following <tr>.

    If you use border-collapse: separate and fashion your borders to sit on one side, the borders will truly attach to the <th>, stay fixed as expected, and appear collapsed.

    Here are example styles that can be applied to your HTML snippet.

    #wrapper {
      width: 400px;
      height: 200px;
      overflow: auto;
    }
    
    table {
      width: 100%;
      text-align: center;
      border-collapse: separate; /* Don't collapse */
      border-spacing: 0;
    }
    
    table th {
      /* Apply both top and bottom borders to the <th> */
      border-top: 2px solid;
      border-bottom: 2px solid;
      border-right: 2px solid;
    }
    
    table td {
      /* For cells, apply the border to one of each side only (right but not left, bottom but not top) */
      border-bottom: 2px solid;
      border-right: 2px solid;
    }
    
    table th:first-child,
    table td:first-child {
      /* Apply a left border on the first <td> or <th> in a row */
      border-left: 2px solid;
    }
    
    table thead th {
      position: sticky;
      top: 0;
      background-color: #edecec;
    }
    
    0 讨论(0)
  • 2020-12-01 14:09
    1. sticky with header border visible

    html{
        padding: 0px;
        margin: 0px;
    }
    body{
        padding: 0px;
        margin: 0px;
        width:100%;
    }
    
     th,td{
         padding:10px;
         border: 0.1px solid #e8e0e0;
         padding-right:10px;
     }   
     th{
         text-align: center;
        background: #f3f3f3;
        background-clip: padding-box;
     }
    
    
    thead th:first-child {
      left: 0;
      z-index: 1;
    }
    tbody th:first-child  {
       text-align: center;
      position: -webkit-sticky; /* for Safari */
      position: sticky;
      left: 0;
     
    }
    tbody th,thead th:first-child  {
    /* display:flex; */
    /* text-align: center;
    align-items: center;
    align-self: center; */
        width:30px;
        
        min-width: 30px;
        max-width: 30px;
        word-break: break-all;
    }
    .fixed_header{
        width: 100%;
        /* height: 500px; */
        table-layout: fixed;
        border-collapse: collapse;
    }
    /* .fixed_header tbody{
      overflow: auto;
     
    } */
    
    /* fixed header */
    thead th {
        /* for Safari */
     text-align: center;
      position: -webkit-sticky;
       position: sticky;
    
      top: 0;
    
    
    }
    
    .fixed_header th, .fixed_header td {
        padding:10px;
      /* text-align: left; */
      width: 90px;
    }
    
    .fixed_header td{
        /* padding:10px; */
    /* word-break: break-all; */
    /* max-width: 200px; */
    }
    .table_container{
    /* position: fixed; */
    position: relative;
    width:100% ;
    min-height: 500px;
    overflow: auto;
    background:cornsilk;
    }
     <table class="fixed_header">
                    <thead>
                      <tr>
                       <th></th>
                        <th>Col 1</th>
                        <th>Col 2</th>
                        <th>Col 3</th>
                        <th>Col 4</th>
                        <th>Col 5</th>
                              <th>Col 1</th>
                        <th>Col 2</th>
                        <th>Col 3</th>
                        <th>Col 4</th>
                        <th>Col 5</th>
                              <th>Col 1</th>
                        <th>Col 2</th>
                        <th>Col 3</th>
                        <th>Col 4</th>
                        <th>Col 5</th>
                              <th>Col 1</th>
                        <th>Col 2</th>
                        <th>Col 3</th>
                        <th>Col 4</th>
                        <th>Col 5</th>
                      </tr>
                    </thead>
                    <tbody>
                      <tr>
                        <th>1</th>
                        <td>row 1-1</td>
                        <td>row 1-2</td>
                        <td>row 1-3</td>
                        <td>row 1-4</td>
                        <td>row 1-1</td>
                        <td>row 1-2</td>
                        <td>row 1-3</td>
                        <td>row 1-4</td>
                        <td>row 1-1</td>
                        <td>row 1-2</td>
                        <td>row 1-3</td>
                        <td>row 1-4</td>
                        <td>row 1-1</td>
                        <td>row 1-2</td>
                        <td>row 1-3</td>
                        <td>row 1-4</td>
                        <td>row 1-1</td>
                        <td>row 1-2</td>
                        <td>row 1-3</td>
                        <td>row 1-4</td>  
                    </tr>     
    
                    </tbody>
                  </table>
                </div>

    0 讨论(0)
  • 2020-12-01 14:10

    You need to use box-shadow property instead of border-top/border-bottom. Additionally you need to delete top/bottom borders for the head and first row of table.

    #wrapper {
                    width : 400px;
                    height : 200px;
                    overflow : auto;
                }
                table {
                    width : 100%;
                    text-align : center;
                    border-collapse : collapse;
                }
                table tr th, table tr td {
                    border : 2px solid;
                }
                table thead th {
                    position: -webkit-sticky;
                    position : sticky;
                    top : 0;
                    background-color : #edecec;
                }
    
                /* here is the trick */
                table tbody:nth-of-type(1) tr:nth-of-type(1) td {
                    border-top: none !important;
                }
                table thead th {
                    border-top: none !important;
                    border-bottom: none !important;
                    box-shadow: inset 0 2px 0 #000000,
                                inset 0 -2px 0 #000000;
                    padding: 2px 0;
                }
                /* and one small fix for weird FF behavior, described in https://stackoverflow.com/questions/7517127/ */
                table thead th {
                    background-clip: padding-box
                }
                
    <body>
            <div id="wrapper">
                <table>
                    <thead>
                        <tr>
                            <th>A</th>
                            <th>B</th>
                            <th>C</th>
                            <th>D</th>
                            <th>E</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>1</td>
                            <td>1</td>
                            <td>1</td>
                            <td>1</td>
                            <td>1</td>
                        </tr>
                        <tr>
                            <td>2</td>
                            <td>2</td>
                            <td>2</td>
                            <td>2</td>
                            <td>2</td>
                        </tr>
                        <tr>
                            <td>3</td>
                            <td>3</td>
                            <td>3</td>
                            <td>3</td>
                            <td>3</td>
                        </tr>
                        <tr>
                            <td>4</td>
                            <td>4</td>
                            <td>4</td>
                            <td>4</td>
                            <td>4</td>
                        </tr>
                        <tr>
                            <td>5</td>
                            <td>5</td>
                            <td>5</td>
                            <td>5</td>
                            <td>5</td>
                        </tr>
                        <tr>
                            <td>6</td>
                            <td>6</td>
                            <td>6</td>
                            <td>6</td>
                            <td>6</td>
                        </tr>
                        <tr>
                            <td>7</td>
                            <td>7</td>
                            <td>7</td>
                            <td>7</td>
                            <td>7</td>
                        </tr>
                        <tr>
                            <td>8</td>
                            <td>8</td>
                            <td>8</td>
                            <td>8</td>
                            <td>8</td>
                        </tr>   
                        <tr>
                            <td>9</td>
                            <td>9</td>
                            <td>9</td>
                            <td>9</td>
                            <td>9</td>
                        </tr>               
                    </tbody>
                </table>
            </div>
        </body>

    0 讨论(0)
  • 2020-12-01 14:11

    Because sticky positioning fluctuates between relative and fixed, the only way I can think to circumvent this out-of-box would be take advantage of psuedo classes.

    I'm sure there's a more elegant manner to accomplish this but I would just alter the :after and :before psuedo classes to provide the border with absolute positioning.

    #wrapper {
      width: 400px;
      height: 200px;
      overflow: auto;
    }
    
    table {
      width: 100%;
      text-align: center;
      border-collapse: collapse;
    }
    
    table tr th,
    table tr td {
      border: 2px solid;
    }
    
    table thead th {
      position: -webkit-sticky;
      position: sticky;
      top: -1px;
      background-color: #edecec;
    }
    th:after,
    th:before {
      content: '';
      position: absolute;
      left: 0;
      width: 100%;
    }
    th:before {
      top: 0;
      border-top: 3px solid blue;
    }
    th:after {
      bottom: 0;
      border-bottom: 3px solid blue;
    }
    <div id="wrapper">
      <table>
        <thead>
          <tr>
            <th>A</th>
            <th>B</th>
            <th>C</th>
            <th>D</th>
            <th>E</th>
          </tr>
        </thead>
        <tr>
          <td>1</td>
          <td>1</td>
          <td>1</td>
          <td>1</td>
          <td>1</td>
        </tr>
        <tr>
          <td>2</td>
          <td>2</td>
          <td>2</td>
          <td>2</td>
          <td>2</td>
        </tr>
        <tr>
          <td>3</td>
          <td>3</td>
          <td>3</td>
          <td>3</td>
          <td>3</td>
        </tr>
        <tr>
          <td>4</td>
          <td>4</td>
          <td>4</td>
          <td>4</td>
          <td>4</td>
        </tr>
        <tr>
          <td>5</td>
          <td>5</td>
          <td>5</td>
          <td>5</td>
          <td>5</td>
        </tr>
        <tr>
          <td>6</td>
          <td>6</td>
          <td>6</td>
          <td>6</td>
          <td>6</td>
        </tr>
        <tr>
          <td>7</td>
          <td>7</td>
          <td>7</td>
          <td>7</td>
          <td>7</td>
        </tr>
        <tr>
          <td>8</td>
          <td>8</td>
          <td>8</td>
          <td>8</td>
          <td>8</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tr>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
          <td>9</td>
        </tr>
        <tbody>
        </tbody>
      </table>
    </div>

    0 讨论(0)
  • 2020-12-01 14:12

    Use table thead th instead of table thead. This is demo. https://jsfiddle.net/nhatphamcdn/9dhqchtu/

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