Таблицы в полоску

13 Dec, 2004

Давненько уже на ALA была статья про "Полосатые таблицы". Решил поделиться маленькой хитростью которую подсмотрел там же в обсуждении статьи.

Что было

В оригинальной статье использовался довольно немаленький (по меркам современного веба) скрипт. Этот скрипт искал таблицу и потом определенным ячейкам присваивал фоновый цвет. Причем этот скрипт не работал в старых ИЕ(5.0, 5.5) поскольку они не поддерживали такое присвоение.(у меня по крайней мере не заработало).

Присвоение же цвета агрументировалось экономией имени класса.(ИМО абсолютно не нужной). перевод статьи можно почитать здесь: Полосатые таблицы

Другие пути

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

Путь первый: универсальный

Идея первого пути почти такая же в оригинале. Но теперь мы присваиваем не фоновые цвета для каждой ячейки, а классы для строк. Вот собственно скрипт:
function stripe(id) {
    var table = document.getElementById(id);
    if (! table) { return; }
    var trs = table.getElementsByTagName('tr');
    for (var i = 0; i < trs.length; i += 2) {
      trs[i].className += ' even';
    }
  }
Где вместо ID нужно подставить ID будущей "зебры". Лично я, для раскраски нескольких таблиц, использую такую конструкцию:
/*Running onLoad Scripts*/  
  function runScripts()
	{
	stripe('price');
	stripe('price-a');
	stripe('price-b');
	stripe('price-d');
	}
window.onload = runScripts;
Ну и естественно, так как скрипт лишь расставляет лишь класс для строк без CSS тут не обойтись:
#price tbody tr.even td {
	background-color: #edf3fe
}
Таким образом на любой странице этим подключенным скриптом будут раскрашены таблицы с id price,price-a,price-b,price-d. Пример можно посмотреть по адресу: http://cssing.iatp.org.ua/examples/melos/table.html

Второй путь: НЕуниверсальный

Это решение наверно можно назвать реализацией CSS3 в ИЕ. Работает это естественно только для ИЕ. :( Но уж больно симпатичное и изящное оно. Для полосатых таблиц достаточно добавить в CSS вот такую строку:
.zebra tr {
background: expression(this.rowIndex%2 == 1?'#F0F0F0':'#FFF');
} 
Все таблицы класса .zebra будут полосаты в ИЕ.

Само собой

Для того что бы работал скрипт, надо что бы структура таблиц была примерно такая:
<table id='playlist'>
  <tbody>
    <tr class='odd'>
     ...
    </tr>
  </tbody>
</table>
Ну и для красоты рекомендую сразу поставить cellspacing="0" для всех таблиц которые вам нужны полосатыми.

В обсуждении были еще методы. Но первый был лучшим, а второй занятным. Что и определило мой выбор.

3 комментариев к “Таблицы в полоску”

1.DpakoH | 02 Feb, 2005
http://cssing.iatp.org.ua/examples/melos/table.html не работает в опера 8 beta
2.CB&#8217;s blog &raquo; Полосатые таблицы | 12 Aug, 2006
[...] Внимательный читатель сразу же может заметить мол сколько можно, тема раскрыта и точка, надоели повторы, практически то же самое скорее всего можно почитать тут (en), тут (рус) и тут (рус), а также додуматься самому при возникновении необходимости в сабже. Но я считаю, что соотношения пользы нижеизложенного кода к размеру в байтах так велико, что лучше прочитать еще раз, выучить наизусть, найти все баги, и в конце-концов повесить в рамочку под стеклом. Javascript now works [...]
3.Человек | 06 Jul, 2013
Если зрить в DOM, то баловать с CSS вообще не нужно. А тем более если ресурс чужой. И править много чего не получиться. function stripe(id) { var table = document.getElementById(id); if (! table) { return; } var trs = table.getElementsByTagName('tr'); for (var i = 0; i < trs.length; i += 2) { trs[i].style.backgroundColor="rgb(204, 204, 204)"; } } мне хватает букмарклета под FF для однотипных задач как ваша. javascript:( function(){ for(var i=0;i<document.body.childNodes[1].children[2].rows.length;i+=3){ document.body.childNodes[1].children[2].rows[i].style.backgroundColor="rgb(204,204,204)"; } })()