Tablezzzzz

24th May 2004 - 20:17

Главная цель — отделить структуру от представления.

» source

<div class="NwsAttr">
  <div class="NwsLeft">
    <div class="NwsSubj">
      Статья о файлах справки
    </div>
  </div>
  <div class="NwsRight">
    <div class="NwsDate">
      23 апреля 2004
    </div>
  </div>
</div>

Если человек пишет такое и считает, что добился поставленной цели… Вы уж извините, что я прилюдно наезжаю на малоопытных людей, просто пример достаточно показателен. Показателен в том смысле, что сейчас модно выбегать на улицы с лозунгом «Без таблиц!», кричать о разделении структуры и представления, но вот слова «как» и, самое главное, «зачем», некоторые кодеры оставляют дома.

Логика (структура) — это XML (XHTML, если угодно). Не надо там гадить. Чем каша из div/span, id/class лучше таблиц? Хотите отделить логику от представления? Отделяйте:

<ul id="navigation">
  <li><a href="#" title="Title">Link</a></li>
  <li><a href="#" title="Title">Link</a></li>
  <li><a href="#" title="Title">Link</a></li>
</ul>

Мало? Недостаточно предоставленных элементов, хочется картинок, hover, content? Вешайте span’ы, пишите htc, если это необходимо, но не плодите совсем уж лишних сущностей и не доводите до абсурда (уже из другого источника):

<a href="#" title="Title">
  <div class="navcont">
    <div class="navimg">
      <img src="img.jpg" ... />
    </div>
    <div class="navtxt">
      <div class="header">Header</div>
      <div>Text</div>
    </div>
  <br clear="all"/>
  </div>
</a>

XHTML — это не div’ы.

С другой стороны, сейчас нет CSS. CSS 2? Калека. И не в браузерах вопрос. Эта версия ущербна сама по себе, достаточно посмотреть хотя бы на «CSS3 Generated and Replaced Content Module». Поэтому и не хватает сейчас просто «голых» структур вроде UL [id]; приходится доставать костыли. Однако, когда я вижу как издеваются над этим калекой,

<div class="part">
<div class="part_div">
  <h3 class="part_head"><span class="part_span">Header</span> text</h3>
  <div class="part_para">
    <div class="img_in_part_para"><img class="part_para_imgblock" ... /></div>
    <p class="text">Text</p>
  </div>
  <div class="part_para"><p class="text">Text</p></div>
</div>
</div>

мне хочется спросить лишь об одном: «У некоторых людей думалка работает или где?»

Да, верстать таблицами — это плохо. Да, разделять структуру и представление — это хорошо. Но (на данный момент) не всегда удаётся достигнуть желаемого, а когда это возможно, нужно приложить максимум усилий для того, чтобы не променять шило на чёрт-знает-что.

Categories: CSS, dHtml | comments: (5)

Комментарии

1. Vanav 25th May 2004 - 16:55

«Напишу-ка я гадость…» (q) Mash, «Thinking Woman».

Первый пример не очень показателен. Возьмем код комментария (структура та же, «a» заменен на «anc»):

<div class="CmntNote" id="last">
<div class="CmntAttr">
<div class="CmntLeft">
<span class="CmntName">Someone</span>
(<anc href="mailto:someone@mail.ru">someone@mail.ru</anc>)
</div>
<div class="CmntRight">
<span class="CmntDate">сегодня, 12:48</span>
<span class="CmntCommands">
<anc href="?cor=1" onclick="return openwin('?cor=1')">[Править]</anc>
<anc href="?delete=1">[Удалить]</anc>
</span>
</div>
</div>
<p>Sample comment</p>
</div>

О косности CSS и HTML здесь напоминает только .CmntLeft и .CmntRight. Остальное вполне может сойти за XHTML. Зачем? Для гибкости — ведь это просто структура. А вот представление (сокращено):

.CmntNote { margin: 2em 0 }
.CmntAttr { padding: 0 2em; border-bottom: 1px #ddd dashed }
.CmntName { font-weight: bold }
.CmntDate { font-size: 90% }
.CmntCommands { font-size: 80% }
.CmntLeft { float: left }
.CmntRight { text-align: right }

Это не полное отделение (нет классов для тела комментария и почты, частичная привязка к представлению — имя автора сверху, сообщение снизу), но вполне достаточное. Хотите больше? XML + XSL решают большинство проблем.

Да, селекторы CSS 2 (о поддержке селекторов), несколько сократили бы HTML код, но он не стал бы понятнее.

CSS 3 делает еще один шаг к отделению структуры от представления (наконец-то можно будет поменять местами имя автора и тело сообщения при помощи одного только CSS), но, боюсь, что в скором будущем он не будет реализован (а многое реализовать просто невозможно — посмотрите на CSS 2.1 и его Candidate Recommendation Exit Criteria).

Mash:

>> Первый пример не очень показателен.

Вполне показателен. Его автор имеет смутное представление о принципах наследования.

<a class="ImageButtonRight" ... >
<span class="ImageLink">
<img .../>
</span>
</a>

И такое — по всему коду красной нитью. Взять хотя бы приведённый вами пример: внутри div.CmntLeft находятся два элемента (span и a). Для чего понадобился класс «CmntName»?

Неужели div.CmntLeft span {font-weight:bold;} не работает?

>> Хотите больше? XML + XSL решают большинство проблем.

Хочу. На стороне клиента. Opera.

PS. Отключите CSS, а потом попробуйте объяснить мне, в каком месте я должен увидеть структуру (логику), которую вы пытаетесь от чего-то отделить.

2. Vanav 26th May 2004 - 00:49

>>Его автор имеет смутное представление о принципах наследования.
Возможно, он только учится и это его первая работа на HTML…

>> Неужели div.CmntLeft span {font-weight:bold;} не работает?
Согласен, здесь можно сократить, правда, потом вспоминать, что все-таки было в span, имя или адрес? В этом случае span будет играть чисто оформительскую роль.

>> Хочу. На стороне клиента. Opera.
Надо еще, чтобы Opera хотела. У них этого, часом, нет в Wish List?

>> Отключите CSS, а потом попробуйте объяснить мне, в каком месте я должен увидеть структуру (логику)
Когда мы отключаем CSS, используются встроенные стили для элементов HTML. Так, отбрасываем <table>, depricated… что остается?
<blockquote> с историческим отступом, <dl>/<dt>/<dd>, <ul>/<li>, <h1>, <sub>, <sup> и различные вариации на тему полужирного и курсива. Слишком мало для эффектного отображения структуры Note/Attr/Name/Date/Commands/…
А теперь посмотрите код 1-го комментария в любом XML-редакторе (или в том же IE). Там будет видна четкая структура:

> Note
>>> Attr
>>>>> Name /
>>>>> Mail /
>>>>> Date /
>>>>> Commands /
>>> /Attr
>>> Comment
>>> /Comment
> /Note

Для более простой структуры лучше, конечно, использовать <ul>/<li> с их предопределенными стилями, хотя и в случае с <div> документ вполне читаем. Если посмотреть с вашей точки зрения, то лучше сделать так:

<div class="comment">
<h6>
<strong>Name</strong>
<address>Mail<address>
<em>Date</em>
<small>Commands</small>
</h6>
<p>Comment 1</p>
</div>

Правда, потом (в CSS) выяснится, что <em> вовсе не курсивный и т.д. Что ж, тоже оригинально, и без CSS смотрится как «так и надо». А то все <div> и <span>…

Mash:

>> Возможно, он только учится и это его первая работа на HTML

Да, вполне возможно. Я снимаю шляпу и искренне радуюсь тому, что уже при создании первого сайта автор думает о структуре и представлении. Серьёзно.

>> В этом случае span будет играть чисто оформительскую роль.

Забавно. А div в этом случае какую роль играет? Вы действительно считаете, что присвоив div’у класс с более-менее осмысленным названием, мы можем говорить о разделении структуры и представления?

И зачем люди мучаются? Право, чудаки. Писали бы уж всё в дивах.

>> правда, потом вспоминать, что все-таки было в span

Лично у меня таких проблем нет. Семантика + комментарии в CSS + здоровая память.

>> Надо еще, чтобы Opera хотела.

Надо, и надо чтобы IE CSS2 хотел, и ещё много чего надо. Я уже написал о том, что некоторые вещи на данный момент, мягко говоря, плохо работают.

>> У них этого, часом, нет в Wish List?

Не знаю. my.opera.com/forums --> search.

>> А теперь посмотрите код 1-го комментария в любом XML-редакторе

У меня нет привычки просматривать web-страницы в XML-редакторах. Обычно я, как и многие другие, делаю это при помощи браузера.

>> хотя и в случае с <div> документ вполне читаем.

Помимо людей, документы читают роботы поисковых систем. Для них, например, заголовок всегда будет иметь больший вес и «смысл», нежели div.

>> Если посмотреть с вашей точки зрения, то лучше сделать так

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

<ul>/<li> — это список. Это логика. Именно в этом и заключается причина того, почему следует отказываться от вёрстки таблицами. А что такое <div>? Какую смыловую нагрузку он несёт? Оформительский костыль.

Google: semantic + markup.

3. Mix 26th May 2004 - 09:24

А вот я хочу применить для навигационной панели не <ul>, а <menu>, ибо ИМХО это логичнее, но низнаю можно ли его в XHTML употреблять.

4. О.Б. 28th May 2004 - 01:05

DIV сам по себе последний элемент в структурной вёрстке. Заплатка, которую можно (не нужно) употреблять тогда, когда ни один другой элемент не подошёл.
То же и со SPAN'ом.

5. Vanav 28th May 2004 - 03:28

2 Mash:
Спасибо за напоминание о SimpleQuiz, я к ним в этом году еще не заглядывал.

<div> практически не несет семантическую нагрузку, да и вообще XHTML — не семантический язык. Единственное, что описывает <div> — это иерархию (структуру). Если необходима некая дополнительная семантическая окраска (а она желательна), то используют <ul>, <ol>, <dl> и т. п. Я считал, что в этом случае одной иерархии достаточно, ведь речь шла не о списке, но это вопрос спорный — у кого и вся страница один большой список с разделами-элементами.
Кстати, иерархию тоже можно представить в виде вложенных списков.

>> Помимо людей, документы читают роботы поисковых систем.
В данном случае имя и дата — не самое важное, если бы была тема сообщения, то ей прямая дорога в <hN>.

2 Mix:
<dir> и <menu> использовать не стоит, они были устаревшими еще в HTML 4.01. Изначально они должны были представлять текст в несколько колонок, но были официально отменены в пользу <ul>.
Входят в HTML 4.01 и XHTML 1.0 Transitional DTD (нет в Strict), не входят в XHTML 1.1.

Mash:

>> да и вообще XHTML — не семантический язык

Ладно, остановимся на том, что у нас разные взгляды на XHTML.

>> В данном случае имя и дата — не самое важное, если бы была тема сообщения, то ей прямая дорога в <hN>.

Про поисковые системы было сказано не в рамках какого-то конкретного случая.

Комментарии временно отключены.