Невалидна ширина на колоната

Имам таблица с 3 колони, където третата колона е по-голяма с 6 от другите колони.
Ето моят пример.
Защо третата колона има същия размер като другата?

Актуализация:
Добавих друг пример, при който оформлението на таблицата е фиксирано и ширините са ок.
Ето го.
Някаква идея защо?

Имам нужда от заглавката с colspan, но това прави проблема. Също така ми трябва оформлението на таблицата като фиксирано. Някаква идея как да го заобиколя?

Проблемът възниква както в IE8, така и в Firefox.

Актуализация:
Следвах съвета на @Alex Hadley, но това причини друг проблем.
Не знам защо дългата клетка не е скрита: http://jsfiddle.net/9vcC2/32/

<код>


person Naor    schedule 30.01.2012    source източник
comment
В кой браузър? Виждам в Opera две малки колони и трета по-голяма.   -  person giker    schedule 30.01.2012
comment
мисля, че table-layout: fixed играе номера тук. тъй като е фиксирана, вашата таблица игнорира ширината, дадена на индивидуалния td, и приема собствената си изчислена ширина според фиксирания стил.   -  person Murtaza    schedule 30.01.2012
comment
@Murtaza: Моля, вижте актуализациите.   -  person Naor    schedule 30.01.2012
comment
Наор: Опитахте ли идеята на @Alex Hadleys с colgroups?   -  person Martin Hennings    schedule 30.01.2012
comment
@Naor Забележка: Отговорих на новия проблем (който така или иначе не е свързан с моето решение) в коментарите към моя отговор по-долу.   -  person Alex Hadley    schedule 30.01.2012


Отговори (4)


Както е отбелязано от @AlexHadley, проблемът е причинен от множеството td редове във вашия thead, което би изисквало използването на colgroups за поддържане на оформлението.

Въпреки това, тъй като изглежда, че първоначалното tr в thead всъщност се използва за предоставяне на описание на таблицата, вероятно би било по-семантично да се използва маркер caption за присвояване на дефиниция на таблицата.

Като бележка за маркиране, вие също трябва да използвате th вместо td за редовете в заглавката на таблицата.

За повече информация относно това какво е налично в рамките на table маркирането, вижте този този WDG справочник.

person My Head Hurts    schedule 31.01.2012

дължи се на table-layout: fixed;. Проверете го, след като го премахнете от css.

Както каза Муртаза: поправено е. вашата таблица игнорира ширината, дадена на отделните td, и взема собствената си изчислена ширина според фиксирания стил

person Community    schedule 30.01.2012
comment
Свързано е с вас, като използвате многообхватен ред като първи ред, както разбирам. Така че използва стойностите за първия ред, за да изчисли ширините на колоните. (опитайте например да размените двата реда в рекламата). - person Alex Hadley; 30.01.2012
comment
@Naor виж коментара ми - той е свързан със съдържанието на първия ред. - person Alex Hadley; 30.01.2012
comment
@Naor: първият ред с colspan дава на всички колони еднаква ширина. - person ; 30.01.2012
comment
@Naor, моля, вижте отговора ми по-долу. По същество добавете colspan в горната част на table. - person Alex Hadley; 30.01.2012

Teez е абсолютно прав, че проблемът е в table-layout:fixed.

Това, което прави този стил, е, че кара таблицата да вземе ширините на колоните си от първия срещан ред, след което започва да генерира съдържанието въз основа единствено на това. Така че във вашия пример първият ред е colspan=3, така че той просто дава на всички колони еднаква ширина. Опитайте да размените редовете във вашия първи пример, за да видите ефекта. Това също обяснява защо вашият втори пример работи.

Повече информация можете да видите тук: http://www.w3.org/TR/CSS2/tables.html#fixed-table-layout

В алгоритъма за оформление на фиксирана таблица ширината на всяка колона се определя, както следва:

  1. Елемент на колона със стойност, различна от „auto“ за свойството „width“, задава ширината за тази колона.
  2. В противен случай клетка в първия ред със стойност, различна от „auto“ за свойството „width“, определя ширината за тази колона. Ако клетката обхваща повече от една колона, ширината се разделя на колоните.
  3. Всички останали колони разделят поравно оставащото хоризонтално пространство на таблицата (минус границите или разстоянието между клетките).

[моето удебеляване]

Като решение можете да добавите <colgroup> като първи запис в тага <table>:

<colgroup> 
    <col style="width:50px;" /> 
    <col style="width:50px;" /> 
    <col style="width:300px;" /> 
</colgroup> 

например. Както се вижда тук.

person Alex Hadley    schedule 30.01.2012
comment
Тъй като @Naor никога не е изяснил целта на проблемния ред, той може също да го добави с помощта на <caption />, тъй като мисля, че това е най-вероятно. - person My Head Hurts; 30.01.2012
comment
@Боли ме главата: Какво е етикетът Caption?? - person Naor; 30.01.2012
comment
@Naor Използва се за описание на естеството на масата. Вижте тук - person My Head Hurts; 30.01.2012
comment
@Alex Hadley: Това решава този проблем, но добавя друг. Вижте това - не знам защо дългият cel не е скрит: jsfiddle.net/9vcC2/32 - person Naor; 30.01.2012
comment
@Naor, ако това разрешава този въпрос, можете ли да го маркирате като отговорено. Проследяването вероятно трябва да бъде публикувано като отделен въпрос. Сега ще погледна твоя jsfiddle. - person Alex Hadley; 30.01.2012
comment
добре, вижте stackoverflow.com/questions/509711/. По принцип имате нужда от overflow:hidden;white-space: nowrap;width:0px във вашата css таблица. Все пак не съм тествал този кросбраузър. - person Alex Hadley; 30.01.2012
comment
@Alex Hadley: Обещавам да маркирам вашето решение, ако го използвам. Тествам предложението на Мартин. - person Naor; 30.01.2012
comment
@Боли ме главата: Използвах твоето предложение с надпис tad. Напишете отговор за него и вземете точките си. - person Naor; 31.01.2012
comment
+1 за забелязване на първоначалния проблем. Изглежда, че не са ти признали никаква заслуга за това. - person My Head Hurts; 31.01.2012
comment
@Alex Hadley: И от мен. Благодаря! - person Naor; 31.01.2012

Това е така, защото colspan td първо задава ширината. Работи, ако декларирате ширините преди colspan:

<thead>
  <tr>
     <td style="width:50px;">FirstName</td>
     <td style="width:50px;">LastName</td>
     <td style="width:300px;">Address</td>
  </tr>
  <tr>
     <td colspan="3">text</td>
  </tr>
</thead>

Можете да използвате невидим ред за ширините:

<thead>
  <tr style="height:0px;">
     <td style="width:50px;"></td>
     <td style="width:50px;"></td>
     <td style="width:300px;"></td>
  </tr>
  <tr>
     <td colspan="3">text</td>
  </tr>
  <tr>
     <td>FirstName</td>
     <td>LastName</td>
     <td>Address</td>
  </tr>
</thead>
person Martin Hennings    schedule 30.01.2012