CSS en la práctica: lo que necesitas para tu portfolio
Ya sabes cómo se escribe una regla, los selectores, el color, la tipografía y el modelo de caja.
El navegador pone estilos por defecto (márgenes, viñetas, subrayados, cursivas); se quitan o se cambian con CSS.
Comas para dar el mismo estilo a varios selectores; .zona elemento para lo que hay dentro de una zona; :not() para excluir.
margin y padding con 1 a 4 valores o por lados; max-width + margin: 0 auto centra un bloque.
Bordes por lados, border-radius para esquinas y círculos.
- Ya sabes cómo se escribe una regla, los selectores, el color, la tipografía y el modelo de caja. Con eso se puede dar estilo a una página, pero al hacer tu primera ficha o tu portfolio aparecen dudas muy concretas: ¿por qué hay un hueco blanco alrededor de la página?, ¿cómo quito los puntos de una lista?, ¿cómo pongo un menú en horizontal?, ¿cómo oculto un título sin que desaparezca para un lector de pantalla? Esta página las resuelve una a una, con el código que vas a necesitar.
- Una página sin CSS ya tiene estilos: los pone el navegador. Los más visibles:
- ElementoLo que hace el navegadorCómo se cambia bodyDeja un margen de 8 px alrededor de toda la páginabody { margin: 0; } h1…h6, p, figure, blockquoteMárgenes arriba y abajomargin en cada uno ul, olViñetas o números y un padding-left de unos 40 pxlist-style: none; padding: 0; aAzul y subrayadocolor y text-decoration address, em, citeCursivafont-style: normal; strong, th, h1…h6Negritafont-weight: 400;
- Por eso casi todas las hojas de estilos empiezan así:
- *, *::before, *::after { box-sizing: border-box; } body { margin: 0; /* fuera el marco blanco de 8 px */ }
Introducción
Ya sabes cómo se escribe una regla, los selectores, el color, la tipografía y el modelo de caja. Con eso se puede dar estilo a una página, pero al hacer tu primera ficha o tu portfolio aparecen dudas muy concretas: ¿por qué hay un hueco blanco alrededor de la página?, ¿cómo quito los puntos de una lista?, ¿cómo pongo un menú en horizontal?, ¿cómo oculto un título sin que desaparezca para un lector de pantalla? Esta página las resuelve una a una, con el código que vas a necesitar.
Los estilos que trae el navegador
Una página sin CSS ya tiene estilos: los pone el navegador. Los más visibles:
ElementoLo que hace el navegadorCómo se cambia bodyDeja un margen de 8 px alrededor de toda la páginabody { margin: 0; } h1…h6, p, figure, blockquoteMárgenes arriba y abajomargin en cada uno ul, olViñetas o números y un padding-left de unos 40 pxlist-style: none; padding: 0; aAzul y subrayadocolor y text-decoration address, em, citeCursivafont-style: normal; strong, th, h1…h6Negritafont-weight: 400;
Por eso casi todas las hojas de estilos empiezan así:
*, *::before, *::after { box-sizing: border-box; } body { margin: 0; /* fuera el marco blanco de 8 px */ }
Más formas de elegir elementos
Varios selectores para una regla
Si dos o más selectores comparten estilo, sepáralos con comas. Es lo mismo que escribir la regla varias veces:
h1, h2, h3 { font-family: Georgia, "Times New Roman", serif; line-height: 1.2; } a:hover, a:focus-visible { color: #1e3a5f; }
Descendientes con clase
Atajos de margin y padding
margin y padding aceptan de uno a cuatro valores. Se leen en el sentido de las agujas del reloj empezando por arriba:
.caja { padding: 1rem; } /* los cuatro lados */ .caja { padding: 1rem 2rem; } /* arriba y abajo 1rem · izquierda y derecha 2rem */ .caja { padding: 1rem 2rem 3rem; } /* arriba 1rem · lados 2rem · abajo 3rem */ .caja { padding: 1rem 2rem 3rem 4rem; } /* arriba · derecha · abajo · izquierda */
Y si solo quieres tocar un lado, cada uno tiene su propiedad: margin-top, margin-right, margin-bottom, margin-left (y lo mismo con padding-).
h2 { margin: 0 0 1rem; } /* sin margen arriba, 1rem abajo */ li { margin-bottom: 0.5rem; } /* aire entre los elementos de una lista */
Bordes y esquinas redondeadas
border junta tres valores: grosor, estilo (solid, dashed, dotted) y color. Cada lado tiene su propiedad, muy útil para filetes y separadores:
.tarjeta { border: 1px solid #e4d9c8; } /* los cuatro lados */ header { border-top: 0.75rem solid #1a5d96; } /* una franja arriba */ section { border-bottom: 1px solid #c9c3b6; } /* línea entre secciones */ .destacado { border-left: 0.3rem solid #2b7a4b; /* filete a la izquierda */ padding-left: 1.25rem; /* separa el texto del filete */ }
border-radius redondea las esquinas. Con 50% en una caja cuadrada sale un círculo, el recurso típico para una foto de perfil:
.tarjeta { border-radius: 0.5rem; } .avatar { width: 8rem; height: 8rem; border-radius: 50%; }
Fondos
background-color pone un color de fondo. background es el atajo que admite color, imagen y más cosas; con un solo color, las dos dan el mismo resultado:
Texto y enlaces
.titulo { text-align: center; } /* left, right, center, justify */ .nota { font-style: italic; } /* normal o italic */ address { font-style: normal; } /* address viene en cursiva */ .oficio { font-weight: 600; } /* 400 normal · 700 negrita · 300 fina… */
Los pesos intermedios (300, 600…) solo se ven si la tipografía los tiene; si no, el navegador usa el más cercano.
El subrayado de los enlaces se controla con text-decoration y se puede afinar:
a { color: #b5400b; text-underline-offset: 0.2em; /* separa el subrayado del texto */ } a:hover, a:focus-visible { text-decoration-thickness: 0.15em; /* subrayado más grueso al pasar */ } .menu a { text-decoration: none; } /* sin subrayado */
Cómo se colocan los elementos: display
Cada elemento tiene un tipo de caja que decide si empieza en una línea nueva o se pone al lado del anterior:
ValorCómo se comportaElementos que lo traen por defecto blockOcupa todo el ancho y empieza en una línea nueva. Acepta width, height y márgenes.p, h1, div, section, ul, li, figure inlineVa dentro de la línea de texto. No acepta width ni height, y el margen de arriba y abajo no empuja.a, span, strong, em, img inline-blockVa en la línea, como inline, pero acepta tamaño y márgenes, como block.button, input noneNo se pinta ni ocupa sitio.head, script
display se puede cambiar. Lo vas a usar sobre todo en dos casos:
/* 1. Las imágenes y vídeos, como bloque: así no queda un hueco debajo */ img, video { display: block; } /* 2. Los elementos de un menú, uno al lado del otro */ .menu li { display: inline-block; }
Un menú horizontal con una lista
El menú de un portfolio es una lista de enlaces dentro de un nav. Con tres reglas pasa de lista con viñetas a barra horizontal:
<nav aria-label="Principal"> <ul class="menu"> <li><a href="#sobre-mi">Sobre mí</a></li> <li><a href="#trabajos">Trabajos</a></li> <li><a href="#contacto">Contacto</a></li> </ul> </nav>
.menu { list-style: none; /* fuera las viñetas */ margin: 0; padding: 0; /* fuera la sangría de la lista */ } .menu li { display: inline-block; /* uno al lado del otro */ margin-right: 1.25rem; /* separación entre enlaces */ } .menu a { font-weight: 600; text-decoration: none; } .menu a:hover, .menu a:focus-visible { text-decoration: underline; /* al pasar o con el teclado vuelve el subrayado */ }
Imágenes y vídeos que no se salen
Una imagen se muestra a su tamaño real: una foto de 3000 px se sale de la pantalla del móvil. Esta regla lo evita en todo el sitio:
img, video { display: block; max-width: 100%; /* nunca más ancha que su contenedor */ height: auto; /* el alto se ajusta para mantener la proporción */ }
Con width fijas el ancho exacto; con max-width, el máximo, y la caja puede ser más estrecha si no cabe. Lo mismo con el alto: height lo fija y min-height pone un mínimo y deja crecer la caja si el contenido lo necesita.
.trabajo img { width: 100%; max-width: 24rem; } /* llena la tarjeta hasta 24rem */ .portada { min-height: 100vh; } /* al menos el alto de la pantalla */
Ocultar elementos
Hay varias formas de ocultar algo y no hacen lo mismo. La pregunta clave es: ¿quién tiene que dejar de verlo?, ¿todo el mundo o solo quien mira la pantalla?
CómoSe veOcupa sitioLo lee un lector de pantalla display: noneNoNoNo visibility: hiddenNoSí, deja el huecoNo Atributo hidden en el HTMLNoNoNo Clase .solo-lector (abajo)NoNoSí
.aviso-cerrado { display: none; } /* desaparece del todo */ .hueco { visibility: hidden; } /* invisible, pero su sitio sigue ahí */
<p hidden>Este párrafo no se muestra.</p>
Todo junto: la cabecera del portfolio
<h1 class="solo-lector">Portfolio de Lucía Prieto</h1> <header class="cabecera"> <p class="nombre">Lucía Prieto</p> <p class="oficio">Diseño gráfico e ilustración</p> <nav aria-label="Principal"> <ul class="menu"> <li><a href="#sobre-mi">Sobre mí</a></li> <li><a href="#trabajos">Trabajos</a></li> <li><a href="#contacto">Contacto</a></li> </ul> </nav> </header>
:root { --papel: #faf6ef; --marino: #1e3a5f; /* 10,7:1 sobre el papel */ --teja: #b5400b; /* 5,3:1 sobre el papel */ } *, *::before, *::after { box-sizing: border-box; } body { margin: 0; background-color: var(--papel); color: var(--marino); font-family: "Segoe UI", "Helvetica Neue", Arial, sans-serif; line-height: 1.6; } .cabecera { max-width: 62rem; margin: 0 auto; /* centrada */ padding: 3rem 1.5rem 1rem; border-bottom: 2px solid var(--marino); /* línea bajo la cabecera */ } .nombre { margin: 0; font-family: Georgia, "Times New Roman", serif; font-size: 3rem; } .oficio { margin: 0.25rem 0 1.5rem; color: var(--teja); font-weight: 600; } .menu { list-style: none; margin: 0; padding: 0; } .menu li { display: inline-block; margin-right: 1.25rem; } .menu a { color: var(--teja); font-weight: 600; text-decoration: none; } .menu a:hover, .menu a:focus-visible { text-decoration: underline; } .solo-lector { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
Resultado: una cabecera centrada con el nombre en grande y con remates, el oficio en color teja, el menú en una fila y una línea debajo. El h1 no se ve, pero un lector de pantalla empieza la página diciendo «Portfolio de Lucía Prieto, encabezado de nivel 1».
Errores frecuentes
Poner width o margin-top a un a o un span y que no pase nada: son inline. Cámbialos a inline-block o block. Intentar centrar una caja con text-align: center: centra lo de dentro, no la caja. Para la caja, max-width + margin: 0 auto. Quitar las viñetas con list-style: none y que la lista siga con sangría: falta padding: 0. Ocultar el h1 con display: none: desaparece también para el lector de pantalla. Olvidar max-width: 100% en las imágenes y que el móvil tenga scroll horizontal.