Заморозить верхнюю строку только для таблицы html (исправлена прокрутка заголовка таблицы)


Я хочу сделать таблицу html с верхней строкой замороженной (поэтому при прокрутке вниз по вертикали вы всегда можете ее увидеть).

есть ли умный способ сделать это без javascript?

обратите внимание, что мне не нужно, чтобы левый столбец был заморожен.

8 83

8 ответов:

Это называется фиксированной прокруткой заголовка. Существует ряд документированных подходов:

http://www.imaputz.com/cssStuff/bigFourVersion.html

http://rcswebsolutions.wordpress.com/2007/01/02/scrolling-html-table-with-fixed-header/

http://blog.oxagile.com/2009/10/26/scrollable-html-table-with-fixed-header-for-ie-7-ie-8-firefox-35-chrome/

вы не будете эффективно тянуть это без javascript ... особенно если вы хотите кроссбраузерную поддержку.

есть ряд gotchyas с любым подходом, который вы принимаете, особенно в отношении поддержки кросс-браузера / версии.

Edit:

даже если это не заголовок, который вы хотите исправить, а первая строка данных, концепция остается прежней. Я не был на 100%, о котором вы говорили.

дополнительные Моя компания поручила мне исследовать решение для этого это может работать в IE7+, Firefox и Chrome.

//float this one right over second table
<table>
  <tr>
    <th>Header 1</th>
    <th>Header 2</th>
  </tr>
</table>

<table>
//Data
</table>

альтернативный подход некоторые пытаются используйте теги tbody и thead, но это тоже неправильно, потому что IE не позволит вам поместить полосу прокрутки на tbody, что означает, что вы не можете ограничить ее высоту (так глупо IMO).

<table>
  <thead style="do some stuff to fix its position">
  <tr>
    <th>Header 1</th>
    <th>Header 2</th>
  </tr>
  </thead>
  <tbody style="No scrolling allowed here!">
     Data here
  </tbody>
</table>

этот подход имеет много проблем, таких как обеспечение точной ширины пикселей, потому что таблицы настолько симпатичны, что разные браузеры будут выделять пиксели по-разному на основе вычислений, и вы просто не можете (AFAIK) гарантировать, что распределение будет идеальным во всех случаях. Это становится понятно, если у вас есть границы внутри таблицы.

Я взял другой подход и сказал винт таблицы, так как вы не можете сделать эту гарантию. Я использовал divs для имитации таблиц. Это также имеет проблемы с позиционированием строк и столбцов (в основном потому, что у плавающего есть проблемы, использование встроенного блока не будет работать для IE7, поэтому он действительно оставил меня с использованием абсолютного позиционирования, чтобы поместить их на свои места).

есть кто-то там, что сделал Слик сетки, которая имеет очень похожий подход к мой и вы можете использовать и хороший (хотя и сложный) пример для достижения этого.

https://github.com/6pac/SlickGrid/wiki

по данным чистая Прокручиваемая таблица CSS с фиксированным заголовком Я написал демо легко исправить заголовок, установив overflow:auto для элемента tbody.

table thead tr{
    display:block;
}

table th,table td{
    width:100px;//fixed width
}


table  tbody{
  display:block;
  height:200px;
  overflow:auto;//set tbody to auto
}

моя забота была не иметь ячейки с фиксированной шириной. Который, казалось, не работал в любом случае. Я нашел это решение, которое кажется то, что мне нужно. Я размещаю его здесь для других, которые ищут способ. Проверьте это скрипка

Рабочий Фрагмент:

html, body{
  margin:0;
  padding:0;
  height:100%;
}
section {
  position: relative;
  border: 1px solid #000;
  padding-top: 37px;
  background: #500;
}
section.positioned {
  position: absolute;
  top:100px;
  left:100px;
  width:800px;
  box-shadow: 0 0 15px #333;
}
.container {
  overflow-y: auto;
  height: 160px;
}
table {
  border-spacing: 0;
  width:100%;
}
td + td {
  border-left:1px solid #eee;
}
td, th {
  border-bottom:1px solid #eee;
  background: #ddd;
  color: #000;
  padding: 10px 25px;
}
th {
  height: 0;
  line-height: 0;
  padding-top: 0;
  padding-bottom: 0;
  color: transparent;
  border: none;
  white-space: nowrap;
}
th div{
  position: absolute;
  background: transparent;
  color: #fff;
  padding: 9px 25px;
  top: 0;
  margin-left: -25px;
  line-height: normal;
  border-left: 1px solid #800;
}
th:first-child div{
  border: none;
}
<section class="">
  <div class="container">
    <table>
      <thead>
        <tr class="header">
          <th>
            Table attribute name
            <div>Table attribute name</div>
          </th>
          <th>
            Value
            <div>Value</div>
          </th>
          <th>
            Description
            <div>Description</div>
          </th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>align</td>
          <td>left, center, right</td>
          <td>Not supported in HTML5. Deprecated in HTML 4.01. Specifies the alignment of a table according to surrounding text</td>
        </tr>
        <tr>
          <td>bgcolor</td>
          <td>rgb(x,x,x), #xxxxxx, colorname</td>
          <td>Not supported in HTML5. Deprecated in HTML 4.01. Specifies the background color for a table</td>
        </tr>
        <tr>
          <td>border</td>
          <td>1,""</td>
          <td>Specifies whether the table cells should have borders or not</td>
        </tr>
        <tr>
          <td>cellpadding</td>
          <td>pixels</td>
          <td>Not supported in HTML5. Specifies the space between the cell wall and the cell content</td>
        </tr>
        <tr>
          <td>cellspacing</td>
          <td>pixels</td>
          <td>Not supported in HTML5. Specifies the space between cells</td>
        </tr>
        <tr>
          <td>frame</td>
          <td>void, above, below, hsides, lhs, rhs, vsides, box, border</td>
          <td>Not supported in HTML5. Specifies which parts of the outside borders that should be visible</td>
        </tr>
        <tr>
          <td>rules</td>
          <td>none, groups, rows, cols, all</td>
          <td>Not supported in HTML5. Specifies which parts of the inside borders that should be visible</td>
        </tr>
        <tr>
          <td>summary</td>
          <td>text</td>
          <td>Not supported in HTML5. Specifies a summary of the content of a table</td>
        </tr>
        <tr>
          <td>width</td>
          <td>pixels, %</td>
          <td>Not supported in HTML5. Specifies the width of a table</td>
        </tr>
      </tbody>
    </table>
  </div>
</section>

можно использовать position:fixed on <th> (<th> будучи верхней строкой).

вот пример

вы можете использовать два дива один для заголовков, а другой для таблицы. тогда используйте

#headings {
  position: fixed;
  top: 0px;
  width: 960px;
}

как сказал @ptriek, это будет работать только для столбцов фиксированной ширины.

плагин Chromatable jquery позволяет фиксированный заголовок (или верхнюю строку) с шириной, которая позволяет проценты--предоставлено, только процент 100%.

http://www.chromaloop.com/posts/chromatable-jquery-plugin

Я не могу думать о том, как вы могли бы сделать это без javascript.

обновление: новая ссылка -> http://www.jquery-plugins.info/chromatable-00012248.htm

Я использую этот:

tbody{
  overflow-y: auto;
  height: 350px;
  width: 102%;
}
thead,tbody{
    display: block;
}

Я определяю ширину столбцов с Bootstrap CSS в коль-МД-ХХ. Без определения столбцов, ширина авто-ширина не соответствует . 102% процентов, потому что вы теряете некоторые sapce с переполнением

С помощью CSS стилей зебра

скопируйте вставить этот пример и посмотреть заголовок исправлено.

       <style>
       .zebra tr:nth-child(odd){
       background:white;
       color:black;
       }

       .zebra tr:nth-child(even){
       background: grey;
       color:black;
       }

      .zebra tr:nth-child(1) {
       background:black;
       color:yellow;
       position: fixed;
       margin:-30px 0px 0px 0px;
       }
       </style>


   <DIV  id= "stripped_div"

         class= "zebra"
         style = "
            border:solid 1px red;
            height:15px;
            width:200px;
            overflow-x:none;
            overflow-y:scroll;
            padding:30px 0px 0px 0px;"
            >

                <table>
                   <tr >
                       <td>Name:</td>
                       <td>Age:</td>
                   </tr>
                    <tr >
                       <td>Peter</td>
                       <td>10</td>
                   </tr>
                </table>

    </DIV>

обратите внимание на верхнюю прокладку 30px в листьях div пространство, которое используется 1-й строкой разделенных данных ie tr:nth-child(1) то есть " фиксированное положение" и отформатирован с запасом-30px