Sto provando a raccogliere e comprendere il ragionamento dietro le convenzioni di denominazione CSS come BEM o SUITCss. Sto avendo difficoltà a capire il valore dei nomi di classi discendenti in presenza di SCSS.Qual è il punto della denominazione della classe discendente esplicita di BEM in presenza di SCSS?
Ad esempio:
<ul class="menu">
<li class="menu__item"></li>
<li class="menu__item"></li>
<li class="menu__item">
<a href="#" class="menu__item_link">link</a>
</li>
</ul>
.menu {
.menu__item {
//styles
.menu__item__link { //styles }
}
//or alternatively this syntax..
&__item { //styles }
}
Con la possibilità di regole nido in SCSS, non vedo i motivi validi per me per includere i nomi delle classi antenato nel mio codice. Sopra ho definito gli stili che dovrebbero essere usati solo per un "oggetto" che si trova all'interno di un "menu", usando nomi di classi discendenti. Tuttavia, la struttura annidata già comunica questo! Le regole per menu__item si applicano solo a un elemento in un menu comunque, quindi perché è necessario includerlo nel nome della classe?
Perché non:
<ul class="menu">
<li class="item"></li>
</ul>
.menu {
.item {//styles}
}
Capisco che la convenzione di denominazione discendente è più esplicito e forse più futuro amichevole. Io sostengo, tuttavia, che è solo più esplicito nell'html. Se volessi consultare come compilare questo modulo "menu", potrei semplicemente consultare il CSS e vedere chiaramente come all'interno di un menu sono presenti elementi.
immagino una possibile vantaggio è che ho potuto scrivere il mio css non-nested, in questo modo:
.menu { //styles }
.menu__item { //styles }
.menu__item__link { //styles }
e quindi utilizzare un "menu__item" ovunque e sarebbe ancora essere esplicita nel nome della classe che questo era lo stile di un oggetto sotto un menu ... ma perché allora definirlo come un discendente di un menu? (Un altro vantaggio, suppongo, è stringhe di identificatori CSS più brevi se le cose non sono nidificate)
Mi sembra che se un nome di classe deve essere usato come discendente sotto un altro, allora l'annidamento in SCSS ottiene questo e presenta quella logica chiaramente. Perché questa sintassi BEM sarebbe necessaria allora?
Mi piacerebbe sentire qualcuno spiegare il ragionamento di questo tipo di convenzione. Voglio aderire alle cosiddette migliori pratiche, ma è difficile per me farlo in modo cieco senza dover comprendere una convenzione.
La convenzione di denominazione non ha alcun effetto sulle prestazioni a meno che non definisca i discendenti al di fuori del suo antenato, come nel mio ultimo esempio. Credo di capire l'argomento secondo cui qualcosa come BEM ti permette di "vedere a prima vista ciò che una classe fa/il suo contesto". Credo che la mia tesi sia che, con l'annidamento in SCSS, SCSS è altrettanto esplicito e chiaro. – Jeloi
come ho detto dopo la convenzione di denominazione contribuirà a ridurre i discendenti, sì, come nel tuo ultimo esempio, sull'annidamento con SCSS, non sono sicuro che la sintassi sarà la stessa, ma in sass puoi usare e per costruire BEM o SMACSS come selettori - http : //stackoverflow.com/questions/24383308/sass-change-nested-elements-class-naming-style – Evgeniy
Mi piace questa risposta di Evgeniy. Vorrei solo aggiungere che la convenzione di denominazione BEM impedisce le collisioni di denominazione in cui, ad esempio, due blocchi hanno un elemento denominato '.item'. Certo, puoi usare i selettori discendenti diretti per impedirlo, ma è più difficile refactoring il tuo markup perché qualsiasi piccolo cambiamento richiederà modifiche al CSS. –