Un elenco ordinato può produrre risultati simili a 1.1, 1.2, 1.3 (anziché solo 1, 2, 3, ...) con CSS? Finora, l'utilizzo list-style-type:decimal
ha prodotto solo 1, 2, 3, non 1.1, 1.2., 1.3.
Un elenco ordinato può produrre risultati simili a 1.1, 1.2, 1.3 (anziché solo 1, 2, 3, ...) con CSS? Finora, l'utilizzo list-style-type:decimal
ha prodotto solo 1, 2, 3, non 1.1, 1.2., 1.3.
Risposte:
Puoi usare i contatori per farlo:
Il seguente foglio di stile numera gli elementi dell'elenco nidificati come "1", "1.1", "1.1.1", ecc.
OL { counter-reset: item } LI { display: block } LI:before { content: counters(item, ".") " "; counter-increment: item }
Esempio
ol { counter-reset: item }
li{ display: block }
li:before { content: counters(item, ".") " "; counter-increment: item }
<ol>
<li>li element
<ol>
<li>sub li element</li>
<li>sub li element</li>
<li>sub li element</li>
</ol>
</li>
<li>li element</li>
<li>li element
<ol>
<li>sub li element</li>
<li>sub li element</li>
<li>sub li element</li>
</ol>
</li>
</ol>
Vedere Contatori e ambito nidificati per ulteriori informazioni.
li:before
: content: counters(item, ".")". ";
Nessuna delle soluzioni in questa pagina funziona correttamente e universalmente per tutti i livelli e paragrafi lunghi (a capo). È davvero difficile ottenere un rientro coerente a causa delle dimensioni variabili del marker (1., 1.2, 1.10, 1.10.5, ...); non può essere solo "simulato", nemmeno con un margine / riempimento precompilato per ogni possibile livello di rientro.
Alla fine ho capito una soluzione che funziona davvero e non ha bisogno di JavaScript.
È testato su Firefox 32, Chromium 37, IE 9 e Android Browser. Non funziona su IE 7 e precedenti.
CSS:
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, ".") " ";
}
La risposta scelta è un ottimo inizio, ma essenzialmente forza lo list-style-position: inside;
stile sugli elementi dell'elenco, rendendo difficile leggere il testo a capo. Ecco una semplice soluzione che dà anche il controllo del margine tra il numero e il testo e allinea il numero a destra secondo il comportamento predefinito.
ol {
counter-reset: item;
}
ol li {
display: block;
position: relative;
}
ol li:before {
content: counters(item, ".")".";
counter-increment: item;
position: absolute;
margin-right: 100%;
right: 10px; /* space between number and text */
}
JSFiddle: http://jsfiddle.net/3J4Bu/
ol
comportamento predefinito . Può essere facilmente rimosso cancellando l'ultimo "."
dalla content
proprietà, ma questo mi sembra un po 'strano.
Le soluzioni pubblicate qui non hanno funzionato bene per me, quindi ho fatto una combinazione di quelle di questa domanda e la seguente domanda: È possibile creare un elenco ordinato a più livelli in HTML?
/* Numbered lists like 1, 1.1, 2.2.1... */
ol li {display:block;} /* hide original list counter */
ol > li:first-child {counter-reset: item;} /* reset counter */
ol > li {counter-increment: item; position: relative;} /* increment counter */
ol > li:before {content:counters(item, ".") ". "; position: absolute; margin-right: 100%; right: 10px;} /* print counter */
Risultato:
Nota: lo screenshot, se desideri vedere il codice sorgente o qualsiasi altra cosa provenga da questo post: http://estiloasertivo.blogspot.com.es/2014/08/introduccion-running-lean-y-lean.html
Nota: utilizzare CSS per creare la numerazione nidificata in un browser moderno. Vedi la risposta accettata Quanto segue è solo per interesse storico.counters
Se il browser supporta content
e counter
,
.foo {
counter-reset: foo;
}
.foo li {
list-style-type: none;
}
.foo li::before {
counter-increment: foo;
content: "1." counter(foo) " ";
}
<ol class="foo">
<li>uno</li>
<li>dos</li>
<li>tres</li>
<li>cuatro</li>
</ol>
.foo > ol > li
.
counters()
funzione come negli esempi precedenti anziché la counter()
funzione.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="author" content="Sandro Alvares - KingRider">
</head>
<body>
<style type="text/css">
li.title {
font-size: 20px;
font-weight: lighter;
padding: 15px;
counter-increment: ordem;
}
.foo {
counter-reset: foo;
padding-left: 15px;
}
.foo li {
list-style-type: none;
}
.foo li:before {
counter-increment: foo;
content: counter(ordem) "." counter(foo) " ";
}
</style>
<ol>
<li class="title">TITLE ONE</li>
<ol class="foo">
<li>text 1 one</li>
<li>text 1 two</li>
<li>text 1 three</li>
<li>text 1 four</li>
</ol>
<li class="title">TITLE TWO</li>
<ol class="foo">
<li>text 2 one</li>
<li>text 2 two</li>
<li>text 2 three</li>
<li>text 2 four</li>
</ol>
<li class="title">TITLE THREE</li>
<ol class="foo">
<li>text 3 one</li>
<li>text 3 two</li>
<li>text 3 three</li>
<li>text 3 four</li>
</ol>
</ol>
</body>
</html>
Risultato: http://i.stack.imgur.com/78bN8.jpg
Ho qualche problema quando ci sono due liste e la seconda è dentro DIV La seconda lista dovrebbe iniziare da 1. non 2.1
<ol>
<li>lorem</li>
<li>lorem ipsum</li>
</ol>
<div>
<ol>
<li>lorem (should be 1.)</li>
<li>lorem ipsum ( should be 2.)</li>
</ol>
</div>
http://jsfiddle.net/3J4Bu/364/
EDIT: ho risolto il problema con questo http://jsfiddle.net/hy5f6161/
Nel prossimo futuro potresti essere in grado di utilizzare l' ::marker
elemento psuedo per ottenere lo stesso risultato di altre soluzioni in una sola riga di codice.
Ricorda di controllare la tabella di compatibilità del browser poiché questa è ancora una tecnologia sperimentale. Al momento di scrivere solo Firefox e Firefox per Android, a partire dalla versione 68, supportano questo.
Ecco uno snippet che verrà visualizzato correttamente se provato in un browser compatibile:
::marker { content: counters(list-item,'.') ':' }
li { padding-left: 0.5em }
<ol>
<li>li element
<ol>
<li>sub li element</li>
<li>sub li element</li>
<li>sub li element</li>
</ol>
</li>
<li>li element</li>
<li>li element
<ol>
<li>sub li element</li>
<li>sub li element</li>
<li>sub li element</li>
</ol>
</li>
</ol>
Potresti anche voler dare un'occhiata a questo fantastico articolo distruggendo il tema sull'argomento.
Avevo bisogno di aggiungere questo alla soluzione pubblicata in 12 mentre stavo usando un elenco con una combinazione di componenti elenco ordinato e elenchi non ordinati. contenuto: no-close-quote sembra una cosa strana da aggiungere, lo so, ma funziona ...
ol ul li:before {
content: no-close-quote;
counter-increment: none;
display: list-item;
margin-right: 100%;
position: absolute;
right: 10px;
}
Per me ha funzionato:
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, ".") ") ";
}
Guarda: http://jsfiddle.net/rLebz84u/2/
o questo http://jsfiddle.net/rLebz84u/3/ con altro testo giustificato
questo è il codice corretto se si desidera ridimensionare il primo figlio di altri CSS.
<style>
li.title {
font-size: 20px;
counter-increment: ordem;
color:#0080B0;
}
.my_ol_class {
counter-reset: my_ol_class;
padding-left: 30px !important;
}
.my_ol_class li {
display: block;
position: relative;
}
.my_ol_class li:before {
counter-increment: my_ol_class;
content: counter(ordem) "." counter(my_ol_class) " ";
position: absolute;
margin-right: 100%;
right: 10px; /* space between number and text */
}
li.title ol li{
font-size: 15px;
color:#5E5E5E;
}
</style>
nel file html.
<ol>
<li class="title"> <p class="page-header list_title">Acceptance of Terms. </p>
<ol class="my_ol_class">
<li>
<p>
my text 1.
</p>
</li>
<li>
<p>
my text 2.
</p>
</li>
</ol>
</li>
</ol>