Предотвратить ноль во вложенном упорядоченном списке при использовании счетчиков css

Я создаю вложенный упорядоченный список HTML (нумерованный). Я пытаюсь добиться того же макета, что и в MS Word, когда вы нажимаете Tab перед нумерованным элементом списка. Бывший:

1. Item at top
1.1.1.1. Item at middle
2. Item at bottom

На данный момент у меня есть следующий CSS, который устанавливает 1.0.0.1 для Item at middle. Есть ли способ исправить это с помощью CSS и без изменения HTML?

ol { counter-reset: itemCounter; padding-left: 0 }
ol li { list-style: none; }
ol li:not(:has(ol)):before {
    content: counters(itemCounter, ".") ". ";
    counter-increment: itemCounter;
}
<ol>
   <li>Item at top</li>
   <li>
      <ol>
         <li>
            <ol>
               <li>
                  <ol>
                     <li>Item at middle</li>
                  </ol>
               </li>
            </ol>
         </li>
      </ol>
   </li>
   <li>Item at bottom</li>
</ol>

Просто примечание: ваш код не работает в Firefox (вообще нет цифр), возможно, из-за :has?

Kaddath 11.04.2023 14:38

Похоже, что это неправильное место для этого: CSS, но мое мнение здесь равно 0. Я всегда сомневаюсь в использовании этих тегов, когда вы устанавливаете list-style: none; - почему бы не использовать настоящие теги, предназначенные для использования, и не нужно принудительно заполнять слева и т. д.

Mark Schultheiss 11.04.2023 14:41

@MarkSchultheiss эти теги имеют семантическое значение, а также некоторые функции доступности. Вы должны использовать их, но в большинстве случаев мы хотим, чтобы они отличались от поведения по умолчанию.

Temani Afif 11.04.2023 14:49

Часть проблемы заключается в том, что первая 1 второй строки уже должна быть 2, если вы действительно считали это на верхнем li уровне. (И 2 в следующей строке должен быть 3.) Но вы, очевидно, хотите подсчитать только первый и третий верхний уровень li и «опустить» второй (?).

CBroe 11.04.2023 14:49

@TemaniAfif Справедливое замечание о семантическом значении и на самом деле одна из моих проблем с использованием <i> Я вижу, что он используется / украден только потому, что он «короче», чем <span> (не является частью ЭТОГО вопроса, чтобы быть ясным)

Mark Schultheiss 11.04.2023 14:54

@MarkSchultheiss Я не использую настоящие теги, потому что дерево отличается от того, что HTML предполагает вложенными списками. Чтобы использовать настоящие теги, мне придется изменить html, чтобы Item at middle был внутри первого тега li.

Alexey Victorov 11.04.2023 14:55

@CBroe У меня есть теги 3ol во втором прямом li корня. Это означает, что я добавляю три раздела для счетчика. Первый элемент должен быть номером 1. Так что разделы root+3 должны быть 1.1.1.1

Alexey Victorov 11.04.2023 15:00

Это не меняет того факта, что у вас есть три li на верхнем уровне ol, которые обычно считаются как 1, 2, 3, но вы, очевидно, хотите, чтобы они «считались» как 1, 1, 2.

CBroe 11.04.2023 15:02

@CBroe хорошо, в эти дни мы видим много доказательств того, что номальный отличается 😊 Я имею в виду MS Word, который обеспечивает ожидаемое мной поведение за последние несколько десятилетий.

Alexey Victorov 11.04.2023 15:04

@AlexeyVictorov Я не думаю, что MS Word использует внутреннюю структуру, в которой второй элемент пропускается из подсчета, если у него есть содержимое, я бы поспорил, что на самом деле наоборот. Я думаю, CBroe предлагает вам использовать неправильную структуру для представления того, что вы хотите. Если вы введете новый дочерний элемент в элемент, он должен быть внутри, а не после, это просто логика и решит проблему совместимости использования not(:has(ol))

Kaddath 11.04.2023 15:12

@Kaddath Я полностью согласен. Предполагаемый способ отображения вложенных списков в HTML отличается от дерева, которое у меня есть. Я понимаю, что правильный путь будет - выравнивание дерева по стандарту HTML. Мне было интересно, можно ли добиться ожидаемой нумерации без изменения HTML, просто с помощью CSS

Alexey Victorov 11.04.2023 15:46
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
11
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

С этой модификацией вложенный элемент ol будет начинаться с «1» вместо «0», и нумерация продолжится оттуда.

ol {
  counter-reset: itemCounter;
  padding-left: 0;
}

ol li {
  list-style: none;
}

ol li:not(:has(ol)):before {
  content: counters(itemCounter, ".") ". ";
  counter-increment: itemCounter;
}

ol ol {
  counter-reset: itemCounter 1; /* initialize counter to 1 */
  padding-left: 1.5em;
}
<ol>
   <li>Item at top</li>
   <li>
      <ol>
         <li>
            <ol>
               <li>
                  <ol>
                     <li>Item at middle</li>
                  </ol>
               </li>
            </ol>
         </li>
      </ol>
   </li>
   <li>Item at bottom</li>
</ol>

Я думаю, вы неправильно поняли вопрос.. речь идет о числах для списка, а не о пробелах.

Kaddath 11.04.2023 14:41

@Kaddath, я отредактировал это. Дайте мне знать, если это правильно.

Selcuk xD 11.04.2023 14:44

Я позволю ОП быть судьей, ни один из текущих ответов не работает для Firefox, кстати, я не понизил голос

Kaddath 11.04.2023 14:48
Item at middle должно быть 1.1.1.1.
Alexey Victorov 11.04.2023 14:50

@Kaddath, если это правильное решение, я добавлю совместимость с Firefox.

Selcuk xD 11.04.2023 14:50
Ответ принят как подходящий

Кажется, это работает так, как вам нужно:

ol { counter-reset: itemCounter; padding-left: 0 }
ol li { list-style: none; }
ol li:not(:has(ol)):before {
    content: counters(itemCounter, ".") ". ";
    counter-increment: itemCounter;
}

ol>li:has(ol) {
  counter-increment: itemCounter 0;
}

ol>li ol li:has(ol) {
  counter-increment: itemCounter 1;
}
<ol>
   <li>Item at top</li>
   <li>
      <ol>
         <li>
            <ol>
               <li>
                  <ol>
                     <li>Item at middle</li>
                     <li>Item at middle</li>
                  </ol>
               </li>
            </ol>
         </li>
         <!-- a few li for testing 👇 -->
         <li>
            <ol>
               <li>
                  <ol>
                     <li>Item at middle</li>
                  </ol>
               </li>
               <li>
                  <ol>
                     <li>Item at middle</li>
                     <li>Item at middle</li>
                  </ol>
               </li>
            </ol>
         </li>
      </ol>
   </li>
   <li>Item at bottom</li>
</ol>

Другие вопросы по теме