sábado, 23 de julio de 2016

Mejora tu codigo CSS, no hagas desastres !!

En este post voy a repasar algunas técnicas, ideas y metodologías que uso para escribir un código CSS escalable, mantenible, predecible y reusable. 

El 99% de los programadores está de acuerdo: “Nombrar cosas es por mucho lo más difícil de hacer cuando programas”. Buscar los nombres correctos para variables, métodos ó los nombres de clases para elementos HTML es muy complicado, esto es debido por que no podemos predecir el futuro de los diseños y funcionalidades. Por ejemplo:

El nombre de una clase de un elemento HTML puede tener mucho sentido hoy, pero si el diseño cambia una semana después, ese nombre de clase puede no encajar en la nueva estructura. También pasa lo mismo cuando una característica es añadida ó removida en una aplicación debido a que el cliente así lo decidió. Como resultado de estos cambios tenemos que hacer un refactoring de nuestro código para que ahora pueda tener sentido. Este ciclo se repite constantemente a lo largo de cualquier proyecto, por lo cual tenemos que tener mucho cuidado cuando nombramos los elementos.

No existe una técnica única para nombrar elementos correctamente, pero existen ciertas guías que pueden ayudarnos. En este artículo quiero enfocarme en cómo nombrar los elementos en CSS.

En el momento en el que estemos bloqueados y no sabemos que nombre de clase ponerle a un elemento HTML, usa las siguientes sugerencias, las cuales podemos dividir en:

Nombres de clases funcionales


Ejemplos de estos nombres: save_button , delete_button , selected_tab. El nombre de estos elementos está basado en la función que desempeñan. Con solo leer el nombre sabemos que ese boton es por ejemplo para guardar.

El diseño puede cambiar pero la función de ese elemento no lo hará. Nombrar elementos de esta manera seria lo ideal pero no a todos los elementos podemos darles nombres basados en su funcion. Por ejemplo una caja de texto necesita una sombra para verse bien ó un icono tiene que ser azul por que se mira bonito.

No todo estilo visual en un sitio web tiene una justificación funcional para poder nombrarlo.


Nombres de clases basado en el contenido


Ejemplo de estos nombres: intro_text , description_item , image_product. Este tipo de nombres describen el contenido de los elementos. Esta es la manera más obvia y facil de nombrar elementos. En sitios web pequeños es lo mejor que puedes hacer, pero para grandes proyectos no es lo ideal escribir todo tu estilo usando una única clase.


Nombres de clases basado en la presentación


Ejemplos de estos nombres: red_button , big_text , vertical_menu, horizontal_menu , bold_text . Este tipo de nombres describe el estilo del elemento, es decir la manera en como lucen y son presentados en el sitio web. También este tipo de nombres son muy descriptivos para cualquier programador, por ejemplo: “border_image” con solo leer ese nombre sabes que el estilo seria unos bordes en la imagen.

La ventaja de estos nombres es que son reutilizables, por ejemplo “big_text” puede ser usado en muchos elementos donde queremos el texto en grande, no importa si es un título de página, nombre de persona ó título de producto, solamente nos interesa que sea un grande.

Piensa en esto : Los nombres de clases tienen significado y propósito, evita nombres que no sean descriptivos. Mantén en mente que los nombres de clases son para programadores, no para usuarios., Piensa en que un nombre de clase con solo leerla tiene que entregar toda la información posible sobre lo que hace a los programadores y a tu futuro yo.

Siempre debemos procurar que nuestro código CSS sea:

Predecible: Tus reglas CSS deben comportarse como su nombre lo indica. Cuando cambias ó actualizas un estilo solo debe afectar la parte que estas trabajando, no debería de afectar otra partes adicionales Ejemplo: vertical_menu , big_button, text_center .

En estos ejemplos se puede ver claramente la intención del estilo.

Reusable: Tus estilos deberían de ser lo suficientemente abstractos y estar lo menos atados posibles a un elemento en específico, para permitirte construir nuevos estilos a partir de ellos, sin tener que reescribir el mismo estilo de nuevo. Ejemplo: shadow_big , round_square.

Estas dos clases se puede usar en un mismo elemento para darle sombras y crear bordes redondeados y así crear un nuevo estilo combinado.

Mantenible: Cuando el diseño web cambia y hay nuevos elementos en escena, tu código CSS no debería de sufrir un cambio drástico, un nuevo elemento Y no debería de afectar al elemento X antiguo.

Ejemplo: Si tienes un sidebar a la izquierda y el nuevo diseño dice que ahora son 2 sidebar al mismo tiempo en ambos lados. Con solo crear una clase nueva llamada “sidebar_rigth” deberías de solucionar el problema

<div class=”sidebar sidebar_left”>menu</div>
<div class=”sidebar sidebar_rigth”>menu</div>

De esta manera la clase “sidebar” aplica el estilo general y las otras solo cambian la posición.

Escalable: Esto significa que tu código CSS debe de ser fácilmente editable por una persona o por un equipo, que no tiene una curva de aprendizaje alta  y es facilisimo de entender. Solo por que tu eres el único programador hoy actualizando este código no quiere decir que siempre sera así


Malas practicas en CSS


Ahora vamos a ver un poco de malas practicas CSS para saber que no debemos de hacer.
Dar estilo basado en el padre:  Ejemplo:

#produc title_shadow {
}
#menu item_visited {
}
.contact .image_responsive {
}

En los 3 ejemplos anteriores no podremos reusar los estilos de “title_shadow” para texto con sombras, “item_visited” para links visitados y “image_responsive” para imagenes responsivas por que estamos forzando a que sean hijos de otros elementos.

Cuando tengas estilos generales, siempre analiza si puedes reusarlos en otros elementos de tu web.

Selectores CSS muy complicados:  Es cierto que CSS nos brinda muchos selectores que podemos usar, pero ojo no por eso vamos a abusar de ellos. Los siguientes son algunos malos ejemplos:

#menu ul li {
}
#sidebar > div + p {
}
table tr ul p {
}

Entre más selectores uses más amarrado esta al HTML, lo que provoca que cualquier cambio en el diseño web afecte a tu CSS también. Este tipo de reglas no son reusables, ni mantenibles por que están apuntando a un elemento en una posicion específica en el HTML

¿ Como podria otro elemento usar el mismo estilo, si tiene una estructura HTML distinta ?

Simple no puede. En lugar puedes usar nombres de clases directos. Los ejemplos anteriores podrían reescribirse así:

.menu_item {
}
.paragraph_description {
}
.descrition_table {
}

Nombres de clases simples y sin significado: 

.title {
}
.content {
}
.name {
}

Este tipo de nombres hay que evitarlos, son muy genéricos y no son informativos para el programador, por ejemplo ”title” ¿ titulo de que ?. con solo leerlo no podemos saber si es en un menú, en una sidebar ó titulo de artículo.

Otro problema es que como el nombre es muy generico, algun compañero podria sobreescribir tu CSS con mucha facilidad por accidente. Este tipo de nombres producen CSS impredecible.

Un estilo que hace mucho:

.user_messages {
     position: relative;
     border: 1px solid gray;
     background-color: white;
     font-size: 15px;
     marging-top: 50px;
     left: 10px; 
}

Imagina que el estilo anterior es para para un caja que muestra los mensajes de usuarios, arriba en el centro de la página. Tiene un margen y lo mueve un poco a la derecha.

¿ Que pasa si quiero mostrar esta misma caja al mismo tiempo en una sidebar derecha ? 

Luciria muy mal , porque el estilo está haciendo muchas cosas: Esta definiendo aspecto y posicion dentro de la misma regla. El aspecto es algo que podemos reusar pero la posicion no, por eso toda la regla está comprometida. Lo mejor sería dividirla así:

.user_messages {
     position: relative;
     border: 1px solid gray;
     background-color: white;
     font-size: 15px;
}
.user_message_top {
    marging-top: 50px;
    left: 10px; 
}

Así el elemento en la sidebar solo puede usar la clase “user_messages” para obtener el estilo.


Usar clases solo para dar estilos y solo eso


El problema aquí es que en proyectos grandes te encuentras con nombres de clases que tienen muchos propósitos por ejemplo: para dar estilos , para hacer alguna función por medio de javascript , como ancla para algún plugin jquery , etc.

Las clases tienen muchas responsabilidades y cuando lees los nombres no son muy descriptivos, no hay nada que te indique para que son. Removerlas ó actualizarlas es todo un caos. La unica recomendacion que puedo hacer aquí es que tus clases solo deben ser usadas para dar estilos y nada más que eso. Y si necesitas alguna clase para hacer algo con javascript la recomendación es que crees otra clase y le pongas al inicio “js-”

Ejemplo: js-drapdrop , js-list-autocomplete , js-grid

Cualquier clase que no comience con “js-” ya sabemos que solo es para dar estilo nada mas y podremos removerla o cambiar el nombre con confianza.


Metodologías CSS


Ahora solo nos falta por hablar sobre algunas metodologías CSS para nombrar clases, las cuales pueden ser muy útiles para escribir un código limpio. Las metodologías CSS son en palabras sencillas, consejos para estructurar mejor nuestro código CSS con el fin de que sea mantenible y escalable.

Existen muchas metodologías para escoger : OOCSSSMACSSBEM solo para nombrar algunas. Yo quiero hablar sobre BEM.

BEM es una metodología que consiste en : “block , element , modifier”. Sugiere escribir tu código CSS de manera estructural basado en elementos y modificadores. Usando BEM no esta permitido usar Ids. Ejemplo:

.block {}
.block__element {}
.block--modifier {}

block : define un bloque que contiene elementos
block__element : elementos que componen al bloque
block--modifier : reglas que modifican el estilo del bloque, ya sea estilo de presentación, posicion ó maquetado.

Para entender mejor esto veamos la siguiente imagen:

Caja de busqueda

En la imagen podemos ver una caja de búsqueda y un botón, esto es considerado un block y todos los elementos dentro de él son parte de este block. Siguiendo la metodología BEM podemos escribir las clases de esta manera.

.search {}
.search__input {}
.search__button {}
.search--big {}
.search--tiny {}

Hasta aquí lo más simple de BEM, no sería prudente escribir un tutorial completo sobre esto cuando en internet existen muchos y muy buenos. Si quieres saber más sobre esta metodología recomiendo leer los siguientes enlaces:


https://www.smashingmagazine.com/2016/06/battling-bem-extended-edition-common-problems-and-how-to-avoid-them/

Recuerda que BEM ó cualquier otra metodología no va a resolver todos tus problemas, son solo maneras muy poderosas de hacer nuestro código mantenible y escalable para que todos en tu equipo tengan una idea clara de cómo mejorar el actualizar y mejorar el CSS.






links


Guia para iniciar en flex-box con CSS 3


propiedades flex-box
descripción de las propiedades flex-box

Flex-box es la nueva técnica de maquetación CSS 3, con la cual es mucho más fácil crear estructuras HTML sin tener que usar float, inline-block o los muchos trucos que usábamos antes. 2015 es el momento indicado para aprender usar flex-box ya que ha alcanzado un buen soporte en navegadores. Puedes consultarlo en caniuse.com.

La primera idea que tuvimos en codingonweb fue hacer un buen tutorial sobre como usar flex-box, pero en el proceso de conseguir información me encontré de que ya existen muy buenos tutoriales para aprender desde cero. Con este artículo solo quiero aclarar ciertas cosas que considero no son explicadas claramente, asi pueden usar este articulo como complemento para los tutoriales.

El primero paso es leer los excelentes tutoriales de flex-box que he encontrado:
Ahora si no quedastes claro y necesitas una refuerzo lee el resto del articulo, aunque si le entendiste a la primera no sera necesario.

Flexbox ofrece una manera eficiente de maquetar cubriendo espacios disponibles ya sea expandiendo o encogiendo a sus elementos hijos. Para usar flex-box solo tienes que usar en un contenedor la propiedad display: flex. Esto convierte al elemento en un contenedor flex-box y automáticamente todos los elementos hijos directos se consideran elementos flexbox.

Aquí tienes un ejemplo sencillo para ver mejor en acción flex-box. Le he puesto una altura al contenedor para una mejor comprensión.

Ahora lo interesante aquí es que con este ejemplo no podemos ver en acción lo de : “cubriendo espacios disponibles ya sea expandiendo o encogiendo a sus elementos hijos”. Para esto solo tienes que agregar ancho a los elementos hijos, no importa si es en píxeles ó porcentajes. Lo interesante es que si el ancho de los hijos excede el ancho de su contenedor, flex-box fuerza a sus hijos a encogerse, logrando el comportamiento de caja flexible. Ejemplo (redimensiona la zona de resultado)

Como puedes ver flexbox nos crea unas cajas flexibles que se adaptan automáticamente.
La propiedad “justify-content” sirve para determinar cómo queremos alinear los elementos flexbox(hijos) dentro de su contenedor en el eje horizontal. Ojo que para poder ver en acción esta propiedad la suma de los anchos de los hijos no tiene que exceder el 100% de su padre, tienes que dejar un espacio para poder ver como flex-box alinea los elementos, Ejemplo

Ahora por defecto flex-box toma todos los hijos y los encoge ó expande para que siempre estén dentro de su contenedor no importa si la suma de sus anchos exceden el 100% del ancho de su padre ó hay elementos adicionales, ejemplo:

Como puedes ver en el ejemplo anterior los hijos tienen 25% de ancho y son 7, por lo que 25*7 = 175%, sobrepasa totalmente el 100% del padre pero flex-box los mantiene dentro de su contenedor. Este comportamiento es por defecto, pero podemos cambiarlo con la propiedad “flex-wrap”. Ejemplo:

En el ejemplo anterior podemos ver que cambiando el valor de esta propiedad podemos hacer que los elementos que no caben en el contenedor sean desplazados hacia abajo. Hay que poner mucha atención en que cada elemento ocupa 25% entonces solo 4 de ellos alcanzan en su contenedor padre para lograr el 100% los demás sobrantes serán desplazados, La propiedad “align-items” es usada para alinear los elementos flex-box (hijos) en el eje vertical. Ejemplo:

En el ejemplo he alineado los elemento hacia abajo en el eje vertical. También podemos hacerlo en el centro:

Las propiedades anteriores son solo algunas de las mas comunes y que se usan solamente en el contenedor flexbox. Pero los hijos también tienen propiedades que podemos usar para manipularlos individualmente como son:

Order: Se usa para alterar el orden de los elementos, independientemente del orden en el HTML. Por defecto todos los elementos flex-box tiene 0. Si queremos pasar un elemento de primero sobre todos los demas usamos -1. Ejemplo:

La parte interesante aquí es que el orden va de menor a mayor, como -1 es menor que cero , este elemento ira de primero. Ahora nos toca hablar de 2 propiedades que son muy poco utilizadas pero que tienden a la confusión, estas propiedades son usadas solo en elementos flex-box(hijos):

flex-grow: Determina cuanto un elemento va crecer con respecto a los otros hijos dentro del mismo contenedor, si hay espacio disponible para hacerlo. Ejemplo:

Ojo esto es muy importante : “si hay espacio disponible para hacerlo”, lo que quiero decir, es que si entre todos los hijos logran el 100% de ancho del padre no habrá espacio para ser usado por la propiedad flex-grow. Ejemplo:

Como puedes ver en el ejemplo anterior los hijos ahora tienen 15% , lo cual hacen 75% entre todos. El resto del espacio disponible lo toma el elemento con flex-grow.

flex-shrink: Es el inverso del flex-grow, determina cuanto un elemento se va encoger con respecto a los otros hijos dentro del mismo contenedor. Para ver esto en acción los demás hijos tienen que aumentar su tamaño para forzar que se encoja. Para comprender mejor este comportamiento haz lo siguiente con el siguiente ejemplo:

En el ejemplo anterior el tercer div tiene la clase “shrink”, ahora aumenta el tamaño de los elementos con la clase “container_item” de 25% a 40% y haz click en play. Solo se encoge cuando la suma del ancho de todos los hijos supera el 100% de contenedor.

flex-basis: define un tamaño base para un elemento, lo demas elementos se van a comportar en base a este. Es muy util para hacer algo como esto Ejemplo:

Flex-box viene a solucionar muchos problemas de maquetacion que teniamos y aprender a usarlo te quitara muchos dolores de cabeza. Par terminar te recomiendo los siguientes link para completar tu aprendizaje:




¿ Que es una página web 404 ?

404 wikipedia

Imaginemos que tenemos un sitio web con la siguiente estructura:
  • index.html
  • blog.html
  • productos.html
  • contacto.html
Cuando nuestros visitantes entran a nuestro sitio atraves de una url por ejemplo: www.minegocio.com , el archivo que se carga por defecto es el index.html. Despues nuestros usuarios navegan por el sitio web por medio de links que los conducen a cada una de las secciones. Por ejemplo:
  • www.minegocio.com/blog.html
  • www.minegocio.com/productos.html
  • www.minegocio.com/contacto.html
Aqui todo bien. Pero que pasa, cuando un link no apunta al archivo correcto ó cuando el archivo ya no existe ó el usuario escribio mal la direccion. En todos estos casos seguramente los visitantes verán una página 404 algo similar a esta, dependiendo del navegador que usen:

404 page no found

Esta pagina solo les dice a los usuarios que la página o contenido que estaba buscando no fue encontrado. El usuario menos experimentado en este momento no sabe que paso o que hacer, lo cual es frustrante. No sería una mejor idea que cuando esto pasara, le indicaramos al usuario un poco más de información sobre lo que ha pasado y tal vez alguna sugerencia para tratar de resolver el problema. 

De esta manera podemos guiar a nuestros visitantes de una manera correcta hacia donde podría encontrarse la información. Para esto es que existen las páginas 404. Si creas un archivo y le pones de nombre “404.html”, esa página siempre será cargada cada vez que los visitantes intenten acceder a un contenido que no existe o que los link estan incorrectos.

Dentro de este archivo podemos incluir toda la información necesaria de por que ocurrió ese error e información útil para guiarlo hacia otro contenido que podria interesarle
En internet existen sitios donde puedes descargar páginas 404, para incluirla en tu pagina web solo basta con buscar y descargar.

Si quieres crear tu mismo tu página 404 puedes obtener inspiración en google buscando por el término por ejemplo: “best 404 page”. Un sitio que tiene un buen top de esta pagina es :


Otra idea muy útil es incluir un formulario de búsqueda en estas paginas para darle al usuario una opción de buscar en sitio web. Si quieres saber como lograr esto necesitas saber un poco de javascript y el uso de las API de Google. Para una guia paso a paso puedes visitar este web:


Aunque una pagina sencilla y con información descriptiva puede bastar para sitios sencillos.





martes, 12 de julio de 2016

¿ Que es SEO y SEM ? ¿ Porqué es importante ?

Google, Yahoo y Bing son algunos de los  motores de búsqueda más populares, con el único fin de ayudarnos a encontrar lo que buscamos en internet. Cada vez que buscas algo en uno de estos buscadores te muestra una serie de resultados paginados. En estos resultados pueden salir miles de paginas web. Pero alguna vez te has preguntado ¿ como funciona esto ?

En palabras simples cada buscador escanea la web indexando cada uno de las sitios web que encuentra. A cada uno de estos sitios encontrados, cada buscador usando sus propios métodos les asigna cierta “relevancia” y determina si es importante mostrar este sitio en sus resultados.

Con el tiempo las personas se dieron cuenta que realmente se podía ganar dinero si lograban que su sitio web saliera en los primeros resultados de los buscadores, fue entonces cuando de manera obvia llegaron a la conclusión de que necesitaban algún método para lograr que sus sitios fueran relevantes para los buscadores.
A esto se le conoce como posicionamiento en buscadores.

Nace el SEO y SEM


SEO: “Search Engine Optimization” El SEO se centra en los resultados orgánicos, es decir todo el esfuerzo necesario que tenemos que hacer para salir en los primeros lugares en los buscadores sin tener que  pagar (por ejemplo a Google) Hacer SEO se le conoce por tener que hacer una serie de cambios en tu sitio web a nivel de código para que los buscadores pueden indexar (rastrear) correctamente tu web y de esta manera aparecer en los primeros lugares.

SEM: “Search engine marketing” SEM son los resultados de pago, es decir tu pagas para que tu página web siempre salga en los primeros resultados. Aqui manda el que tiene más dinero para salir primero y por lo general te cobran cada vez que alguien ha hecho click en tu anuncio.

Como puedes ver en la siguiente imagen, los anuncios pagados SEM siempre salen de primeros lugares  y los de no pago (orgánicos) abajo de ellos
.
donde estan seo y sem en google

Algo interesante de notar es que el 70% de los clicks se hacen en el área de los resultados orgánicos  SEO y el 30% en el área SEM. Por lo que un buen SEO es de mucha importancia.

sem y seo donde se hacen mas clicks

El siguiente mapa de calor también nos da una buena idea de donde se hacen la mayoría de los clicks

seo y sem mapa de calor de click de usuarios

Pero esto no significa que debemos dejar el SEM a un lado, por que aunque el SEM tiene menos porcentajes de clicks , el ratio de conversión (ventas) de SEM es más alto que SEO es decir los visitantes que llegan a tu sitio web por medio de SEM posiblemente tengan más probabilidad de comprar.
  • SEM ratio de conversion : 2.03%
  • SEO ratio de conversion: 1.26%
Una mezcla de las técnicas es muy saludable si quieres posicionar tu web, un tiempo haces SEO y otro SEM.

Existen personas que todavía que no les interesa estar en los buscadores ya sea por que tienen muchos seguidores en sus redes sociales ó por que sus ventas se han mantenido estables hasta el momento.

Pero considera esto, segun http://www.comscore.com/ se hacen 5000 millones de busquedas al dia en Google , esto es 3 millones de busquedas por minuto. Por lo que si tu no estas en los buscadores seguramente tu competencia si lo esta y estas perdiendo potenciales clientes.

Por ejemplo si tu tienes un hotel y escribes por ejemplo : “Hotel en Nicaragua” Todos lo resultados que veas serán todos tus competidores que ya tienen ventaja sobre ti.
Las redes sociales también juegan un papel importante para hacer SEO, por medio de ellas puedes crear viralidad de tus páginas al hacer que tus seguidores compartan tu web con sus amigos.

SEO y dispositivos moviles


Recientemente Google empezó a penalizar los sitios web que no estan optimizados para dispositivos móviles, por lo que tienes que hacer todo lo posible para que tu sitio web sea compatible con tablets, celulares, etc. por que tendra un gran impacto en tu estrategia de posicionamiento en buscadores.

Google ofrece una herramienta útil para saber si tu sitio esta optimizado para móviles: https://www.google.com/webmasters/tools/mobile-friendly/

¿ Por que razon Google hace esto ?  bueno el siguiente tweet te responde:

60% of consumers use mobile search for purchase decisions – is YOUR website responsive? via @rivaliq

Recuerden que si ustedes estan en internet necesitan una estrategia de posicionamiento en buscadores SEO, no existe nada, ni nadie que no se beneficie de una estrategia SEO, no hacerlo es simplemente tonto por que seguramente tu competencia lo esta haciendo.
Si quieres aprender a fondo sobre posicionamiento en buscadores solo tienes que hacer una pequeña busqueda en Google sobre cursos SEO No te pierdas la explicación sencilla de google de como trabaja su buscador, esta muy interesante en el siguiente enlace:


Google en 2011 publico un articulo con unas guia que debes de tener en cuenta para crear contenido para tu web, aunque son un poco viejitas siguen siendo muy buenas practicas a seguir. Guia de como crear contenido de calidad de google 211

Google lee contenido dinamico


Ahora nos toca pasarnos al tema de javascript. Muchos expertos SEO recomiendan insertar lo menos posible contenido por medio de codigo javascript por que corremos el peligro que google no pueda indexar nuestro contenido, no pueda leer las tags y nuestros enlaces.
Pero un grupo de expertos SEO se dio a la tarea de hacer pruebas para comprobar si Google no puede indexar contenido generado con javascript, ¿ el resultado ? GOOGLE INDEXA TODOOO !!

Para leer los resultado y las pruebas visita el siguiente link:

Google analytics


Google analytics es una herramienta muy util para medir todo lo relacionado a SEO para tu pagina web, Si quieres entrar a este mundo tienes que aprender a usarla. Por suerte Google tiene unos cursos donde podras aprender todo lo necesario sobre esta herramienta, el unico detalle es que esta en ingles Analytics Academy

Videos de youtube en SEO

Youtube es una herramienta util para atraer trafico a tu web, optimizar tus videos es de vital importancia si quieres aumentar el traficoen tu web, Mauro Sicard   ha escrito un articulo muy bueno de como debes optimizar tus videos.