20 maggio 2026
5 proprietà CSS sottovalutate che migliorano subito UI e leggibilità
Numerazioni automatiche, testi “non selezionabili”, cifre allineate, colonne fluide e underline finalmente controllabili.
Cinque proprietà CSS poco usate ma estremamente pratiche: counters per numerazioni senza liste, user-select per evitare selezioni indesiderate, font-variant-numeric per allineare le cifre, multicolumn per impaginare testi in colonne responsive e text-decoration per underline personalizzate (spessore, offset, stile e colore). Con esempi pronti da copiare.
1) CSS Counters: numerazioni automatiche senza liste
Capita spesso di voler numerare blocchi “tipo lista” (step, tips, sezioni) senza trasformare il markup in una vera <ol>. I CSS counters risolvono bene quando la numerazione è solo visiva e vuoi evitare di aggiornare i numeri a mano (soprattutto se riordini i blocchi).
Pattern base
- Inizializzi il contatore sul contenitore.
- Incrementi il contatore su ogni item.
- Stampi il valore con un pseudo-elemento.
.tips {
counter-reset: tip; /* inizializza (e resetta) il contatore */
}
.tip {
counter-increment: tip;
}
.tip::before {
content: counter(tip);
margin-inline-end: .75rem;
font-weight: 700;
}
Prefissi, zeri e formattazione veloce
Puoi comporre stringhe in content:
.tip::before {
content: "0" counter(tip) ".";
}
Se vuoi riservare spazio stabile, valuta un layout (grid/flex) e una larghezza fissa per il “numero”. Spesso ch è utile perché esprime una misura legata alla larghezza del carattere.
Accessibilità: testo alternativo per content
Una chicca poco conosciuta: dentro content puoi fornire un testo alternativo dopo uno slash. Se la numerazione è puramente decorativa, puoi “svuotarla” per gli screen reader:
.tip::before {
content: counter(tip) / "";
}
Usalo con criterio: se il numero è informativo (es. “Step 1 di 5”), potrebbe essere meglio che venga letto.
2) user-select: none: evita selezioni indesiderate (senza abusarne)
user-select controlla se il testo può essere selezionato. Oggi i browser gestiscono meglio la selezione accidentale sui bottoni, ma ci sono ancora casi reali:
- elementi cliccabili con drag (slider custom, card trascinabili)
- badge, chip, UI “da cruscotto” dove trascinare/selezionare testo è solo rumore
.button,
.chip,
.draggable-handle {
user-select: none;
}
Nota pratica: non usarlo per “impedire di copiare” contenuti: è una pessima UX e non è una protezione reale. Usalo solo dove la selezione non ha senso e crea attrito.
3) font-variant-numeric: tabular-nums: numeri allineati senza monospace
In molti font proporzionali, le cifre hanno larghezze diverse (un “1” occupa meno di un “0”). In tabelle, listini, dashboard o KPI, questo peggiora la scansione visiva.
Con tabular-nums forzi cifre a larghezza uniforme senza cambiare font in monospace.
table {
font-variant-numeric: tabular-nums;
}
.kpi {
font-variant-numeric: tabular-nums;
}
Vantaggio: la regola impatta sostanzialmente solo le cifre, quindi puoi applicarla anche a contenitori ampi (tabelle intere, pannelli) senza stravolgere il testo.
4) Multicolumn: testo in colonne fluide con poche righe
Il layout multicolonna è perfetto per testo scorrevole (articoli, note, liste lunghe) quando vuoi un effetto “editoriale” senza costruire una grid manuale.
Colonne automatiche con columns
columns accetta due valori: conteggio e larghezza ideale.
.article {
columns: 3 18ch; /* max 3 colonne, larghezza ideale ~18ch */
gap: 2rem;
}
Questo approccio è molto comodo:
- il browser crea fino a 3 colonne
- rispetta una larghezza di colonna ragionevole
- al diminuire dello spazio, le colonne “spariscono” gradualmente
Se specifichi solo il numero di colonne (es.
column-count: 3;) rischi di “forzare” 3 colonne anche quando diventano troppo strette. Abbina sempre una dimensione (column-widtho la shorthandcolumns).
Evitare split brutti: break-inside: avoid
Con contenuti a “blocchi” (card, box, snippet) può succedere che un elemento venga spezzato tra colonne. In quei casi:
.card {
break-inside: avoid;
}
Su paragrafi lunghi invece può creare colonne sbilanciate: va valutato in base al contenuto.
Decorare la separazione: column-rule
Vuoi una linea tra le colonne senza hack?
.article {
column-rule: 2px solid color-mix(in oklab, currentColor 25%, transparent);
}
column-rule è la “riga” tra colonne: pulita e immediata.
5) text-decoration-*: underline finalmente sotto controllo
Molti si fermano a text-decoration: underline;. In realtà hai un set di proprietà che rendono i link molto più curati (e coerenti col design system).
Spessore: text-decoration-thickness
a {
text-decoration-thickness: .12em;
}
Distanza dal testo (solo underline): text-underline-offset
Questa proprietà lavora sulle sottolineature (non su overline/line-through):
a {
text-underline-offset: .2em;
}
Stile e colore
a {
text-decoration-style: wavy; /* solid | double | dotted | dashed | wavy */
text-decoration-color: color-mix(in oklab, currentColor 65%, transparent);
}
Puoi usare transizioni soprattutto sul colore (è comodo per hover):
a {
transition: text-decoration-color 160ms ease;
}
a:hover {
text-decoration-color: currentColor;
}
In sintesi
- Counters: numerazioni automatiche e riordinabili, perfette per “liste visive”.
- user-select: elimina selezioni accidentali su UI interattive.
- tabular-nums: cifre allineate e leggibili in tabelle e KPI.
- Multicolumn: impaginazione editoriale con colonne fluide,
gap,column-rulee controllo degli split. - text-decoration: underline su misura (spessore, offset, stile, colore) per link più rifiniti.
Se vuoi, posso proporti uno snippet completo (HTML+CSS) che combina counters + grid per un layout “tips list” con numerazione allineata e accessibilità curata.