Использование CSS "content" для стиля иерархического вложенного списка

я столкнулся с проблемой, используя свойство css "content", чтобы создать упорядоченный список, который был стилизован для отображения с помощью десятичных знаков для более глубоко вложенных элементов. То, что я пытаюсь сделать, кажется очевидной задачей, но я еще не преуспел, и я сталкиваюсь с некоторыми проблемами кросс-браузера, но я не могу найти много ковыряться в интернете... То, что я пытаюсь сделать, довольно четко прописано в образе, который я прикрепил в нижней части этого вопрос.

мой CSS:

ol {list-style:none; font:11px arial; margin:0px 0px 0px 10px; padding:0;}

ol li:before {
        content: counter(num) ". ";
        counter-increment: num;
        counter-reset: sub_num;
}

ol ol li:before {
        content: counter(num) "." counter(sub_num)  " ";
        counter-increment: sub_num; 
        counter-reset: sub_sub_num;
}
ol ol ol li:before {
        content: counter(num) "." counter(sub_num)  "." counter(sub_sub_num) " ";
        counter-increment: sub_sub_num; 
        counter-reset:none;
}

мой HTML:

<ol>
    <li>Level 1 - should be '1.'</li>
    <li>Level 1 - should be '2.'
      <ol>
        <li>Level 2 - Should be '2.1'</li>
        <li>Level 2 - Should be '2.2'
          <ol>
            <li>Level 3 - Should be '2.2.1'</li>

            <li>Level 3 - Should be '2.2.2'</li>
          </ol>
        </li>
      </ol>
    </li>
    <li>Level 1 - should be '3.'
      <ol>
        <li>Level 2 - Should be '3.1'</li>
      </ol>
    </li>
</ol>

Мои Результаты

к сожалению, css не увеличивает переменную 'num'

counter-increment: num;

в любом браузере, и Chrome не увеличивает "sub_sub_num"

counter-increment: sub_sub_num; 

Я немного озадачен, так как кажется, что все браузеры внутренне несовместимы с тем, как они обрабатывают стили (почему все браузеры игнорируют приращение num, но принимают приращение sub_num?) и это немного удивительно, что firefox и ie имеют одинаковое поведение, в то время как chrome, похоже, обрабатывает его особенно плохо (я привык к тому, что ie является нечетным человеком).

вот изображение с выходами моего образца для ff8, chrome16 и ie8, которое показывает выходы, которые я вижу, вместе со строкой агента пользователя:

Issues with the css content property

Я просто что-то упускаю, или это поняли вопроса? Есть ли хорошие реализации там?

2 ответов


есть удобная функция под названием counters() который обрабатывает все это автоматически для вас-просто передайте в num переменная и символ периода в качестве разделителя. Вам не нужно создавать или увеличивать какие-либо другие переменные.

вы также забыли сбросить num в вашем верхнем уровне ol элемент.

вот CSS, который вам нужен:

ol {
    list-style: none; 
    font: 11px arial; 
    margin: 0px 0px 0px 10px; 
    padding: 0;
    counter-reset: num;
}

ol li:before {
    content: counter(num) '. ';
    counter-increment: num;
}

ol ol li:before {
    content: counters(num, '.') ' ';
}

демо jsFiddle

если вы хотите понять, как использовать несколько счетчики с вложенными списками, ответ демонстрирует нечто более сложное. Идея состоит в том, чтобы сбросить счетчики в Родительском ol элементы и увеличить их в их соответствующих дочерних li:before псевдо-элементы; в вашем случае вы делаете оба в li:before псевдо-элементы, что не совсем правильно.

полезное чтение: W3C CSS2.1 сгенерированная спецификация контента, §12.4.1 вложенные счетчики и область


@BoltClock ваше решение работает хорошо, если и

  • теги не входят в a . ваш скрипт отсутствует, если вставить в (даже если css Div пуст), вы думаете о чем-то, чтобы исправить это : 1. пункт 1.1 пункт 1.2 пункт 3. пункт (а не 2, как ожидалось)