Por que os traços são preferidos para os seletores CSS / atributos HTML?

213

No passado, sempre usei sublinhados para definir atributos de classe e ID em HTML. Nos últimos anos, mudei para traços, principalmente para me alinhar com a tendência da comunidade , não necessariamente porque fazia sentido para mim.

Eu sempre pensei que traços têm mais desvantagens e não vejo os benefícios:

Conclusão e edição de código

A maioria dos editores trata os traços como separadores de palavras; portanto, não consigo acessar o símbolo que desejo. Digamos que a turma seja " featured-product", preciso concluir automaticamente " featured", inserir um hífen e concluir " product".

Com sublinhados " featured_product" é tratado como uma palavra, para que possa ser preenchido em uma etapa.

O mesmo se aplica à navegação no documento. Pular com palavras ou clicar duas vezes nos nomes das classes é interrompido por hífens.

(Geralmente, penso em classes e IDs como tokens , por isso não faz sentido para mim que um token seja tão facilmente divisível em hífens.)

Ambiguidade com operador aritmético

O uso de traços interrompe o acesso à propriedade do objeto para formar elementos em JavaScript. Isso só é possível com sublinhados:

form.first_name.value='Stormageddon';

(É certo que eu não acesso aos elementos do formulário dessa maneira, mas, ao decidir sobre traços e sublinhados como regra universal, considere que alguém pode.)

Idiomas como o Sass (especialmente em toda a estrutura do Compass ) definiram traços como padrão, mesmo para nomes de variáveis. Eles originalmente usaram sublinhados no começo também. O fato de isso ser analisado de maneira diferente me parece estranho:

$list-item-10
$list-item - 10

Inconsistência com a nomeação de variáveis ​​entre idiomas

No passado, eu costumava escrever underscored_namespara variáveis ​​em PHP, ruby, HTML / CSS e JavaScript. Isso era conveniente e consistente, mas, novamente, para "encaixar" agora eu uso:

  • dash-case em HTML / CSS
  • camelCase em JavaScript
  • underscore_case em PHP e ruby

Isso realmente não me incomoda muito, mas eu me pergunto por que elas se tornaram tão desalinhadas, aparentemente de propósito. Pelo menos com sublinhados, foi possível manter a consistência:

var featured_product = $('#featured_product'); // instead of
var featuredProduct = $('#featured-product');

As diferenças criam situações em que precisamos traduzir seqüências desnecessariamente, juntamente com o potencial de erros.

Por isso, pergunto: Por que a comunidade quase universalmente se contentou com traços e existem razões que superam os sublinhados?

Há uma pergunta relacionada na época em que isso começou, mas sou da opinião de que não é (ou não deveria ter sido) apenas uma questão de gosto. Eu gostaria de entender por que todos concordamos com esta convenção, se realmente era apenas uma questão de gosto.

Andrew Vit
fonte
50
Uso traços porque não preciso pressionar a tecla Shift.
jrod
12
Curioso por que isso foi fechado ... houve votos para fechá-lo? Não estou solicitando opiniões nesta pergunta. Dei razões específicas contra o uso de traços, mas deve haver boas razões para que todos pareçam concordar com essa tendência. Existem algumas boas respostas e boas informações aqui. Posso melhorar a pergunta?
Andrew Vit
9
Estou nomeando minha pergunta para reabrir: todas as respostas abaixo incluem "fatos, referências ou conhecimentos específicos" ... então não vejo como "não foi construtivo".
Andrew Vit
12
Eu acho que fechar esse tópico como não construtivo foi uma decisão estúpida. Se houver um estilo de codificação preferido por causa de algo diferente da preferência (mais fácil para os IDEs lidarem, mais fácil conclusão de código, melhor integração com as ferramentas), acho que seria uma pergunta / resposta / discussão bastante construtiva.
Jake Wilson
8
@ AndrewVit: esta é uma pergunta muito boa, bem formatada, informativa e destaca vários aspectos. +1 para isso. Por outro lado, concordo que não fazia sentido encerrar este tópico como "não construtivo" . Na verdade, é construtivo.
Sk8erPeter

Respostas:

130

Conclusão de código

Se o traço é interpretado como pontuação ou como um identificador opaco depende do editor escolhido, eu acho. No entanto, como preferência pessoal, sou a favor de poder tabular entre cada palavra em um arquivo CSS e seria irritante se elas fossem separadas por sublinhado e não houvesse paradas.

Além disso, o uso de hífens permite tirar proveito do seletor de atributo | = , que seleciona qualquer elemento que contenha o texto, seguido opcionalmente por um traço:

span[class|="em"] { font-style: italic; }

Isso faria com que os seguintes elementos HTML tivessem o estilo de fonte em itálico:

<span class="em">I'm italic</span>
<span class="em-strong">I'm italic too</span>

Ambiguidade com operador aritmético

Eu diria que o acesso aos elementos HTML via notação de ponto no JavaScript é um bug e não um recurso. É uma construção terrível desde os primeiros dias de implementações terríveis de JavaScript e não é realmente uma ótima prática. Para a maioria das coisas que você faz com JavaScript atualmente, convém usar seletores CSS para buscar elementos do DOM de qualquer maneira, o que torna toda a notação de ponto inútil. Qual você prefere?

var firstName = $('#first-name');
var firstName = document.querySelector('#first-name');
var firstName = document.forms[0].first_name;

Acho as duas primeiras opções muito mais preferíveis, especialmente porque '#first-name'podem ser substituídas por uma variável JavaScript e construídas dinamicamente. Eu também os acho mais agradáveis ​​aos olhos.

O fato de o Sass ativar a aritmética em suas extensões ao CSS não se aplica realmente ao CSS, mas eu entendo (e aceito) o fato de o Sass seguir o estilo de linguagem do CSS (exceto o $prefixo de variáveis, o que, é claro, deve foram @). Para que os documentos Sass pareçam e pareçam documentos CSS, eles precisam seguir o mesmo estilo que o CSS, que usa o traço como delimitador. No CSS3, a aritmética é limitada à calcfunção, que mostra que, no próprio CSS, isso não é um problema.

Inconsistência com a nomeação de variáveis ​​entre idiomas

Todas as linguagens, como linguagens de marcação, linguagens de programação, linguagens de estilo ou linguagens de script, têm seu próprio estilo. Você encontrará isso em sub-idiomas de grupos de idiomas como XML, onde, por exemplo, o XSLT usa letras minúsculas com delimitadores de hífen e o XML Schema usa camel-caseing.

Em geral, você descobrirá que adotar o estilo que parece e mais "nativo" para o idioma em que está escrevendo é melhor do que tentar introduzir seu próprio estilo em cada idioma diferente. Como você não pode evitar o uso de bibliotecas nativas e construções de linguagem, seu estilo será "poluído" pelo estilo nativo, quer você goste ou não, por isso é praticamente inútil tentar.

Meu conselho é não encontrar um estilo favorito entre os idiomas, mas sinta-se em casa em cada idioma e aprenda a amar todas as suas peculiaridades. Uma das peculiaridades do CSS é que palavras-chave e identificadores são escritos em letras minúsculas e separados por hífens. Pessoalmente, acho isso visualmente atraente e acho que ele se encaixa no HTML todo em minúsculas (embora sem hífen) .

Asbjørn Ulsberg
fonte
4
"Se o traço é interpretado como pontuação ou como um identificador opaco depende do editor escolhido". Eu não acho que isso geralmente seja verdade, embora possa haver alguns editores excepcionais. Clicar duas vezes em uma palavra hifenizada selecionará apenas parte dela, não o token inteiro: isso parece ser do sistema operacional inteiro.
Andrew Vit
13
Bom ponto sobre o |=seletor, vi isso na outra resposta, e é um ponto justo. A convenção de idiomas foi projetada para contornar isso ou o contrário? (Hífens como uma tendência universal parecem ser relativamente recente, estes poderiam ter surgido em torno do mesmo tempo.)
Andrew Vit
1
@AndrewVit, existem editores baseados na CLI em que o clique duplo não é relevante (já que geralmente não há mouse) e que pode ser configurado para ter esse tipo de comportamento. Mas, em geral, você está certo. O |=seletor de atributo é feito especificamente para o langatributo, mas seu uso pode ser estendido. Eu sempre usei hífens no meu CSS, então não posso falar para o público em geral, mas definitivamente houve uma convergência em relação aos hifens do caso pascal, caso camel e sublinhados. O |=seletor e o hífen como delimitador são, até onde eu sei, independentes.
Asbjørn Ulsberg
3
Não vejo a notação de ponto como um bug, é o CSS que não deveria ter usado hífens. Além disso, o que é agradável aos olhos é variável.
vivek
2
@ KamilKiełczewski Isso é útil, mas funciona de maneira um pouco diferente.
gcampbell
68

Talvez uma das principais razões pelas quais a comunidade HTML / CSS se alinhe com traços em vez de sublinhados seja devido a deficiências históricas nas especificações e nas implementações do navegador.

De um documento da Mozilla publicado em março de 2001 @ https://developer.mozilla.org/en-US/docs/Underscores_in_class_and_ID_Names

A especificação CSS1, publicada em sua forma final em 1996, não permitia o uso de sublinhados nos nomes de classe e ID, a menos que eles "escapassem". Um sublinhado de escape seria mais ou menos assim:

    p.urgent\_note {color: maroon;}

No entanto, isso não era bem suportado pelos navegadores, e a prática nunca pegou. O CSS2, publicado em 1998, também proibiu o uso de sublinhados nos nomes de classe e ID. No entanto, as erratas das especificações publicadas no início de 2001 tornaram os sublinhados legais pela primeira vez. Infelizmente, isso complicou uma paisagem já complexa.

Eu geralmente gosto de sublinhados, mas a barra invertida apenas a torna feia além da esperança, sem mencionar o apoio escasso da época. Eu posso entender por que os desenvolvedores evitaram isso como uma praga. É claro que não precisamos da barra invertida hoje em dia, mas a etiqueta do traço já foi firmemente estabelecida.

user193130
fonte
6
Obrigado! Adoro descobrir a 'etimologia' de uma convenção como essa. Isso me ajuda a lembrar de usar a convenção, pois posso associar o idioma a ela. Ter a associação me ajuda a preparar meu subconsciente para usar a convenção como resultado.
Ape-Inago
39

Eu não acho que alguém possa responder isso definitivamente, mas aqui estão meus palpites:

  1. Os sublinhados precisam pressionar a tecla Shift e, portanto, são mais difíceis de digitar.

  2. Os seletores de CSS que fazem parte das especificações oficiais de CSS usam traços (como pseudo-classes como: primeiro filho e pseudo-elementos: primeira linha), não sublinhados. O mesmo vale para propriedades, por exemplo, decoração de texto, cor de fundo, etc. Programadores são criaturas de hábitos. Faz sentido que eles sigam o estilo do padrão, se não houver uma boa razão para não fazê-lo.

  3. Este está mais à frente, mas ... Seja mito ou fato, existe uma idéia antiga de que o Google trata palavras separadas por sublinhados como uma única palavra e palavras separadas por traços como palavras separadas. (Matt Cutts em Sublinhados vs. Dashes.) Por esse motivo, sei que agora minha preferência para criar URLs de página é usar palavras com traços e, para mim, pelo menos, isso aconteceu em minhas convenções de nomenclatura para outras coisas. , como seletores de CSS.

Mason G. Zhwiti
fonte
2
Bom argumento sobre o SEO em relação a traços em URLs e para marcação semântica (se isso é realmente verdade ou não) ... Você pode esclarecer quais "seletores de CSS que fazem parte das especificações oficiais de CSS usam traços"?
Andrew Vit
Eu expandi o ponto 2 da minha resposta para dar alguns exemplos, embora estivesse pensando mais nas propriedades CSS como decoração de texto em vez de "seletores", de modo que isso foi um erro de digitação, embora existam alguns seletores, como observado acima.
Mason G. Zhwiti
1
Obrigado @albert, isso daria uma boa resposta por si só ... pelo menos para o contexto histórico. Eu não sabia que a especificação original não permitia sublinhados! (Mas não faz sentido por que eles deveriam ser anulado.)
Andrew Vit
4
O ponto 2 me convenceu, especialmente considerando propriedades como cor de fundo, decoração de texto etc.
Big McLargeHuge
2
Para os curiosos, o URL devedge-temp mencionado no comentário de @ albert acima ( devedge-temp.mozilla.org/viewsource/2001/css-underscores ) agora está em developer.mozilla.org/en-US/docs/…
aponzani 20/08/2013
14

Existem muitas razões, mas uma das coisas mais importantes é manter a consistência .

Eu acho que este artigo explica isso de forma abrangente.

CSS é uma sintaxe delimitada por hífen. Com isto quero dizer que escrever coisas como font-size, line-height, border-bottometc.

Assim:

Você simplesmente não deve misturar sintaxes: é inconsistente .

simhumileco
fonte
11

Houve um aumento claro nos segmentos de URLs separados por hífen e palavra inteira nos últimos anos. Isso é incentivado pelas melhores práticas de SEO. O Google "recomenda explicitamente que você use hífens (-) em vez de sublinhados (_) nos seus URLs": http://www.google.com/support/webmasters/bin/answer.py?answer=76329 .

Como observado, diferentes convenções prevaleceram em momentos diferentes em diferentes contextos, mas geralmente não fazem parte formal de nenhum protocolo ou estrutura.

Minha hipótese, então, é que a posição do Google ancora esse padrão em um contexto-chave (SEO), e a tendência de usar esse padrão nos nomes de classe, ID e atributo é simplesmente o rebanho se movendo lentamente nessa direção geral.

Faust
fonte
5

Eu acho que é uma coisa dependente de programador. Alguém gosta de usar traços, outros usam sublinhados.
Eu pessoalmente uso sublinhado ( _) porque também o uso em outros lugares. Tais como:
- Variáveis ​​JavaScript ( var my_name);
- Minhas ações do controlador ( public function view_detail)
Outro motivo pelo qual eu uso sublinhados é que, na maioria dos IDEs, duas palavras separadas por sublinhado são consideradas como 1 palavra. (e é possível selecionar com double_click).

Ali Farhoudi
fonte