Por que o CSS funciona com elementos falsos?

438

Na minha turma, eu estava brincando e descobri que o CSS funciona com elementos inventados.

Exemplo:

imsocool {
    color:blue;
}
<imsocool>HELLO</imsocool>

Quando meu professor me viu usando isso pela primeira vez, ele ficou um pouco surpreso com o fato de os elementos de maquiagem funcionarem e recomendou que eu simplesmente alterasse todos os meus elementos de composição para parágrafos com IDs.

Por que meu professor não quer que eu use elementos inventados? Eles trabalham efetivamente.

Além disso, por que ele não sabia que os elementos inventados existem e funcionam com CSS. Eles são incomuns?

Mais ouvidas de Jordan Chill
fonte
62
HTML é uma maneira de fornecer significado aos dados que podem ser entendidos por uma ampla variedade de mídias (incluindo pessoas e navegadores). Suas tags inventadas não adicionam nenhum significado. Essa é uma das muitas razões pelas quais ele não quer que você as use.
precisa
59
@MrMisterMan, na verdade, acho que sim. O que é mais significativo - <p>555-212-2344</p>ou <supportPhone> 555-212-2344 </supportPhone>
Yuriy Galanter
169
@YuriyGalanter <p class = "supportPhone">; P
punkrockbuddyholly
30
@MrMisterMan Lembre-se de que todas essas regras e construções de programação foram criadas por pessoas não mais inteligentes que você, e você pode alterá-lo, influenciá-lo, criar suas próprias coisas que outras pessoas podem usar.
L_7337 03/12/2013
90
Eu devo ressaltar que o que você está fazendo é basicamente XML e não HTML. XML é uma linguagem de marcação mais abstrata que permite representar dados da maneira "útil" que você descreve - isto é. com significado semântico anexado. Você pode usar uma transformação XSLT para renderizar seus dados em HTML
ose

Respostas:

470

Por que o CSS funciona com elementos falsos?

(A maioria) dos navegadores são projetados para serem (até certo ponto) compatíveis com as adições futuras ao HTML. Os elementos não reconhecidos são analisados ​​no DOM, mas não têm semântica ou renderização padrão especializada associada a eles.

Quando um novo elemento é adicionado à especificação, às vezes CSS, JavaScript e ARIA podem ser usados ​​para fornecer a mesma funcionalidade em navegadores mais antigos (e os elementos precisam aparecer no DOM para que esses idiomas possam manipulá-los para adicionar essa funcionalidade. )

(Embora seja necessário observar que o trabalho está em andamento para definir um meio de estender o HTML com elementos personalizados , mas esse trabalho está nos estágios iniciais de desenvolvimento no momento, portanto, provavelmente deve ser evitado até que amadureça.)

Por que meu professor não quer que eu use elementos inventados?

  • Eles não são permitidos pela especificação HTML
  • Eles podem entrar em conflito com futuros elementos padrão com o mesmo nome
  • Provavelmente, existe um elemento HTML existente mais adequado à tarefa

Além disso; por que ele não sabia que os elementos inventados existiam e trabalhavam com CSS. Eles são incomuns?

Sim. As pessoas não as usam porque têm os problemas acima.

Quentin
fonte
30
"Eles não são permitidos pela especificação HTML" Não necessariamente verdadeiro. Eles não estão em conformidade com a especificação de espaço para nome HTML, mas a especificação HTML5 é uma coisa muito mais ampla que permite especificações personalizadas e afirma explicitamente como lidar com essas coisas em relação ao CSS e ao manuseio de API (DOM).
quer
4
Já existem bibliotecas, principalmente o Angular.js, que permitem estender o HTML com elementos personalizados. Talvez não no sentido que você quer dizer como os elementos estão apenas analisado pelo javascript e traduzido para reais geralmente, mas se você está olhando para estender html com marcas personalizadas, você pode fazê-lo com Angular
Charlie Martin
11
+1 Para "Eles podem entrar em conflito com os padrões futuros". Lembre-se de que pode funcionar agora, mas precisa funcionar por 3-4 anos após o início.
tim.baker
70
Eu gostaria de ter uma tag <ninja> para elementos esconder dom em vez da aplicação de exibição style: none por exemplo: <ninja> algumas coisas escondidas </ ninja>
kiranvj
18
Outro ponto realmente importante: navegadores especiais para pessoas cegas ou com capacidades limitadas usam os elementos HTML adequados para coisas diferentes (facilitar a navegação na página seguindo os cabeçalhos, por exemplo). Portanto, a semântica faltante + a renderização padrão podem não afetar muito os navegadores normais, mas esses navegadores especiais provavelmente ficarão confusos, reduzindo drasticamente a usabilidade do seu site.
Arve Systad
98

TL; DR

  • Tags personalizadas são inválidas em HTML. Isso pode levar a problemas de renderização.
  • Torna o desenvolvimento futuro mais difícil, pois o código não é portátil.
  • O HTML válido oferece muitos benefícios, como SEO, velocidade e profissionalismo.

Resposta longa

Existem alguns argumentos que o código com tags personalizadas é mais utilizável.

No entanto, isso leva a HTML inválido. O que não é bom para o seu site.

O ponto de CSS / HTML válido | StackOverflow

  • O Google prefere, por isso é bom para SEO.
  • Isso aumenta a probabilidade de sua página da web funcionar em navegadores que você não testou.
  • Faz você parecer mais profissional (pelo menos para alguns desenvolvedores)
  • Navegadores compatíveis podem renderizar [HTML válido mais rápido]
  • Ele indica um monte de bugs obscuros que você provavelmente perdeu que afetam coisas que provavelmente não foram testadas, por exemplo, a página de código ou o conjunto de idiomas da página.

Por que validar | W3C

  • Validação como uma ferramenta de depuração
  • Validação como uma verificação de qualidade à prova de futuro
  • Validação facilita a manutenção
  • A validação ajuda a ensinar boas práticas
  • Validação é um sinal de profissionalismo
Dan Grahn
fonte
8
Outro argumento para o código válido é: se você precisar entregar a outro desenvolvedor ou estiver trabalhando em equipe, os outros membros ou o novo desenvolvedor devem entender instantaneamente o que você está tentando alcançar. . . Com inválidos, constituídos etiquetas, isso pode se tornar muito difícil ...
Pat Dobson
9
AKA. Desenvolvimento futuro e manutenção facilitada.
Dan Grahn
68

YADA (mais uma resposta (diferente))

Edit: Por favor, veja o comentário do BoltClock abaixo sobre o tipo vs tag vs elemento. Geralmente não me preocupo com a semântica, mas o comentário dele é muito apropriado e informativo.

Embora já haja muitas respostas boas, você indicou que seu professor solicitou que você publicasse essa pergunta, para que pareça que você está (formalmente) na escola . Eu pensei em explicar um pouco mais sobre não apenas o CSS, mas também a mecânica dos navegadores da web. Segundo a Wikipedia , "CSS é uma linguagem de folha de estilos usada para descrever ... um documento escrito em uma linguagem de marcação". (Eu adicionei a ênfase em "a") Observe que ele não diz "escrito em HTML", muito menos uma versão específica do HTML. CSS pode ser usado em HTML, XHTML, XML, SGML, XAML, etc. Claro, você precisa de algo que renderizecada um desses tipos de documento que também aplicará estilo. Por definição, o CSS não conhece / entende / se importa com tags específicas da linguagem de marcação. Portanto, as tags podem ser "inválidas" no que diz respeito ao HTML, mas não há conceito de uma tag / elemento / tipo "válido" no CSS.

Modernos navegadores visuais não são programas monolíticas. Eles são uma amálgama de diferentes "mecanismos" que têm tarefas específicas a serem executadas. No mínimo , posso pensar em três mecanismos, o mecanismo de renderização, o mecanismo CSS e o mecanismo javascript / VM. Não tenho certeza se o analisador faz parte do mecanismo de renderização (ou vice-versa) ou se é um mecanismo separado, mas você entendeu.

Se um navegador visual ou não ( outros já abordaram o fato de que os leitores de tela podem ter outros desafios ao lidar com tags inválidas ) aplica a formatação depende se o analisador deixa a tag "inválida" no documento e se o mecanismo de renderização aplica estilos para essa tag. Como isso tornaria mais difícil o desenvolvimento / manutenção, os mecanismos CSS não foram escritos para entender que "Este é um documento HTML, então aqui está a lista de tags / elementos / tipos válidos". Os mecanismos CSS simplesmente localizam tags / elementos / tipos e depois informam ao mecanismo de renderização: "Aqui estão os estilos que você deve aplicar". Depende se o mecanismo de renderização decide realmente aplicar os estilos.

Aqui está uma maneira fácil de pensar no fluxo básico de mecanismo para mecanismo: analisador -> CSS -> renderização. Na realidade, é muito mais complicado, mas isso é bom o suficiente para começar.

Esta resposta já é muito longa, então vou terminar por aí.

Andrew Steitz
fonte
10
Embora você tenha mencionado que "tags" se tornou um termo comum para elementos, dos quais não posso e não discordo, isso não muda o fato de que o termo correto para elas ainda é "elementos". Uma tag é especificamente um recurso de sintaxe de HTML e XML e pode não existir em outras linguagens de documentos compatíveis com CSS. Portanto, dizer que os estilos CSS "tags", como as pessoas costumam chamá-los, não faz muita justiça ao agnosticismo da linguagem de documentos do CSS.
BoltClock
53

Elementos desconhecidos são tratados como divs pelos navegadores modernos. É por isso que eles trabalham. Isso faz parte do padrão HTML5 que introduz uma estrutura modular à qual novos elementos podem ser adicionados.

Em navegadores mais antigos (acho que o IE7-), você pode aplicar um truque de Javascript, após o qual eles também funcionarão.

Aqui está uma pergunta relacionada que encontrei ao procurar um exemplo.

Aqui está uma pergunta sobre a correção do Javascript . Acontece que é realmente o IE7 que não suporta esses elementos imediatamente.

Além disso; por que ele não sabia que etiquetas inventadas existiam e trabalhavam com CSS. Eles são incomuns?

Sim, bastante. Mas especialmente: eles não servem a propósitos adicionais. E eles são novos no html5. Nas versões anteriores do HTML, uma tag desconhecida era inválida.

Além disso, os professores parecem ter lacunas em seus conhecimentos, às vezes. Isso pode ser devido ao fato de que eles precisam ensinar aos alunos o básico sobre um determinado assunto, e não vale a pena conhecer todos os detalhes e estar realmente atualizado. Certa vez, fui detido porque um professor pensou que eu tinha programado um vírus, apenas porque eu podia fazer um computador tocar música usando o playcomando GWBasic. (História verdadeira, e sim, há muito tempo). Mas, seja qual for o motivo, acho que o conselho de não usar elementos de custume é sensato.

GolezTrol
fonte
3
@OnoSendai Você me fez duvidar, mas eu realmente acho que eles são renderizados como 'elementos de bloco sem marcação adicional', basicamente como divs.
precisa saber é o seguinte
6
@OnoSendai Um elemento de bloco pode ter a propriedade display de block , mas não é necessário. Por exemplo, as tags âncora foram promovidas para bloquear o status (o que significa que você pode colocar elementos de bloco como divs dentro deles), mas ainda tem a propriedade de exibição embutida.
Cimmanon
8
O valor inicial de displayé inline, então o comentário do @ OnoSendai está correto.
BoltClock
2
@ cimmanon: os aelementos têm um modelo de conteúdo transparente agora; portanto, se são bloco ou inline, depende se o ancestral é bloco ou inline. Esta resposta está falando de elementos desconhecidos, para os quais o HTML não define um modelo de conteúdo. No que diz respeito ao CSS, se não houver displayvalor padrão do navegador, ele usará o valor inicial.
BoltClock
1
@ BoltClock'saUnicorn Então, isso significa que <div> <a> foo </a> <a> barra </a> </div> renderiza as duas tags <a> como blocos? Isso parece um pouco suspeito ...
macia
27

Na verdade, você pode usar elementos personalizados. Aqui está a especificação do W3C sobre este assunto:

http://w3c.github.io/webcomponents/spec/custom/

E aqui está um tutorial explicando como usá-los:

http://www.html5rocks.com/en/tutorials/webcomponents/customelements/

Conforme apontado por @Quentin: este é um rascunho de especificação nos primeiros dias de desenvolvimento e que impõe restrições sobre como podem ser os nomes dos elementos.

Bas van Dijk
fonte
7
Deve-se notar que esse é um rascunho de especificação nos primeiros dias de desenvolvimento e que impõe restrições sobre como podem ser os nomes dos elementos.
Quentin
2
+1 Não sabia que o W3C usa, githubmas na verdade eles usam.
Vitor Canova
22

Existem algumas coisas nas outras respostas que são pouco expressas ou talvez um pouco incorretas.

FALSE (ish): elementos HTML não padrão são "não permitidos", "ilegais" ou "inválidos".

Não necessariamente. Eles são "não conformes" . Qual é a diferença? Algo não pode "estar em conformidade" e ainda pode ser "permitido". O W3C não vai enviar a polícia HTML para sua casa e levá-lo embora.

O W3C deixou as coisas assim por uma razão. Conformidade e especificações são definidas por uma comunidade. Se houver uma comunidade menor consumindo HTML para fins mais específicos e todos concordarem com alguns novos elementos de que precisam para facilitar as coisas, eles podem ter o que o W3C chama de "outras especificações aplicáveis" . (é uma simplificação grosseira, obviamente, mas você entendeu)

Dito isto, validadores estritos declararão seus elementos não padrão como "inválidos". mas isso ocorre porque o trabalho do validador é garantir a conformidade com qualquer especificação que esteja validando, não garantir a "legalidade" do navegador ou do uso .

FALSE (ish): elementos HTML não-padrão irá resultar em problemas de processamento

Possivelmente, mas improvável. (substituir "será" por "pode") A única maneira de resultar em um problema de renderização é se o seu elemento personalizado entrar em conflito com outra especificação, como uma alteração na especificação HTML ou outra especificação sendo honrada no mesmo sistema (como SVG, Math ou algo personalizado).

De fato, o motivo pelo qual o CSS pode estilizar tags não padrão é porque a especificação HTML afirma claramente que:

Os agentes de usuários devem tratar elementos e atributos que eles não entendem como semanticamente neutros; deixando-os no DOM (para processadores DOM) e estilizando-os de acordo com CSS (para processadores CSS), mas sem inferir nenhum significado deles

Nota: se você quiser usar uma tag personalizada, lembre-se de que uma alteração nas especificações do HTML posteriormente poderá aumentar seu estilo, portanto, esteja preparado. No <imsocool>entanto, é realmente improvável que o W3C implemente a tag.

Tags não padrão e JavaScript (via DOM)

O motivo pelo qual você pode acessar e alterar elementos personalizados usando JavaScript é porque a especificação fala sobre como eles devem ser tratados no DOM , que é a API (realmente horrível) que permite manipular os elementos em sua página.

A interface HTMLUnknownElement deve ser usada para elementos HTML que não são definidos por esta especificação (ou outras especificações aplicáveis).

TL; DR: A conformidade com as especificações é feita para fins de comunicação e segurança. A não conformidade ainda é permitida por tudo, exceto por um validador , cujo único objetivo é impor a conformidade, mas cujo uso é opcional.

Por exemplo:

var wee = document.createElement('wee');
console.log(wee.toString()); //[object HTMLUnknownElement]

(Tenho certeza de que isso atrairá chamas, mas há meus 2 centavos)

Ben Lesh
fonte
3
O HTML não apenas especifica como os elementos devem ser tratados no CSS, a especificação do CSS também é, na maior parte, independente de linguagem de documento por design (isso já está meio que implícito em algumas outras respostas, mas eu o observo aqui para conveniência). Se houver algum comportamento específico para HTML e / ou XHTML, ele sempre será indicado , mesmo em texto informativo (por exemplo, "o ID de um elemento HTML é especificado pelo idatributo"), não apenas em texto normativo (consulte Plano de fundo e bordas 3 para obter uma exemplo).
BoltClock
18

De acordo com as especificações:

CSS

Um seletor de tipo é o nome de um tipo de elemento de linguagem de documento escrito usando a sintaxe dos nomes qualificados de CSS

Eu pensei que isso era chamado de seletor de elementos , mas aparentemente é realmente o seletor de tipos . A especificação continua falando sobre CSS qualified namesquais não colocam restrições sobre quais são os nomes. Ou seja, desde que o seletor de tipo corresponda à sintaxe de nome qualificado de CSS, ele é tecnicamente correto em CSS e corresponderá ao elemento no documento. Não há restrição específica de CSS para elementos que não existem em uma especificação específica - HTML ou outro.

HTML

Não há nenhuma restrição oficial sobre a inclusão de tags no documento que você deseja. No entanto, a documentação diz

Os autores não devem usar elementos, atributos ou valores de atributos para outros fins que não os propósitos semânticos apropriados, pois isso impede o software de processar corretamente a página.

E depois diz

Os autores não devem usar elementos, atributos ou valores de atributos que não são permitidos por esta especificação ou por outras especificações aplicáveis, pois isso torna significativamente mais difícil a extensão do idioma no futuro.

Não sei exatamente onde ou se a especificação diz que elementos desconhecidos são permitidos , mas fala sobre a interface HTMLUnknownElement para elementos não reconhecidos. Alguns navegadores podem nem reconhecer elementos que estão na especificação atual (o IE8 vem à mente).

No entanto, existe um rascunho para elementos personalizados , mas duvido que ele já esteja implementado em qualquer lugar.

Comprimidos de explosão
fonte
Acho que a maioria de nós pensa neles como seletores de elementos , mas faz sentido que sejam seletores de tipo "oficialmente" .
Andrew Steitz
@ Andrew Steitz: Pense desta maneira: elemento: type :: person: name. Você pode ter muitos elementos de tipos diferentes, com cada elemento sendo de um único tipo e da mesma maneira que você pode ter muitas pessoas, cada uma com um nome. Os seletores funcionam em uma árvore de documentos e cada seletor pode corresponder a alguns elementos da árvore de documentos, que você pode restringir com um seletor de classe, um seletor de ID, um seletor de atributos ... ou um seletor de tipos. O que quer que você use, você ainda está combinando elementos. Portanto, "seletor de elementos" não faria sentido nesse caso - todas essas coisas seriam seletores de elementos.
BoltClock
@ BoltClock'saUnicorn: Verdadeiro, mas classe, ID e atributo são todos, uh, atributos (LOL) de um "elemento", isto é, o "coisinha" dentro dos colchetes angulares. Eles descrevem o "elemento" em cuja tag de abertura eles residem. Sim, <a> e <div> são "tipos" específicos de elementos, mas duvido que alguém possa chamar classe, ID e atributos "elementos". Eu concordo totalmente que todos os seletores são realmente seletores de "elemento", mas em USO COMUM, as pessoas geralmente se referem a seletores de "tipo" como seletores de "elemento". Esse foi o ponto do meu comentário anterior. Desculpe, não estava claro. :-)
Andrew Steitz 3/13/13
@ExplosionPills - As especificações HTML não dizem que elementos desconhecidos não são permitidos, mas como todo elemento tem uma lista enumerada de nomes de elementos permitidos como filhos (ou seja, seu modelo de conteúdo), não é necessário. Simplesmente, em nenhum lugar é permitido um elemento desconhecido como filho de um elemento permitido. A aplicação de HTMLUnknownElement a esses elementos faz parte da especificação anterior - ou seja, o que os consumidores de HTML devem fazer com documentos válidos ou não - e não fazem parte do que os autores devem fazer para validar seus documentos.
Alohci
@Alohci quero dizer não é permitido no sentido de que eles seriam descartados do DOM ao contrário de ser semanticamente inválido
Pills Explosão
13

Isso é possível com o html5, mas é necessário levar em consideração os navegadores mais antigos.

Se você decidir usá-los, certifique-se de COMENTAR seu html !! Algumas pessoas podem ter problemas para descobrir o que é, então um comentário pode economizar uma tonelada de tempo.

Algo assim,

<!-- Custom tags in use, refer to their CSS for aid -->

Quando você cria sua própria tag / elementos personalizados, os navegadores mais antigos não têm idéia do que são elementos html5 como nav/ section.

Se você está interessado nesse conceito, recomendo fazê-lo da maneira certa.

Começando

Elementos personalizados permitem que os desenvolvedores da Web definam novos tipos de elementos HTML. A especificação é uma das várias novas primitivas de API que chegam ao âmbito dos componentes da Web, mas é possivelmente a mais importante. Os Componentes da Web não existem sem os recursos desbloqueados por elementos personalizados:

Definir novos elementos HTML / DOM Crie elementos que se estendem a partir de outros elementos Agrupe logicamente a funcionalidade personalizada em uma única tag Estenda a API dos elementos DOM existentes

Há muito o que você pode fazer com isso e isso torna seu script bonito, como este artigo gosta de colocar. Elementos personalizados que definem novos elementos em HTML .

Então vamos recapitular,

Prós

  • Muito elegante e fácil de ler.

  • É bom não ver tantos divs. : p

  • Permite uma sensação única ao código

Contras

  • O suporte a navegadores mais antigos é algo importante a considerar.

  • Outros desenvolvedores podem não ter idéia do que fazer se não souberem sobre tags personalizadas. (Explique a eles ou adicione comentários para informá-los)

  • Por fim, uma coisa a ser levada em consideração, mas não tenho certeza, são os elementos de bloco e embutidos. Ao usar tags personalizadas, você acabará escrevendo mais css, pois a tag personalizada não terá um lado padrão.

A escolha é inteiramente sua e você deve basear-se no que o projeto está pedindo.

Atualização 1/2/2014

Aqui está um artigo muito útil que encontrei e achei que compartilharia, elementos personalizados .

Aprenda a tecnologia Por que elementos personalizados? Elementos personalizados permitem que os autores definam seus próprios elementos. Os autores associam o código JavaScript aos nomes de marcas personalizadas e, em seguida, usam esses nomes de marcas personalizadas como usariam qualquer marca padrão.

Por exemplo, depois de registrar um tipo especial de botão chamado super botão, use o botão super da seguinte maneira:

Elementos personalizados ainda são elementos. Podemos criar, usar, manipular e compor com a mesma facilidade que qualquer padrão ou hoje.

Parece uma biblioteca muito boa de usar, mas notei que ela não passava no status de compilação do Windows. Isso também está em um pré-alfa, eu acredito, então eu ficaria de olho nisso enquanto ele se desenvolve.

Josh Powell
fonte
3
" Other developers may have no clue what to do if they don't know about custom tags." Eu odeio esse argumento. Outros desenvolvedores também devem aprender coisas novas e, se não entenderem as técnicas usadas no seu código, devem ser gratos a você por apontar deficiências em seus conhecimentos. Talvez isso seja um pouco injusto nesse caso, porque as tags personalizadas existem apenas como rascunho, mas ouvi o mesmo argumento ao usar técnicas padronizadas adequadas.
precisa saber é o seguinte
1
Não estou dizendo que apoio isso, mas muitos desenvolvedores não continuam aprendendo. Quase não há razão para não comentar algo, se é um pouco complexo ou novo. Todos nós comentamos nossos scripts corretos? Para mostrar o que estamos executando e como, o mesmo acontece com as tags personalizadas.
Josh Powell
1
Claro, se é apenas sobre adicionar comentários. Eu pensei que você quisesse dizer que não deveria usar elementos personalizados porque outras pessoas não entenderiam. Adicionar um pequeno comentário ao adicionar uma técnica menos utilizada é uma boa coisa a fazer. Tenha cuidado com os comentários em HTML, no entanto. Eles podem acabar no cliente, consumindo largura de banda e possivelmente revelando detalhes da implementação sobre os quais você não quer que seus visitantes aprendam. Como alternativa, você pode adicionar comentários como comentários PHP / ASP, para que eles ainda estejam no modelo, mas permaneçam no servidor.
precisa saber é o seguinte
1
@GolezTroi, não é que você nunca deva fazer coisas que desafiam outros desenvolvedores, é uma questão de custo-benefício. Se fazer algo de uma maneira mais difícil para o próximo desenvolvedor legitimamente tornar seu código melhor e mais limpo, faça-o. Mas não faça coisas rudes apenas por diversão.
BostonJohn
1
@ JoshPowell Comentários não devem ser sobre o quê e como (o código já diz isso, e se não estiver claro o suficiente, reescreva o código até que seja), mas deve me dizer o porquê . Existem poucas coisas piores do que muitos comentários que apenas dizem que a sendmailfunção envia correio ou algo parecido. Eu ficaria mais interessado no motivo pelo qual você envia e-mails - e se o nome da função tornar isso óbvio, ótimo! Então não preciso de um comentário, que é o caso ideal. Vou ler o código de qualquer maneira.
Christopher Creutzig
4

Por que ele não quer que você os use? Eles não são comuns nem fazem parte do padrão HTML5. Tecnicamente, eles não são permitidos. Eles são um hack.

Eu também gosto deles. Você pode estar interessado em XHTML5. Permite definir suas próprias tags e usá-las como parte do padrão.

Além disso, como outros salientaram, eles são inválidos e, portanto, não são portáteis.

Por que ele não sabia que eles existem? Eu não sei, exceto que eles não são comuns. Possivelmente ele não estava ciente de que você poderia.

tjons
fonte
2
Não há XHTML5 - havia um grupo de trabalho tentando criar o XHTML 2, mas ele fracassou anos atrás.
Max
1
@papirtiger: XHTML5 é HTML5 servido como XML, mas você está certo de que não existe um padrão XHTML independente além do XHTML 1.1.
BoltClock
1
Portanto, não é XHTML5, mas parece diferir pouco de HTML5 em relação a este assunto de marcas personalizadas. Portanto, acho que a declaração sobre o XHTML5, que permite definir tags adicionais em contraste com o HTML5, está errada, o que pode explicar o voto negativo, mesmo que eu não tenha certeza o suficiente sobre o XHTML5 para fazer o voto positivo ou o voto negativo desta resposta.
GolezTrol
1
De acordo com o rascunho HTML5 do W3C, HTML e XHTML são (agora) "sintaxes concretas" representando a mesma "linguagem abstrata". Eles têm os mesmos recursos fundamentais, exceto aqueles que só fazem sentido em uma sintaxe (espaços para nome XML, comutador analisador de noscript HTML): w3.org/TR/html5/introduction.html#html-vs-xhtml
IMSoP
2

As tags criadas quase nunca são usadas, porque é improvável que funcionem de maneira confiável em todos os navegadores atuais e futuros.

Um navegador precisa analisar o código HTML em elementos que ele conhece; as tags criadas serão convertidas em outra coisa para caber no modelo de objeto de documento (DOM). Como os padrões da web não cobrem como lidar com tudo que está fora dos padrões, os navegadores da web tendem a manipular código não-padrão de maneiras diferentes.

O desenvolvimento da Web é bastante complicado com vários navegadores diferentes que têm suas próprias peculiaridades, sem adicionar outro elemento de incerteza. A melhor aposta é manter o que realmente está nos padrões, é o que os fornecedores de navegadores tentam seguir, para que tenha a melhor chance de realmente funcionar.

Guffa
fonte
2

Eu acho que as tags inventadas são potencialmente mais confusas ou pouco claras do que os ps com IDs (geralmente algum bloco de texto). Todos nós sabemos que um ID com um ID é um parágrafo, mas quem sabe para que tags inventadas se destinam? Pelo menos esse é o meu pensamento. :) Portanto, esse é mais um problema de estilo / clareza do que de funcionalidade.

runelynx
fonte
3
Obrigado gramática fadas :)
runelynx
2

Outros fizeram pontos excelentes, mas vale a pena notar que, se você observar uma estrutura como o AngularJS , há um caso muito válido para elementos e atributos personalizados. Eles transmitem não apenas um melhor significado semântico para o xml, mas também podem fornecer comportamento, aparência e aparência para a página da web.

drew_w
fonte
2

CSS é uma linguagem de folha de estilos que pode ser usada para apresentar documentos XML, não apenas documentos X (X) HTML. Seu snippet com as tags criadas pode fazer parte de um documento XML legal; seria um se você o incluir em um único elemento raiz. Provavelmente você já tem um<html> ...</html> problema? Qualquer navegador atual pode exibir documentos XML.

É claro que não é um documento XML muito bom, falta uma gramática e uma declaração XML. Se você usar um cabeçalho de declaração HTML (e provavelmente uma configuração de servidor que envie o tipo MIME correto), seria HTML ilegal.

(X) HTML tem vantagens sobre XML simples, pois os elementos têm um significado semântico que é útil no contexto de uma apresentação da página da web. As ferramentas podem trabalhar com essa semântica, outros desenvolvedores sabem o significado, é menos propenso a erros e melhor para ler.

Mas em outros contextos, é melhor usar CSS com XML e / ou XSLT para fazer a apresentação. Foi isso que você fez. Como essa não era sua tarefa, você não sabia o que estava fazendo, e HTML / CSS é a melhor maneira de percorrer a maior parte do tempo em que você deve cumpri-lo em seu cenário.

Você deve adicionar um cabeçalho HTML (X) ao seu documento para que as ferramentas possam fornecer mensagens de erro significativas.

Hauke ​​Ingmar Schmidt
fonte
2
Não, não é XML legal (bem formado). Há um <style>elemento, e então ... um <body>elemento. Um documento XML deve ter apenas um elemento raiz; nesse caso, o <style>elemento é o elemento raiz, mas <body>está interferindo, ou um elemento raiz precisa ser adicionado, tornando ambos os elementos seus filhos. A menos que você substitua o <style>elemento por uma referência de folha de estilo (até mesmo um URI de dados <?xml-stylesheet href="data:text/css,imsocool { color: blue; }"?>funcionaria bem), de modo que o elemento raiz se torne <body>.
BoltClock
2

... Simplesmente altero todas as minhas tags inventadas para parágrafos com IDs.

Na verdade, discordo de sua sugestão de como fazê-lo corretamente.

  1. Uma <p>tag é para parágrafos. Vejo pessoas usando o tempo todo em vez de uma div - simplesmente para fins de espaçamento ou porque parece mais suave. Se não for um parágrafo, não o use.

  2. Você não precisa ou deseja colar IDs em tudo, a menos que precise direcioná-lo especificamente (por exemplo, com Javascript). Use classes ou apenas uma divisão direta.

dennisbest
fonte
2

Desde o início, o CSS foi projetado para ser independente de marcação, para que possa ser usado com qualquer linguagem de marcação que produza estruturas DOM semelhantes a árvores (SVG, por exemplo). Qualquer tag que name tokenesteja em conformidade com a produção é perfeitamente válida em CSS. Portanto, sua pergunta é mais sobre HTML do que sobre o próprio CSS.

Elementos com tags personalizadas são suportados pela especificação HTML5. O HTML5 padroniza a maneira como os elementos desconhecidos devem ser analisados ​​no DOM. Portanto, o HTML5 é a primeira especificação HTML que permite elementos personalizados estritamente. Você só precisa usar o doctype HTML5 <!DOCTYPE html>no seu documento.

A partir dos próprios nomes de tags personalizados ...

Este documento http://www.w3.org/TR/custom-elements/ recomenda tags personalizadas que você escolhe conter pelo menos um símbolo '-' (traço). Dessa forma, eles não entrarão em conflito com futuros elementos HTML. Portanto, é melhor alterar seu documento para algo assim:

<style>
so-cool {
    color:blue;
}
</style>

<body>
    <so-cool>HELLO</so-cool>
</body> 
sorriso
fonte
2

Aparentemente, ninguém mencionou, então eu vou.

Este é um subproduto das guerras entre navegadores .

Nos anos 90, quando a Internet estava começando a se popularizar, a concorrência aumentou no mercado de navegadores. Para manter a competitividade e atrair usuários, alguns navegadores (principalmente o Internet Explorer) tentaram ser úteis e "amigáveis", tentando descobrir o que os designers de página queriam dizer e, portanto, permitiram a marcação incorreta (por exemplo,<b><i>foobar</b></i> seria corretamente exibida em negrito). itálico).

Isso fazia sentido até certo ponto, porque se um navegador continuasse reclamando de erros de sintaxe, enquanto outro comesse qualquer coisa que você jogasse nele e cuspisse um resultado (mais ou menos) correto, as pessoas naturalmente se concentrariam no último.

Enquanto muitos pensavam que as guerras dos navegadores haviam terminado, uma nova guerra entre os fornecedores de navegadores reacendeu nos últimos anos desde o lançamento do Chrome, a Apple começou a crescer novamente e pressionou o Safari, e o IE perdeu seu domínio. (Você pode chamar isso de "guerra fria" devido à cooperação e suporte percebidos pelos padrões pelos fornecedores de navegadores.) Portanto, não é de surpreender que mesmo os navegadores contemporâneos que supostamente estejam em conformidade com os padrões da Web realmente tentem ser "inteligentes" e permita um comportamento de quebra de padrão como esse para tentar obter uma vantagem como antes.

Infelizmente, esse comportamento permissivo levou a um crescimento maciço ( alguns podem até dizer cancerígeno) de páginas da web mal marcadas. Como o IE era o navegador mais branda e popular, e devido à contínua violação dos padrões da Microsoft, o IE tornou-se famoso por incentivar e promover um design ruim e propagar e perpetuar páginas quebradas.

Você pode se safar do uso de peculiaridades e explorações como essa em alguns navegadores por enquanto, mas, além do quebra-cabeça ou jogo ocasional ou algo assim, você deve sempre seguir os padrões da web ao criar páginas e sites para garantir que sejam exibidos corretamente e evite que fiquem quebrados (possivelmente completamente ignorados) com uma atualização do navegador.

Synetech
fonte
Eu diria que culpar essa peculiaridade em particular no IE é um pouco desagradável, porque quando várias novas tags foram adicionadas oficialmente (para HTML5), o IE era o único navegador importante que exigia um "calço" específico para torná-las elegantes . Isso se deve em parte aos regimes de atualização mais agressivos de outros navegadores (o que significa que versões antigas do IE permanecem mais longas que as versões antigas do Chrome do Firefox), mas é exatamente o oposto do IE ser "o mais branda".
IMSoP
HTML5? Hã? <imsocool>não é uma nova tag no HTML5. Isso não tem nada a ver com HTML5 ou IE 8, 9, etc. Esse tipo de comportamento não é uma novidade ; é um subproduto de guerras de navegador de anos . Mesmo que o IE não seja responsável pelas ofensas padrão atuais (apesar da ira dos desenvolvedores da Web, eles ainda se recusarem a se adaptar adequadamente), eles certamente eram notórios por promover práticas de codificação ruins por anos. Mais especificamente, navegadores brandos (o IE é o pior infrator) chegaram no pior momento, exatamente quando a Internet estava começando a decolar e os desenvolvedores da Web começaram a aprender HTML ... incorretamente.
Synetech
Eu não disse que isso tinha algo a ver com HTML5, mas tem a ver com tags não-padrão (como, por exemplo, <header>até que o HTML5 se tornasse o padrão alvo), das quais as versões antigas do IE certamente não são "tolerantes". Leniência também não é o mesmo que não conformidade - o HTML5 é um padrão extremamente pragmático que aceita a existência de HTML mal formado, diferente do idealismo das especificações anteriores do W3C, e essa "leniência" beneficia, sem dúvida, o crescimento democrático da web.
IMSoP
Mais uma vez, não estou falando de nenhum navegador ou versão específica. Estou explicando que a clemência em geral é um efeito colateral das guerras entre navegadores. O IE tolerou muitos comportamentos não padronizados e até simples, como tags ausentes, tags e atributos inválidos e tags com correspondência incorreta (<b><i>foobar</b></i> ). Isso não é segredo e nem mesmo é uma questão muito criticada e muito criticada. Como eu disse, o IE não foi o único navegador a permitir uma marcação ruim, mas como tinha uma participação de mercado tão grande e surgiu no momento certo (ou errado), contribuiu muito com a marcação ruim em geral .
Synetech
1

Embora os navegadores geralmente relacionem CSS às tags HTML, independentemente de serem válidas ou não, você ABSOLUTAMENTE NÃO deve fazer isso.

Tecnicamente, não há nada errado com isso da perspectiva do CSS. No entanto, o uso de tags inventadas é algo que você NUNCA deve fazer em HTML.

HTML é uma linguagem de marcação, o que significa que cada tag corresponde a um tipo específico de informação.

Suas tags inventadas não correspondem a nenhum tipo de informação. Isso criará problemas de rastreadores da Web, como o Google.

Leia mais informações sobre a importância da marcação correta .

Editar

Divs referem-se a grupos de vários elementos relacionados, destinados a serem exibidos em forma de bloco e podem ser manipulados como tal.

Os spans se referem a elementos que devem ser estilizados diferentemente do contexto em que estão atualmente e devem ser exibidos em linha, não como um bloco. Um exemplo é se algumas palavras em uma frase precisam ser maiúsculas.

Tags personalizadas não se correlacionam com nenhum padrão e, portanto, span / div deve ser usado com propriedades de classe / ID.

Existem isenções muito específicas, como Angular JS

Dan Green-Leipciger
fonte
3
"Nunca" nunca é a resposta certa - você parece ter esquecido XHTML;)
Izkata
divs e spans também não correspondem a nenhum tipo de informação. O Google e os leitores de tela parecem lidar bem com isso. É importante usar a marcação semântica, mas não é um argumento contra o uso de tags personalizadas.
precisa saber é o seguinte
2
Divs referem-se a grupos de vários elementos relacionados, destinados a serem exibidos em forma de bloco e serem manipulados como tal. Os spans se referem a elementos que devem ser estilizados de maneira semelhante e que devem ser exibidos em linha, não como um bloco. Tags personalizadas não se correlacionam com nenhum padrão e, portanto, span / div deve ser usado com propriedades de classe / ID.
Dan Green-Leipciger
Tirei sua parte dos leitores de tela porque está incorreta. A tecnologia de assistência lerá <imsocool>some awesome text</imsocool>bem porque será interpretada como <>...</>. O que não vai acontecer é que eles não serão capazes de pular para aquele pedaço de texto independentemente, como se fosse um <p>. Claro que se você escreveu seu próprio DOCTYPE e mapeados imsocoolpara p, ele iria trabalhar.
Ryan B
0

Embora o CSS tenha algo chamado "seletor de tags", ele não sabe realmente o que é uma tag. Isso resta para o idioma do documento definir. O CSS foi projetado para ser usado não apenas com HTML, mas também com XML, onde (supondo que você não esteja usando um DTD ou outro esquema de validação) as tags podem ser praticamente qualquer coisa. Você também pode usá-lo com outros idiomas, embora precise criar sua própria semântica para exatamente o que coisas como "tags" e "atributos" correspondem.

Os navegadores geralmente aplicam CSS a tags desconhecidas em HTML, porque isso é considerado melhor do que quebrar completamente: pelo menos eles podem exibir alguma coisa. Mas é uma prática muito ruim usar tags "falsas" deliberadamente. Uma razão para isso é que novas tags são definidas de tempos em tempos e, se uma é definida, parece com sua tag falsa, mas não funciona da mesma maneira, isso pode causar problemas com o site em novos navegadores.

The Spooniest
fonte
0

Por que o CSS funciona com elementos falsos? Porque não machuca ninguém, porque você não deve usá-los de qualquer maneira.

Por que meu professor não quer que eu use elementos inventados? Porque se esse elemento for definido por uma especificação no futuro, seu elemento terá um comportamento imprevisível.

Além disso, por que ele não sabia que os elementos inventados existem e funcionam com CSS. Eles são incomuns? Porque ele, como a maioria dos outros desenvolvedores da web, entende que não devemos usar coisas que possam quebrar aleatoriamente no futuro.

ADJenks
fonte