Впорядкований HTML-список 1.1, 1.2 (вкладені лічильники та область дії) не працює


87

Я використовую вкладені лічильники та область для створення упорядкованого списку:

ol {
    counter-reset: item;
    padding-left: 10px;
}
li {
    display: block
}
li:before {
    content: counters(item, ".") " ";
    counter-increment: item
}
<ol>
    <li>one</li>
    <li>two</li>
    <ol>
        <li>two.one</li>
        <li>two.two</li>
        <li>two.three</li>
    </ol>
    <li>three</li>
    <ol>
        <li>three.one</li>
        <li>three.two</li>
        <ol>
            <li>three.two.one</li>
            <li>three.two.two</li>
        </ol>
    </ol>
    <li>four</li>
</ol>

Я очікую наступного результату:

1. one
2. two
  2.1. two.one
  2.2. two.two
  2.3. two.three
3. three
  3.1 three.one
  3.2 three.two
    3.2.1 three.two.one
    3.2.2 three.two.two
4. four

Натомість ось що я бачу (неправильна нумерація) :

1. one
2. two
  2.1. two.one
  2.2. two.two
  2.3. two.three
2.4 three <!-- this is where it goes wrong, when going back to the parent -->
  2.1 three.one
  2.2 three.two
    2.2.1 three.two.one
    2.2.2 three.two.two
2.3 four

Я не маю уявлення, хтось бачить, де це йде не так?

Ось JSFiddle: http://jsfiddle.net/qGCUk/2/

Відповіді:


102

Зніміть прапорець біля пункту "нормалізувати CSS" - http://jsfiddle.net/qGCUk/3/ Скидання CSS, яке використовується за замовчуванням, для всіх полів списку та відступів до 0

ОНОВИТИ http://jsfiddle.net/qGCUk/4/ - ви повинні включити свої під-списки у свій основний<li>

ol {
  counter-reset: item
}
li {
  display: block
}
li:before {
  content: counters(item, ".") " ";
  counter-increment: item
}
<ol>
  <li>one</li>
  <li>two
    <ol>
      <li>two.one</li>
      <li>two.two</li>
      <li>two.three</li>
    </ol>
  </li>
  <li>three
    <ol>
      <li>three.one</li>
      <li>three.two
        <ol>
          <li>three.two.one</li>
          <li>three.two.two</li>
        </ol>
      </li>
    </ol>
  </li>
  <li>four</li>
</ol>


3
Як зробити так, щоб його індекс супроводжувався крапками - як 1.> 1.1. 1.2. 1.3.і так далі?
URL87

2
Тільки не забудьте виправити селектори css, щоб це не впливало на такі речі, як списки навігації.
Окомікеруко

@Okomikeruko Що означає "виправити селектори css"? Оскільки я стикаюся саме з проблемою, на яку ви згадали - цей фокус не лише впливає на нумерований список, для якого я хочу його використовувати, але й на інші списки в моєму HTML. : - \ Неважливо: відповідь Моше Сімантова це виправляє. :)
antred

1
Атрибути елемента @antred люблять idі classдозволяють вам визначити css, специфічний для цих елементів, за допомогою селекторів. Якщо ви використовуєте ковдру li, ul, і olт.д., то CSS впливає на всі його екземпляри. Але якщо ви встановите для свого елемента значення <ol class="cleared">та для вашого селектора css ol.cleared, тоді ви не будете впливати на інші olелементи без потреби.
Окомікеруко

64

Використовуйте цей стиль, щоб змінити лише вкладені списки:

ol {
    counter-reset: item;
}

ol > li {
    counter-increment: item;
}

ol ol > li {
    display: block;
}

ol ol > li:before {
    content: counters(item, ".") ". ";
    margin-left: -20px;
}

2
Чудово! Працював нестандартно для мене! Тода.
yO_

3
Це найкраща відповідь, оскільки він також має перший рівень із крапкою та вставкою вмісту.
Мартін Екклбен

якщо я додаю font-weight: boldдо ol ol > li:beforeвкладеного списку, лічильники є, boldале це не робить лічильники списку першого рівня bold?
Сушміт Сагар

14

Перевір це :

http://jsfiddle.net/PTbGc/

Здається, вашу проблему вирішено.


Що з’являється у мене (під Chrome і Mac OS X)

1. one
2. two
  2.1. two.one
  2.2. two.two
  2.3. two.three
3. three
  3.1 three.one
  3.2 three.two
    3.2.1 three.two.one
    3.2.2 three.two.two
4. four

Як я це зробив


Замість :

<li>Item 1</li>
<li>Item 2</li>
   <ol>
        <li>Subitem 1</li>
        <li>Subitem 2</li>
   </ol>

Зробіть:

<li>Item 1</li>
<li>Item 2
   <ol>
        <li>Subitem 1</li>
        <li>Subitem 2</li>
   </ol>
</li>

7

Це чудове рішення! За допомогою кількох додаткових правил CSS ви можете відформатувати його так само, як список контурів MS Word із висячим відступом першого рядка:

OL { 
  counter-reset: item; 
}
LI { 
  display: block; 
}
LI:before { 
  content: counters(item, ".") "."; 
  counter-increment: item; 
  padding-right:10px; 
  margin-left:-20px;
}

2
Проблема такого підходу полягає в тому, що ви не можете скопіювати номери списку. Тож якщо ви скопіюєте величезний список, він буде без чисел
Рохіт,

1

Нещодавно я зіткнувся з подібною проблемою. Виправлення полягає у встановленні властивості відображення елементів li у впорядкованому списку на елемент списку, а не на відображення блоку, і переконатися, що властивість відображення ol не є елементом списку. тобто

li { display: list-item;}

Завдяки цьому синтаксичний аналізатор html розглядає весь li як елемент списку і присвоює йому відповідне значення, а ol - як вбудований блок або елемент блоку на основі ваших налаштувань, і не намагається присвоїти будь-яке значення підрахунку це.


Це продублює нумерацію.
TylerH

0

Рішення Моше - чудове, але проблема все одно може існувати, якщо вам потрібно помістити список всередину div. (читати: CSS-скидання лічильника вкладеного списку )

Цей стиль може запобігти цій проблемі:

ol > li {
    counter-increment: item;
}

ol > li:first-child {
  counter-reset: item;
}

ol ol > li {
    display: block;
}

ol ol > li:before {
    content: counters(item, ".") ". ";
    margin-left: -20px;
}
<ol>
  <li>list not nested in div</li>
</ol>

<hr>

<div>
  <ol>
  <li>nested in div</li>
  <li>two
    <ol>
      <li>two.one</li>
      <li>two.two</li>
      <li>two.three</li>
    </ol>
  </li>
  <li>three
    <ol>
      <li>three.one</li>
      <li>three.two
        <ol>
          <li>three.two.one</li>
          <li>three.two.two</li>
        </ol>
      </li>
    </ol>
  </li>
  <li>four</li>
  </ol>
</div>

Ви також можете ввімкнути скидання лічильника li:before.


що робити, якщо я не хочу завершення .у вкладеному списку, а лише кореневий список?
Сушміт Сагар

0

Переглянувши інші відповіді, я придумав це, просто застосуйте клас nested-counter-listдо кореневого olтегу:

код sass:

ol.nested-counter-list {
  counter-reset: item;

  li {
    display: block;

    &::before {
      content: counters(item, ".") ". ";
      counter-increment: item;
      font-weight: bold;
    }
  }

  ol {
    counter-reset: item;

    & > li {
      display: block;

      &::before {
        content: counters(item, ".") " ";
        counter-increment: item;
        font-weight: bold;
      }
    }
  }
}

css-код :

ol.nested-counter-list {
  counter-reset: item;
}
ol.nested-counter-list li {
  display: block;
}
ol.nested-counter-list li::before {
  content: counters(item, ".") ". ";
  counter-increment: item;
  font-weight: bold;
}
ol.nested-counter-list ol {
  counter-reset: item;
}
ol.nested-counter-list ol > li {
  display: block;
}
ol.nested-counter-list ol > li::before {
  content: counters(item, ".") " ";
  counter-increment: item;
  font-weight: bold;
}

ol.nested-counter-list {
  counter-reset: item;
}

ol.nested-counter-list li {
  display: block;
}

ol.nested-counter-list li::before {
  content: counters(item, ".") ". ";
  counter-increment: item;
  font-weight: bold;
}

ol.nested-counter-list ol {
  counter-reset: item;
}

ol.nested-counter-list ol>li {
  display: block;
}

ol.nested-counter-list ol>li::before {
  content: counters(item, ".") " ";
  counter-increment: item;
  font-weight: bold;
}
<ol class="nested-counter-list">
  <li>one</li>
  <li>two
    <ol>
      <li>two.one</li>
      <li>two.two</li>
      <li>two.three</li>
    </ol>
  </li>
  <li>three
    <ol>
      <li>three.one</li>
      <li>three.two
        <ol>
          <li>three.two.one</li>
          <li>three.two.two</li>
        </ol>
      </li>
    </ol>
  </li>
  <li>four</li>
</ol>

І якщо вам потрібно відстеження .в кінці лічильників вкладеного списку, використовуйте це:

ol.nested-counter-list {
  counter-reset: item;
}

ol.nested-counter-list li {
  display: block;
}

ol.nested-counter-list li::before {
  content: counters(item, ".") ". ";
  counter-increment: item;
  font-weight: bold;
}

ol.nested-counter-list ol {
  counter-reset: item;
}
<ol class="nested-counter-list">
  <li>one</li>
  <li>two
    <ol>
      <li>two.one</li>
      <li>two.two</li>
      <li>two.three</li>
    </ol>
  </li>
  <li>three
    <ol>
      <li>three.one</li>
      <li>three.two
        <ol>
          <li>three.two.one</li>
          <li>three.two.two</li>
        </ol>
      </li>
    </ol>
  </li>
  <li>four</li>
</ol>


0

Не ускладнювати!

Простіше і стандартне рішення для збільшення числа та збереження крапки в кінці. Навіть якщо ви правильно зробите css, це не спрацює, якщо ваш HTML неправильний. Дивіться нижче.

CSS

ol {
  counter-reset: item;
}
ol li {
  display: block;
}
ol li:before {
  content: counters(item, ". ") ". ";
  counter-increment: item;
}

SASS

ol {
    counter-reset: item;
    li {
        display: block;
        &:before {
            content: counters(item, ". ") ". ";
            counter-increment: item
        }
    }
}

Батьківська дитина HTML

Якщо ви додаєте дитину, переконайтеся, що вона знаходиться під батьком li.

<!-- WRONG -->
<ol>
    <li>Parent 1</li> <!-- Parent is Individual. Not hugging -->
        <ol> 
            <li>Child</li>
        </ol>
    <li>Parent 2</li>
</ol>

<!-- RIGHT -->
<ol>
    <li>Parent 1 
        <ol> 
            <li>Child</li>
        </ol>
    </li> <!-- Parent is Hugging the child -->
    <li>Parent 2</li>
</ol>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.