У меня есть набросок, который я хочу разместить на своем веб-сайте, и я также собираюсь написать небольшую пьесу в какой-то момент, которую я также хотел бы сделать в свободном доступе.
Я пытаюсь найти лучший способ представить это в HTML. Мне в основном нужны две колонки - одна для говорящего персонажа, а другая для текста. Очевидно, что каждое выступление должно соответствовать выступающему. Другими словами, примерно так:
Jeff This sure is a nice website we've got now.
Joel It certainly is. By the way, working at FogCreek rocks.
Jeff Of course it does. Have you played Rock Band yet? It's
a lot of fun.
(Ну это лучше, чем lorem ipsum ...)
Я знаю, как я могу сделать это с таблицами HTML (с одной строкой таблицы на речь), но это кажется довольно уродливым, и все, безусловно, похоже, заинтересованы в использовании CSS для представления нетабличных данных. Я не могу понять, как на самом деле учитываются табличные данные - раньше я использовал «строку» и «столбец» скорее для макета, чем для фундаментальных данных.
Итак, есть идеи? Я думаю, что большинство веб-сайтов сценариев, которые я видел (правда, не многие), либо используют <pre>, как мой пример выше, либо не пытаются сохранить обычный формат сценария, вместо этого просто добавляя к каждому абзацу имя докладчика. (См. Пример этого стиля в вики-странице подкаста.) У меня проблемы с определением даже того, какие элементы HTML я должен использовать для представления этого, честно говоря - списка определений словаря с говорящим в качестве термина и речью в качестве определения. наверное, самое близкое, о чем я думал, но это похоже на насилие.






ИМО, это на самом деле табличные данные. Первый столбец - динамик, второй столбец - текст.
Однако, если вы хотите быть модным и агрессивно избегать столов, я считаю, что то, что веб-знатоки диктуют в этом сезоне, согласуется с такой структурой:
<div class = "play">
<div class = "line">
<div class = "speaker">Jeff</div>
<div class = "text">This sure is a nice website we've got now. </div>
</div>
<div class = "line">
<div class = "speaker">Joel</div>
<div class = "text">It certainly is. By the way, working at FogCreek rocks.</div>
</div>
</div>
Затем вы контролируете, как это будет выглядеть, с помощью соответствующего CSS.
Если похоже, что вы в основном пишете XML и используете CSS, чтобы указать, как он выглядит, ну, это потому, что веб-знатоки считают, что вы должны делать это, AFAICT.
(Конечно, я могу использовать XSLT для создания таблиц вместо огромного количества div.)
@Jon Skeet: вполне разумно. Может быть, было бы также хорошо, если бы ваш интерфейс редактирования воспроизведения хранился в базе данных, выводил любую полезную окончательную форму и, тем не менее, пропустил XSLT.
@ Эран Гальперин: Ага. Но это магически политически одобренные дивы, а не злые контрреволюционные таблицы, так что это правильно и хорошо. (Можете ли вы сказать, что я думаю, что некоторые люди немного заносчивы и примадонны со своими резкими обличительными фразами "фу, столы"? Да, я думал, что вы могли бы.)
Я не согласен. Та же структура (два столбца) может быть легко реализована с использованием семантических тегов с гораздо меньшим объемом разметки.
@ Эран Гальперин: Хотя я считаю, что блоки div выглядят нелепо и в первую очередь будут голосовать за таблицы, я должен отметить, что у вас и в примерах Марка Тайлера гораздо меньше разметки, но это игрушечные примеры, которые не могут фактически использоваться на нетривиальном производственном веб-сайте. (продолжение)
@ Эран Гальперин: Это безумно плохая практика - глобально перепрофилировать семантические теги для чего-то подобного, как это делают оба ваших примера. В реальном производстве ваша разметка будет расширена атрибутами class (или, тьфу, id), необходимыми для изоляции ваших поведенческих спецификаций.
конечно, в реальном мире у него будет класс или контейнер с классом. это просто пример, а не полное приложение. Я добавил в свой пример контейнер, а разметка все равно меньше половины
@ Эран Гальперин: ладно. Мне больше нравится ваш пример с контейнером. На самом деле наши примеры нацелены на разные вещи. Мой не пытается минимизировать разметку, он пытается отобразить логическую структуру и максимизировать ясность и точность связанного CSS.
Сведение к минимуму разметки - не идеальный вариант, но он помогает облегчить обслуживание и упростить работу. Использование именованных тегов также хорошо для семантики (программы чтения с экрана и т. д.).
@chaos "ИМО, это табличные данные". - Абсолютно согласен.
Определенно таблица - нет необходимости в div - поскольку она имеет форму (a: b) +, а не форму ключевого значения, поскольку "a" может повторяться (исключает <dl>).
@annakata: в спецификации ничего не говорится об уникальных терминах в DL. DL может содержать любое количество элементов dd / dt в любом порядке (ну, если во всем списке хотя бы 1!). Это делает скромный DL очень гибким и вполне подходящим для таких задач. Пока не получим элемент ...
... направленные непосредственно на сценарии, я думаю, это лучшее, что мы можем сделать. Я полагаю, что таблица не совсем неправильная, но я обычно с подозрением отношусь к табличным данным, которые ДОЛЖНЫ быть упорядочены фиксированным образом, а не по заданному столбцу. Конечно, это мое личное определение.
Я бы использовал заголовки и абзацы.
Со следующими стилями он будет оформлен так, как вы его представили:
.play h2 {
float: left;
clear: left;
width: 100px;
margin: 0;
}
.play p {
margin-left: 100px;
}<div class = "play">
<h2>Jeff</h2>
<p>This sure is a nice website we've got now.</p>
<h2>Joel</h2>
<p>It certainly is. By the way, working at FogCreek rocks.</p>
<h2>Jeff</h2>
<p>Of course it does. Have you played Rock Band yet? It's<br /> a lot of fun.</p>
</div>Более правильным (семантически) и короче было бы использование списков определений:
dl {
overflow: hidden;
}
dl dt {
float: left;
width: 30%;
}
dl dd {
float: left;
width: 70%;
}<dl>
<dt>Jeff</dt>
<dd>This sure is a nice website we've got now.</dd>
<dt>Joel</dt>
<dd>It certainly is. By the way, working at FogCreek rocks.</dd>
<dt>Jeff</dt>
<dd>Of course it does. Have you played Rock Band yet? It's a lot of fun.</dd>
</dl>Я не совсем согласен с тем, что это обязательно семантически правильно. Фактический список определений не имеет расширенной серии множественных определений для термина «Джефф».
Подумав об этом еще раз, я бы сказал то же самое, если бы элемент <dl> назывался <al>, список ассоциаций, но не если бы это был <pl>, парный список.
Конечно, но, к сожалению, в HTML не реализованы теги <al> или <pl>. В HTML так много всего не хватает ... :)
Хаос, я бы склонен был согласиться, но учтите, что спецификация HTML 4.01 (например) фактически говорит, что «Другое применение DL, например, для разметки диалогов, где каждое DT называет говорящего, а каждый DD содержит его или ее слова ".
Почему у вас плавают и dt, и dd
Таблицы - это то, что вам нужно.
Все остальное, например возиться с <div> и css или XSLT, - это просто новое изобретение <table>, но с синтаксисом c ** p.
Я бы выбрал три или четыре стойки фиксированной ширины. (Для любой нетривиальной пьесы потребуются сценические постановки, спецэффекты, звуковые эффекты и т. д.).
Сценические направления и т. д. Обычно представлены в той же колонке, что и выступление, но курсивом. Похоже, что столы могут быть лучшим выходом.
О, но теперь я пару раз прочитал все остальные ответы, становится менее ясно ...
Не позволяйте хулиганам, выступающим за стол, напугать вас. Если ситуация требует GOTO, то, ей-богу, требуется GOTO.
Я не вижу преимуществ в том, чтобы избегать столов здесь. Однако я бы порекомендовал использовать элементы <th> для ваших имен, поскольку они означают для речи то же самое, что заголовки для чисел в числовой сетке.
@chaos: Дискуссия за / против таблицы так часто неверна - таблицы - вполне приемлемое решение целого ряда проблем. Проблемы возникают, когда люди начинают использовать таблицы как средство управления компоновкой, когда контент не имеет земной связи с таблицей. Все дело в семантике.
@chaos - то, что я забочусь, не делает меня хулиганом!
Я поддерживаю ересь :-)
Всегда полезно рассмотреть CSS, прежде чем прибегать к таблицам, но часто таблицы действительно подходят лучше всего. Похоже так в данном случае.
Единственное дополнительное соображение - доступность. Я слышал, что таблицы затрудняют обработку таблиц программным обеспечением для чтения текста, но я не понимаю, почему это так (не стесняйтесь комментировать здесь, если вы знаете больше).
Еще одна вещь - я предполагаю, что сначала вы будете хранить необработанные данные в каком-то другом формате - возможно, в базе данных, XML или другом структурированном тексте?
В любом случае, преобразование его в формат xml и преобразование его в html с помощью xslt может быть весьма полезным, когда дело доходит до игры с этим материалом.
Пожалуйста, избегайте «синдрома кувалды» (если ваш единственный инструмент - молоток, вы пытаетесь относиться к каждой проблеме как к гвоздю). HTML - это язык представление, а не язык источник.
Поэтому я предлагаю написать пьесу на чем-то, что лучше всего отражает ваши мысли (не обязательно в XML), а затем преобразовать это в HTML. Для своих работ я использую рекурсивный XML-анализатор, который может выпадать из-за синтаксического анализа XML для определенных элементов:
<content><<Hello,>> Forne smiled and thought: <<T Idiot.>></content>
Мой синтаксический анализатор вызовет собственный синтаксический анализатор для анализа содержимого <content>. В моем случае он создаст промежуточное XML-дерево:
<content><say>Hello,</say> <char>Forne</char> smiled and thought: <think>Idiot.</think></content>
Затем это дерево конвертируется в HTML, TeX, PDF и т. д.
[EDIT] Моя стратегия по созданию компактного языка работает следующим образом: я начинаю с XML. Через некоторое время я смотрю на XML и пытаюсь увидеть закономерности. Затем я думаю, как я мог бы выразить эти шаблоны более компактно: 1.) как XML, 2.) как XML-текст (с настраиваемой разметкой) и 3.) как что-то совершенно другое. Когда мне приходит в голову идея, я пишу парсер для нового формата.
Откровенно говоря, написание синтаксических анализаторов, которые могут преобразовывать что-либо в XML для автоматической фоновой обработки, сегодня является второстепенной задачей.
+1 для HTML - это просто представление. Я не уверен, какой исходный язык является лучшим на данный момент, но мне нужно будет знать, какой HTML сгенерировать в какой-то момент. Конечно, с подходящим исходным языком я могу довольно легко опробовать все идеи, представленные здесь ...
@Jon: На этой планете есть три человека, которые могут создать хороший язык. Один из них - Гвидо ван Россум, а двое других - не я или вы;)
Если вы хотите сделать это семантически, я бы использовал метки, например:
<div class = "script">
<label for = "Jeff1">Jeff<label>
<div id = "Jeff1">
<p>This sure is a nice website we've got now.</p>
</div>
<label for = "Joel1">Joel</label>
<div id = "Joel1">
<p>It certainly is.</p>
<p>By the way, working at FogCreek rocks.</p>
</div>
<label for = "Jeff2">Jeff</label>
<div id = "Jeff2">
<p>Of course it does.</p>
<p>Have you played Rock Band yet? It's a lot of fun.</p>
</div>
</div>
Это довольно красиво деградирует, и я думаю, что этот ярлык немного больше подходит для того, что вы пытаетесь сделать. А затем в вашей таблице стилей я бы сделал что-то вроде примера CSS Эрана Гальперина.
Если вы серьезно к этому относитесь, я бы посоветовал еще глубже изучить, как пишутся сценарии мертвых деревьев, и сделать все возможное, чтобы сохранить их стиль. Это поможет вашей аудитории выглядеть знакомо (читайте профессионально).
Я достаточно серьезен, чтобы взглянуть на некоторые сценарии, которые я создаю, и попытаться устранить любые недоработки. Я недостаточно серьезен, чтобы тратить на это часы и часы :) Мне нравится, как это выглядит, кроме того, что для каждой речи нужен отдельный идентификатор - это не идеально для меня :(
Вы можете обойтись без идентификаторов и оставить атрибут for вне div.
Мой любимый пример разметки чего-то подобного - это одно из XHTML-соединений Tantek http://tantek.com/presentations/2005/03/elementsofxhtml/ (проверьте бит разговора)
В итоге это выглядит так:
<ol>
<li><cite>Jeff</cite>
<blockquote><p>This sure is a nice website we've got now.</p><blockquote>
</li>
<li><cite>Joel</cite>
<blockquote><p>It certainly is. By the way, working at FogCreek rocks.</p></blockquote>
</li>
...etc...
</ol>
Не уверен, как вы разметите направления этапа и т. Д ... Может быть, вы в конечном итоге создадите новый микроформат :)
Кроме того, в этой разметке есть несколько идеальных хуков CSS с дискретными ссылками, в отличие от списка определений.
Обыграй меня в цитировании, комбинации цитат. Я не собирался добавлять список, хотя это именно то, что есть, список строк.
Элементы cite и blockquote специально отмечены как «не подходящие» для разговоров в последней спецификации HTML 5.2. См. Примеры как представить разговор.
я бы сказал
<dialog>
<dt>Jeff
<dd>This sure is a nice website we've got now.
<dt>Joel
<dd>It certainly is. By the way, working at FogCreek rocks.
<dt>Jeff
<dd>Of course it does. Have you played Rock Band yet? It's a lot of fun.
</dialog>
как определено в HTML5.
Конечно, вам понадобится <script>document.createElement('dialog');</script>, чтобы заставить IE делать что-то разумное, и dialog { display:block; } в вашем CSS, чтобы заставить его работать полностью.
Вау - это реально круто! Сколько современных браузеров его поддерживают?
Нравится вам это или нет, но я бы предположил, что это поддерживает первоначальное предложенное использование в спецификациях w3 DL. Нет?
Не знаю, какая у этого была история, но сейчас это неуместно.
В настоящее время dialog представляет собой элемент пользовательского интерфейса, с которым взаимодействует пользователь (например, модальное диалоговое окно).
Вы не получите однозначного ответа на этот вопрос, поскольку в HTML есть много пробелов, один из которых заключается в следующем: в сети разбросано несколько очень солидных статей по его теме, и хорошее место для начала было бы Статья Брюса Лоусона от 2006 г..
Учитывая, что на этот вопрос нет ответа, лучшее, что мы можем сделать, это посмотреть, какие элементы доступны нам, и пойти на собственный компромисс, основанный на нашей (и сообществе) интерпретации руководящих принципов.
Мне лично нравится cite / blockquote и маршрут списка данных. Я знаю, что списки данных не имеют семантической разметки, но я искренне верю, что цель списков данных состоит не в том, чтобы перечислять определения данных исключительно в словарной манере, а в том, чтобы объединить данные в пары, где ul и ol не могут.
Я потратил много времени на размышления о семантике, и в одном я (как и большинство других специалистов в этой области) уверен, глядя на все вопросы разметки, - это то, что таблицы не являются ответом на 99,9% вопросов разметки ( если это не табличные данные, в которых вы можете использовать th, caption, тогда таблицы действительно следует исключить из вашего инвентаря). Тем не менее, я бы также сказал, что использование исключительно div также, вероятно, не является правильным ответом.
Я очень сомневаюсь, что голоса за этот вопрос будут отражать лучший подход, но, скорее всего, они будут отражать согласие с подходом, основанным на текущих знаниях избирателей и использовании HTML.
Элементы cite и blockquote специально отмечены как «не подходящие» для разговоров в последней спецификации HTML 5.2.
В этом случае я бы просто использовал элементы div с хорошими классами, описывающими домен. Вы можете спорить об использовании всех видов элементов HTML, которые дают лучшее семантическое значение намерения, но, например, в случае элемента диалог, то есть нет, предназначенного для написания диалогов между персонажами в пьесе, он, однако, предназначен для представления пользователю диалогового окна для взаимодействия. Но тот факт, что вы можете изменить и стилизовать этот элемент по своему желанию в CSS, - это замечательно, но я бы не рекомендовал это делать.
Причина этого проста в том, что, если вы не будете осторожны, вы переопределите это поведение и внешний вид для каждого такого элемента. Допустим, это интерактивное приложение для драматургов, вы можете захотеть включить диалоговые окна в дополнение к «диалогу» в пьесе.
Предлагаю такое решение:
.character{
display: block;
float: left;
}
.line{
margin-bottom: 20pt;
width: 400px;
margin-left: 50pt;
}
Со следующим HTML:
<div class = "character">Jeff</div>
<div class = "line">This sure is a nice website we've got now.</div>
<div class = "character">Joel</div>
<div class = "line"> It certainly is. By the way, working at FogCreek rocks.</div>
<div class = "character">Jeff</div>
<div class = "line">Of course it does. Have you played Rock Band yet?
<br/>It's a lot of fun.</div>
Запуск JSFiddle: https://jsfiddle.net/quz9cj2f/6/
Теперь вы можете реализовать стандартное форматирование воспроизведения, которое я взял отсюда: http://ptfaculty.gordonstate.edu/lking/CPF_play_formatting2.pdf
.play {
font-family: courier;
}
.play{
margin-top: 1in;
margin-left: 1.5in;
margin-right: 1in;
margin-bottom: 1in;
}
.character {
display: block;
margin-left: 4in;
text-transform: uppercase;
}
.direction:before{
margin-left: 2.75in;
content: "(";
}
.direction:after{
content: ")";
}
.line {
margin-bottom: .3in;
}
С помощью этого HTML:
<div class = "play">
<div class = "character">Jeff</div>
<div class = "direction">JEFF is enthusiastic!</div>
<div class = "line">This sure is a nice website we've got now.</div>
<div class = "character">Joel</div>
<div class = "direction">Jumping continuously</div>
<div class = "line"> It certainly is. By the way, working at FogCreek rocks.</div>
<div class = "character">Jeff</div>
<div class = "line">Of course it does. Have you played Rock Band yet?
<br/>It's a lot of fun.</div>
</div>
Рабочий JSFiddle: https://jsfiddle.net/quz9cj2f/9/
Или вы можете пойти ва-банк и использовать селекторы атрибутов CSS и создать собственные атрибуты для метаинформации:
.play {
font-family: courier;
}
.play{
margin-top: 1in;
margin-left: 1.5in;
margin-right: 1in;
margin-bottom: 1in;
}
.character {
display: block;
margin-left: 4in;
text-transform: uppercase;
}
.line[direction]:before{
margin-left: 2.75in;
content: "(" attr(direction) ")";
display: block;
}
.line {
margin-bottom: .3in;
}
Теперь вы избавились от лишних элементов и добавили метаинформацию в виде атрибутов - теперь вы можете довольно легко преобразовать ее из какой-то красивой структуры данных из JSON, XML или других форматов обмена в этот:
<div class = "play">
<div class = "character">Jeff</div>
<div direction = "Enthusiastic" class = "line">This sure is a nice website we've got now.</div>
<div class = "character">Joel</div>
<div direction = "Shaking his head" class = "line"> It certainly is. By the way, working at FogCreek rocks.</div>
<div class = "character">Jeff</div>
<div class = "line">Of course it does. Have you played Rock Band yet?
<br/>It's a lot of fun.</div>
</div>
authors are encouraged to mark up conversations using
pelements and punctuation. Authors who need to mark the speaker for styling purposes are encouraged to usespanorb. Paragraphs with their text wrapped in theielement can be used for marking up stage directions.
<article class=stage-script>
<h1>Water Cooler Talk at FogCreek</h1>
<p><b>Jeff</b> This sure is a nice website we've got now.
<p><b>Joel</b> It certainly is. By the way, working at FogCreek rocks.
<p><b>Jeff</b> Of course it does. Have you played Rock Band yet? It's a lot of fun.
<p><i>Joel and Jeff walk into the sunset</i>
</article>
.stage-script > p > b:first-child {
display: inline-block;
width: 5em;
}
.stage-script > p > b:first-child::after {
content: ':';
}
На самом деле это приводит к интересной идее - XML + XSLT. <speech><speaker>Jeff</speaker><text>Foo</text> </speech>. Хм. Следующая работа: приложение WYSIWYG для этого ... иначе я вижу, что творческий процесс несколько прерывается :)