Как я могу установить <table>
ширину 100% и поместить только в <tbody>
вертикальную прокрутку для некоторой высоты?
table {
width: 100%;
display:block;
}
thead {
display: inline-block;
width: 100%;
height: 20px;
}
tbody {
height: 200px;
display: inline-block;
width: 100%;
overflow: auto;
}
<table>
<thead>
<tr>
<th>Head 1</th>
<th>Head 2</th>
<th>Head 3</th>
<th>Head 4</th>
<th>Head 5</th>
</tr>
</thead>
<tbody>
<tr>
<td>Content 1</td>
<td>Content 2</td>
<td>Content 3</td>
<td>Content 4</td>
<td>Content 5</td>
</tr>
</tbody>
</table>
Я хочу избежать добавления какого-либо дополнительного div, все, что мне нужно, это простая таблица, подобная этой, и когда я пытаюсь изменить отображение table-layout
, position
и многое другое в таблице CSS, не работающей хорошо со 100% шириной только с фиксированной шириной в px.
html
css
vertical-scrolling
Марко С
источник
источник
Ответы:
Чтобы сделать
<tbody>
элемент прокручиваемым, нам нужно изменить способ его отображения на странице, т.е. использовать егоdisplay: block;
для отображения в качестве элемента уровня блока.Так как мы изменяем
display
свойствоtbody
, мы должны изменить это свойство и дляthead
элемента, чтобы не нарушать макет таблицы.Итак, мы имеем:
Веб - браузеры отображают
thead
иtbody
элементы в виде строки-группы (table-header-group
иtable-row-group
) по умолчанию.Как только мы изменим это, внутренние
tr
элементы не заполняют все пространство своего контейнера.Чтобы это исправить, мы должны вычислить ширину
tbody
столбцов и применить соответствующее значение кthead
столбцам с помощью JavaScript.Авто ширина столбцов
Вот версия jQuery вышеупомянутой логики:
И вот вывод (на Windows 7 Chrome 32) :
РАБОЧАЯ ДЕМО .
Таблица полной ширины, столбцы относительной ширины
Поскольку оригинальный плакат требовался, мы могли бы расширить
table
до 100%width
его контейнера, а затем использовать относительный ( процент )width
для каждого столбца таблицы.Поскольку таблица имеет (своего рода) разметку , мы должны отрегулировать ширину
thead
столбцов при изменении размера контейнера.Следовательно, мы должны установить ширину столбцов после изменения размера окна:
Выход будет:
РАБОЧАЯ ДЕМО .
Поддержка браузера и альтернативы
Я протестировал два вышеуказанных метода в Windows 7 через новые версии основных веб-браузеров (включая IE10 +), и это сработало.
Тем не менее, он не работает должным образом на IE9 и ниже.
Это связано с тем, что в макете таблицы все элементы должны иметь одинаковые структурные свойства.
Используя элементы
display: block;
for<thead>
и<tbody>
, мы нарушили структуру таблицы.Редизайн макета с помощью JavaScript
Один из подходов заключается в перепроектировании (всей) компоновки таблицы. Использование JavaScript для создания нового макета на лету, обработки и / или динамической регулировки ширины / высоты ячеек.
Например, взгляните на следующие примеры:
Скворечники
Этот подход использует две вложенные таблицы с содержащим div. Первая
table
имеет только одну ячейку, которая имеетdiv
, а вторая таблица находится внутри этогоdiv
элемента.Проверьте таблицы вертикальной прокрутки в CSS Play .
Это работает в большинстве веб-браузеров. Мы также можем динамически выполнять вышеуказанную логику с помощью JavaScript.
Таблица с фиксированным заголовком на свитке
С целью добавления вертикальной полосы прокрутки к
<tbody>
отображающей таблицы заголовка в верхней части каждой строки, мы могли бы расположить наthead
элемент , чтобы остатьсяfixed
в верхней части экрана вместо.Вот рабочая демонстрация этого подхода в исполнении Жюльена .
Имеет многообещающую поддержку веб-браузера.
А вот чистый CSS реализация на Willem Van Bockstal .
Чистое решение CSS
Вот старый ответ. Конечно, я добавил новый метод и уточнил объявления CSS.
Стол с фиксированной шириной
В этом случае значение
table
должно быть фиксированнымwidth
(включая сумму ширины столбцов и ширины вертикальной полосы прокрутки) .Каждый столбец должен иметь конкретную ширину , и последний столбец из
thead
элементов нуждается в большей ширины , которая равна к другим ширина + ширина вертикальной полосы прокрутки.Следовательно, CSS будет:
Вот вывод:
РАБОЧАЯ ДЕМО .
Стол со 100% шириной
В этом подходе
table
ширина имеет100%
для каждогоth
иtd
значениеwidth
свойства должно быть меньше, чем100% / number of cols
.Кроме того , нам нужно , чтобы уменьшить ширину от ,
thead
как значения ширины вертикальной полосы прокрутки.Для этого нам нужно использовать
calc()
функцию CSS3 следующим образом:Вот онлайн демо .
Примечание. Этот подход потерпит неудачу, если содержимое каждого столбца разбивает строку, то есть содержимое каждой ячейки должно быть достаточно коротким .
Ниже приведены два простых примера чистого решения CSS, которые я создал, когда ответил на этот вопрос.
Вот демоверсия jsFiddle v2 .
Старая версия: jsFiddle Demo v1
источник
display: block
вы теряете свойства таблицы как ширину столбца, разделяемую между thead и tbody. Я знаю, что вы исправили это путем установки,width: 19.2%
но в случае, если мы не знаем ширину каждого столбца заранее, это не будет работать.height: 100%
(когда вы хотите, чтобы таблица расширилась до нижней части страницы).ng-repeat
таблицами AngularJS . Не уверен, почему есть все эти библиотеки с фиксированными заголовками таблиц, а что нет, когда есть это решение.box-sizing
свойство, чтобы границы двух разных толщин не нарушали выравнивание столбцов.В следующем решении таблица занимает 100% родительского контейнера, абсолютные размеры не требуются. Это чистый CSS, используется гибкий макет.
Вот как это выглядит:
Возможные недостатки:
HTML (сокращенно):
CSS, с некоторыми украшениями для ясности:
полный код на jsfiddle
Тот же код в LESS, так что вы можете смешать его в:
источник
td
должно помочьВ современных браузерах вы можете просто использовать css:
источник
<table>
с<div>
которой имеетoverflow-y: auto;
и некоторыеmax-height
. Например:<div style="overflow-y: auto; max-height: 400px;"><table>...</table></div>
Я использую
display:block
дляthead
иtbody
. Из-за этого ширинаthead
столбцов отличается от шириныtbody
столбцов.Чтобы исправить это, я использую небольшой
jQuery
код, но это можно сделатьJavaScript
только в.Вот мое рабочее демо: http://jsfiddle.net/gavroche/N7LEF/
Не работает в IE 8
Показать фрагмент кода
источник
colNumber
переменная может быть заменена кодом, который выполняет итерацию по фактическим найденным ячейкам, и обратите внимание, что она не справляется правильно, если есть какие-либоcolspan
(может быть также улучшена в коде, если необходимо, но вряд ли для вида таблица, вероятно, захочет эту функцию прокрутки).CSS-только
для Chrome, Firefox, Edge (и других вечнозеленых браузеров)
Просто
position: sticky; top: 0;
вашиth
элементы:PS: если вам нужны границы для элементов TH, то
th {box-shadow: 1px 1px 0 #000; border-top: 0;}
это поможет (так как границы по умолчанию не отображаются правильно при прокрутке).Для варианта вышеупомянутого, который использует только немного JS, чтобы приспособиться к IE11, посмотрите этот ответ https://stackoverflow.com/a/47923622/383904
источник
separate
вы добавляете масло в огонь. jsfiddle.net/RokoCB/o0zL4xyw и посмотрите решение ЗДЕСЬ: добавьте границы к фиксированному TH - я приветствую предложения OFC, если я что-то пропустил.Создайте две таблицы одну за другой, поместите вторую таблицу в div с фиксированной высотой и установите для свойства overflow значение auto. Также держите все td внутри thead во втором столе пустыми.
источник
Наконец-то я понял это правильно с помощью чистого CSS, выполнив следующие инструкции:
http://tjvantoll.com/2012/11/10/creating-cross-browser-scrollable-tbody/
Первым шагом является установка
<tbody>
блока display: таким образом, чтобы можно было применить переполнение и высоту. Оттуда строки<thead>
необходимо установить в положение: относительное и отображение: блок, чтобы они располагались поверх прокручиваемой теперь<tbody>
.tbody, thead { display: block; overflow-y: auto; }
Поскольку
<thead>
относительно позиционируется, каждая ячейка таблицы нуждается в явной ширине.Но, к сожалению, этого недостаточно. Когда полоса прокрутки присутствует, браузеры выделяют для нее пространство, поэтому в
<tbody>
итоге получается меньше доступного пространства, чем<thead>
. Обратите внимание на небольшое смещение, которое это создает ...Единственный обходной путь, который я мог придумать, - это установить минимальную ширину для всех столбцов, кроме последнего.
Весь пример codepen ниже:
CSS:
Html:
РЕДАКТИРОВАТЬ: Альтернативное решение для ширины таблицы 100% (выше на самом деле для фиксированной ширины и не ответил на вопрос):
HTML:
CSS:
Демо: http://codepen.io/anon/pen/bNJeLO
источник
Обходной путь Css для принудительного отображения столбцов с помощью 'block' tbody
Это решение все еще требует, чтобы
th
ширина была рассчитана и установлена jQueryИ Jquery / Javascript
источник
попробуйте подход ниже, очень просто, легко реализовать
Ниже ссылка jsfiddle
http://jsfiddle.net/v2t2k8ke/2/
HTML:
CSS:
Jquery:
источник
Добавление фиксированной ширины к td, th после того, как блок tbody & thead работает отлично, а также мы можем использовать плагин slimscroll, чтобы сделать полосу прокрутки красивой.
источник
Вот код, который работает для меня, чтобы создать липкую игру на столе с прокручиваемым телом:
источник
Для использования «overflow: scroll» вы должны установить «display: block» на thead и tbody. И это портит ширину столбцов между ними. Но затем вы можете клонировать строку thead с Javascript и вставить ее в tbody как скрытый ряд, чтобы сохранить точную ширину col.
http://jsfiddle.net/Julesezaar/mup0c5hk/
CSS:
источник
Попробуйте это jsfiddle . Это использует jQuery и сделано из ответа Хашема Колами. Сначала создайте обычную таблицу, затем сделайте ее прокручиваемой.
источник