як повернути текст наліво на 90 градусів, а розмір комірки регулюється відповідно до тексту в HTML


78

Припустимо, у мене є таблиця з деякими рядками та стовпцями, тому я хочу повернути текст у клітинках приблизно так
: введіть тут опис зображення

проблема полягає в тому, коли я обертаю текст за допомогою стилю:

#rotate {
     -moz-transform: rotate(-90.0deg);  /* FF3.5+ */
       -o-transform: rotate(-90.0deg);  /* Opera 10.5 */
  -webkit-transform: rotate(-90.0deg);  /* Saf3.1+, Chrome */
             filter:  progid:DXImageTransform.Microsoft.BasicImage(rotation=0.083);  /* IE6,IE7 */
         -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0.083)"; /* IE8 */

все це псується так

html код:

<table cellpadding="0" cellspacing="0" align="center">
    <tr>
        <td id='rotate'>10kg</td>
        <td >B</td>
        <td >C</td>
        <td>D</td>
        <td>E</td>
    </tr>
    <tr>
        <td id='rotate'>20kg</td>
        <td>G</td>
        <td>H</td>
        <td>I</td>
        <td>J</td>
    </tr>
    <tr>
        <td id='rotate'>30kg</td>
        <td>L</td>
        <td>M</td>
        <td>N</td>
        <td>O</td>
    </tr>


</table>

css:

<style type="text/css">
td {
    border-collapse:collapse;
    border: 1px black solid;
}
tr:nth-of-type(5) td:nth-of-type(1) {
    visibility: hidden;
}
#rotate {
     -moz-transform: rotate(-90.0deg);  /* FF3.5+ */
       -o-transform: rotate(-90.0deg);  /* Opera 10.5 */
  -webkit-transform: rotate(-90.0deg);  /* Saf3.1+, Chrome */
             filter:  progid:DXImageTransform.Microsoft.BasicImage(rotation=0.083);  /* IE6,IE7 */
         -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0.083)"; /* IE8 */
}
</style>

@Mr_Green: transform: rotate (-90.0deg); я додав його у свій код, але жодних змін. Чи можу я знати, для чого він використовується?
lata

Відповіді:


62

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

Також переконайтеся, що ви змінили свій id #rotateклас на клас, оскільки у вас є кілька.

Таблиця 4x3 із заголовками в першій колонці, повернутими на 90 градусів

$(document).ready(function() {
  $('.rotate').css('height', $('.rotate').width());
});
td {
  border-collapse: collapse;
  border: 1px black solid;
}
tr:nth-of-type(5) td:nth-of-type(1) {
  visibility: hidden;
}
.rotate {
  /* FF3.5+ */
  -moz-transform: rotate(-90.0deg);
  /* Opera 10.5 */
  -o-transform: rotate(-90.0deg);
  /* Saf3.1+, Chrome */
  -webkit-transform: rotate(-90.0deg);
  /* IE6,IE7 */
  filter: progid: DXImageTransform.Microsoft.BasicImage(rotation=0.083);
  /* IE8 */
  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0.083)";
  /* Standard */
  transform: rotate(-90.0deg);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table cellpadding="0" cellspacing="0" align="center">
  <tr>
    <td>
      <div class='rotate'>10kg</div>
    </td>
    <td>B</td>
    <td>C</td>
    <td>D</td>
    <td>E</td>
  </tr>
  <tr>
    <td>
      <div class='rotate'>20kg</div>
    </td>
    <td>G</td>
    <td>H</td>
    <td>I</td>
    <td>J</td>
  </tr>
  <tr>
    <td>
      <div class='rotate'>30kg</div>
    </td>
    <td>L</td>
    <td>M</td>
    <td>N</td>
    <td>O</td>
  </tr>


</table>

JavaScript

Еквівалент вищезазначеного в чистому JavaScript такий:

jsFiddle

window.addEventListener('load', function () {
    var rotates = document.getElementsByClassName('rotate');
    for (var i = 0; i < rotates.length; i++) {
        rotates[i].style.height = rotates[i].offsetWidth + 'px';
    }
});

Зверніть увагу, що значення 0,083 стосуються 7,5 градусів, а для IE10 вам знадобиться -ms-transform: rotate (-90.0deg);
Девід Сайкс,

13
Це працює для короткого тексту, але при введенні довшого тексту tdширина буде зростати в ширину, і немає можливості її зменшити :( +1, хоча для робочого випадку
Едуард Лука

@EduardLuca max-widthдопомагає, наприклад max-width: 1em, тестуватися на Chrome, але ширина комірки - це лише одна з проблем, яку вводить довший текст. На думку спадає принаймні (1) розбиття слів та (2) позиціонування / вирівнювання. (1) можна допомогти з нерозривними символами та (2) з відносним розташуванням замість вирівнювання тексту esp. якщо таблиця / комірка є дещо статичною. Поворот все ж далекий від ідеалу, але може бути корисним у обмежених випадках.
Jari Keinänen

7
А тепер спробуйте збільшити колонку, а центр тексту - і бум - макет вибухне вам в обличчя! Навіть у 2015 році вам все одно доведеться це зробити, написавши загальний обробник зображень для вертикального тексту ... Це просто абсурд. Це не повинно бути так важко. Це повинно бути так просто, як <span style = "text-direction: upside-down; font-weight: bold; font-size: 10px;" > lalala </span>, що це не так, з якоїсь дурної причини.
Стефан Штайгер

1-а клітина квадратна. не те, що ти хочеш.
Борис Гафуров

57

Без розрахунку висоти. Строгі CSS та HTML. <span/>лише для Chrome, оскільки chrome не може змінити напрямок тексту для <th/>.

th 
{
  vertical-align: bottom;
  text-align: center;
}

th span 
{
  -ms-writing-mode: tb-rl;
  -webkit-writing-mode: vertical-rl;
  writing-mode: vertical-rl;
  transform: rotate(180deg);
  white-space: nowrap;
}
<table>
  <tr>
    <th><span>Rotated text by 90 deg.</span></th>
  </tr>
</table>


4
Це надзвичайно хитро і дуже міцно. Чудова ідея, це повинна бути прийнята відповідь - відсутність JS, ніяких спеціальних ширин, висоти, полів тощо. - дійсно приємно.
Ендрю Ходжкінсон,

Для кращого ефекту ви можете використовувати додатково, th span{display:table; border-spacin:0; margin-left:...}щоб уникнути відмінностей між IE11, Firefox та Chrome.
18C,

саме те, що я шукаю, воно автоматично регулює висоту заголовка таблиці на основі вмісту без додаткового JavaScript! добре працював з моїм варіантом використання.
sf9v

2
Схоже sideways-lr, не потрібно буде обертати 180deg хак, але лише Firefox підтримує його зараз.
mpen

провівши досить багато часу, граючи з CSS, не змогли цього зробити, і ваше рішення запрацювало за секунду. дякую, чоловіче.
eirenaios

43

Відповідь Даніеля Іммса є чудовою щодо застосування вашої ротації CSS до внутрішнього елемента. Однак можна досягти кінцевої мети способом, який не вимагає JavaScript і працює з довшими рядками тексту .

Зазвичай вся причина, по якій вертикальний текст має бути в першому стовпці таблиці, полягає в тому, щоб помістити довгий рядок тексту в короткий горизонтальний проміжок і йти поряд з високими рядками вмісту (як у вашому прикладі) або кількома рядками вмісту (що я у цьому прикладі).

введіть тут опис зображення

Використовуючи клас ".rotate" на батьківському тегу TD, ми можемо не тільки повертати внутрішній DIV, але ми можемо також встановити кілька властивостей CSS на батьківському тегу TD, які змусять весь текст залишатися в одному рядку і тримати ширину до 1,5em. Тоді ми можемо використовувати деякі негативні поля на внутрішньому DIV, щоб переконатися, що він добре центрований.

td {
    border: 1px black solid;
    padding: 5px;
}
.rotate {
  text-align: center;
  white-space: nowrap;
  vertical-align: middle;
  width: 1.5em;
}
.rotate div {
     -moz-transform: rotate(-90.0deg);  /* FF3.5+ */
       -o-transform: rotate(-90.0deg);  /* Opera 10.5 */
  -webkit-transform: rotate(-90.0deg);  /* Saf3.1+, Chrome */
             filter:  progid:DXImageTransform.Microsoft.BasicImage(rotation=0.083);  /* IE6,IE7 */
         -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0.083)"; /* IE8 */
         margin-left: -10em;
         margin-right: -10em;
}
<table cellpadding="0" cellspacing="0" align="center">
    <tr>
        <td class='rotate' rowspan="4"><div>10 kilograms</div></td>
        <td>B</td>
        <td>C</td>
        <td>D</td>
        <td>E</td>
    </tr>
    <tr>
        <td>G</td>
        <td>H</td>
        <td>I</td>
        <td>J</td>
    </tr>
    <tr>
        <td>L</td>
        <td>M</td>
        <td>N</td>
        <td>O</td>
    </tr>
    <tr>
        <td>Q</td>
        <td>R</td>
        <td>S</td>
        <td>T</td>
    </tr>
    
    <tr>
        <td class='rotate' rowspan="4"><div>20 kilograms</div></td>
        <td>B</td>
        <td>C</td>
        <td>D</td>
        <td>E</td>
    </tr>
    <tr>
        <td>G</td>
        <td>H</td>
        <td>I</td>
        <td>J</td>
    </tr>
    <tr>
        <td>L</td>
        <td>M</td>
        <td>N</td>
        <td>O</td>
    </tr>
    <tr>
        <td>Q</td>
        <td>R</td>
        <td>S</td>
        <td>T</td>
    </tr>
    
    <tr>
        <td class='rotate' rowspan="4"><div>30 kilograms</div></td>
        <td>B</td>
        <td>C</td>
        <td>D</td>
        <td>E</td>
    </tr>
    <tr>
        <td>G</td>
        <td>H</td>
        <td>I</td>
        <td>J</td>
    </tr>
    <tr>
        <td>L</td>
        <td>M</td>
        <td>N</td>
        <td>O</td>
    </tr>
    <tr>
        <td>Q</td>
        <td>R</td>
        <td>S</td>
        <td>T</td>
    </tr>
    
</table>

З цим рішенням слід пам’ятати, що воно не працює належним чином, якщо висота рядка (або рядових рядків) менша, ніж вертикальний текст у першому стовпці . Найкраще це працює, якщо ви охоплюєте кілька рядків або у вас багато вмісту, що створює високі рядки.

Веселіться, граючись із цим на jsFiddle .


Як примітка: я наткнувся на значення margin-leftі margin-rightз, -10emщоб -100emпросто бути в безпеці. Якщо ширина тексту, що не повертається, перевищує 20em, макет почне змінюватися. OTOH, 200emширина тексту занадто велика для читання, повернута на -90deg, тому цього повинно бути достатньо, щоб не натрапити на цю проблему.
maxathousand

^^ Моє виправлення вище спричинило надмірне пробіл під моїм столом через поля, що розширювались досить широко (або «високими» після його обертання). Щоб це виправити, я додав overflow: hiddenдо оберненого td.
maxathousand

1
Не працює на IE11. Слід також додати "перетворити" та "-ms-перетворити"
Anonymoose

2

На жаль, хоча я думав, що ці відповіді можуть спрацювати для мене, я зіткнувся з рішенням, оскільки використовую таблиці в адаптивних таблицях - там, де грається overflow-x.

Отже, маючи це на увазі, подивіться на це посилання для більш чистого способу, який не має дивних проблем із переповненням ширини. Врешті-решт це спрацювало для мене, і його було дуже легко реалізувати.

https://css-tricks.com/rotated-table-column-headers/

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