1. Web Design
  2. UX/UI
  3. Responsive Design

Cómo Crear un Componente UI Responsivo usando Element Queries

En éste tutorial continuaremos nuestra discusión sobre element queries, con el objetivo de crear un componente responsivo reutilizable.
Scroll to top

Spanish (Español) translation by Javier Salesi (you can also view the original English article)

En éste tutorial continuaremos nuestra discusión sobre element queries, con el objetivo de crear un componente responsivo reutilizable.

Para recapitular, element queries nos permiten moldear un elemento basado en las características de su contenedor; la anchura, la altura, etc. Pero cabe destacar que element queries no se han convertido en un estándar de CSS, y probablemenete tendremos que esperar un par de años antes de que ello ocurra.

Asi que por ahora, tendremos que recurrir a una librería JavaScript para emular una funcionalidad similar, como EQCCS.

EQCSS

EQCSS es una librería JavaScript desarrollada por Tommy Hodgnins. Veamos algunas razones para optar por ésta librería.

Para empezar, EQCSS nos da una sintaxis similar a las estándares Media Queries de CSS3 con la declaración @element.  Ésto funciona dentro de una hoja de estilos o incrustada en un elemento style, por lo tanto se siente muy intuitivo. En el siguiente código, por ejemplo, apilamos los menús en la navegación para ajusarnos al reducido espacio de la navegación (no al de la ventana gráfica).

1
.navigation .menu {
2
  display: inline-block;
3
}
4
@element ".navigation" and ( max-width: 480px ) {
5
	.navigation .menu {
6
		display: block;
7
	}
8
}

EQCSS ofrece más que sólo queries basados en altura o anchura. También ofrece queries basados en conteo, lo cual nos da el poder de aplicar reglas de estilo basadas en el contenido; el número de caracteres, líneas, y elementos contenidos.

1
.tweetContent { // textarea
2
	background-color: #eaeaea;
3
}
4
@element ".tweetContent" and ( min-characters: 100 ) {
5
	.tweetContent {
6
		background-color: #ffc04d; // orange
7
	}
8
}
9
@element ".tweetContent" and ( min-characters: 140 ) {
10
	.tweetContent {
11
		background-color: #FF3333; // red
12
		color: #fff;
13
	}
14
}

Soporta unidades CSS variantes incluyendo recientes adiciones como vw, vh, vmin, y vmax.

Y para los que aún requieren apoyo para IE8, EQCSS ofrece un polyfill.

EQCSS está disponible vía Bower, NPM, CDNJS, y directamente del repositorio en Github. Elige la opción que más se acomode al despliegue de tu proyecto, y asegúrate de tenerlo cargado en tu página.

1
<script src="https://cdnjs.cloudflare.com/ajax/libs/eqcss/1.2.1/EQCSS.min.js"></script>

¡Ahora elaboremos algo!

El HTML

Vamos a crear un componente UI de perfil de usuario, y comenzamos con el marcado HTML.

1
<div class="user-profile">
2
    <div class="user-profile__avatar">
3
        <img src="path/to/profile/image.jpg" alt="Louie R. Avatar Image" width="160" height="160">
4
    </div>
5
    <div class="user-profile__summary">
6
        <h3 class="user-profile__name">Louie R.</h3>
7
        <h4 class="user-profile__location">Middle Earth</h4>
8
        <p class="user-profile__bio">A developer and frequent StackOverflow reader. Born, raised, and live on the Web. I speak three languages: HTML, CSS, and JavaScript.</p>
9
        <button class="user-profile__button button button--primary">Follow</button>
10
    </div>
11
</div>

Nuestro componente consiste de una imagen de avatar, el nombre del usuario, donde viven, una corta biografía, y un boton de "Seguir" á la Twitter y Medium.

El CSS

Primero, establecemos la anchura del contenedor del componente UI y el modo de display a flex. La sintaxis de flexbox en el siguiente fragmento de código no lleva prefijos por cuestiones de sencillez, así que sólo funcionará en versiones de navegadores más recientes.  Si es necesario,siempre puedes emplear Autoprefixer para generar sintaxis que se usaba anteriormente así como los prefijos requeridos para soportar las versiones anteriores de navegadores.

1
.user-profile {
2
	width: 100%;
3
	max-width: 640px;
4
	display: flex;
5
}

Luego, establecemos la proporción de anchura entre la imagen avatar y el sumario del perfil que contiene el nombre, ubicación y una corta biografía.

1
.user-profile__avatar {
2
	width: 25%;
3
	max-width: 120px;
4
	flex: 1 1 120px;
5
}
6
.user-profile__summary {
7
	width: 75%;
8
	padding-left: 25px;
9
	font-size: 1em;
10
}

También ajustamos ligeramente el tamaño de la fuente del nombre de usuario y la ubicación.

1
.user-profile__name {
2
	font-family:'Montserrat', sans-serif;
3
	font-size:1.3125em;
4
}
5
.user-profile__location {
6
	font-size:0.87em;
7
}

Éstas son las reglas de estilo primarias para demostrar como funcionan los element queries. Las reglas de estilo como background-colour, colour de texto, y box-shadow quedan a tu discreción. En mi caso, aparece como sigue.

Desplegando Element Queries

Usar element queries con EQCSS es muy intuitivo. Como se mencionó, la sintaxis se asemeja mucho a media queries de CSS. Primero, como se mencionó anteriormente, denotamos un element query con @element seguido de uno o más selectores de elemento y la condición de consulta como la anchura, la altura, la posición del scroll, etc. del elemento.

1
@element 'header, nav, footer' and ( min-width: 100px ) and ( min-height: min-height: 300px ) {
2
	// Style rules
3
}

Ahora podemos desplegarlo en nuestro componente UI, por ejemplo, para redimensionar la anchura del elemento dentro del contenedor y ajustar el tamaño de fuente cuando se reduzca la anchura del contenedor.

1
@element '.user-profile' and ( max-width: 540px ) {
2
    .user-profile {
3
        font-size:0.75em;
4
    }
5
    .user-profile__avatar {
6
        max-width:80px;
7
    }
8
}

Además, queremos que el componente UI sea reutilizable, y de manera más importante presentable en cualquier parte del sitio web sin importar la anchura disponible. La barra lateral, por ejemplo, donde su anchura es comúnmente menor a 400px. En éste caso, ya que la anchura es mucho más angosta tenemos que realinear todo el maquetado del componente.

1
@element '.user-profile' and ( max-width: 380px ) {
2
	.user-profile {
3
		padding-top: 30px;
4
		padding-bottom: 30px;
5
		display: block;
6
		text-align: center;
7
	}
8
	.user-profile__avatar,
9
	.user-profile__summary {
10
		width: 100%;
11
	}
12
	.user-profile__avatar {
13
		margin-right: auto;
14
		margin-bottom: 20px;
15
		margin-left: auto;
16
	}
17
	.user-profile__summary {
18
		padding-left: 0;
19
	}
20
}

Concluyendo

En éste tutorial hemos creado un componente UI para mostrar un perfil de usuario. Es responsivo, cambiando de acuerdo a su contenedor y no a la ventana gráfica. Puedes ver la página de demostración y ver que el maquetado cambia sin importar el tamaño de la ventana gráfica. ¡Magnífico!

Éste es solo un ejemplo. Hay muchos más ejemplos que otros han publicado donde element queries tienen sentido.

Recuerda, la sintaxis en éste tutorial se basa completamente en EQCSS-si el Grupo de Trabajo de W3C lo adoptará o creará la suya propia aún no está decidido. Sin embargo, estoy ansioso de que ésta idea sea adoptada y revolucione nuevamente la forma en que creamos sitios web.