Professional Documents
Culture Documents
OOCSS
Poniendo OOrden en CSS
@janogarcia http://janogarcia.es
OdiOCSS
e OdiOCSS
D t qu odias de CSS.
ODIO
OOCSS R
Maximizar reusabilidad.
R OOCSS
Maximizar reusabilidad.
{ 1:1
1:n
Maximizar relacin
ODIO
CSS
ENV
ENE NAD
1+1=2
OOCSS
Comportamiento predecible.
ODIO
OOCSS O
Arquitectura modular.
O OOCSS
Arquitectura modular.
Retoma el
CONTROL
con OOCSS
OOCSS
OOCSS busca el equilibrio
OOCSS=CSS
Alguien lo usa?
Aprende los
PATRONES
y antipatrones OOCSS
FRAMEWORK
Reset Base Grid Widgets Helpers
THEME
Widgets Pages
OOCSS
Patrn recomendado.
{
Usa un Reset y un Base.
FRAMEWORK
Reset Base Grid Widgets Helpers
Normalizan estilos entre navegadores, eliminando inconsistencias y estableciendo una base comn. Sin ellos no podramos partir de una base conocida, nuestros estilos no tendran un comportamiento predecible en los diferentes navegadores. Evitan el cdigo repetitivo (DRY). Usa una ya existente: 960.gs, formalize.me, normalize.css, html5boilerplate, YUI... O crea la tuya propia.
THEME
Widgets Pages
FRAMEWORK
Reset Base Grid
Normaliza estilos entre navegadores, eliminando inconsistencias y estableciendo una base comn.
Widgets Helpers
Sin ellos no podramos partir de una base conocida, nuestros estilos no tendran un comportamiento predecible en los diferentes navegadores. Evitan el cdigo repetitivo (DRY). Usa una ya existente 960.gs, formalize.me, normalize.css, html5boilerplate, YUI... O crea la tuya propia.
DEMO
THEME
Widgets Pages
OOCSS
Patrn recomendado.
{
Usa Grids.
FRAMEWORK
Reset Base Grid Widgets Helpers
Some years ago, I found CSS Framework like Blueprint to be a waste of time. I didn't want to clutter my HTML markup with non-semantic classes for handling the styling. Now I still don't think cluttering the HTML with span-6 pull-2 is the best thing that happened to CSS, but I found it much better than cluttering my CSS with endless overow:hidden and oat:left; margin-right:10px declarations.
http://www.pixelastic.com/blog/201:7-advices-to-start-using-oocss-as-a-coding-practice
THEME
Widgets Pages
FRAMEWORK
Reset Base Grid Widgets Helpers
Evitan el cdigo repetitivo (DRY). Abstraen inconsistencias entre navegadores. Usa una ya existente: 960.gs, 978.gs, blueprint, YUI... O crea la tuya propia. O repites una y otra vez las reglas necesarias para crear layouts1 o abstraes esas reglas y las aplicas como clases2. Elige.
1 float:left,
THEME
Widgets Pages
FRAMEWORK
Reset Base Grid
O repites una y otra vez las reglas necesarias para crear layouts1 o abstraes esas reglas y las aplicas como clases2. Elige.
Widgets Helpers
1 float:left,
margin-right:10px, overflow:hidden... 2 .grid-6, .grid-10, .push-1... Evitan el cdigo repetitivo (DRY). Abstraen inconsistencias entre navegadores. Usa una ya existente: 960.gs, 978.gs, blueprint, YUI... O crea la tuya propia.
DEMO
THEME
Widgets Pages
OOCSS
Patrn recomendado.
{
Crea Objetos reusables.
FRAMEWORK
Reset Base Grid Widgets Helpers
Build HTML from the component library. New pages should not generally require additional CSS.
- Nicole Sullivan
Crea una librera de componentes reusables para el proyecto o incluso independientes del proyecto. Los objetos son un conjunto de clases CSS relacionadas que responden a una funcionalidad determinada. Estos objetos deben ser reusables, extensibles y anidables. La clave est en identificar esos objetos y en saber aprovechar la extensin y la composicin. Evitan el cdigo repetitivo (DRY). Maximizan la reusabilidad. Itera, refactoriza!
THEME
Widgets Pages
FRAMEWORK
Reset Base Grid
Build HTML from the component library. New pages should not generally require additional CSS.
- Nicole Sullivan
Widgets Helpers
Crea una librera de componentes reusables para el proyecto o incluso independientes del proyecto. Los objetos son un conjunto de clases CSS relacionadas que responden a una funcionalidad determinada. Estos objetos deben ser reusables, extensibles y anidables. La clave est en identificar esos objetos y en saber aprovechar la extensin y la composicin. Evitan el cdigo repetitivo (DRY). Maximizan la reusabilidad. Itera, refactoriza!
DEMO
THEME
Widgets Pages
OOCSS
Patrn recomendado.
{
Simplifica la cascada.
FRAMEWORK
Reset Base Grid Widgets Helpers
Si la cascada no tiene un comportamiento predecible tus estilos tampoco lo tendrn, por lo que nunca podrn ser realmente reusables. Di adis a los selectores #id, a los estilos en lnea y a las declaraciones !important. De lo contrario no conseguirs que tus estilos tengan un comportamiento predecible.
THEME
Widgets Pages
Estructura Hoja de Estilos > Widgets > Simplifica la Cascada > No #id
FRAMEWORK
Reset Base Grid Widgets Helpers
1
2.1
Slo puede haber uno en la pgina, impidiendo la reusabilidad y limitando la modularizacin Singleton, no puedes crear varias instancias, no puede haber objetos extendidos o compuestos en la misma pgina: #objeto y #objeto.extendido Complican la especificidad y la cascada, tienen demasiado peso. No podremos crear reglas del mismo peso cuando combinemos objetos basados en .clase y en #id. salos nicamente en el HTML como hooks de JavaScript o para accesibilidad (formularios, anclas...).
THEME
Widgets Pages
Estructura Hoja de Estilos > Widgets > Simplifica la Cascada > No #id
FRAMEWORK
Reset Base Grid
1
2.1
Widgets Helpers
Slo puede haber uno en la pgina, impidiendo la reusabilidad y limitando la modularizacin Singleton, no puedes crear varias instancias, no puede haber objetos extendidos o compuestos en la misma pgina: #objeto y #objeto.extendido Complican la especificidad y la cascada, tienen demasiado peso. No podremos crear reglas del mismo peso cuando combinemos objetos basados en .clase y en #id. salos nicamente en el HTML como hooks de JavaScript o para accesibilidad (formularios, anclas...).
DEMO
THEME
Widgets Pages
Estructura Hoja de Estilos > Widgets > Simplifica la Cascada > Ni estilos en lnea ni !important
FRAMEWORK
Reset Base Grid Widgets Helpers
1
2.2
salos nicamente para sobreescribir estilos de una hoja externa fuera de tu control (por ejemplo, un widget externo de comentarios). Si ests usando estilos en lnea o el modificador !important para sobreescribir estilos creados por t es un claro sntoma de que algo va mal, te has cargado la cascada.
THEME
Widgets Pages
Estructura Hoja de Estilos > Widgets > Simplifica la Cascada > Olvida la cascada!
FRAMEWORK
Reset Base Grid Widgets Helpers
1
2.3
Olvida la cascada!
- No dependas del orden del cdigo fuente - Usa valores absolutos para propiedades que se
heredan (evita tight coupling con el HTML). Los estilos se deben heredar de una manera simple y completamente predecible. De esta manera tus objetos se comportarn de una forma predecible, elegirs tus selectores con total seguridad, de una forma sencilla y sin sorpresas desagradables, ya que no habr dependencias ni influencias desconocidas (loose coupling).
THEME
Widgets Pages
Estructura Hoja de Estilos > Widgets > Simplifica la Cascada > Olvida la cascada!
FRAMEWORK
Reset Base Grid
1
2.3
Olvida la cascada!
Widgets Helpers
- No dependas del orden del cdigo fuente - Usa valores absolutos para propiedades que se
heredan (evita tight coupling con el HTML). Los estilos se deben heredar de una manera simple y completamente predecible. De esta manera tus objetos se comportarn de una forma predecible, elegirs tus selectores con total seguridad, de una forma sencilla y sin sorpresas desagradables, ya que no habr dependencias ni influencias desconocidas (loose coupling).
DEMO
THEME
Widgets Pages
OOCSS
Patrn recomendado.
{
Usa clases, no elementos.
FRAMEWORK
Reset Base Grid Widgets Helpers
Usa clases para tus objetos CSS, evita usar elementos HTML en los selectores CSS.
3.1 Nombra los elementos asignndoles una
clase. Los estilos sern ms reusables, ya que no dependern del markup (.title en vez de h1, h2...). aplicado una clase CSS (s: .miclase, no: div.miclase).
THEME
Widgets Pages
Especificar el elemento al que es aplicado una clase es redundante, innecesario y crea ms dependencia entre la estructura HTML y el estilo CSS, obligndonos a modificar el CSS cada vez que modifiquemos la estructura HTML (por ejemplo, al cambiar de ol a ul).
FRAMEWORK
Reset Base Grid
Usa clases para tus objetos CSS, evita usar elementos HTML en los selectores CSS.
Widgets Helpers
DEMO
clase. Los estilos sern ms reusables, ya que no dependern del markup (.title en vez de h1, h2...). aplicado una clase CSS (s: .miclase, no: div.miclase).
THEME
Widgets Pages
Especificar el elemento al que es aplicado una clase es redundante, innecesario y crea ms dependencia entre la estructura HTML y el estilo CSS, obligndonos a modificar el CSS cada vez que modifiquemos la estructura HTML (por ejemplo, al cambiar de ol a ul).
OOCSS
Patrn recomendado.
{
Minimiza los selectores.
FRAMEWORK
Reset Base Grid Widgets Helpers
innecesariamente cualificados como .usuarios table thead tr th a, con .usuarios thead a es suficiente. Evita sobre detallar cada nivel de la estructura HTML. En la mayora de ocasiones basta con indicar el primer y ltimo elemento. No definas elementos redundantes como tr th o ul li, bastara con indicar th o li ya que no pueden estar contenidos por un padre diferente.
THEME
Widgets Pages
(espacio) es el que requiere un proceso ms intensivo por parte del navegador, el hijo > algo menos. Trata de limitar su uso, por ejemplo, un mximo de 3 selectores simples.
FRAMEWORK
Reset Base Grid
Widgets Helpers
innecesariamente cualificados como .usuarios table thead tr th a, con .usuarios thead a es suficiente. Evita sobre detallar cada nivel de la estructura HTML. En la mayora de ocasiones basta con indicar el primer y ltimo elemento. No definas elementos redundantes como tr th o ul li, bastara con indicar th o li ya que no pueden estar contenidos por un padre diferente. (espacio) es el que requiere un proceso ms intensivo por parte del navegador, el hijo > algo menos. Trata de limitar su uso, por ejemplo, un mximo de 3 selectores simples.
DEMO
THEME
Widgets Pages
OOCSS
Patrn recomendado.
{
No dependas del contexto.
FRAMEWORK
Reset Base Grid Widgets Helpers
Separate container and content: Break the dependency between the container module and the content objects it contains.
- Nicole Sullivan
Los estilos de los objetos deben ser independientes del lugar que ocupen en la pgina: footer, sidebar, content... Si dependen de la estructura de la pgina no sern reusables fuera de ese contexto. No: .sidebar .last-comments {} S: .last-comments {}. sto permitir mostrar el widget en cualquier pgina y en cualquier parte de la misma. Incluso en otro proyecto, conociendo en todo momento sus dependencias de estilo y cmo le afectar el nuevo contexto (herencia y namespaces).
THEME
Widgets Pages
FRAMEWORK
Reset Base Grid
Separate container and content: Break the dependency between the container module and the content objects it contains.
Widgets Helpers
- Nicole Sullivan
Los estilos de los objetos deben ser independientes del lugar que ocupen en la pgina: footer, sidebar, content... Si dependen de la estructura de la pgina no sern reusables fuera de ese contexto.
DEMO
THEME
Widgets Pages
No: .sidebar .last-comments {} S: .last-comments {}. sto permitir mostrar el widget en cualquier pgina y en cualquier parte de la misma. Incluso en otro proyecto, conociendo en todo momento sus dependencias de estilo y cmo le afectar el nuevo contexto (herencia y namespaces).
OOCSS
Patrn recomendado.
{
No crees dependencias innecesarias entre objetos.
Estructura Hoja de Estilos > Widgets > No crees dependencias innecesarias entre objetos
FRAMEWORK
Reset Base Grid Widgets Helpers
No agrupes selectores de distintos objetos, creando dependencias innecesarias entre ellos (Loose Coupling, Component Singularity). No uses el operador de agrupacin , para combinar selectores de diferentes objetos. salo nicamente para agrupar selectores dentro de un mismo objeto. Si ests creando bien tus objetos, y aplicando bien la extensin y la composicin te dars cuenta que apenas necesitas usar el operador de agrupacin ,.
THEME
Widgets Pages
Estructura Hoja de Estilos > Widgets > No crees dependencias innecesarias entre objetos
FRAMEWORK
Reset Base Grid
No agrupes selectores de distintos objetos, creando dependencias innecesarias entre ellos (Loose Coupling, Component Singularity).
Widgets Helpers
No uses el operador de agrupacin , para combinar selectores de diferentes objetos. salo nicamente para agrupar selectores dentro de un mismo objeto. Si ests creando bien tus objetos, y aplicando bien la extensin y la composicin te dars cuenta que apenas necesitas usar el operador de agrupacin ,.
DEMO
THEME
Widgets Pages
OOCSS
Patrn recomendado.
{
Extiende los objetos.
FRAMEWORK
Reset Base Grid Widgets Helpers
Extiende los objetos a travs de mltiples clases. .objeto{}, es un objeto padre .objeto.hijo{}, es una extensin de .objeto{} Similar a cmo funciona la extensin en OOP. Las clases hijas heredan las propiedades de la clase padre, estas propiedades podrn ser modificadas o ampliadas por las clases hijas. Las clases hijas, al contrario que en OOP, no requieren ser declaradas despus de la clase padre, pero se recomienda hacerlo para una mayor legibilidad.
THEME
Widgets Pages
FRAMEWORK
Reset Base Grid
Extiende los objetos a travs de mltiples clases. .objeto{}, es un objeto padre .objeto.hijo{}, es una extensin de .objeto{} Similar a cmo funciona la extensin en OOP. Las clases hijas heredan las propiedades de la clase padre, estas propiedades podrn ser modificadas o ampliadas por las clases hijas.
Widgets Helpers
DEMO
THEME
Widgets Pages
Las clases hijas, al contrario que en OOP, no requieren ser declaradas despus de la clase padre, pero se recomienda hacerlo para una mayor legibilidad.
OOCSS
Patrn recomendado.
{
Crea objetos compuestos.
FRAMEWORK
Reset Base Grid Widgets Helpers
Algunos componentes de la pgina pueden estar compuestos de varios objetos independientes. En este caso no aplicaremos la extensin de un objeto base, sino la composicin o anidamiento de objetos. Al utilizar este patrn nos encontramos con uno de los mayores problemas de CSS, la falta de control total sobre la herencia de estilos y la cascada.
THEME
Widgets Pages
FRAMEWORK
Reset Base Grid Widgets Helpers
Los problemas de anidacin surgen por dos motivos: propiedades CSS heredables, nombres de clases compartidas (sin namespace).
8.1 Crea reglas especficas para cada caso de
anidacin, de forma bidireccional y con el mismo nivel de especifidad, as no dependers del orden en el cdigo fuente. En ellas especificaremos los estilos a neutralizar o sobreescribir del mdulo padre.
8.2 Todos los nombres de clases estn en el
THEME
Widgets Pages
namespace global de CSS. S consistente con el formato de namespaces que uses, s consciente de sus ventajas e inconvenientes.
FRAMEWORK
Reset Base Grid
Los problemas de anidacin surgen por dos motivos: propiedades CSS heredables, nombres de clases compartidas (sin namespace).
Widgets Helpers
DEMO
anidacin, de forma bidireccional y con el mismo nivel de especifidad, as no dependers del orden en el cdigo fuente. En ellas especificaremos los estilos a neutralizar o sobreescribir del mdulo padre. namespace global de CSS. S consistente con el formato de namespaces que uses, s consciente de sus ventajas e inconvenientes.
THEME
Widgets Pages
FRAMEWORK
Reset Base Grid Widgets Helpers
La seccin Pages es opcional, sus objetos podran formar parte de la seccin Widgets. Depender de la complejidad del proyecto. Dos funciones:
1 Agrupar los objetos de pginas/secciones con
estilos completamente independientes, no reusables en otro contexto. Facilitamos su localizacin y posible separacin a otra hoja. cuyo estilo depende de la pgina. No deja de ser un caso de composicin.
THEME
Widgets Pages
FRAMEWORK
Reset Base Grid Widgets Helpers
Ejemplos: .clear, .clearfix, .hidden... Evitan la repiticin del cdigo (DRY). Los Helpers son pequeas clases auxiliares reusables entre proyectos.
THEME
Widgets Pages
Preguntas?
DISPARA!
:z
GraCIASS
@janogarcia http://janogarcia.es