2011-10-31 8 views
8

Mi objetivo principal aplicación web para teléfonos inteligentes y tengo que cambiar el archivo CSS según el dispositivo (si hay problemas en la interfaz de usuario tenga que pulsar ellos), y tengo la intención de intercambio CSS usando el siguiente jQuery. Solo quiero saber si es una buena práctica y buena en rendimiento.Detectar dispositivo y cambiar el archivo CSS - jQuery

<link rel="stylesheet" href="basic.css" type="text/css" class="cssLink" /> 
<link rel="stylesheet" href="general.css" type="text/css" /> 

<script type="text/javascript"> 
    $(document).ready(function() { 

     // css file based on the device 
     var controlCss; 
     // get the device agent and conver to lover case 
     var deviceAgent = navigator.userAgent.toLowerCase(); 

     if(deviceAgent.match(/android/i)){ 
      controlCss = "android.css"; 
      $(".cssLink").attr("href", controlCss); 
     } 
     else if(deviceAgent.match(/webso/i)){ 
      controlCss = "webOS.css"; 
      $(".cssLink").attr("href", controlCss); 
     } 
     else if(deviceAgent.match(/iphone/i)){ 
      controlCss = "iphone.css"; 
      $(".cssLink").attr("href", controlCss); 
     } 
     else if(deviceAgent.match(/ipod/i)){ 
      controlCss = "ipad.css"; 
      $(".cssLink").attr("href", controlCss); 
     } 
     else if(deviceAgent.match(/blackberry/i)){ 
      controlCss = "bb.css"; 
      $(".cssLink").attr("href", controlCss); 
     } 
     else { 
      controlCss = "basic.css"; 
      $(".cssLink").attr("href", controlCss); 
     } 
    }); 
</script> 
+8

¿Alguna razón para evitar el uso de consultas CSS '@ media' con reglas de tamaño de pantalla? – kojiro

+1

@kojiro, no tengo ninguna objeción contigo, por supuesto, pensé mucho, pero más tarde, pensé que aumentaría el tamaño del archivo CSS, así que pensé en ir a archivos diff. –

+0

Nada te impide hacer eso. Debería leer la [documentación sobre consultas en los medios] (http://www.w3.org/TR/css3-mediaqueries/). – kojiro

Respuesta

15

1. ¿Es la mejor práctica?

depende de lo que se piensa en como la mejor práctica, también lo es la mejor práctica en el contexto de su aplicación y su empresa. Una cosa que me hace pensar es: ¿Pueden garantizar que todas sus páginas usarán jQuery? Si es así, entonces creo que este es un buen enfoque para lograr lo que buscas. Una alternativa sería hacer este lado del servidor, que garantizaría el mejor rendimiento, pero puede haber otras razones por las que no desea hacer esto (tal vez no tenga acceso al código del lado del servidor, o si desea mantener la mayor parte del funcionalidad en manos de programadores de front-end).

2.Is bueno en el rendimiento?

La respuesta corta es no. Además de necesitar la carga útil de 100K + de jQuery para inyectar el CSS en la página. La forma en que ha abordado el problema en este momento es esperar a que se cargue toda la página (y todas las dependencias) antes de agregarle estilos. Esto creará un 'salto' notable entre cuando la página se muestra al principio (sin estilos) y cuando los estilos se cargan y todo se mueve.

Cargando el lado del servidor CSS se deshace de esto, pero creo que todavía puede hacer esto en la interfaz de usuario y mantener la mayoría de su base de código en JavaScript, lo que hará que sea más fácil de mantener. Con el fin de hacer esto, quitar el fragmento en el que espera a que el documento que se debe cargar antes de llamar a su archivo CSS:

<link rel="stylesheet" href="basic.css" type="text/css" class="cssLink" /> 
<link rel="stylesheet" href="general.css" type="text/css" /> 

<script type="text/javascript"> 

    // No need to wait for document to load 
    // $(document).ready(function() { 

     // css file based on the device 
     var controlCss; 
     // get the device agent and conver to lover case 
     var deviceAgent = navigator.userAgent.toLowerCase(); 

     if(deviceAgent.match(/android/i)){ 
      controlCss = "android.css"; 
      $(".cssLink").attr("href", controlCss); 
     } 

     // etc.. 

    // }); 
</script> 

Para mejorar aún más el rendimiento se puede utilizar una solución que no depende de jQuery, en lugar de

$(".cssLink").attr("href", controlCss); 

se podría añadir #cssLink al elemento de hoja de estilo <link> y utilizar el DOM para hacer lo mismo:

document.getElementById("cssLink").setAttribute("href", controlCss); 

Este wo ULD que hacen mirada código como sigue:

<link rel="stylesheet" href="basic.css" type="text/css" css="cssLink" id="cssLink" /> 
<link rel="stylesheet" href="general.css" type="text/css" /> 

<script type="text/javascript"> 

     // .. blah blah .. 

     if(deviceAgent.match(/android/i)){ 
      controlCss = "android.css"; 
      // use a solution that does not need jQuery 
      document.getElementById("cssLink").setAttribute("href", controlCss); 
     } 

     // etc.. 

</script> 

De esta manera se retire la dependencia de la carga útil de más de 100K jQuery antes de poder aplicar sus hojas de estilo a la página.

ACTUALIZACIÓN:

También es posible aplicar reglas CSS en función del tamaño de la pantalla en lugar de dispositivo.

¿Ha tenido un vistazo a @media queries?

+0

Esa fue una gran respuesta ... gracias. Si uso consultas de medios, ¿no descargará el navegador todos los recursos necesarios para la página, incluso si no son necesarios? por ejemplo, si tengo una página y la veo en una tableta y tengo una tableta.css, desktop.css vinculada en la página (con consultas de medios) y desktop.css hace referencia a una imagen de fondo de 4mb, la tableta no ¿Tienes que descargar esa imagen por si acaso la necesita? – Ads

+1

Hiya @Ads, con respecto a las consultas de medios de CSS: la respuesta es que el navegador aislará un único estilo para el elemento que está buscando y prescindirá de los otros estilos, incluida la imagen de fondo 4mb si estructura correctamente su código CSS. Una vez dicho esto, debe tener en cuenta que las consultas de los medios no hacen distinción entre la tableta y el escritorio, solo funcionan en función del ancho, la orientación, la resolución, etc. consulte [este enlace] (https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Media_queries). –

+0

Gracias @Steven ... que hizo una buena lectura ... muy apreciada ... – Ads

Cuestiones relacionadas