td ширини, не працює?


96

Отже, у мене тут є цей код:

<table>
    <tr>
        <td width="200px" valign="top">
            <div class="left_menu">
                <div class="menu_item">
                    <a href="#">Home</a>
                </div>
            </div>
        </td>
        <td width="1000px" valign="top">Content</td>
    </tr>
</table>

за допомогою CSS

.left_menu {
    background: none repeat scroll 0 0 #333333;
    border-radius: 5px 5px 5px 5px;
    font-family: Arial,Helvetica,sans-serif;
    font-size: 12px;
    font-weight: bold;
    padding: 5px;
}

.menu_item {
    background: none repeat scroll 0 0 #CCCCCC;
    border-bottom: 1px solid #999999;
    border-radius: 5px 5px 5px 5px;
    border-top: 1px solid #FFFFCC;
    cursor: pointer;
    padding: 5px;
}

Він чудово працює в моєму браузері, і я тестував його в кожному браузері, як на Mac, так і на ПК, але хтось скаржиться, що tdпри width200 з них постійно змінюється ширина. Я не уявляю, про що він говорить. Хтось знає, чому він чи вона бачать зміну ширини на td?


То як ми можемо допомогти, коли маємо ще менше уявлення про те, про що йдеться у скарзі? Ми навіть не можемо перевірити реальну сторінку, і ми не маємо інформації про когось та його або її середовище перегляду.
Jukka K. Korpela

Відповіді:


125

Вона повинна бути:

<td width="200">

або

<td style="width: 200px">

Зверніть увагу, що якщо ваша комірка містить якийсь вміст, який не вписується в 200 пікселів (наприклад, somelongwordwithoutanyspaces), комірка все одно розтягнеться, якщо ваш CSS не містить table-layout: fixedтаблиці.

РЕДАГУВАТИ

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


Дякую bfavaretto ... пробую це зараз
user979331

47
якщо таблиця повинна бути<table style="table-layout:fixed;">
user979331

3
@ user1193385, так, це все. Але уникайте використання вбудованого css, якщо це можливо.
bfavaretto

4
вбудований css - погана ідея, якщо він вам дійсно потрібен лише в одному місці. також, ширина td певний час амортизується. див. відповідь нижче
Крістіна Чайлдс

2
@kristinachilds Я згоден. На своєму прикладі я використовував вбудований css, тому мені не потрібно було б розділяти два блоки коду для HTML та CSS. Додано коментар вище, в якому повідомляється OP, щоб уникнути вбудованого CSS. Щодо атрибута width, технічно він не застарів (оскільки специфікація HTML5 все ще є робочим проектом), але ви маєте рацію, цього слід уникати. Я відредагую свою відповідь із приміткою про це.
bfavaretto

31

Ширина та / або висота таблиць вже не є стандартними; як каже Янз, вони застаріли. Натомість найкращий спосіб зробити це - мати елемент блоку всередині комірки таблиці, який буде тримати комірку відкритою до потрібного розміру:

<table>
    <tr>
        <td valign="top">
            <div class="left_menu">
                <div class="menu_item">
                    <a href="#">Home</a>
                </div>
            </div>
        </td>
        <td valign="top" class="content">Content</td>
    </tr>
</table>

CSS

.content {
    width: 1000px;
}

.left_menu {
    background: none repeat scroll 0 0 #333333;
    border-radius: 5px 5px 5px 5px;
    font-family: Arial,Helvetica,sans-serif;
    font-size: 12px;
    font-weight: bold;
    padding: 5px;
    width: 200px;
}

.menu_item {
    background: none repeat scroll 0 0 #CCCCCC;
    border-bottom: 1px solid #999999;
    border-radius: 5px 5px 5px 5px;
    border-top: 1px solid #FFFFCC;
    cursor: pointer;
    padding: 5px;
}

10
На жаль, технологія електронної пошти на багато років відстає від поточної специфікації HTML, і в такому випадку таблиці та вбудований css, на жаль, не можна уникнути.
MikeTheLiar

2
Ніхто не говорив про HTML-адреси електронної пошти, це було для основного перегляду веб-сторінок на робочому столі. Але так, для електронних листів таблиці та вбудований css є єдиним способом їх побудови. Дякую, Microsoft ...
Крістіна Чайлдс

3
Я згадую лише електронну пошту, бо саме це призвело мене сюди; У мене була така сама проблема з електронною поштою.
MikeTheLiar

22
 <table style="table-layout:fixed;">

Це призведе до ширини стилю <td>. Якщо текст переповнює його, він перекриває інший <td>текст. Тож спробуйте використовувати медіа-запити.


1
У моєму випадку використання це було так само важливо, як і відповідь
bfavaretto

У моєму випадку (Firefox 70.0), table-layout:fixedприсвоєно стовпцям фіксовану ширину, тому я більше не можу змінити width(за допомогою jquery).
Жозе Мануель Абарка Родрігес

7

Ви не можете вказати одиниці в width/ heightатрибути таблиці; вони завжди в пікселях, але використовувати їх взагалі не слід, оскільки вони застаріли.




2

спробуйте використовувати

word-wrap: break-word;

сподіваюся, це допоможе




0

Зверніть увагу, що регулювання ширини стовпця в теаді вплине на всю таблицю

<table>
    <thead>
        <tr width="25">
            <th>Name</th>
            <th>Email</th>
        </tr>
    </thead>
    <tr>
        <td>Joe</td>
        <td>joe@email.com</td>
    </tr>
</table>

У моєму випадку ширина на thead> tr безпосередньо перевищувала ширину на table> tr> td.


0

Використовуйте

<table style="table-layout:fixed;">

Це примусить таблицю встановити на 100% ширину. Потім використовуйте цей код

$('#dataTable').dataTable( {
        bAutoWidth: false, 
        aoColumns : [
          { sWidth: '45%' },
          { sWidth: '45%' },
          { sWidth: '10%' },
              ]
      });

(ідентифікатор таблиці - dataTable і має 3 стовпці), щоб вказати довжину кожної комірки


0

Я пробував із багатьма рішеннями, але це не спрацьовувало для мене, тому я спробував згинати таблицю, і це добре працювало для мене з усіма функціональними можливостями таблиці, такими як граничне згортання та інше, лише зміна - це властивість display

Це була моя вимога HTML

<table>
  <thead>
    <tr>
      <th>1</th>
      <th colspan="3">2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td colspan="3">2</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td colspan="2">3</td>
    </tr>
  </tbody>
</table>

Мій CSS

table{
    display: flex;
  flex-direction: column;
}
table tr{
    display: flex;
  width: 100%;
}
table > thead > tr > th:first-child{
    width: 20%;
}
table > thead > tr > th:last-child{
    width: 80%;
}
table > tbody tr > td:first-child{
    width: 10%;
}
table > tbody tr > td{
    width: 30%;
}
table > tbody tr > td[colspan="2"]{
    width: 60%;
}
table > tbody tr > td[colspan="3"]{
    width: 90%;
}
/*This is to remove border making 1px space on right*/
table > tbody tr > td:last-child{
    border-right: 0;
}

0

Цю проблему досить легко вирішити за допомогою правила css min-widthі max-widthв межах нього.

HTML

<table>
  <tr>
    <td class="name">Peter</td>
    <td class="hobby">Photography</td>
    <td class="comment">A long comment about something...</td>
  </td>
</table>

CSS

.name {
  max-width: 80px;
  min-width: 80px;
}

Це змусить перший стовпець мати ширину 80 пікселів. Зазвичай я використовую макс-ширину без мінімальної ширини для того, щоб правити в тексті, який дуже часто буває занадто довгим від створення таблиці, яка має надширокий стовпець, в основному порожній. Питання OP стосувалося встановлення фіксованої ширини, отже, обидва правила разом. У багатьох браузерахwidth:80px; CSS ігнорується для стовпців таблиці. Встановлення ширини в HTML працює, але це не так, як вам слід робити.

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

Якщо я хочу, щоб текст не загортався і не збільшував висоту рядка, але все ж дозволяв користувачеві бачити повний текст, я використовую white-space: nowrap; головне правило, а потім застосовую правило наведення, яке видаляє правила ширини та перенесення так що користувач може бачити повний вміст, коли наводить на нього курсор. Щось на зразок цього:

CSS

.name {
  max-width: 80px;
  white-space: nowrap;
  overflow: hidden;
}
.name:hover {
  max-width: none;
  white-space: normal;
  overflow:auto;
}

Це просто залежить від того, чого саме ви намагаєтесь досягти. Сподіваюся, це комусь допомагає. PS Окрім того, для iOS існує виправлення, коли наведення не працює - див. CSS Hover Not Working на iOS Safari та Chrome

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