Situación: Tenemos componentes que se han de mostrar de una manera u otra dependiendo de si hay javascript o no

Ejemplos típicos:

  • Un menú que se despliega con javascript, por lo tanto si no hay js ha de aparecer ya desplegado para que se pueda usar
  • Un botón que da funcionalidad con javascript, por lo tanto si no hay js no tiene sentido que aparezca
  • Un link que  da funcionalidad necesaria cuando no hay javascript, por lo tanto si hay js no es necesario que aparezca

Solución tradicional:

  • El menú se pinta desplegado y luego un método javascript lo colapsa
  • El botón no viene en el html si no que se añade posteriormente por medio de javascript
  • Se pinta el link y posteriormente se elimina por javascript

Problema: Si el explorador o la conexión es un poco lenta o la web es muy pesada podemos ver como los componentes aparecen y desaparecen delante de nuestras narices

Solución elegante: Tener separado un css para uso general y un css para uso con javascript que solo estará disponible cuando haya js de manera que la página se renderice como queremos a la primera

css/main.css:

.displayIfJS{display:none;}

css/javascript.css:

.hiddenIfJS{display:none;}
.displayIfJS{display:inline !important}
<html>
<head>
    <link href="css/main.css" rel="stylesheet" media="screen" type="text/css" />
    <script type="text/javascript">
    // <![CDATA[
        document.write('<link media="screen" href="css/javascript.css" rel="stylesheet" type="text/css"/>');
    // ]]>
    </script>
</head>
<body>
    <input class="displayIfJS" onclick="do()" type="button" name="Bóton JS" />
    <a class="hiddenIfJS" href="#do">Link sin JS</a>
</body>
</head>

El caso del menú desplegable es similar, simplemente la clase o clases que lo muestran colapsado estaría en javascript.css