Вложенные списки или как правильно влаживать список в список

Books

Недавно передо мной была поставлена задача сверстать небольшой документ в html. В данном документе было обычное «Условия пользование» с множеством пунктов и подпунктов.

Вид списка был примерно таков:

1. Первый заголовок
-1.1. Подпункт 1 
-1.2. Подпункт 2
--1.2.1. Подпункт 1 подпункта 2
--1.2.2. Подпункт 2 подпункта 2
-1.3. Подпункт 3
-1.4. Подпункт 4
2. Второй заголовок

Ленивый вариант №1

Можно было пойти простым путем и не замысловатым путем, а именно, просто в ручную прописать пункты в списке, получилось бы (Убрать маркер «•» можно через CSS используя list-style-type: none;):

<ul style="list-style-type: none;">
-<li>1. Первый заголовок</li>
--<li>1.1. Подпункт 1 </li>
--<li>1.2. Подпункт 2</li>
---<li>1.2.1. Подпункт 1 подпункта 2</li>
......
</ul>

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

Продвинутый вариант №2

Для реализации нам понадобится CSS (честно и сознательно скопированный со stackoverflow:

ol {
  list-style-type: none;
  counter-reset: item;
  margin: 0;
  padding: 0;
}

ol > li {
  display: table;
  counter-increment: item;
  margin-bottom: 0.6em;
}

ol > li:before {
  content: counters(item, ".") ". ";
  display: table-cell;
  padding-right: 0.6em;    
}

li ol > li {
  margin: 0;
}

li ol > li:before {
  content: counters(item, ".") " ";
}

Прикрепляю изображение того, что у нас должно получиться:

ol

Данный код позволяет реализовать тот функционал, к которому мы стремились в самом начале, а именно правильный и красивый вывод вложенных числовых списков. НО Что же делать, если вдруг у нас в нумерованных списках будут обычные, НЕ нумерованные?

-1.1. Подпункт 2
--1.1.1. Подпункт 1 подпункта 2
--1.1.2. Подпункт 2 подпункта 2
-1.2. Подпункт 3
-1.3. Подпункт 4
-- Не нумерованный пункт 1
-1.4. Подпункт 5

Код, приведенный выше не даст нам желаемого результата, так как он инкрементирует каждый новый, но нам ведь не нужен +1 в не нумерованном пункте. Для этих целей я дополню код CSS:

.tyre{
list-style: none;
}

.tyre li:before {
    content:  "—";
    position: relative;
    left:     -5px;
}

В итоге, мы получим результат к которому стремились:

<ol>
-<li> Первый заголовок
--<ol>
---<li>Подпункт 1.1</li>
---<li>Подпункт 1.2</li>
--</ol>
-</li>
-<li> Второй заголовок
--<ol>
---<li> Подпункт 2.1
----<ul class='tyre'>
-----<li>Не нумерованный пункт 1</li>
-----<li>Не нумерованный пункт 1</li>
----</ul>
---</li>
---<li>Подпункт 2.2</li>
---<li>Подпункт 2.3</li>
--</ol>
-</li>
.........
</ol>

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

comments powered by Disqus