Необходимо, чтобы текст в ячейках с классом "vertical" при отображении в браузере имел вертикальное направление "снизу-вверх"
Средствами CSS это возможно реализовать только в Internet Explorer, воспользовавшись свойством writing-mode. Для необходимого направления текста придётся воспользоваться фильтрами flipH и flipV
А как же быть с остальными браузерами, которые не поддерживают ни фильтры, ни свойство writing-mode?
На ум приходит, пожалуй, только одно - заменить текстовое содержимое на картинку. Но уж, конечно, не хочется делать это ручками, воспользуемся способностью основных браузеров генерировать SVG-изображения.
Scalable Vector Graphics (SVG) (масштабируемая векторная графика), язык, основанный на XML, разрабатываемый консорциумом W3C. SVG позволяет создавать анимацию для каждого элемента, позволяет управлять элементами с помощью скриптов через DOM, JavaScript, ECMAScript или с помощью любого другого скриптового языка, который поддерживается SVG-программой. В SVG разработчику доступны многие основные элементы, включая окружности, прямоугольники, эллипсы, многоугольники, кривые и текст. Так же как и в HTML, отображением элементов можно управлять с помощью стилей (CSS2), либо напрямую с помощью атрибутов.
Наша задача фактически сводится к созданию SVG-разметки, которой мы заменим текст в нужных нам ячейках.
<style type="text/css">
table.preview { border-collapse: collapse; }
table.preview td
{
font-family: verdana;
font-size: 12px;
color: #000;
padding: 5px;
border: solid 1px #d1d1d1;
text-align: center;
vertical-align: middle;
background: #fff;
}
table.preview td.vertical
{
writing-mode: tb-rl;
filter: flipH flipV;
}
</style>
<table class="preview">
<tr>
<td colspan="3">Сроки наблюдения, сут</td>
<td>3</td>
<td>6</td>
</tr>
<tr>
<td rowspan="12" class="vertical">Содержание основных клеточных элементов, %</td>
<td rowspan="3" class="vertical">Нейтрофилы</td>
<td>Хлоргексидин</td>
<td>49.3</td>
<td>31.5</td>
</tr>
<tr>
<td>Левосин</td>
<td>43.4</td>
<td>25.3</td>
</tr>
<tr>
<td>Левосин + прополис</td>
<td>32.5</td>
<td>22.3</td>
</tr>
<tr>
<td rowspan="3" class="vertical">Макрофаги</td>
<td>Хлоргексидин</td>
<td>1.0</td>
<td>1.4</td>
</tr>
<tr>
<td>Левосин</td>
<td>2.1</td>
<td>1.3</td>
</tr>
<tr>
<td>Левосин + прополис</td>
<td>4.1</td>
<td>3.8</td>
</tr>
<tr>
<td rowspan="3" class="vertical">Лимфоциты</td>
<td>Хлоргексидин</td>
<td>1.1</td>
<td>3.5</td>
</tr>
<tr>
<td>Левосин</td>
<td>1.9</td>
<td>2.9</td>
</tr>
<tr>
<td>Левосин + прополис</td>
<td>6.6</td>
<td>2.7</td>
</tr>
<tr>
<td rowspan="3" class="vertical">Фибробласты</td>
<td>Хлоргексидин</td>
<td>1.0</td>
<td>1.0</td>
</tr>
<tr>
<td>Левосин</td>
<td>1.8</td>
<td>2.3</td>
</tr>
<tr>
<td>Левосин + прополис</td>
<td>4.1</td>
<td>3.9</td>
</tr>
</table>
<script type="text/javascript">
function GetVerticalLayout()
{
var fontFamily = "verdana";
var fontSize = 12;
var notIE = !(navigator.appVersion.indexOf("MSIE") != -1 && navigator.systemLanguage);
var supportSVG = document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#SVG", "1.1");
if (notIE && supportSVG)
{
var td = document.getElementsByTagName("td");
var objElement = document.createElement("object");
for(i = 0; i < td.length; i++)
{
if (td[i].className.match(/vertical/i))
{
var text = td[i].innerHTML;
var h = td[i].clientHeight;
var w = td[i].clientWidth;
var obj = objElement.cloneNode(true);
obj.height = (h > w) ? h : w;
obj.type = "image/svg+xml";
obj.width = fontSize + 2;
obj.data = "data:image/svg+xml;charset/windows-1251,<svg xmlns='http://www.w3.org/2000/svg'><text x='" + (- obj.height / 2) + "' y='" + fontSize + "' style='font-family:" + fontFamily + "; font-size:" + fontSize + "px; text-anchor: middle' transform='rotate(-90)'>" + text + "</text></svg>";
td[i].replaceChild(obj, td[i].firstChild);
}
}
}
}
window.onload = GetVerticalLayout();
</script>
Если браузер поддерживает SVG, то в соответствующих ячейках текст отобразится должным образом. В Internet Explorer замену не производим, так как для него существует упомянутое выше простое решение, кроме того, для отображения SVG в IE нужны внешние плагины.
Источник: http://perkoka.ru/