Eu estive trabalhando neste artigo para organizar meu código de front-end. Ele faz referência a artigos no BEM / SMACSS, que por sua vez fazem referência a outros artigos.
Estou realmente tentando entender quais são as melhores práticas ... Tenho alguns dias para estabelecer esse "padrão" e, em seguida, tenho que gravar um projeto de cronograma de alta prioridade / alta visibilidade / tempo limitado. Como tal, gostaria de garantir que estou começando com uma base que será dimensionada como meu aplicativo.
Dado um componente chamado segment
... Estou criando páginas que terão ~ 10 segments
por página. Cada segment
um compartilhará a mesma classe base. No entanto, alguns segments
terão modificadores (cores de fundo diferentes). Além disso, os elementos dentro de cada bloco (na abordagem BEM) também terão modificadores. Para demonstrar, aqui está uma implementação simples (com apenas um elemento arrow
, enquanto meu site completo terá 4-5 elementos em cada segment
):
.segment__arrow {
position: absolute;
bottom: -24px;
left: 50%;
margin-left: -11px;
background-position: center no-repeat;
height: 21px;
width: 21px;
z-index: 2;
}
.segment__arrow--orange {
@extend .segment__arrow;
background-image: url('/images/arrow_orange.png');
}
.segment__arrow--white {
@extend .segment__arrow;
background-image: url('/images/arrow_white.png');
}
Portanto, esta é a abordagem de classe única:
<div class="segment__arrow--white"> ... </div>
Como alternativa, eu poderia usar a abordagem de várias classes:
.segment__arrow {
position: absolute;
bottom: -24px;
left: 50%;
margin-left: -11px;
background-position: center no-repeat;
height: 21px;
width: 21px;
z-index: 2;
}
.segment__arrow--orange {
background-image: url('/images/arrow_orange.png');
}
.segment__arrow--white {
background-image: url('/images/arrow_white.png');
}
Onde minha marcação seria:
<div class="segment__arrow segment__arrow--white"> ... </div>
Terceiro, eu poderia fazer:
.segment__arrow {
position: absolute;
bottom: -24px;
left: 50%;
margin-left: -11px;
background-position: center no-repeat;
height: 21px;
width: 21px;
z-index: 2;
}
.segment__arrow.orange {
background-image: url('/images/arrow_orange.png');
}
.segment__arrow.white {
background-image: url('/images/arrow_white.png');
}
E então minha classe def seria
<div class="segment__arrow orange"> ... </div>
Talvez até namespacing orange com algo parecido sa_orange
com evitar seletores soltos.
O resultado final que estou procurando é menos código / mais fácil de manter (o que provavelmente exclui a abordagem de classe única (opção 1), conforme descrito neste ótimo artigo sobre arquitetura escalável. A abordagem de várias classes (opção 2) resulta em muita verbosidade (especialmente no meu HTML), mas é extremamente explícita.O terceiro usa uma abordagem de várias classes, mas não usa modificadores no namespace (como .segment__arrow), por isso é um pouco menos detalhado (mas também menos explícito e superior) potencial de colisões).
Alguém com experiência no mundo real com esse material tem algum feedback sobre a melhor maneira de abordar isso?
.orange
não tem significado apenas como modificador. Não vejo um grande problema em usar.segment__arrow--orange
junto com sua abordagem multiclasse. Obviamente, em projetos maiores, seu HTML pode ficar um pouco fora de controle (muitas classes).