Как вы можете настроить числа в упорядоченном списке?

Как выровнять числа в упорядоченном списке по левому краю?

1.  an item
// skip some items for brevity 
9.  another item
10. notice the 1 is under the 9, and the item contents also line up

Изменить символ после числа в упорядоченном списке?

1) an item

Также существует решение CSS для перехода от чисел к алфавитным / римским спискам вместо использования атрибута type в элементе ol.

Меня больше всего интересуют ответы, которые работают в Firefox 3.

Ответов (16)

Решение

Это решение, которое я работаю в Firefox 3, Opera и Google Chrome. Список по-прежнему отображается в IE7 (но без закрывающих скобок и чисел выравнивания по левому краю):

ol {
  counter-reset: item;
  margin-left: 0;
  padding-left: 0;
}
li {
  display: block;
  margin-bottom: .5em;
  margin-left: 2em;
}
li::before {
  display: inline-block;
  content: counter(item) ") ";
  counter-increment: item;
  width: 2em;
  margin-left: -2em;
}
<ol>
  <li>One</li>
  <li>Two</li>
  <li>Three</li>
  <li>Four</li>
  <li>Five</li>
  <li>Six</li>
  <li>Seven</li>
  <li>Eight</li>
  <li>Nine<br>Items</li>
  <li>Ten<br>Items</li>
</ol>

РЕДАКТИРОВАТЬ: Включено исправление нескольких строк от strager

Также существует решение CSS для перехода от чисел к алфавитным / римским спискам вместо использования атрибута type в элементе ol.

См. Свойство CSS типа list-style-type . Или при использовании счетчиков второй аргумент принимает значение типа списка. Например, в следующем примере будет использоваться верхний римский алфавит:

li::before {
  content: counter(item, upper-roman) ") ";
  counter-increment: item;
/* ... */

Существует атрибут Type, который позволяет вам изменить стиль нумерации, однако вы не можете изменить точку после цифры / буквы.

<ol type="a">
    <li>Turn left on Maple Street</li>
    <li>Turn right on Clover Court</li>
</ol>

Нет ... просто используйте DL:

dl { overflow:hidden; }
dt {
 float:left;
 clear: left;
 width:4em; /* adjust the width; make sure the total of both is 100% */
 text-align: right
}
dd {
 float:left;
 width:50%; /* adjust the width; make sure the total of both is 100% */
 margin: 0 0.5em;
}

Остальные ответы лучше с концептуальной точки зрения. Тем не менее, вы можете просто заполнить числа левой клавишей с соответствующим числом '& ensp;' чтобы они выстроились в линию.

* Примечание: сначала я не понял, что используется нумерованный список. Я думал, что список создается явно.

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

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

Я не знаю причин для этого, но предположим, что у вас есть веские причины.

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

Когда вы используете стандартную нумерацию «ol», у вас будет визуализированный контент, в котором текст «li» можно выбрать, но номер, предшествующий ему, не может быть выбран. То есть стандартная система нумерации кажется скорее «украшением», чем реальным содержанием. Если вы добавляете контент для чисел, используя, например, методы ": before", этот контент будет доступен для выбора, и из-за этого будут возникать нежелательные проблемы при вставке / вставке или проблемы с доступом к средствам чтения с экрана, которые будут читать этот "новый" контент дополнительно. к стандартной системе счисления.

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

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

Вы также можете указать свои собственные числа в HTML - например, если числа предоставляются базой данных:

ol {
  list-style: none;
}

ol>li:before {
  content: attr(seq) ". ";
}
<ol>
  <li seq="1">Item one</li>
  <li seq="20">Item twenty</li>
  <li seq="300">Item three hundred</li>
</ol>

seq Атрибут становится видимым с помощью метода , аналогичного приведенному в других ответах. Но вместо использования content: counter(foo) мы используем content: attr(seq) .

Демо в CodePen с большим количеством стилей

Этот код делает стиль нумерации таким же, как заголовки содержимого li.

<style>
    h4 {font-size: 18px}
    ol.list-h4 {counter-reset: item; padding-left:27px}
    ol.list-h4 > li {display: block}
    ol.list-h4 > li::before {display: block; position:absolute;  left:16px;  top:auto; content: counter(item)"."; counter-increment: item; font-size: 18px}
    ol.list-h4 > li > h4 {padding-top:3px}
</style>

<ol class="list-h4">
    <li>
        <h4>...</h4>
        <p>...</p> 
    </li>
    <li>...</li>
</ol>

HTML5: используйте valueатрибут (CSS не требуется)

Современные браузеры интерпретируют value атрибут и отображают его так, как вы ожидаете. См. Документацию MDN .

<ol>
  <li value="3">This is item three.</li>
  <li value="50">This is item fifty.</li>
  <li value="100">This is item one hundred.</li>
</ol>

Также ознакомьтесь со <ol>статьей о MDN , особенно с документацией по start атрибуту и.

Заимствовал и улучшил ответ Маркуса Даунинга . Протестировано и работает в Firefox 3 и Opera 9. Также поддерживает несколько строк.

ol {
    counter-reset: item;
    margin-left: 0;
    padding-left: 0;
}

li {
    display: block;
    margin-left: 3.5em;          /* Change with margin-left on li:before.  Must be -li:before::margin-left + li:before::padding-right.  (Causes indention for other lines.) */
}

li:before {
    content: counter(item) ")";  /* Change 'item' to 'item, upper-roman' or 'item, lower-roman' for upper- and lower-case roman, respectively. */
    counter-increment: item;
    display: inline-block;
    text-align: right;
    width: 3em;                  /* Must be the maximum width of your list's numbers, including the ')', for compatability (in case you use a fixed-width font, for example).  Will have to beef up if using roman. */
    padding-right: 0.5em;
    margin-left: -3.5em;         /* See li comments. */
}

CSS для стилей списков здесь , но в основном это:

li {
    list-style-type: decimal;
    list-style-position: inside;
}

Однако конкретный макет, который вам нужен, вероятно, может быть достигнут только путем вникания во внутренности макета с чем-то вроде этого (обратите внимание, что я на самом деле не пробовал его):

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

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

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

li:before {
  content: counter(item) ") ";
  counter-increment: item;
  display: marker;
  width: 2em;
}

Но вам придется поэкспериментировать, чтобы найти точное решение.

Числа выровняются лучше, если вы добавляете к числам ведущие нули, задав для list-style-type значение:

ol { list-style-type: decimal-leading-zero; }

Документы говорят о list-style-position : outside

В CSS1 не указано точное расположение поля маркера, и из соображений совместимости CSS2 остается столь же неоднозначным. Для более точного контроля ящиков маркеров используйте маркеры.

Далее на этой странице рассказывается о маркерах.

Один из примеров:

       LI:before { 
           display: marker;
           content: "(" counter(counter) ")";
           counter-increment: counter;
           width: 6em;
           text-align: center;
       }

У меня есть это. Попробуйте следующее:

<html>
<head>
<style type='text/css'>

    ol { counter-reset: item; }

    li { display: block; }

    li:before { content: counter(item) ")"; counter-increment: item; 
        display: inline-block; width: 50px; }

</style>
</head>
<body>
<ol>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
</ol>
</body>

Загвоздка в том, что это определенно не будет работать в старых или менее совместимых браузерах: display: inline-block это очень новое свойство.

Украл много этого из других ответов, но для меня это работает в FF3. Имеет upper-roman равномерный отступ, закрывающую скобку.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> new document </title>
<style type="text/css">
<!--
ol {
  counter-reset: item;
  margin-left: 0;
  padding-left: 0;
}
li {
  margin-bottom: .5em;
}
li:before {
  display: inline-block;
  content: counter(item, upper-roman) ")";
  counter-increment: item;
  width: 3em;
}
-->
</style>
</head>

<body>
<ol>
  <li>One</li>
  <li>Two</li>
  <li>Three</li>
  <li>Four</li>
  <li>Five</li>
  <li>Six</li>
  <li>Seven</li>
  <li>Eight</li>
  <li>Nine</li>
  <li>Ten</li>
</ol>
</body>
</html>

Быстрое и грязное альтернативное решение. Вы можете использовать символ табуляции вместе с предварительно отформатированным текстом. Вот возможность:

<style type="text/css">
ol {
    list-style-position: inside;
}
li:first-letter {
    white-space: pre;
}
</style>

и ваш html:

<ol>
<li>    an item</li>
<li>    another item</li>
...
</ol>

Обратите внимание, что пространство между li тегом и началом текста является символом табуляции (то, что вы получаете, когда нажимаете клавишу табуляции внутри блокнота).

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

<style type="text/css">
ol {
    list-style-position: inside;
}
</style>

<ol>
    <li><pre>   </pre>an item</li>
    <li><pre>   </pre>another item</li>
    ...
</ol>