CSS3 проблемы выравнивания преобразования внутри таблицы

Я пытаюсь достичь таблицы, в которой текст повернут-90degrees. До сих пор я использовал изображения текста, однако я надеялся изменить это на текст.

CSS3 rotated text within a table

есть несколько проблем, которые я не могу исправить.

  1. столбец 07 текст перетекает в столбец 08.
    • Я не могу исправить это с помощью overflow: hidden; потому что я должен установить ширину и высоту как в 200px, чтобы получить правильное форма.
  2. я должен установить ширину и высоту повернутого текста, что не делает его очень гибким для работы, и это также вызывает проблему № 1.
  3. я должен установить маржу в "0-100px", потому что я должен установить ширину в 200px, но после поворота его ширина по-прежнему 200px, что сделает таблицу невероятно большой.
  4. если размер шрифта изменен, он больше не вписывается в столбцы.
  5. шрифты выглядят ужасные, и их трудно читать. Я полагаю, что это будет работать в будущих обновлениях браузеров.

вот jsFiddle его в действии

http://jsfiddle.net/CoryMathews/ZWBHS/

Мне нужно, чтобы он работал и получил его в ту же точку в IE7+, Chrome, FF и Opera.

есть идеи о том, как улучшить этот метод, чтобы он действительно использовался? Некоторые из моих идей являются:

  1. Я мог бы рассчитать ширину, высоту и т. д. с некоторым javascript при загрузке страницы, это решило бы проблемы 2 и 3 выше, но не 1. Однако я ненавижу полагаться на javascript для отображения.

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

4 ответов


это решение устраняет некоторые из ваших проблем, но оно не идеально:

  1. использовать whitespace: nowrap чтобы отключить перетекание текста в следующую строку.
  2. оберните содержимое каждой ячейки в контейнер с width: 1em. Столбцы всегда достаточно широки для 1 строки вертикального текста. Вы можете свободно регулировать размер шрифта.
  3. вручную установите высоту таблицы для полного отображения повернутого содержимого (на -90 градусов). Высоты жесткого кодирования не велики, но есть преимущества: нет необходимости в фиксированной ширине и отрицательных полях для противодействия фиксированной ширине / преобразованию / относительному позиционированию / JavaScript; текст автоматически привязывается к нижней части столбца.

  4. см. 2.

  5. рекомендуется использовать шрифты без засечек. Чем менее детализированы шрифты, тем лучше они выглядят после преобразований.

это работает в Firefox, Chrome, Opera, IE9+. Вертикальный текст не работает на IE8 и более ранних. Я попытался повернуть стол. использование:

filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)

и результат выглядит ужасно, поэтому я добавил резервный стиль для отображения простой горизонтальной таблицы.

body {
    font-family: sans-serif;
    padding: 10px;
    font-size: 12px;
}

td, tr, th, table { border: 1px solid #333; }
td:nth-child(odd) { background: #eee; }
td {
    overflow: hidden;
    white-space: nowrap; /* text on one line only */
    vertical-align: bottom;
    height: 300px; /* to be adjusted: column is not always tall enough for text */
}

td > div {
    padding: 10px;
    width: 1em; /* column is always wide enough for text */
}

td > div > div {
    -moz-transform: rotate(-90deg);
    -o-transform: rotate(-90deg);
    -webkit-transform: rotate(-90deg);
    -ms-transform: rotate(-90deg) !important;
    transform: rotate(-90deg);
}
<!--[if LT IE 9]>
    <style>
        table { width: 100px; }
        td {
            white-space: normal;
            vertical-align: baseline;
            height: auto;
        }
        td > div {
            width: auto;
        }
    </style>
<![endif]-->
<table>
    <tr>
        <th>01</th>
        <th>02</th>
        <th>03</th>
        <th>04</th>
        <th>05</th>
        <th>06</th>
        <th>07</th>
        <th>08</th>
        <th>09</th>
        <th>10</th>
        <th>11</th>
        <th>12</th>
    </tr>
    <tr>
        <td><div><div>Report Results 1</div></div></td>
        <td><div><div>Shinanigans</div></div></td>
        <td><div><div>CSS Transforms Suck</div></div></td>
        <td><div><div>Lorem Ipsum</div></div></td>
        <td><div><div>So Damn Pixelated</div></div></td>
        <td><div><div>This font looks Terrible</div></div></td>
        <td><div><div>Too Long to read on 1 line Set dimensions suck</div></div></td>
        <td><div><div>Grumble Grumble.</div></div></td>
        <td><div><div>Homebrew!</div></div></td>
        <td><div><div>Spotify Commercial Suck</div></div></td>
        <td><div><div>Grooveshark FTW!</div></div></td>
        <td><div><div>Beer time yet?</div></div></td>
    </tr>
</table>

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

вы затем "unrotate" заголовки таблицы с обратным преобразованием:

http://jsfiddle.net/G93KE/

Я понятия не имею, работает ли это с фильтрами IE7-8.


Как Duopixel, (unrotate)

<style>

body { font-family: "Times New Roman", Times, serif; padding:10px; }
td, tr, th, table { border:1px solid #333; }
td:nth-child(odd) { background:#eee; } /* No IE, No Cares */

td.title { width:200px; }

table {       
    -moz-transform: rotate(-90deg);
    -o-transform: rotate(-90deg);
    -webkit-transform: rotate(-90deg);
    -ms-transform: rotate(-90deg) !important;
    transform: rotate(-90deg);
    -webkit-transform-origin:0 0;
    -moz-transform-origin:0 0;
    -ms-transform-origin:0 0;
    -o-transform-origin:0 0;
    transform-origin:0 0;
    background-color:transparent;

    width:250px; 

    position:relative;
    top:250px;
  }

td > div {       
    -moz-transform: rotate(90deg);
    -o-transform: rotate(90deg);
    -webkit-transform: rotate(90deg);
    -ms-transform: rotate(90deg) !important;
    transform: rotate(90deg);
    -webkit-transform-origin:0 0;
    -moz-transform-origin:0 0;
    -ms-transform-origin:0 0;
    -o-transform-origin:0 0;
    transform-origin:0 0;
    background-color:transparent;

    position:relative; /*Needed to position in the correct columns*/
    height:20px; /* Need to not set this, needed for columns to fill*/
    left:20px; /*Needed to line up, .5 of width - padding*/
}

</style>

<!--[if LT IE 9]>
    <style>
        table {
            filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
            top:0px;
        }
        td div { /* ah..? didn't action of filter..? by td > div..? */
            filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
            overflow:hidden;
            width:20px; /* fix to number.. */
            height:20px; /* fix to number.. */
        }
    </style>
<![endif]-->
<table>
    <tr>
        <td class=title >Report Results 1</td>
        <td><div>01</div></td>
    </tr>
    <tr>
        <td class=title >Shinanigans</td>
        <td><div>02</div></td>
    </tr>
    <tr>
        <td class=title >CSS Transforms Suck</td>
        <td><div>03</div></td>
    </tr>
    <tr>
        <td class=title >Lorem Ipsum</td>
        <td><div>04</div></td>
    </tr>
    <tr>
        <td class=title >So Damn Pixelated</td>
        <td><div>05</div></td>
    </tr>
    <tr>
        <td class=title >This font looks Terrible</td>
        <td><div>06</div></td>
    </tr>
    <tr>
        <td class=title >Too Long to read on 1 line Set dimensions suck</td>
        <td><div>07</div></td>
    </tr>
    <tr>
        <td class=title >Grumble Grumble.</td>
        <td><div>08</div></td>
    </tr>
    <tr>
        <td class=title >Homebrew!</td>
        <td><div>09</div></td>
    </tr>
    <tr>
        <td class=title >Spotify Commercial Suck</td>
        <td><div>10</div></td>
    </tr>
    <tr>
        <td class=title >Grooveshark FTW!</td>
        <td><div>11</div></td>
    </tr>
    <tr>
        <td class=title >Beer time yet?</td>
        <td><div>12</div></td>
    </tr>
</table>

сначала исправим перекрывающийся текст: тд{белый-пространство:без переноса;}

преобразования CSS несколько похожи на" position:relative " в одном аспекте, они изменяют рендеринг объекта, а не его положение в потоке. Это означает, что в настоящее время нет способа динамически регулировать высоту ячейки на основе ширины div (по крайней мере, до начала реализации CSS-выражений).

с этой находкой в виду, мы теперь свободны принять div из потока все мы хотеть. Я собираюсь пойти и установить его абсолютно в верхнем левом углу родительской ячейки. Будучи обученным профессионалом, я могу это делать.: td{положение: относительное;} td>div{position: absolute; top: 0; left: 0;}

ну посмотрите на это, теперь все содержимое ячейки было сдвинуто вверх. Мы не можем просто отрегулировать положение блока, поскольку это повлияет на то, как он трансформируется; вместо этого мы отрегулируем смещение блока: рентабельность:100% 0 -100%;

мы взяли элемент из потока выше (и по уважительной причине тоже), теперь мы просто применим высоту к родительской ячейке, и нам хорошо идти:

http://jsfiddle.net/ZWBHS/2/

обновление:

вы всегда можете добавить свойство переполнения текста и исправить размер текста и ячейки, чтобы он требовал минимального обновления работы, напримерhttp://jsfiddle.net/ZWBHS/3/

чтобы усеченный текст не терялся, возможно, добавьте атрибут title дублируя его?