Hojas de estilo en cascada o CSS utilizadas


General

En 2017, todas las hojas de estilo de la Sede Electrónica se integran en una sola, utilizando Less Bootstrap 3.3.7. que da lugar a una hoja main-sede.css minificada.

El enlace a la hoja de estilo se encuentra en el apartado cssjs de los template , que es integrado en los servicios y en los portales. Se accede desde el siguinete link: https://www.zaragoza.es/cont/assets/css/main-sede.min.css

Específicas

Dada la diversidad de portales y servicios que ofrece la web del Ayuntamiento, se ha optado por añadir nuevos CSS en cada portal, para dar respuesta a necesidades específicas. Esta opción no afecta al resto de portales.

Estas CSS se integran en los template de cada portal con la siguiente ruta: https://www.zaragoza.es/cont/assets/css/portales/nombre_del_portal.css

Bootstrap


La versión utilizada en el portal es Bootstrap 3.3.7. Actualmente ya existe versiones mas modernas, por lo que es importante no confundirlas. A partir de la versión 4 el core CSS de Bootstrap cambió, por lo que muchas funcionalidades modificaron su comportamiento.

Bootstrap es un sistema de diseño basado en filas y columnas en el que es importante destacar su versatilidad a la hora de realizar diseño responsive.

Normalize.css

Para mejorar la compatibilidad entre navegadores, bootstrap utiliza Normalize.css un proyecto de Nicolas Gallagher y Jonathan Neal que hace que los navegadores representen todos los elementos de manera más consistente y en línea con los estándares modernos. Se dirige con precisión solo a los estilos que necesitan normalizarse.

Mobile first

Definición

Mobile First es una estrategia de diseño de interfaces de uso (UI) donde se inicia el proceso pensando primero en cómo va a aplicar a pantallas pequeñas (smartPhones o Mobile) y desde ahí hacer crecer el diseño para adaptarse a pantallas de mayor tamaño como tablets y ordenadores.

En principio, el propósito del diseño Mobile First es desarrollar una solución web óptima para dispositivos móviles; y solo después, basándose en la estrategia de mejora progresiva, dichas páginas web son optimizadas para todo tipo de pantallas de ordenadores y portátiles

Finalmente, vale acotar que todo proceso de optimización de páginas web basado en la estrategia Mobile First se guía por los principios del diseño web responsivo.

Media Queries

Una media query consiste de un media type y una o más expresiones, que implican media features, que se resuelve en true o false. El resultado de la consulta es verdadero si el media type especificado en el media query coincide con el tipo de dispositivo sobre el que el documento está siendo mostrado y todas las expresiones del media query son verdaderas. Cuando un media query es verdadero, se aplica la hoja de estilo correspondiente o las reglas de estilo, siguiendo las reglas normales en cascada.

Disponemos de medidas de pantalla predefinidas que nos ayudarán a guiarnos en nuestros diseños

	
/* Mobile(xs) (< 768px) */
/*Por defecto, Bootstrap es mobile first*/

/* Pequeños(sm) */
@media (min-width: 768px) { ... }

/* Medianos(md) */
@media (min-width: 992px) { ... }

/* Grandes(lg)*/
@media (min-width: 1200px) { ... }

Sistema de columnas

Para lograr cumplir con esta estrategia, bootstrap nos ofrece un sistema de grillas basado en 12 columnas que se adaptan a los distintos tipo de pantalla.

Para ello nos ofrece un set de clases predefinidas las cuales podremos utilizar para realizar maquetaciones eficientes

  • .col-lg-*
  • .col-md-*
  • .col-sm-*
  • .col-xs-*

Haciendo uso de esta herramienta podemos realizar facilmente un layout responsivo

col-sm-6 col-md-8
col-sm-6 col-md-4
.col-md-4
.col-md-4
.col-md-4
col-xs-8 col-sm-4 col-md-6
col-xs-4 col-sm-8 col-md-6

Reescalar la pantalla para ver como se ajustan las columnas

Sabiendo lo anterior, se definen una serie de reglas para su utilización:

  • Todo el contenido debe estar dentro dentro de un contenedor

    Este, generalmente, será definido por la etiqueta <sede:content>

    	
    <div class="container">
    	
    </div>
    
    <div class="container-fluid">
    	
    </div>
    
    
  • Usaremos la clase row para crear filas
    	
    <div class="container">
    	<div class="row"></div>
    </div>
    
    
  • El contenido debe estar dentro de las columnas(.col) y las columnas deben estar dentro de un contenedor de tipo fila(.row).
    	
    <div class="container">
    	<div class="row">
    		<div class="col-xs-12">
    			CONTENIDO
    		</div>
    	</div>
    </div>
    
    
  • Los contenedores de tipo columnas(.col) crean espacios entre ellas utilizando un padding predefinido(15px). Es decir, que si añadimos más de una columna, éstas se verán divididas con un espacio automáticamente.

    Los contenedores de tipo fila(.row) eliminan este espacio en los laterales, por lo que nos crea un efecto de tipo tabla, en el que las celdas tendrán espacios pero las que estén en el margen izquierdo y derecho se eliminan.

    	
    <div class="container">
    	<div class="row">
    		<div class="col-xs-12 col-md-6">
    			<p>CONTENIDO 1</p>
    		</div>
    		<div class="col-xs-12 col-md-6">
    			<p>CONTENIDO 2</p>
    		</div>
    	</div>
    </div>
    
    
  • El número de columnas que se pueden anidar en una fila son 12 por lo que tendremos que jugar con el número de espacios que ocupará cada columna utilizando las clases que nos brinda bootstrap. Por ejemplo podríamos crear un contenedor con 3 columnas iguales utilizando la clase .col-md-4
    	
    <div class="container">
    	<div class="row">
    		<div class="col-xs-12 col-md-4">
    			<p>CONTENIDO 1</p>
    		</div>
    		<div class="col-xs-12 col-md-4">
    			<p>CONTENIDO 2</p>
    		</div>
    		<div class="col-xs-12 col-md-4">
    			<p>CONTENIDO 3</p>
    		</div>
    	</div>
    </div>
    
    
Es interesante aclarar que no necesariamente deben caber 12 elementos dentro de una fila. Si colocamos más, estos se desbordarán y pasaran a estar debajo. Esto puede ser útil para hacer galerías de imágenes por ejemplo.

Accesibilidad


Siguiendo uno de los objetivos principales de la sede electrónica, debemos asegurar la Accesibilidad de los servicios disponibles en Internet, es decir que pueden ser navegados y leídos por cualquiera, sin tener en cuenta aspectos como la localización, la experiencia del usuario/a, o la plataforma de acceso (dispositivos, Software, tipo de conexión) empleada. Por ello los contenidos incorporados al sitio web deberán ser accesibles nivel AA, de acuerdo con las pautas de contenido Accesible en la Web WCAG 2.1, desarrolladas por la Iniciativa de Accesibilidad Web (WAI) del Consorcio W3C.

Por eso disponemos de los siguientes consejos y herramientas:

Servicio de voz Readspeaker

ReadSpeaker es un proveedor de conversión de texto a voz sintetizada

Para incluir dicha herramienta de accesibilidad deberemos añadirla en los _template.xml de cada portal con el siguiente código.

	
<th:block th:include=”fragmentos/readspeaker”></th:block>

Estructura Semántica

Para conseguir el mejor resultado posible en términos de accesibilidad. Es nuestro trabajo como desarrolladores generar la estructura semántica mas óptima posible, brindando todas las herramientas necesarias para que el producto esté al alcance de todos.

Esquema del documento

La manera más básica para describir el esquema o índice del contenido, es utilizando los elementos de títulos que van del <h1> al <H6>. Se debe utilizar <h1> para el título del artículo o página y <h2> a <h6> para dividir el contenido interno de acuerdo al esquema del documento.

Estos deben ser colocados en orden ascendente evitando saltos entre ellos. Es decir, siempre empezar por h1 y no saltar de h2 a h4 por ejemplo.

Etiquetas de estructura

Entender el significado semántico de estos elementos permite estructurar con detalle el documento

  • <header> - Para agrupar las piezas de introducción del contenido.
  • <nav> - Para agrupar elementos de navegación del sitio, muy importante utilizarlo en el menú principal.
  • <main> - Para indicar el contenido más importante de la página (muy importante para los lectores de pantalla y dispositivos de asistencia a discapacitados)
  • <article> - Indica que se debe utilizar para agrupar contenido que por sí solo tiene razón de ser y significado
  • <section> - Tiene un valor semántico más general y es utilizada para agrupar secciones o subsecciones de contenido. El significado de que es una sección se vuelve muy personal y subjetiva. Por ello recomendamos usarlo para agrupar contenidos o etiquetas <article> con significado similar.
  • <aside> Dentro de este elemento va el contenido que está fuera del tema principal de la página.

Ejemplo:

	
<header>
	<h1>Título de página</h1>
	<nav>
		<a href=”#”>menu1</a>
		<a href=”#”>menu2</a>
		<a href=”#”>menu3</a>
	</nav>
</header>

<section>

	<article>
		<h2>título del artículo 1</h2>
		<p>contenido del artículo 1</p>
	</article>
	<article>
		<h2>título del artículo 2</h2>
		<p>contenido del artículo 2</p>
	</article>

</section>
<aside>
	<!--barra lateral-->
</aside>

Etiquetas de contenido

  • <figure> - Este elemento describe contenido de flujo con significado propio, muy utilizado para describir imágenes, video, ilustraciones, diagramas, etc.
  • <figcaption> - Contiene la leyenda o información relevante acerca del elemento <figure>
  • <time> - Contiene información de fechas, horarios o tiempo. Al formatear estas fechas, horarios o tiempo con estándares legibles por máquinas, esta información puede servir para guardar información en calendarios y agendar notificaciones.
  • <data> - Es utilizada para entregar un valor asociado al contenido dentro de la etiqueta para ser leído por alguna aplicación o sistema
  • <details> - Representa detalles adicionales que el usuario puede ver y esconder a su gusto.
  • <summary> - Es el elemento que conforman la cabecera siempre visible del elemento <details>
  • <address> - Aporta información de contacto, puede incluir el nombre, domicilio, país, código postal, correo electrónico y teléfono (Si la etiqueta se encuentra en <section> o <article>, la información de contacto suministrada pertenece al autor de esa sección. En caso contrario, se asume que la etiqueta corresponde al autor de todo el documento.)
  • <blockquote> - Permite insertar citas en forma de bloques de contenido
  • <cite> - Permite insertar citas en forma de lineas de contenido
  • <strong> - Provee importancia, seriedad o urgencia al texto que contiene
  • <em> - Para marcar con énfasis las partes importantes de un texto

Listado de etiquetas HTML

Colores


Colores de Principales

IDEZar

#202020

Ayuntamiento

#E81B16

Ciudad

#006a00

Cultura

#8958A9

Para la gente

#006b87

Turismo

#8b5400

Colores Utilitarios

Son los colores que nos brinda Bootstrap para ser aplicados a distintos estados de los elementos,

success

#006A00

success-light

#DFF0D8

success-dark

#005100

info

#006B87

info-light

#D9EDF7

info-dark

#00576E

warning

#8b5400

warning-light

#FCF8E3

warning-dark

#633d04

danger

#A94442

danger-light

#F2dEDE

danger-dark

#973D3B

Monocromáticos

Negro

#202020

bg-neutral-20

#e5e5e5

bg-neutral-100

#F5F5F5

Blanco

#FFFFFF

Tipografía


Familia

Aa Ee Ii Oo Uu
Helvética Neue

La tipografía principal del portal del Ayuntamiento de Zaragoza es de la familia Helvética Neue, en color negro (#000000) .

Es un tipo de letra sans serif obtenida de la revisión de 1983 del tipo de letra Helvetica original. El conjunto más unificado de alturas y anchuras, el mayor grosor de los signos de puntuación y el aumento del espaciado en los números resulta en una mejora en la legibilidad de esta fuente, lo que la hace perfecta para ser integrada en la web.

Caracteres

ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

ÂÊÔâêô

1234567890

‘?’“!”(%)[#]{@}/&<-+÷×=>®©$£¥¢:;,.*

Si esta fuente no se encuentra disponible, utilizará Arial u otra fuente “sans-serif” que tenga instalada, en su defecto.

Comportamiento de texto con enlace

Los textos sensibles se identificarán en color rojo (#E81B16) . Al situar el ratón sobre estos textos interactivos, se mostrarán en un tono de rojo más oscuro (#a2130f) y subrayados.

Ejemplo: Enlace de ejemplo

Los textos de opciones ya visitadas se verán en color rojo oscuro (#660000) .

El color de los enlaces debe cambiar para asegurarse que el contraste fondo-texto sea el adecuado según los niveles de accesibilidad.

Por ejemplo: para el fondo (#e5e5e5) se debe utilizar un color mas oscuro para los enlaces. (#c41511)

Tamaños

Cuerpo del documento

Bootstrap por default configura el font-size global a 14px con un line-height de 1.428. Este tamaño afectará a todos los elementos de texto del documento.

Títulos

  • Título h1

    36px
  • Título h2

    30px
  • Título h3

    24px
  • Título h4

    18px
  • Título h5
    14px
  • Título h6
    12px

Excepciones

  • Destacar un parrafo con la clase .lead. Cambia el font-size del elemento a 16px para mobile y 21px a partir de los 768px de tamaño de pantalla
  • El uso de la etiqueta <small>(o la clase .small) cambia el font size del elemento al 85% del tamaño de fuente de la etiqueta contenedora.

Iconos


Iconos generales

Para los iconos generales de la sede electrónica se utiliza Font Awesome Free en su versión 5.15.4

Modo de empleo:

	
<span class="........."></span> 
	

Deberemos colocarlo dentro de una etiqueta <span> y ponerle la clase correspondiente al icono que necesitamos colocar.

En la biblioteca de iconos se puede ver las clases disponibles
Biblioteca de iconos

Formularios


Tipo de inputs

Para cada tipo de input de nuestros formularios, Bootstrap nos ofrece una serie de controladores para lograr un estilarlos.

Los mismos se logran colocandole la clase .form-control a los elementos que necesitemos

Inputs basados en texto

form-control sirve para todos los tipos de input basados en texto de HTML5 (color, date, datetime-local, email , month, number, password, search, tel,text, time,url, week)

	
<input type="text" class="form-control" placeholder="input text de ejemplo"/> 
	
	
<input type="password" class="form-control" placeholder="contraseña de ejemplo"/> 
	
	
<input type="datetime-local" class="form-control" placeholder="datetime-local de ejemplo"/> 
	
	
<textarea class="form-control" rows="3" placeholder="textarea de ejemplo"></textarea>
	

Hay que especificar la cantidad de lineas en el atributo "rows"

	
<select class="form-control">
	<option>1</option>
	<option>2</option>
	<option>3</option>
	<option>4</option>
	<option>5</option>
</select>
	

Checkboxes

En este caso, no disponemos de la clase .form-control, en su lugar debemos colocar la clase .checkbox

	
<div class="checkbox">
	<label>
		<input type="checkbox" value="">
		Tipo checkbox 
	</label>
</div>
	

o la clase .radio

	
<div class="radio">
	<label>
		<input type="radio" name="optionsRadios" value="option1">
		Tipo radio
	</label>
</div>
	

Texto de ayuda

Esto es un texto de ayuda que nos sirve para hacer mas descriptivos los campos del formulario
	
<div class="form-group">
	<label class="sr-only" for="inputHelpBlock">Input con texto de ayuda</label>
	<input type="text" id="inputHelpBlock" class="form-control" aria-describedby="helpBlock">
	<span id="helpBlock" class="help-block">Esto es un texto de ayuda que nos sirve para hacer mas descriptivos los campos del formulario</span>
</div>
	

Estados de validación

Para incluir estados de valdacion de los distintos tipo de formulario, podemos hacer uso de las clases .has-warning, .has-error, o .has-success

Pulsar para cambiar el estado del formulario

Haciendo uso de las clases .has-* podemos mostrar la correcta validación del formulario
	
<div class="form-group has-success">
	<label class="sr-only" for="inputHelpBlock">Input con texto de ayuda</label>
	<input type="text" id="inputHelpBlock" class="form-control" aria-describedby="helpBlock">
	<span id="helpBlock" class="help-block">Esto es un texto de ayuda que nos sirve para hacer mas descriptivos los campos del formulario</span>
</div>
	

Tablas


Tablas responsivas

Cada tabla debe estar encerrada dentro de un contenedor con la clase .table-responsive

	
<div class="table-responsive">
	...
</div>
	

Tablas simples

Haciendo uso de la clase .table podremos darle un estilado sencillo a nuestras tablas. Esta cubrirá la totalidad del ancho de su contenedor y colocará bordes entre las celdas.

Fecha Unidad
11/07/2022 3
12/07/2022 5
	
<div class="table-responsive">
	<table class="table">
		<thead>
			...
		</thead>
		<tbody>
			...
		</tbody>
	</table>
</div>
	

Tablas con bordes

Debemos agregar la clase .table-bordered

Fecha Unidad
11/07/2022 3
12/07/2022 5
	
<div class="table-responsive">
	<table class="table table-bordered">
		<thead>
			...
		</thead>
		<tbody>
			...
		</tbody>
	</table>
</div>
	

Tablas "cebra"

Debemos agregar la clase .table-striped a nuestras tablas. Esto añadirá distincion de color a las filas de las tablas

Fecha Unidad
11/07/2022 3
12/07/2022 5
13/07/2022 8
	
<div class="table-responsive">
	<table class="table table-striped">
		<thead>
			...
		</thead>
		<tbody>
			...
		</tbody>
	</table>
</div>
	

Imágenes


Imágenes repsonsivas

Utilizando las clases de Bootstrap podemos hacer que las imágenes sean responsivas utilizando la clase .img-responsive

	
<img src="..." class="img-responsive" alt="" /> 
	

Imagenes con formas

Bootstrap nos da la opción de darle formas a las imágenes para distintas presentaciones

... ... ...
	
<img src="..." alt="..." class="img-rounded">
<img src="..." alt="..." class="img-circle">
<img src="..." alt="..." class="img-thumbnail">
	

Imagenes - Relación de aspecto

Bootstrap 3, por defecto, no nos permite trabajar con relaciones de aspecto en imágenes. Por lo que para ello se desarrolló la clase .img-aspect-ratio.

Para utilizarla necesitaremos definir un contenedor y utilizar la clase img-aspect-ratio con alguna de las configuraciones predefinidas .i16y9, .i4y3, .i1y1

Los componentes tienen su propia manera de manejar las imágenes. Por favor leer la respectiva documentación del componente a utilizar

...
1:1
...
4:3
...
16:9
	
<figure class="col-xs-12 col-sm-4">
	<div class="img-aspect-ratio i16y9">
		<img src="..." alt="...">
	</div>
	<figcaption class="text-center">16:9</figcaption>
</figure>
	

Esta clase utiliza la forma de CSS de calcular el padding para determinar su alto en relación con su ancho.

Por medio de porcentajes podemos hacer una simple cuenta según la relación de aspecto que necesitemos:

16:9 ----> 9 / 16 * 100% = 56.25%;

4:3 ----> 3 / 4 * 100% = 75%;

1:1 ----> 1 / 1 * 100% = 100%.

Hay que tener en cuenta que utiliza el 100% del contendor padre donde se encuentre definida la clase .img-aspect-ratio