Sobre este problema HTML
O elemento <noscript> fornece conteúdo de fallback para utilizadores cujos navegadores não suportam scripting ou têm JavaScript desativado. Quando <noscript> aparece dentro de <head>, a especificação HTML restringe o seu conteúdo apenas a elementos de metadados — especificamente <link>, <style>, e <meta>. Uma etiqueta <img> é conteúdo de fluxo, não conteúdo de metadados, por isso não é permitida dentro de <head> independentemente de estar envolvida em <noscript>.
Quando <noscript> aparece dentro de <body>, no entanto, pode conter qualquer conteúdo de fluxo que seria normalmente válido nessa posição — incluindo elementos <img>. É por isto que a correção consiste simplesmente em realocar o bloco <noscript> do <head> para o <body>.
Este problema é extremamente comum com pixels de rastreamento de terceiros. Serviços como Facebook Pixel, LinkedIn Insight Tag, Google Tag Manager, e ferramentas similares frequentemente instruem você a colar um bloco <noscript> contendo um <img> de rastreamento 1×1 diretamente após a etiqueta de abertura <head>. Embora isto funcione nos navegadores (são tolerantes com HTML inválido), não está em conformidade com a especificação HTML e irá gerar um erro de validação.
Para além da conformidade com os padrões, manter o seu HTML válido garante comportamento previsível em todos os navegadores e tecnologias de assistência. Markup inválido pode levar à construção inesperada do DOM, o que pode causar problemas subtis com seletores CSS, consultas DOM JavaScript, ou ferramentas de acessibilidade.
Como corrigir
-
Localize o bloco
<noscript>que contém o elemento<img>dentro do seu<head>. -
Mova todo esse bloco
<noscript>para algum lugar dentro do<body>— tipicamente logo após a etiqueta de abertura<body>. -
Mantenha qualquer etiqueta
<script>associada no<head>se desejado; apenas o<noscript>com o<img>precisa de ser movido.
Exemplos
❌ Inválido: <img> dentro de <noscript> em <head>
Este é o padrão comumente fornecido pelas instruções de pixels de rastreamento de terceiros:
<!DOCTYPE html>
<html lang="en">
<head>
<title>My Page</title>
<script>
/* tracking script */
</script>
<noscript>
<img src="https://example.com/pixel?id=123" height="1" width="1" alt="">
</noscript>
</head>
<body>
<h1>Welcome</h1>
</body>
</html>
O validador reporta “Bad start tag in img in noscript in head” porque <img> não é conteúdo de metadados válido.
✅ Válido: <noscript> com <img> movido para <body>
Mova o bloco <noscript> para dentro do <body> deixando o <script> no <head>:
<!DOCTYPE html>
<html lang="en">
<head>
<title>My Page</title>
<script>
/* tracking script */
</script>
</head>
<body>
<noscript>
<img src="https://example.com/pixel?id=123" height="1" width="1" alt="">
</noscript>
<h1>Welcome</h1>
</body>
</html>
O <img> está agora dentro do <body> (via <noscript>), onde conteúdo de fluxo é permitido. O pixel de rastreamento continuará a funcionar corretamente para utilizadores com JavaScript desativado.
✅ Válido: <noscript> apenas com metadados em <head>
Se você apenas precisa de conteúdo de fallback de metadados no <head>, elementos como <meta>, <link>, e <style> são permitidos:
<head>
<title>My Page</title>
<noscript>
<style>
.js-only { display: none; }
</style>
</noscript>
</head>
Isto é válido porque <style> é conteúdo de metadados. Use este padrão quando precisar de aplicar estilos de fallback para utilizadores sem JavaScript, e reserve blocos <noscript> com <img> ou outro conteúdo de fluxo para o <body>.
Encontre problemas como este automaticamente
O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.