Selettore figlio immediato in MENO


112

È comunque possibile fare in modo che LESS applichi il selettore figlio immediato (>) nel suo output?

Nel mio style.less, voglio scrivere qualcosa del tipo:

.panel {
    ...
    > .control {
        ...
    }
}

e fai in modo che LESS generi qualcosa come:

.panel > .control { ... }


15
In modo divertente, lo snippet della tua domanda era già la risposta giusta.
— trenta punti il

@thirtydot Certo, tranne per il fatto che non funziona ... non se non rimuovi lo spazio o aggiungi la "&". Sto usando less.js. Non posso dirlo con certezza per altri parser.
— Dave

2
Ho appena provato, e il codice originale dalla tua domanda lo fa lavorare in less.js. Guarda tu stesso: jsfiddle.net/thirtydot/vcE8t
— trentaduesimo

1
Sì, mi scuso, funziona come un fascino con lo spazio. +1 per te. Non so come non abbia funzionato per me ieri per ore ... altrimenti non avrei postato la domanda.
— Dave

Risposte:


144

AGGIORNARE

In realtà, il codice nella domanda originale funziona bene. Puoi semplicemente restare con il >selettore figlio.


Ho trovato la risposta.

.panel {
    ...
    >.control {
        ...
    }
}

Nota la mancanza di spazio tra ">" e ".", Altrimenti non funzionerà.


4
Non dubiterei che sia un bug se non funziona con uno spazio lì, a meno che non sia specificamente documentato.
— BoltClock

Questo sta solo ingannando il parser. Lo vede come un singolo selettore, quindi ottieni .panel >.control.
— Ricardo Tomasi

Lo considero una caratteristica piuttosto che un bug. È molto più coerente quando lo usi in questo modo rispetto alla "&". Penso che sia più chiaro il codice se usi solo "&" con pseudo-classi e non classi figlie.
— Dave

1
È una funzionalità di CSS, che accetta sia div > pe div>p. La coerenza userebbe sempre lo spazio tra i selettori (dai un'occhiata al CSS generato).
— Ricardo Tomasi

Certo, ma ero più preoccupato per la coerenza dell'uso di &.
— Dave

78

Il modo ufficiale:

.panel {
  & > .control {
    ...
  }
}

& si riferisce sempre al selettore corrente.

Vedi http://lesscss.org/features/#features-overview-feature-nested-rules


1
Penso che anche questo stia solo ingannando il parser (come hai sentito per l'altra risposta). Lasciatemi spiegare. Come hai detto, & si riferisce sempre al selettore (genitore) corrente. Quindi qualunque cosa sia dopo dovrebbe applicarsi al genitore. E questo è il ruolo delle pseudo-classi. Le classi figlio immediate sono più vicine alle classi figlio **** gasp **** piuttosto che alle pseudo-classi. Quindi usare solo> è più intuitivo e logico.
— Dave

6
Cosa pensi sia più corretto? div > po div >p? Il &combinatore è il modo canonico di farlo in MENO, non i miei sentimenti. La tua spiegazione è retorica. Alcune persone scrivono il loro CSS in una sola riga ...
— Ricardo Tomasi

La maggior parte delle persone usa MENO, quindi non devono preoccuparsi del CSS effettivo che viene generato. Ad ogni modo, risulta che lo spazio può essere utilizzato dopo>. Quindi & è puramente ridondante.
— Dave

13

La sintassi corretta sarebbe seguire mentre si utilizza "&" sarebbe ridondante qui.

.panel{
   > .control{
   }
}

Secondo meno linee guida , '&' viene utilizzato per parametrizzare gli antenati (ma qui non è necessario tale bisogno). In questo esempio meno , &: hover è essenziale over : hover altrimenti risulterebbe in un errore sintattico. Tuttavia, non esiste tale requisito sintattico per l'utilizzo di "&" qui. In caso contrario, tutti gli annidamenti richiederebbero "&" poiché si riferiscono essenzialmente al genitore.


1
@JJF nessuna domanda perché è una risposta?
— Bill Woodger

0

Nel caso in cui sia necessario indirizzare più selettori:

.parent {
    >.first-child,
    >.second-child,
    >.third-child {
    ...
    }
}

-1

Inoltre, se si prendono di mira il primo elemento figlio, come ad esempio il primo <td>di una <tr>, si potrebbe usare qualcosa di simile a questo:

tr {
    & > td:first-child {font-weight:bold;}
}

questo aiuta a ridurre le dichiarazioni di classe quando non sono necessarie.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.