Відображення CSS: рядок таблиці не розширюється, коли ширина встановлена ​​на 100%


96

У мене трохи проблем. Я використовую FireFox 3.6 і маю таку структуру DOM:

<div class="view-row">
    <div class="view-type">Type</div>
    <div class="view-name">Name</div>                
</div>

І наступний CSS:

.view-row {
width:100%;
display:table-row;
}

.view-name {
display: table-cell;
float:right;
}

.view-type {
display: table-cell;
}

Якщо я зніму, display:table-rowвін буде відображатися правильно, із view-rowпоказом ширини 100%. Якщо я поверну його назад, він стискається. Я виклав це на JS Bin:

http://jsbin.com/ifiyo

Що відбувається?

Відповіді:


90

Якщо ви використовуєте display:table-rowтощо, то вам потрібна правильна розмітка, яка включає таблицю, що містить. Без нього ваше вихідне запитання в основному забезпечує еквівалентну погану розмітку:

<tr style="width:100%">
    <td>Type</td>
    <td style="float:right">Name</td>
</tr>

Де таблиця в наведеному вище? Ви не можете просто рядок з нізвідки (тр повинен міститися в будь-якому table, thead, tbodyі т.д.)

Натомість додайте зовнішній елемент за допомогою display:table, покладіть 100% ширину на вміщуючий елемент. Дві клітини всередині автоматично пройдуть 50/50 і вирівняють текст прямо на другій комірці. Забудьте про floatsелементи таблиці. Це спричинить стільки головних болів.

розмітка:

<div class="view-table">
    <div class="view-row">
        <div class="view-type">Type</div>
        <div class="view-name">Name</div>                
    </div>
</div>

CSS:

.view-table
{
    display:table;
    width:100%;
}
.view-row,
{
    display:table-row;
}
.view-row > div
{
    display: table-cell;
}
.view-name 
{
    text-align:right;
}

11
+5 за позбавлення від проклятих поплавців!
чувак випадковості

37
-1, оскільки пояснення просто неправильне. Відповідно до специфікацій CSS2.1 , зазначена розмітка / CSS повинна працювати.
користувач123444555621

8
Жоден браузер не має проблем із відсутньою таблицею (Firefox 3.0 мав ...) Фактична проблема полягає в тому, що налаштування ширини в рядках таблиці повністю ігноруються . (що означає, що розмітка / CSS, про яку йде мова, насправді працює не так, як очікувалося, тому мій коментар вище був помилковим;))
user123444555621

3
Ця відповідь неправильна. Розмітка запитувача правильна. Як каже Pumbaa80, проблема полягає в припущенні, що ширина повинна бути на рівні рядків, а не на рівні таблиці. Ширина інтерпретується лише на рівні таблиці. Рядки можна повністю пропустити. Дивіться мою повну відповідь нижче.
Амін Аріана

1
Я не коментував відповідь, яка працює. Я коментував ваш коментар, що ви повинні включити рядок таблиці в CSS. Ти ні. Сказати щось псевдо дійсне через ваші особисті переконання - це дуже догматична / жорстка річ; Особливо, коли CSS був цілком дійсним.
Білл Росмус

56

Перевірена відповідь:

У CSV-рядку .view змініть:

display:table-row;

до:

display:table

і позбутися "плавати" . Все буде працювати, як очікувалося.

Як було запропоновано в коментарях, немає потреби в обгортковому столі. CSS дозволяє опускати неявні рівні деревної структури (в даному випадку рядки). Причина, по якій ваш код не працює, полягає в тому, що "width" можна інтерпретувати лише на рівні таблиці, а не на рівні рядка таблиці. Коли у вас є "таблиця", а потім "таблиця-комірка" безпосередньо під ними, вони неявно інтерпретуються як сидячі в ряду.

Робочий приклад:

<div class="view">
    <div>Type</div>
    <div>Name</div>                
</div>

з css:

.view {
  width:100%;
  display:table;
}

.view > div {
  width:50%;
  display: table-cell;
}

Ваша відповідь передбачає, що еквівалент CSS, <table><td></td></table>який сам по собі буде неприпустимою розміткою HTML відповідно до W3C. Хоча це буде перевірятись, чому б ви пропонували браузеру імітувати цю розмітку?
КП.

16
Це правильно за правилами CSS: w3.org/TR/CSS2/tables.html#anonymous-boxes . Це легше підтримувати, видаляючи непотрібні рядки коду (наприклад, непотрібний div <view-row>, запропонований KP.). Це мені допомогло ... Я ним користуюся. +1
Білл Росмус

1
Чи не буде достатньо просто позбутися операторів float? Div .view міг зберегти властивість display: table-row.
Ідеограма

1
Це добре, ~~ але не працює на IE9, наскільки я можу зрозуміти. ~~ Я помиляюся. Це чудово! :)
f1lt3r

Звичайно, дисплей: таблиця не корисна, якщо у вас більше 1 рядка. Усі вони мають погано
вирівняні позиції

16

Зверніть увагу, що відповідно до специфікації CSS3, вам НЕ потрібно обертати ваш макет елементом стилю таблиці. Браузер зробить висновок про існування елементів, що містять, якщо вони не існують.


4
Те саме було зазначено в CSS 2.1 , розділ 17.2.1, верх 3.2. Наведений нижче приклад HBOX / VBOX - саме такий випадок. Тож схоже на те, що браузерам просто все одно.
користувач123444555621

1

дати на .view-typeкласі float:left;або видалити float:right;з.view-name

редагувати: оберніть свій div, наприклад, <div class="view-row">іншим div<div class="table">

і встановіть такий css:

.table {
    display:table;
    width:100%;}

Для правильних результатів потрібно використовувати структуру таблиці.


Я тестував з ff3.6, тобто 8, хром, опера. ви можете побачити тут jsbin.com/ifiyo/4 вони показують їх поруч
Sotiris

Я прагнув назвати крайнє право, введіть крайнє ліве ... якщо ви робите display: inline на обох і виймаєте display: table-row це працює, я думав, що може бути кращий спосіб зробити це, використовуючи властивості рядка таблиці / комірки.
чувак випадковості

0

Ви можете вкласти комірку таблиці безпосередньо в таблицю. У вас у линьки стіл. Запуск eith табличного рядка не працює. Спробуйте за допомогою цього HTML:

<html>
  <head>
    <style type="text/css">
.table {
  display: table;
  width: 100%;
}
.tr {
  display: table-row;
  width: 100%;
}
.td {
  display: table-cell;
}
    </style>
  </head>
  <body>

    <div class="table">
      <div class="tr">
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
      </div>
    </div>

      <div class="tr">
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
      </div>

    <div class="table">
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
    </div>

  </body>
</html>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.