<html>
<body>
<style type="text/css">
p.first {color:blue}
p.second {color:green}
</style>
<p class="first">Hello World</p>
<p class="second">Hello World</p>
<style type="text/css">
p.first {color:green}
p.second {color:blue}
</style>
<p class="first">Hello World</p>
<p class="second">Hello World</p>
</body>
</html>
Como um navegador deve renderizar css que não é contíguo? É suposto gerar alguma estrutura de dados usando todos os estilos css em uma página e usá-la para renderizar?
Ou ele renderiza usando informações de estilo na ordem em que vê?
CSS
eHTML
.<head>
tag<body>
e não no<head>
.Respostas:
Como outros já mencionaram, o HTML 4 exige que a
<style>
tag seja colocada na<head>
seção (mesmo que a maioria dos navegadores permita<style>
tags dentro dabody
).No entanto, o HTML 5 inclui o
scoped
atributo (consulte a atualização abaixo), que permite criar folhas de estilo com escopo definido no elemento pai da<style>
tag. Isso também permite que você coloque<style>
tags dentro do<body>
elemento:Se você renderizar o código acima em um navegador compatível com HTML-5 compatível
scoped
, verá o escopo limitado da folha de estilos.Há apenas uma grande ressalva ...
No momento em que escrevo esta resposta (maio de 2013), quase nenhum navegador mainstream atualmente suporta o
scoped
atributo. (Embora aparentemente as versões do desenvolvedor do Chromium sejam compatíveis).No entanto, há uma implicação interessante do
scoped
atributo que pertence a esta pergunta. Isso significa que os navegadores futuros são obrigatórios via padrão para permitir<style>
elementos dentro do<body>
(desde que os<style>
elementos tenham escopo definido).Então, dado que:
scoped
atributo<style>
tags dentro do<body>
<style>
tags (com escopo) dentro do<body>
... então, literalmente, não há mal nenhum em colocar
<style>
tags dentro do corpo, desde que você as proteja com umscoped
atributo no futuro . O único problema é que os navegadores atuais não limitarão o escopo da folha de estilo - eles a aplicarão a todo o documento. Mas o ponto é que, para todos os fins práticos, você pode incluir<style>
tags dentro do valor<body>
que você:scoped
atributo<body>
escopo não terá realmente um escopo (porque ainda não existe suporte ao navegador principal)* exceto, é claro, por irritar os validadores HTML ...
Finalmente, com relação à alegação comum (mas subjetiva) de que a incorporação de CSS no HTML é uma prática inadequada, deve-se observar que todo o objetivo do
scoped
atributo é acomodar estruturas de desenvolvimento modernas típicas que permitem que os desenvolvedores importem partes do HTML como módulos ou conteúdo sindicado . É muito conveniente ter CSS incorporado que se aplica apenas a um pedaço específico de HTML, a fim de desenvolver componentes modulares encapsulados com estilos específicos.Atualize a partir de fevereiro de 2019, de acordo com a documentação da Mozilla , o
scoped
atributo está obsoleto. O Chrome parou de suportá-lo na versão 36 (2014) e o Firefox na versão 62 (2018). Nos dois casos, o recurso teve que ser explicitamente ativado pelo usuário nas configurações dos navegadores. Nenhum outro navegador importante jamais o suportou.fonte
head
. Se esse for seu único CSS, e se a página for grande e se a conexão de rede não for muito rápida, talvez você veja um flash de conteúdo sem estilo, mas isso me surpreenderia nas situações mais práticas.@scoped
, ouscoped
parece estar morrendo: aqui e aquiscoped
atributo foi removido das especificações atuais do HTML5.Notícias ruins para "estilo no corpo" amantes: W3C recentemente perdeu a guerra HTML contra WHATWG, cujo versionless HTML "padrão de vida" agora se tornou a oficial, que, infelizmente, não não permitir
STYLE
noBODY
. Os dias felizes de curta duração terminaram. ;) O validador W3C também funciona com as especificações do WHATWG agora. (Obrigado @FrankConijn pelo aviso!)(Nota: esse é o caso "a partir de hoje", mas como não há controle de versão, os links podem se tornar inválidos a qualquer momento sem aviso ou controle. A menos que você queira vincular sua fonte individual ao GitHub, você basicamente não pode faça referências estáveis ao novo padrão oficial de HTML , AFAIK. Corrija-me se houver uma maneira canônica de fazer isso corretamente.)
BOAS NOTÍCIAS OBSILHADAS:
Yay,
STYLE
finalmente é válidoBODY
, a partir do HTML5.2! (Escoped
se foi também.)Das especificações do W3C ( aprecie a última linha! ):
NOTA LATERAL DO META:
O mero fato de que, apesar dos danos da "guerra dos navegadores", ainda tínhamos que continuar desenvolvendo contra dois padrões "oficiais" HTML " ridiculamente concorrentes " (aspas para
1 standard + 1 standard < 1 standard
) significa que a abordagem de "retorno ao senso comum nas trincheiras" o desenvolvimento web nunca realmente deixou de se aplicar.Isso pode finalmente mudar agora, mas citando a sabedoria convencional: autores / desenvolvedores da Web e, portanto, por sua vez, os navegadores devem decidir o que deve (e não deve) estar nas especificações, quando não há uma boa razão contra o que já foi feito em realidade. E a maioria dos navegadores têm apoiado
STYLE
emBODY
(de uma forma ou outra; ver, por exemplo oscoped
. Attr) (que, apesar de seu desempenho inerente (e possivelmente outros) Pênaltis nós . Deve decidir pagar ou não, não as especificações). Então, por um lado, continuarei apostando neles e não vou perder a esperança. ;) Se o WHATWG tiver o mesmo respeito à realidade / autores que afirmam, eles podem acabar fazendo aqui o que o W3C fez.fonte
style
bloco nobody
que valida?STYLE
como metadados e conteúdo de fluxo, mas as últimas especificações "vivas" do WHATWG contam a velha e chata história "apenas metadados" (permitindo apenas no HEAD). E, para adicionar insulto à lesão, o validador do W3C parece seguir o sabor WHATWG. Ainda não decidi rir ou chorar, mas com certeza decidi "errar" com o caso "browsers + W3C - validator" e permitir STYLE no BODY. (Aliás, não se esqueça: na verdade, devemos ser a melhor fonte do padrão .)Quando vejo que os sistemas de gerenciamento de conteúdo de sites grandes rotineiramente colocam alguns elementos <style> (alguns, não todos) próximos ao conteúdo que depende dessas classes, concluo que o cavalo está fora do estábulo.
Consulte as fontes da página do cnn.com, nytimes.com, huffingtonpost.com, o jornal da cidade grande mais próximo etc. etc. Todos eles fazem isso.
Se houver um bom motivo para colocar uma seção <style> extra em algum lugar do corpo - por exemplo, se você incluir () elementos de página diversos e independentes em tempo real e cada um tiver um estilo próprio incorporado, e a organização será mais limpa, mais modular, mais compreensível e mais sustentável - eu digo apenas morda a bala. Claro que seria melhor se pudéssemos ter um estilo "local" com escopo restrito, como variáveis locais, mas você trabalha com o HTML que possui, não com o HTML que deseja ou deseja ter posteriormente.
É claro que existem desvantagens em potencial e boas (se não sempre obrigatórias) razões para seguir a ortodoxia, como outras pessoas elaboraram. Mas, para mim, parece cada vez mais com o uso ponderado de <style> em <body> já se tornou popular.
fonte
HTML inválido; de qualquer maneira, praticamente todos os navegadores parecem considerar apenas a segunda instância.
Testado nas últimas versões do FF e Google Chrome no Fedora, e FF, Opera, IE e Chrome no XP.
fonte
Acho que isso varia de navegador para navegador: as regras de exibição global provavelmente serão atualizadas à medida que o navegador avança no código.
Às vezes, você pode ver essas alterações nas regras de exibição global quando uma folha de estilo externa é carregada com um atraso. Algo semelhante pode acontecer aqui, mas em uma sucessão tão curta que na verdade não é renderizada.
De qualquer forma, não é HTML válido, então eu diria que é uma coisa fútil para se pensar.
<style>
tags pertencem àhead
seção da página.fonte
Como já foi dito, esse HTML inválido não é válido, pois as tags de estilo pertencem à cabeça.
No entanto, a maioria dos navegadores realmente não impõe essa validação. Em vez disso, depois que o documento é carregado, os estilos são mesclados e aplicados. Nesse caso, o segundo conjunto de estilos sempre substituirá o primeiro porque foram as últimas definições encontradas.
fonte
A
<style>
tag pertence à<head>
seção, separada de todo o conteúdo.Referências: Especificações do W3C e W3Schools
fonte
No seu exemplo, um navegador não deve "fazer nada". O HTML é inválido. A recuperação de erros é acionada ou o analisador faz o que quiser.
Em uma instância válida, várias folhas de estilo são tratadas como aparecendo uma após a outra, a cascata é calculada normalmente.
fonte
Eu acho que isso pode ser uma questão sobre contextos limitados, por exemplo, editores WYIWYG em um sistema web usado por usuários não programadores , que limita as possibilidades de seguir os padrões. Às vezes (como o TinyMCE), é uma biblioteca que coloca seu conteúdo / código dentro de uma
textarea
tag, renderizada pelo editor como umadiv
tag grande . E, às vezes, pode ser uma versão antiga desses editores.Suponho que:
stylesheets
. Na verdade, seria impraticável para os administradores (ou webdevs), considerando o número de solicitações nesse sentido que elas teriam.Em alguns casos, sem
style
regras de uso , pode ser uma experiência de design muito ruim. Então, sim, esses usuários precisam de personalização. Ok, mas quais seriam as soluções nesse cenário? Considerando as diferentes maneiras de inserir CSS em umahtml
página, suponho que estas soluções:1ª opção: pergunte ao seu sysadm
Peça ao administrador do sistema para incluir algumas regras CSS no sistema
stylesheets
. Essa será uma solução CSS externa ou interna . Como já foi dito, pode não ser possível.2ª opção:
<link>
ativada<body>
Use uma folha de estilo externa na
body
tag, ou seja, o uso dalink
tag dentro da área que você tem acesso (que será, no site, dentro dabody
tag e não nahead
tag). Algumas fontes dizem que está tudo bem, mas "não é uma boa prática", como o MDN :Alguns outros o restringem à
<head>
seção, como w3schools :Teste
Eu testei aqui (ambiente de desktop, em um navegador) e funciona para mim. Crie um arquivo
foo.html
:E, em seguida, um arquivo CSS, no mesmo diretório, chamado
bar.css
:Bem, isso só parece possível se você tiver como fazer upload de um arquivo CSS em algum lugar do sistema da instituição. Talvez este fosse o caso.
3ª opção:
<style>
ativada<body>
Use a folha de estilo da Internet na
body
etiqueta, ou seja, o uso dastyle
etiqueta dentro da área a que você tem acesso (que será, no site, dentro dabody
tag e não nahead
tag). É disso que trata as respostas de Charles Salvia e Sz aqui. Escolhendo esta opção, considere suas preocupações.4ª, 5ª e 6ª opções: maneiras JS
Alerta Esses estão relacionados à modificação do
<head>
elemento da página. Talvez isso não seja permitido pelos administradores de sistema da instituição. Portanto, é recomendável pedir permissão a eles primeiro.Ok, supondo a permissão concedida, a estratégia é acessar o
<head>
. Quão? Métodos JavaScript.4ª opção: novo
<link>
em<head>
Esta é outra versão da 2ª opção. Use uma folha de estilo externa na
<head>
tag, ou seja, uso do<link>
elemento fora da área que você tem acesso (que será, no site, não dentro dabody
tag e sim dentro dahead
tag). Esta solução está em conformidade com as recomendações da MDN e da w3schools , conforme citado acima, na segunda opção de solução. Um novoLink
objeto será criado.Para resolver o problema por meio do JS, existem várias maneiras, mas nas seguintes linhas de código eu demonstro uma simples.
Teste
Eu testei aqui (ambiente de desktop, em um navegador) e funciona para mim. Crie um arquivo
f.html
:Dentro da
script
tag:E então, no arquivo CSS, no mesmo diretório, chamado
bar.css
(como na segunda opção):Como eu já disse: isso só parece possível se você tiver como fazer upload de um arquivo CSS em algum lugar do sistema da instituição.
5ª opção: novo
<style>
em<head>
Use uma nova folha de estilo interna na
<head>
tag, ou seja, use um novo<style>
elemento fora da área que você tem acesso (que será, no site, não dentro dabody
tag e sim dentro dahead
tag). Um novoStyle
objeto será criado.Isso é resolvido através do JS. Uma maneira simples é demonstrada a seguir.
Teste
Eu testei aqui (ambiente de desktop, em um navegador) e funciona para mim. Crie um arquivo
foobar.html
:Dentro da
script
tag:6ª opção: usar um já existente
<style>
em<head>
Use uma folha de estilo interna existente na
<head>
tag, ou seja, uso de um<style>
elemento fora da área que você tem acesso (que será, no site, não dentro dabody
tag e sim dentro dahead
tag), se houver algum. Um novoStyle
objeto será criado ou umCSSStyleSheet
objeto será usado (no código da solução adotada aqui).Isso é arriscado em algum ponto de vista. Primeiro , porque talvez não exista algum
<style>
objeto. Dependendo da maneira como você implementa esta solução, você pode obterundefined
retorno (o sistema pode usar folhas de estilo externas ). Segundo , porque você estará editando o trabalho do autor do design do sistema (problemas de autoria). Terceiro , porque pode não ser permitido nas políticas de segurança de TI da sua instituição. Portanto, peça permissão para fazer isso (como em outras soluções JS) .Supondo, novamente, a permissão foi concedida:
Você terá de considerar algumas restrições do método disponível para desta forma:
insertRule()
. A solução proposta usa o cenário padrão e uma operação no primeirostylesheet
, se houver algum.Teste
Eu testei aqui (ambiente de desktop, em um navegador) e funciona para mim. Crie um arquivo
foo_bar.html
:Dentro da
script
tag:Outra abordagem para esta solução é usar
CSSStyleDeclaration
objeto (documentos em w3schools e MDN ). Mas pode não ser interessante, considerando o risco de substituir as regras existentes no CSS do sistema.7ª opção: CSS embutido
Use CSS embutido . Isso resolve o problema, embora, dependendo do tamanho da página (em linhas de código), a manutenção (pelo próprio autor ou outra pessoa designada) do código possa ser muito difícil.
Mas, dependendo do contexto de sua função na instituição ou de suas políticas de segurança do sistema da web, essa pode ser a solução disponível exclusiva para você.
Teste
Crie um arquivo
_foobar.html
:Respondendo estritamente à pergunta de Gagan
(citação adaptada)
Para uma resposta mais precisa, sugiro ao Google os seguintes artigos:
fonte
Como este HTML não é válido, não afeta o resultado ... significa apenas que o HTML segue o padrão (apenas para fins organizacionais). Por uma questão de validade, poderia ter sido escrito desta maneira:
Meu palpite é que o navegador aplica o último estilo que aparece.
fonte
Sim pode. Eu verifiquei na página da Mozilla. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style
fonte