Можно ли создать ширину таблицы HTML в процентах по высоте, но высоту строки с точностью до пикселя? - PullRequest
2 голосов
/ 30 января 2009

Мне нужно создать таблицу на веб-странице, которая имеет две строки. Таблица должна заполнять всю страницу, поэтому я установил высоту и ширину таблицы на 100% в таблице стилей CSS, а также высоту HTML и тела на 100%.

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

Возможно ли такое поведение? Я попробовал следующее, но это не работает.

<table style="border-collapse:collapse;height:100%;width:100%;">
  <tr>
    <td style="border:solid 1px black;height:100px">1</td>
    <td style="border:solid 1px black">2</td>
  </tr>
  <tr>
    <td style="border:solid 1px black">3</td>
    <td style="border:solid 1px black">4</td>
  </tr>
</table>

Edit: я использую табличные данные и специально хочу использовать таблицу, а не div. Пример выше - упростить таблицу с 20 столбцами.

Редактировать 2: Я нашел проблему. Это определение типа документа в HTML (добавлено Visual Studio). После удаления ...

... работает отлично. Итак, мой новый вопрос: это нормально делать или есть правильный способ сделать это с DOCTYPE?

Ответы [ 8 ]

5 голосов
/ 30 января 2009

Без CSS это работает:

<html>
  <body>
    <table height="100%" width="100%" border="1">
      <tr height="100">
        <td>This is item text.</td>
      </tr>

      <tr>
        <td>This is item text 2.</td>
      </tr>
    </table>
  </body>
</html>

Так что возможно, сейчас попробую с CSS.

4 голосов
/ 30 января 2009

ОК, работа с CSS.

HTML:

<html>
  <head>
    <link href="table.css" rel="stylesheet" type="text/css">
  </head>
  <body>
    <table>
      <tr class="fixed">
        <td>This is item text.</td>
      </tr>

      <tr>
        <td>This is item text 2.</td>
      </tr>
    </table>

  </body>
</html>

CSS:

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

tr.fixed
{
 border: 1px solid black;
 height: 100px;
}

td
{
 border: 1px solid black;
}
2 голосов
/ 30 января 2009
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <style type="text/css" media="screen">
        html, body {
            height:100%;
            margin:0;
        }
        table {
            background-color:#ccc;
            width:100%;
            height:100%;
        }
        th {
            height:100px;
            background-color:#fcfcfc;
        }
    </style>

    <title>TableTest</title>

</head>

<body>

<table>
    <tr>
        <th>Header1</th>
        <th>Header2</th>
    </tr>
    <tr>
        <td>Data1</td>
        <td>Data2</td>
    </tr>
</table>

</body>
</html>

Это то, что я считаю более семантическим подходом без использования идентификатора атрибутов класса в тегах таблицы с использованием тега

для различия между двумя строками. Этот код не работает должным образом в IE6 / 7, он может работать в IE8, я его протестировал и правильно работает в Firefox 3, Safari 3.1.2, Opera 9.50 и Camino 1.6.6.
2 голосов
/ 30 января 2009

Ну, я думаю, что знаю, как это сделать, поэтому я запускаю код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <style type="text/css">
    html, body 
    {
        height: 100%;
        margin: 0;
        padding: 0;
    }
    table 
    {
        height: 100%;
        width: 100%;
        background-color: blue;
        border-collapse:collapse;
    }
    tr#fixed
    {
        background: silver; 
        height: 100px;
    }
    tr#expand
    {
        background: gray;
    }
    td 
    {
        text-align: center;
    }
    </style>
</head>
<body>
    <table>
        <tbody>
            <tr id="fixed">
                <td>100</td>
            </tr>
            <tr id="expand">
                <td>*</td>
            </tr>
        </tbody>
    </table>
</body>
</html> 

(примечание, строгий + CSS)

И я нахожу, что хотя это работает в Firefox, Chrome и прочем! IE Мне нравится, IE имеет некоторое очень необычное поведение здесь. Короче говоря, IE игнорирует размеры в пикселях и вместо этого сравнивает относительные высоты! Он неверно сообщает об этом на панели инструментов разработчика IE, но вы можете ясно увидеть это, если добавите и измените высоту на tr#expand

Если вы установите высоту 100px, вы увидите, что оба tr на самом деле рендерит на 50%. При 200px вы получите разделение 33/66, а при 50px - 66/33! Похоже, что это верно для других модулей, таких как em, и я подозреваю, что это может быть связано с контентом, поскольку он имеет граничное поведение при низких единицах, таких как 5px. Насколько я вижу, IE здесь совершенно не работает. Это не ошибка, которую я видел раньше, ни та, которую я смог гуглить. До тех пор, пока не появится обходной путь, мне кажется, что вы SOL для строгого решения.

2 голосов
/ 30 января 2009

Хорошо, в свете новой информации (а именно табличных данных), вот решение:

<html>
<head>
<style type="text/css">
    #wrap { position: absolute; height: 100%; top: 0; right: 0; bottom: 0; left: 0; }
    table { width: 100%; height: 100%; }
    tr { margin: 0; }
    td { text-align: center; font-size: 80px; font-weight: bold; color: white; }
    #top { height: 100px; }
    #bottom { height: 100%; }
    #topleft { background-color: red; border: 3px solid black; }
    #topright { background-color: green; border: 3px solid yellow; }
    #bottomleft { background-color: yellow; border: 3px solid green; }
    #bottomright { background-color: blue; border: 3px solid red; }
</style>
</head>
<body>
<div id="wrap"> 
    <table>
    <tr id="top">
        <td id="topleft">1</td>
        <td id="topright">2</td>
    </tr>
    <tr id="bottom">
        <td id="bottomleft">3</td>
        <td id="bottomright">4</td>
    </tr>
  </table>
</div>  
</body>
</html>

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

<html>
<head>
  <style type="text/css" media="screen">
    #wrap {
      position: absolute;
      top: 0;
      right: 0;
      left: 0;
      bottom: 0;
    }

    #top {
      width: 100%;
      height: 100px;
      position: relative;
      top: 0;
      background-color: #CCC;
    }

    #bottom {
      position: relative;
      height: 100%;
      bottom: 0;
      width: 100%;
      background-color: yellow;
    }
  </style>
</head>
<body>
  <div id="wrap">
    <div id="top">Top</div>
    <div id="bottom">Bottom</div>
  </div>
  </body>
</html>
1 голос
/ 30 января 2009

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

0 голосов
/ 30 января 2009

Попробовал следующий код в IE7, Mozilla 2, Chrome 1, Opera 9.5, Safari 3.2 и все работает

<html>
<head>

</head>
 <body>
  <table height="100%" border="1">
<tr height="100px"><td>Some</td></tr>
<tr><td>Other</td></tr>
 </table>
 </body>
</html>
0 голосов
/ 30 января 2009

Да, вы можете объединить все измерения. Просто попробуйте в разных браузерах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...