Как лучше всего обрабатывать стили для вложенных h1 в html5? - PullRequest
11 голосов
/ 03 декабря 2010

В настоящее время я работаю над некоторыми темами HTML5 для нескольких своих веб-сайтов и продолжаю сталкиваться с проблемами, связанными с тем, как <h1> можно использовать несколько раз.Кажется, я не могу предсказать, в каких элементах будут отображаться заголовки, но я хочу попытаться автоматически определить их размер в зависимости от их положения в DOM ...

Я думал об использовании чего-то вроде

h1 { font-size: 3em; }
h2,
body > * > header h1 { font-size: 2.5em; }
h3,
body > * > header h2,
body > * > * > header h1 { font-size: 2em; }

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

<section>
  <ul>
    <li>
      <header>
        <h1>Title of a block</h1>
      </header>
      content
    </li>
 </ul>
</section>

, что делает <h1> гораздо более глубоким, чем на самом деле.Каковы хорошие способы справиться с этим?

Ответы [ 7 ]

12 голосов
/ 25 января 2011

Вы должны стилизовать h1 в зависимости от типа элементов, в которых они находятся, а не только от глубины.

Например, если у вас есть общие заголовки, заголовки статей и заголовки элементов боковой панели, вы можетесделать это:

h1 { font-size: 3em }
h2 { font-size: 2.5em }
article h1 { font-size: 2em }
article h2 { font-size: 1.5em }
aside h1 { font-size: 2.5em }

Вы бы использовали любой селектор, который вы используете, чтобы выбрать статьи или боковую панель для макета (в моем примере, теги article и aside, это может быть section.sidebar или что-то ещеиначе) для различения различных тегов h1.

Между глубиной тега и размером не существует большой связи (хотя, кажется, существует шаблон; глубже - меньше).Однако существует связь между соглашением, используемым для разметки боковой панели, и размером заголовков на боковой панели.Селекторы CSS для заголовков будут совпадать с селекторами для макета, который показывает соединение.

6 голосов
/ 03 декабря 2010

Во-первых, я немного не уверен, зачем вам нужен

section -> ul -> li -> header -> h1

Почему бы просто

section -> header -> h1

Это кажется интересным способом настройки ваших стилей, но такжесбивает с толку и, возможно, не нужно.Я имею в виду, что HTML не означает конец класса и идентификатор, почему бы не использовать:

body section.class{}
body section.class header h1{}

<section class="class">
 <header>
  <h1>Title</h1>
 </header>
 <content>
  <p>Content</p>
 </content>
 <footer>
  footer
 </footer>
</section>
5 голосов
/ 25 января 2011

Это не поможет вам в практическом смысле в ближайшем будущем, но есть предложение для CSS, чтобы сделать подобные вещи немного чище, селектор any . Общее правило для заголовка второго уровня исходит из этого:

section section h1, section article h1, section aside h1, section nav h1,
article section h1, article article h1, article aside h1, article nav h1,
aside section h1, aside article h1, aside aside h1, aside nav h1,
nav section h1, nav article h1, nav aside h1, nav nav h1, {
  font-size: 20px;
}

К этому:

any(section, article, aside, nav)
any(section, article, aside, nav) h1 {
  font-size: 20px;
}
3 голосов
/ 03 декабря 2010

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

Вам нужно проработать в ваших таблицах стилей места, которые влияют на разрешенный уровень h1 в механизме выделения. Это элементы секционирования (article, aside, nav и section) и корневые элементы секционирования (blockquote, body, details, fieldset, figure и td)

Другие элементы не влияют на уровень h1, поэтому их можно игнорировать, но они могут быть оболочками, такими как ul и li в вашем примере, поэтому ваши селекторы css должны использовать дочерние, а не дочерние отношения.

Тем не менее, без создания таблицы стилей специально для вашей структуры страницы, правила css очень быстро выводят из-под контроля.

Вы хотите что-то вроде:

body h1 { font-size: 3em; }
body section h1 { font-size: 2.5em; }
body article h1 { font-size: 2.5em; }
body nav h1 { font-size: 2.5em; }
body aside h1 { font-size: 2.5em; }
body section section h1 { font-size: 2em; }
body section article h1 { font-size: 2em; }
body section nav h1 { font-size: 2em; }
body section aside h1 { font-size: 2em; }
body article section h1 { font-size: 2em; }
body article article h1 { font-size: 2em; }
  ...
  ...
  ...

И так далее. Повторите эти действия для каждого корня секционирования и для каждого из h1-h6, и вы получите массивный файл CSS.

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

2 голосов
/ 30 марта 2014

Во-первых, согласно правильному использованию, вложенные h1 должны обрабатываться точно в соответствии с их значением вложенности (включая article, aside, nav, section, но не любые другие элементы). Это правильное поведение. H1, вложенный в элемент section, должен быть визуально таким же, как h2, а h1, вложенный в два элемента section, должен визуально быть таким же, как h3 ... Короче говоря, есть альтернативная разметка, плавающая вокруг, которая почти не -он использует, но на самом деле более семантически непротиворечивый, то есть использует только h1 когда-либо и позволяет определять уровень заголовка по схеме документа.

авторам настоятельно рекомендуется использовать только элементы h1 или используйте элементы соответствующего ранга для уровня вложенности раздела. согласно Разделу 4.3.11 WHATWG

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

Что касается реализации:

Для браузеров webkit (chrome и safari) и firefox вы можете использовать псевдоселекторы css "-moz-any" и "-webkit-any". Фактически, вот как стандартные таблицы стилей в Firefox и Chrome стилизуют эти элементы в соответствии с уже существующими стандартами:

Например, на уровне 3 заголовки в Firefox по умолчанию css:

h3, *:-moz-any(article, aside, nav, section) *:-moz-any(article, aside, nav, section) h1 {
    display: block;
    font-size: 1.17em;
    font-weight: bold;
    margin: 1em 0;
}

Это значительно упрощает ответ, правильно предложенный Алохчи.

Проблема, конечно, в IE не работает. Одним из вариантов является использование препроцессора CSS, такого как SASS. Я написал следующий фрагмент в SASS, который я использую для разметки заголовка и который используется для эффективной нормализации в браузерах представления вложенных элементов h1. (Если вы не хотите активно использовать препроцессор CSS, вы можете использовать его один раз, чтобы сгенерировать исходный шаблон для этих значений, а затем изменить значения по мере необходимости - это, по крайней мере, сэкономит вам кучу текста и устранить возможные ошибки в процессе):

@function bb_permute_lists($left_list, $right_list) {
    $permuted_list: ();

    @each $left_item in $left_list {
        @each $right_item in $right_list {
            $permuted_list: append($permuted_list, $left_item $right_item, comma);
        }
    }

    @return $permuted_list;
}

@function bb_html5_header_markup($level) {
  @if (1 == $level) {
    @return h1;
  }

  $header_containers: article, aside, nav, section;
  $header_markup: $header_containers;
  @for $i from 2 to $level {
    $header_markup: bb_permute_lists($header_containers, $header_markup);
  }
  $header_markup: bb_permute_lists($header_markup, h1);

  @return append(h#{$level}, $header_markup, comma);
}

Эту функцию можно использовать следующим образом:

#{bb_html5_header_markup(1)} { 
  font-size: 2em;
    margin: .67em 0;
}

#{bb_html5_header_markup(2)} { 
    font-size: 1.5em;
    margin: .83em 0;
}

Желаем удачи в реализации этого предупреждающего стандарта. Существует много документации об этом альтернативном и более семантическом использовании h1, но, основываясь на том факте, что я не смог найти никого другого с фрагментом кода, который бы помог мне в его реализации, я думаю, что он довольно редко используется (возможно, потому что люди работают с большим количеством смешанного контента, тогда как я начинаю с нуля).

2 голосов
/ 25 января 2011

HTML5 должен упростить кодирование, а IMO - это далеко не заголовок и заголовок. Они оба являются заголовочными тегами , так что спам по всем страницам просто лишний.

Страница должна иметь только 1 <h1> тег , чтобы показать, чтовся страница посвящена, каждому разделу не нужен тег h1, как я сказал выше

Независимо от того, что проще всего было бы использовать классы и идентификаторы, как в прошлом.

<section class="widget">
  <ul>
    <li>
      <header>
        <h1>Title of a block</h1>
      </header>
      content
    </li>
 </ul>
</section>

Затем вы можете удалить все дополнительные селекторы, и они могут быть более общими.

section.widget h1 { }
section.something h1 { }
2 голосов
/ 21 января 2011

Еще одна вещь, которую вы могли бы сделать, это использовать id в теге <h1>.Например, ваш HTML будет выглядеть следующим образом:

<h1 id="page-title">My Blog</h1>

А затем в вашем CSS вы можете использовать:

h1#page-title { font-size:2.5em; color:#f00; [etc] }

Обновление: Мне только что упомянули, что это может быть неактуальная информация, так что вот мои два бита: так что вложенный <h1> не разрабатывает правильно?Вот как я бы это исправил, сделав его уникальным идентификатором, а не указав его для каждого вложенного тега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...