Qual é o objetivo da classe HTML "no-js"?


510

Percebo que em muitos mecanismos de modelo, no HTML5 Boilerplate , em várias estruturas e em sites php simples, há a no-jsclasse adicionada à <HTML>tag.

Por que isso é feito? Existe algum tipo de comportamento padrão do navegador que reage a essa classe? Por que incluí-lo sempre? Isso não torna obsoleta a própria classe, se não houver nenhum caso "não-js" e o html puder ser endereçado diretamente?

Aqui está um exemplo do HTML5 Boilerplate index.html:

<!--[if lt IE 7 ]> <html lang="en" class="no-js ie6"> <![endif]-->
<!--[if IE 7 ]>    <html lang="en" class="no-js ie7"> <![endif]-->
<!--[if IE 8 ]>    <html lang="en" class="no-js ie8"> <![endif]-->
<!--[if IE 9 ]>    <html lang="en" class="no-js ie9"> <![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--> <html lang="en" class="no-js"> <!--<![endif]-->

Como você pode ver, o <html>elemento sempre terá essa classe. Alguém pode explicar por que isso é feito com tanta frequência?

Respostas:


493

Quando o Modernizr é executado, ele remove a classe "no-js" e a substitui por "js". Essa é uma maneira de aplicar diferentes regras de CSS, dependendo de o suporte a Javascript estar ou não ativado.

Veja o código fonte do Modernizer .


5
Há outro ótimo artigo aqui: alistapart.com/articles/…
Hannele:

47
Como o Modernizr substitui "no-js" por "js", você pode usar isso como uma maneira de fazer o equivalente a uma instrução if / else no seu código CSS. Por exemplo, .myclass { /* CSS code for all versions of your page goes here */ }, .js .myclass { /* This CSS code will only show up if JS is enabled */ }e .no-js .myclass { /* This CSS code will only show up if JS is disabled. */ }. Espero que isto ajude. -Nick
skcin7

33
@Ringo: HTML 5 especifica que qualquer elemento pode ter um classatributo. Embora o HTML 4 tecnicamente não funcione, nenhum navegador entra nele; mesmo aqueles que não o suportam simplesmente o ignoram, e eu não vejo um desses navegadores há anos.
precisa

4
@ZachL Sei que devo estar fumando crack aqui, mas parece-me que .js { padding: ...}está bem, já que você sabe como quem o implementou naquele corpo = .js. Mais diretamente ao seu ponto, parece que você está afirmando que body.jsé pior do que .js bodyo que eu não estou seguindo ...
wired_in

4
Vale ressaltar que o html5-boilerplate o coloca <html>e nenhum problema foi relatado contra isso. De alguma forma, colocá-lo em <html>prática tornou-se uma prática estabelecida e as pessoas imediatamente sabem o que é e o que faz. No final, desviar-se dessa prática apenas levanta mais questões.
Gregory Pakosz

109

A no-jsclasse é usada pela biblioteca de detecção de recursos Modernizr . Quando o Modernizr é carregado, ele é substituído no-jspor js. Se o JavaScript estiver desativado, a classe permanecerá. Isso permite que você escreva CSS que tenha como alvo facilmente qualquer uma das condições.

Da fonte anotada da Modernizrs (não mais mantida) :

Remova a classe "no-js" do elemento, se existir: docElement.className=docElement.className.replace(/\bno-js\b/,'') + ' js';

Aqui está um post de Paul Irish descrevendo essa abordagem: http://www.paulirish.com/2009/avoiding-the-fouc-v3/


Eu gosto de fazer a mesma coisa, mas sem o Modernizr. Coloquei o seguinte <script>no <head>para alterar a classe para jsse o JavaScript estiver ativado. Eu prefiro usar .replace("no-js","js")a versão regex porque é um pouco menos enigmática e atende às minhas necessidades.

<script>
    document.documentElement.className = 
       document.documentElement.className.replace("no-js","js");
</script>

Antes dessa técnica, geralmente eu aplicava estilos dependentes de js diretamente com JavaScript. Por exemplo:

$('#someSelector').hide();
$('.otherStuff').css({'color' : 'blue'});

Com o no-jstruque, isso agora pode ser feito com css:

.js #someSelector {display: none;}
.otherStuff { color: blue; }
.no-js .otherStuff { color: green }

Isso é preferível porque:

  • Carrega mais rápido sem FOUC (flash de conteúdo não estilizado)
  • Separação de preocupações, etc ...

1
A versão Modernizr usando um RegExp é mais segura (e provavelmente mais rápida).
precisa saber é o seguinte

@ AndrewF - você poderia talvez expandir um pouco isso? Como exatamente é mais seguro?
Zach Lysobey

12
@ZachL A versão regexp (with \b) não corresponde a algo como anno-jsus, a outra muda para anjsus. no-jsnão é uma substring típica de qualquer nome de classe, mas ainda assim é "mais seguro" com \bs.
Cucu

40

Modernizr.js irá remover a no-jsclasse.

Isso permite que você crie regras CSS para .no-js somethingaplicá-las somente se o Javascript estiver desativado.


17

A no-jsclasse é removida por um script javascript, para que você possa modificar / exibir / ocultar itens usando css se js estiver desativado.


Você disse "A classe no-js é removida por um script javascript". Então, como o Javascript funciona (capaz de remover a classe 'no-js') se estiver desativado. Você poderia me dar uma clara?
haind

2
Você está certo e este é realmente o ponto: se o JavaScript estiver desativado, a classe permanecerá e você poderá, por exemplo, mostrar alguma parte de html usando CSS para avisar o usuário sobre isso. .no-js #js-warning {display: block;}
marc

Esteja ciente, erros JS pode ocorrer após Modernizr fez isso, então não é uma maneira infalível de testar JS está funcionando
htmlr

11

Isso não é aplicável apenas no Modernizer. Vejo algum site ser implementado como abaixo para verificar se ele possui suporte a javascript ou não.

<body class="no-js">
    <script>document.body.classList.remove('no-js');</script>
    ...
</body>

Se houver suporte a javascript, ele removerá a no-jsclasse. Caso contrário no-js, permanecerá na etiqueta do corpo. Eles controlam os estilos no CSS quando não há suporte a javascript.

.no-js .some-class-name {

}

4

Veja o código fonte no Modernizer, nesta seção:

// Change `no-js` to `js` (independently of the `enableClasses` option)
// Handle classPrefix on this too
if (Modernizr._config.enableJSClass) {
  var reJS = new RegExp('(^|\\s)' + classPrefix + 'no-js(\\s|$)');
  className = className.replace(reJS, '$1' + classPrefix + 'js$2');
}

Então, basicamente, procure a no-jsclasse classPrefix + e substitua-a por classPrefix + js.

E o uso disso é diferente se o JavaScript não estiver sendo executado no navegador.


1

A classe no-js é usada para estilizar uma página da Web, dependendo de o usuário ter o JS desativado ou ativado no navegador.

De acordo com os documentos Modernizr :

no-js

Por padrão, o Modernizr será reescrito <html class="no-js"> to <html class="js">. Isso permite ocultar certos elementos que devem ser expostos apenas em ambientes que executam JavaScript. Se você deseja desativar essa alteração, pode definir enableJSClass como false em sua configuração.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.