Твиттер-скроллер с возможностью прокрутки

149

Я хотел бы иметь таблицу на моем сайте. Проблема в том, что в этой таблице будет около 400 строк. Как я могу ограничить высоту стола и применить к нему полосу прокрутки? Это мой код:

<div class="span3">
  <h2>Achievements left</h2>
<table class="table table-striped">
  <thead>
    <tr>
      <th>#</th>
      <th>Name</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>Something</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Something</td>
    </tr>
    <tr>
      <td>3</td>
      <td>Something</td>
    </tr>
    <tr>
      <td>4</td>
      <td>Something</td>
    </tr>
    <tr>
      <td>5</td>
      <td>Something</td>
    </tr>
    <tr>
      <td>6</td>
      <td>Something</td>
    </tr>
  </tbody>
</table>

  <p><a class="btn" href="#">View details &raquo;</a></p>
</div>

Я пытался применить максимальную высоту и фиксированную высоту к столу, но это не работает.

Панги
источник

Ответы:

241

Элементы таблицы, кажется, не поддерживают это напрямую. Поместите стол в div и установите высоту div и установите overflow: auto.

Джонатан Вуд
источник
50
Это на самом деле работает? Я попробовал это, и это не имело никакого эффекта вообще.
cjstehno
8
Просто FYI, установив переполнение на «auto», а не переполнение: прокрутка, не создаст избыточную горизонтальную полосу прокрутки.
daCoda
8
@JonathanWood: есть ли способ применить overflowтолько к основанию таблицы, но где <thead>части всегда отображаются?
Виллем Ван Онсем
8
Просто чтобы прояснить это для людей .... <div style = "overflow: auto;"> <table class = "table"> .... </ table> </ div>
Генри Вебер
3
Пожалуйста, приведите небольшой пример!
Яхья Яхьяуи
53
.span3 {  
    height: 100px !important;
    overflow: scroll;
}​

Вы захотите обернуть его в свой собственный div или присвоить этому span3 свой собственный идентификатор, чтобы не влиять на весь макет.

Вот скрипка: http://jsfiddle.net/zm6rf/

Аккорды
источник
2
Обратите внимание, что «! Важно» не важно;)
Аккорды
8
Будьте осторожны, установка этих свойств .span3повлияет на все span3 элементы всего сайта, управляемого Bootstrap.
Терри
1
Вы можете добавить процент высоты только в том случае, если родительский контейнер имеет высоту в пикселях. В вашем случае вам нужно сделать что-то вроде установки .row на 500px и .span3 на 50%. Если родительский элемент не имеет установленной высоты, браузер по умолчанию использует высоту содержимого, если вы задаете процент.
Аккорды
1
Можете ли вы сделать это, заставляя тело ругаться, а теаду нет?
уличный фонарь
1
Для вашей информации, установка overflow: scroll создаст горизонтальную полосу прокрутки, которая может быть избыточной. Делая это автоматически, т.е. переполнение: авто, это не делает.
daCoda
38

Не нужно оборачивать это в div ...

CSS :

tr {
width: 100%;
display: inline-table;
table-layout: fixed;
}

table{
 height:300px;              // <-- Select the height of the table
 display: -moz-groupbox;    // Firefox Bad Effect
}
tbody{
  overflow-y: scroll;      
  height: 200px;            //  <-- Select the height of the body
  width: 100%;
  position: absolute;
}

Bootply : http://www.bootply.com/AgI8LpDugl

БЕНАРД Патрик
источник
Я был очень взволнован, когда увидел этот пример, но оказалось, что компоновка «запуталась», когда данные в tdэлементе различаются по размеру. bootply.com/OsvzINuTUA
Frito
4
@Frito Не волнуйся, будь счастлив;) Я просто забыл раскладку стола: исправлено; ... Ссылка обновлена
БЕНАРД Патрик
30

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

В моем решении верхний и нижний колонтитулы остаются фиксированными, пока тело прокручивается.

<div class="table-responsive">
    <table class="table table-striped table-hover table-condensed">
        <thead>
            <tr>
                <th width="25%">First Name</th>
                <th width="13%">Last Name</th>
                <th width="25%" class="text-center">Address</th>
                <th width="25%" class="text-center">City</th>
                <th width="4%" class="text-center">State</th>
                <th width="8%" class="text-center">Zip</th>
            </tr>
        </thead>
    </table>
    <div class="bodycontainer scrollable">
        <table class="table table-hover table-striped table-condensed table-scrollable">
            <tbody>
                <!-- add rows here, specifying same widths as in header, at least on one row -->
            </tbody>
        </table>
    </div>
    <table class="table table-hover table-striped table-condensed">
        <tfoot>
            <!-- add your footer here... -->
        </tfoot>
    </table>
</div>

А потом просто применил следующий CSS:

.bodycontainer { max-height: 450px; width: 100%; margin: 0; overflow-y: auto; }
.table-scrollable { margin: 0; padding: 0; }

Я надеюсь, что это помогает кому-то еще.

Тодд
источник
Спасибо, это помогает. К сожалению, я не могу указать ширину th элементов, так как это недопустимый элемент. (???)
Эрвин Роиджаккерс
1
столбцы td не выровнены с элементами th, потому что полоса прокрутки сдвигает контент
IHeartAndroid
Ааа ... Я на Mac, где полосы прокрутки невидимы и отображаются поверх содержимого только при прокрутке. Это будет непросто, поскольку полосы прокрутки зависят от ОС и браузера.
Тодд
9

Недавно мне пришлось сделать это с помощью bootstrap и angularjs, я создал директиву angularjs, которая решает проблему, вы можете увидеть рабочий пример и подробности в этом посте .

Вы используете его, просто добавив атрибут с фиксированным заголовком в тег таблицы:

<table class="table table-bordered" fixed-header>
...
</table>

Если вы не используете angularjs, вы можете настроить javascript директивы и использовать его напрямую.

Джейсон
источник
8

CSS

.achievements-wrapper { height: 300px; overflow: auto; }

HTML

<div class="span3 achievements-wrapper">
    <h2>Achievements left</h2>
    <table class="table table-striped">
    ...
    </table>
</div>
Терри
источник
Можно ли сохранить относительную высоту?
Панги
Я хочу, чтобы высота была установлена ​​в процентах. Это возможно? Я не мог заставить его работать.
Панги
Конечно, просто установите высоту стола на 100%. .table-class-name { height: 100%; },
Терри
Это расширяет мой стол, и это продолжается и продолжается. (Это не имеет никакого эффекта)
Панги
4
С помощью этого метода заголовок также можно прокручивать, так есть ли способ исправить заголовок таблицы?
Kyleinincubator
4

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

(Столбец с фиксированной шириной - это метод, который я использую для таблицы с большим количеством строк, для которой требуется только дублирование строки заголовка)

Образец кода:

<div style="height:30px;overflow:hidden;margin-right:15px;">
   <table class="table">
       <thead>
           <tr>
                <th>Col 1</th>
                <th>Col 2</th>
                <th>Col 3</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Cel 1,1</td>
                <td>Cel 1,2</td>
                <td>Cel 1,3</td>
            </tr>
            <tr>
                <td>Cel 2,1</td>
                <td>Cel 2,2</td>
                <td>Cel 2,3</td>
            </tr>
            <tr>
                <td>Cel 3,1</td>
                <td>Cel 3,2</td>
                <td>Cel 3,3</td>
            </tr>


        </tbody>
    </table>
</div>
<div style="height:100px;overflow-y:scroll;;">
    <table class="table">
        <thead>

        </thead>
        <tbody>
            <tr>
                <td>Cel 1,1</td>
                <td>Cel 1,2</td>
                <td>Cel 1,3</td>
            </tr>
            <tr>
                <td>Cel 2,1</td>
                <td>Cel 2,2</td>
                <td>Cel 2,3</td>
            </tr>
            <tr>
                <td>Cel 3,1</td>
                <td>Cel 3,2</td>
                <td>Cel 3,3</td>
            </tr>
             <tr style="color:white">
                <th>Col 1</th>
                <th>Col 2</th>
                <th>Col 3</th>
            </tr>
        </tbody>
    </table>
</div>
Chukiat
источник
4

Поместите таблицу в div и передайте этому div класс pre-scrollable.

Реза Саадати
источник
3

У меня недавно была похожая проблема, и я решил ее, используя смесь разных решений.

Первый и самый простой - использовать две таблицы: одну для заголовков и одну для тела. Это работает, но заголовки и столбцы тела не выровнены. И, так как я хотел использовать авторазмер, который поставляется с таблицами начальной загрузки Twitter, я закончил тем, что создал функцию Javascript, которая изменяет заголовки, когда: тело отображается; окна изменяются; изменяются данные в столбце и т. д.

Вот часть кода, который я использовал:

        <table class="table table-striped table-hover" style="margin-bottom: 0px;">
        <thead>
            <tr>
                <th data-sort="id">Header 1</i></th>
                <th data-sort="guide">Header 2</th>
                <th data-sort="origin">Header 3</th>
                <th data-sort="supplier">Header 4</th>
            </tr>
        </thead>
    </table>
    <div class="bodycontainer scrollable">
        <table class="table table-hover table-striped table-scrollable">
            <tbody id="rows"></tbody>
        </table>
    </div>

Заголовки и тело разделены на две отдельные таблицы. Один из них находится внутри DIV с необходимым стилем для создания вертикальных полос прокрутки. Вот CSS, который я использовал:

.bodycontainer {
  //height: 200px
  width: 100%;
  margin: 0;
}

.table-scrollable {
  margin: 0px;
  padding: 0px;
}

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

Атрибуты сортировки данных, которые я использовал в заголовках, также используются в каждом тд. Таким образом, я мог бы получить ширину и отступ каждого тд и ширину строки. Используя атрибуты сортировки данных, я с помощью CSS устанавливаю соответственно отступы и ширину каждого заголовка и строки заголовка, которая всегда больше, поскольку у нее нет полосы прокрутки. Вот функция, использующая coffeescript:

fixHeaders: =>
  for header, i in @headers
    tdpadding = parseInt(@$("td[data-sort=#{header}]").css('padding'))
    tdwidth = parseInt(@$("td[data-sort=#{header}]").css('width'))
    @$("th[data-sort=#{header}]").css('padding', tdpadding)
    @$("th[data-sort=#{header}]").css('width', tdwidth)
    if (i+1) == @headers.length
      trwidth = @$("td[data-sort=#{header}]").parent().css('width')
      @$("th[data-sort=#{header}]").parent().parent().parent().css('width', trwidth)
      @$('.bodycontainer').css('height', window.innerHeight - ($('html').outerHeight() -@$('.bodycontainer').outerHeight() ) ) unless @collection.length == 0

Здесь я предполагаю, что у вас есть массив заголовков, называемых @headers.

Это не красиво, но это работает. Надеюсь, это кому-нибудь поможет.

guzmonne
источник
3

Все вышеперечисленные решения также делают прокрутку заголовка таблицы ... Если вы хотите прокрутить только tbody, примените следующее:

tbody {
    height: 100px !important;
    overflow: scroll;
    display:block;
}
solo999
источник
7
Это будет работать только в том случае, если это таблица из одного столбца. Если у вас есть таблица с несколькими столбцами, это приведет к прокрутке только первого столбца.
empo
2

Ни один из этих ответов не работал для меня удовлетворительно. Они либо не фиксировали строку заголовка таблицы на месте, либо требовали фиксированной ширины столбца для работы, и даже в этом случае имели тенденцию выравнивать строки заголовка и строки тела в различных браузерах.

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

Саймон Брангвин
источник
2

Предложение Джонатана Вуда. У меня нет возможности упаковки таблиц с новым div, так как я использую CMS. Используя JQuery, вот что я сделал:

$( "table" ).wrap( "<div class='table-overflow'></div>" );

Это оборачивает элементы таблицы новым div с классом «table-overflow».

Затем вы можете просто добавить следующее определение в ваш файл CSS:

.table-overflow { overflow: auto; }     
Скотт
источник
2

поместите стол внутри div, чтобы сделать таблицу с возможностью прокрутки вертикально. изменить, overflow-yчтобы overflow-xсделать таблицу прокручиваемой горизонтально. просто overflowчтобы сделать таблицу прокручиваемой как горизонтальной, так и вертикальной.

<div style="overflow-y: scroll;"> 
    <table>
    ...
    </table>
</div>
Икбал Пратомо Сантосо
источник
1

Подумал, что я бы опубликовал здесь, так как я не мог заставить все вышеперечисленное работать с Bootstrap 4. Я нашел это в Интернете и отлично работал для меня ...

table
{
    width: 100%;
    display: block;
    border:solid black 1px;
}

thead
{
    display: inline-block;
    width: 100%;
    height: 20px;
}

tbody
{
    height: 200px;
    display: inline-block;
    width: 100%;
    overflow: auto;
}

th, td
{
    width: 100px;
    border:solid 1px black;
    text-align:center;
}

Я также приложил рабочий jsfindle.

https://jsfiddle.net/jgngg28t/

Надеюсь, это поможет кому-то еще.

BV2005
источник