Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=fce8eeb3-1bdc-431c-9b8e-e52307499d5a

Cómo hacer un sencillo slider con HTML y CSS (y sin tocar JavaScript)

Icono de advertencia ATENCIÓN: este contenido tiene más de 2 años de antigüedad y, debido a su temática, podría contener información desactualizada o inexacta en la actualidad.

Probablemente ya sabes que, cuando el atributo href de un enlace consiste en una almohadilla o hash (#) seguida de una palabra, el navegador hará scroll hasta el elemento cuyo id coincida con dicha palabra. De hecho, esto ya lo vimos en un post anterior.

Esta técnica no sirve sólo para enlaces internos, sino que puedes apuntar con un enlace a un elemento concreto de una página externa para que, al hacer clic, el navegador no solo cargue la página, sino que haga scroll hasta donde quieras.

Por ejemplo, si haces clic en este enlace irás al final de la ficha de nuestro curso de maquetación responsive con HTML y CSS en nuestro catálogo.

Esto más o menos lo conoce todo el mundo que maneja HTML, pero lo que no todo el mundo sabe es que existe un pseudoelemento de CSS para identificar ese elemento al que estamos apuntando. Estamos hablando de :target

Gracias a esto podemos crear un slideshow, un carrusel, una galería de imágenes o simplemente una pequeña presentación sin necesidad de echar mano de JavaScript o jQuery.

El slider paso a paso

En primer lugar preparamos una lista de elementos que queremos mostrar. Dentro de cada <li> pondremos lo que queramos. Yo he puesto texto que forma un mensaje al ir viendo cada diapositiva, pero podrían ser imágenes, audios, vídeos...

<ul class="slider">
    <li id="slide1">En campusMVP</ li>
    <li id="slide2">encontrarás los mejores</ li>
    <li id="slide3">cursos online de programación</ li>
    <li id="slide4">y aprenderás de la mano</ li>
    <li id="slide5">de los mejores profesionales</ li>
 </ul>

Y por otro lado tenemos los enlaces que vamos a usar para mostrar el contenido:

<nav>
    <ul class="menu">
        <li><a href="#slide1">Diapositiva 1<//a></ li>
        <li><a href="#slide2">Diapositiva 2<//a></ li>
        <li><a href="#slide3">Diapositiva 3<//a></ li>
        <li><a href="#slide4">Diapositiva 4<//a></ li>
        <li><a href="#slide5">Diapositiva 5<//a></ li>
</ul>
</nav>

Tampoco tienen por qué ser enlaces de texto. Por ejemplo, si estamos creando una galería de imágenes, aquí podríamos poner los thumbnails (vamos, las imágenes en pequeñito).

El CSS de nuestra galería

Ahora pasamos a aplicarle algo de estilos a nuestra galería para que sea funcional.

Básicamente, lo que vamos a hacer es lo siguiente:

  • Posicionamos de forma absoluta los <li> dentro dentro del <ul> que tiene position:relative;. De esta forma se apilan todos en el mismo sitio por orden de llegada (debajo de todo estará el primero). Si no conoces esta técnica, échale un vistazo a este post sobre posicionamiento absoluto.
  • Todos los elementos <li> de nuestra lista se ocultan con opacidad 0
  • Mostramos el primer <li> dándole una opacidad igual a 1
  • Cada vez que se hace clic en un enlace que apunta a un elemento de nuestra lista, haremos que este elemento pase a tener opacidad 1 gracias a que lo podemos identificar con la pseudoclase :target.
  • Como el primer elemento queda abajo de todo, será tapado por los elementos que vamos haciendo visibles al hacer clic, a pesar de que es el único que siempre tiene opacity:1;

¡Manos a la obra! Para hacer todo esto nuestro CSS podría ser este:

ul, li {
    padding: 0;
    margin: 0;
    list-style: none inside;
}
ul.slider {
    position:relative; /*Necesitamos que el ul sea relativo*/
}
ul.slider li {
    opacity: 0; /*Ocultamos todos los <li>*/
    transition: opacity .5s;
    position: absolute; /*Posicionamos en absoluto los <li>*/
    left: 0px;
    top: 0px;
    margin:50px;
    padding:50px;
    border:2px solid red;
    background:#fff;
}
ul.slider li:first-child {
    opacity: 1; /*Mostramos el primer <li>*/
}
ul.slider li:target {
    opacity: 1; /*Mostramos el <li> al que apunta el enlace*/
}
nav {
    position:relative;
    top:200px;
    left:50px;
}

Y el resultado sería este otro, un poco espartano, pero funcional:

Ahora que ya lo tenemos funcionando, ya solo nos queda aplicarle más CSS con el diseño que queramos, para que sea más bonito.

Yo le he añadido este bloque de CSS:

body, html {
    padding: 0;
    margin: 0;
    width: 100vw;
    height: 100vh;
    overflow:hidden;
}

ul, li {
    box-sizing: border-box;
}

ul.slider {
    padding: 30px;
}

ul.slider li {
    width: 100vw;
    height: 100vh;
    margin: 0;
    padding: 0;
    border: 0;
    background-color: gray;
    opacity: 0; 
    transition: opacity .5s;
    padding-top: 30vh;
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    font-weight: bold;
    font-size: calc( 1.5rem + 1vw );
    text-align: center;
}

#slide1 {
    background-color: #00324b;
    color: #fff;
}

#slide2 {
    background-color: #65bce8;
    color: #00324b;
}

#slide3 {
    background-color: #f90;
    color: #00324b;
}

#slide4 {
    background-color: #00324b;
    color: #65bce8;
}

#slide5 {
    background-color: #65bce8;
    color: #00324b;
}

nav {
    width: 100vw;
    position: absolute;
    top: auto;
    right: 0;
    bottom: 0;
    left: 0;
    background: #f1f2f3;
}

nav ul {
    display: flex;
    justify-content: space-around;
    flex-wrap: wrap;
}

nav ul li {
    display: flex;
    flex-grow: 1;
    flex-wrap: wrap;
    box-sizing: border:box;
}

nav a {
    font-size: calc( 1.2rem + 1vw );
    text-decoration: none;
    font-weight: bold;
    color: #00324b;
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    line-height: 1.8;
    flex-grow: 1;
    text-align: center;
    border-top: 5px solid #00324b;
    border-right: 1px solid #00324b;
    flex-wrap: wrap;
    position: relative;
}

nav li:last-child a {
    border-right: 0;
}

nav a:hover {
    background-color: #00324b;
    color: #fff;
    border-top-color: #65bce8;
}

nav a:active {
    border-top-color: #f90;
    background: #f90;
    color: #00324b;
}

Así queda como una presentación que ocupa toda la ventana del navegador:

Pero no te limites solo a esto, porque puedes darle muchos usos: un portafolio, una pequeña galería de fotos o de productos, navegación por pestañas, diferentes apartados de una web de una sola página...

Puedes descargarte aquí el código de ejemplo.

Espero que este pequeño truco te haya sido útil. Recuerda que, si te quieres aprender bien las entrañas de la maquetación y el desarrollo web front end, tenemos una completísima colección de cursos online creados y tutorizados por profesionales de primer nivel para cubrir todas las necesidades, tanto las de aquel que empieza desde cero en el mundo web hasta las de el que necesita dominar las técnicas más avanzadas de JavaScript y ECMAscript.

Fecha de publicación:
Pablo Iglesias Pablo Iglesias es diseñador Web. Cuenta la leyenda que, anidando listas HTML en busca de la página semánticamente perfecta, provocó un agujero espacio-temporal en IE tan grande, que en Redmond tuvieron que llamar al comando SG1 de Stargate para evitar una invasión alienígena. Puedes seguirlo en twitter ( @piglesias). Ver todos los posts de Pablo Iglesias
Archivado en: Desarrollo Web

Boletín campusMVP.es

Solo cosas útiles. Una vez al mes.

🚀 Únete a miles de desarrolladores

DATE DE ALTA

x No me interesa | x Ya soy suscriptor

La mejor formación online para desarrolladores como tú

Comentarios (29) -

Obed Medina
Obed Medina

Gracias por este código hermano. Trabajo en una escuela de educación primaria; aula de computación y en estos momentos me encuentro desarrollando una digiteca para los niño@s, este código es una gran ayuda y herramienta
Que Dios te bendiga y te siga dando sabiduría para que crezcas y la compartas!!!

Responder

Pablo Iglesias
Pablo Iglesias

Gracias a ti por tu amable comentario :-)

Responder

gracias por este codigo estudio eso me puede ayudar mucho a seguir programando gracias diosb lo bendiga

Responder

Hola,

Muy buen tutorial, te lo agradezco que lo hayas explicado. ¿Sabes cómo hacer que las imágenes roten de forma automática, autoplay?.

Gracias
Saludos

Responder

Josserand Ruiz
Josserand Ruiz

Hola!

yo he estudiado teoria. Hoy logro comprender muchas cosas para crear un citio, pero por ahora agradasco tu aporte por que me amplio el panorama de lo que puedo hacer con css, y muchas cosas que no logre identificar en tu codigo y que trabajare para investigar cada una de ellas.

De antemano valoro tu esfuerzo y aprovechare cada parte de el.


Gracias por tu aporte...

Responder

Diego Torres
Diego Torres

Genial, muchísimas gracias. ¿Podrías enseñarme a hacer una caja de comentarios? Bendiciones!

Responder

Habra alguna manera de hacer que este mismo codigo tenga un reproductor autoatico? es decir, que los slides cambien por ejm cada 5 segundos?

Responder

Para que sea automática hay que agregar un timer javascript y ejecutar eventos que vayan haciendo el paso

Responder

Muchas gracias por el tutorial, estoy intentando hacer esto pero automático cada X segundos, que cargue y ponga activo el botón uno, después el dos y así, ¿como debería hacer?

Responder

campusMVP
campusMVP

JavaScript... y un buen curso para aprenderlo, como este: www.campusmvp.es/.../...vaScript-y-jQuery_207.aspx 😉

¡Saludos!

Responder

Muchas gracias!!!

Responder

en que parte de la plantilla hay que pegar todos esos codigos?

Responder

Facil el primer codigo lo pegas despues de <body> o en el editor html si usas un blog, justo debajo pegas el segundo codigo y el tercer codigo va antes de la etiqueta </head> de la plantilla madre, para personalizarlo usa ctrl  + f para buscar los slide y los reemplazas con tus imagenes o textos y listo.

Responder

Genial amigo y que modifico para poder hacer scroll hacia abajo y colocar alli otros contenidos??

Responder

Si deseamos hacerlo con DIV en vez de listas, como quedarían el código de HTML y de CSS? Gracias de antemano

Responder

Pablo Iglesias
Pablo Iglesias

Hola Robero, pues básicamente sería igual, pero sustituyento las etiquetas <ul> y <li> por las de <div>. Eso sí, no es la mejor opción en cuanto a semántica.
En tu caso quizá te vendría bien echarle un vistazo a este curso: www.campusmvp.es/.../...a-desarrolladores_185.aspx Unos buenos fundamentos lo hacen todo más fácil después.

Responder

puedo usar ese código en mi sitio web para vender productos?

Responder

Claro, si te sirve, puedes usarlo como quieras...

Responder

Hola Pablo, gracias por tu post! muy útil a la hora de querer hacer cosas solo con css. Una duda, no logro poder insertar este slide dentro de el body de un sitio con más secciones, porque se monta encima de la sección siguiente, ¿hay alguna forma de hacerlo? de antemano gracias

Responder

Pablo Iglesias
Pablo Iglesias

Hola Andrés:

Puede deberse a múltiples razones. El ejemplo tiene una altura del 100% del viewport. Si eso lo has modificado puede deberse a que lo has flotado o a un conflicto entre contextos al posicionar elementos de forma absoluta o algo así. Pero tampoco te puedo garantizar que no sea otra cosa...

CSS en teoría es sencillo, pero en la práctica hace falta tener una buena base para evitar ese tipo de problemas. Te recomiendo encarecidamente este curso www.campusmvp.es/.../...a-desarrolladores_185.aspx y, ya más avanzado, este otro: www.campusmvp.es/.../...-Grid-y-Bootstrap_212.aspx

Responder

Muchas gracias por el código, justo es lo que estabamos buscando para la portada de nuestra web de calderas.

Responder

Hola soy estudiante de programacion web, intente hacer el slider que publicaste en esta pagina pero no me salio aplique tal cual el codigo tanto html como css de igual manera y me quedo de esta forma: https://ibb.co/SKpv550

Responder

Pablo Iglesias
Pablo Iglesias

¡Hola!, gracias por comentar. Sin ver el código es difícil saber exactamente qué pasa.
Podría ser una clase mal escrita que hace que no se aplique alguna regla CSS, algún problema de especificidad (nuestro tutor José Manuel Alarcón lo explica en su blog: www.jasoft.org/.../Tu-estilo-gana-a-mi-estilo-Especificidad-en-reglas-CSS) o algún conflicto en el contexto de apilamiento en el que se aplica el posicionamiento absoluto (se explica en este post: www.campusmvp.es/.../...ento-en-mi-diseno-web.aspx).

Saludos

Responder

Te paso el codigo para que me puedas ayudar de una mejor manera:

HTML:

<ul class="slider">
            
        <li id="slider1">Mi primer</li>
        <li id="slider2">Slider</li>
        <li id="slider3">Simple</li>
    </ul>  
        
        <nav>
            <ul class="menu">
                <li><a href="#slider1">Diapositiva 1</a></li>
                <li><a href="#slider2">Diapositiva 2</a></li>
                <li><a href="#slider3">Diapositiva 3</a></li>
            </ul>
        </nav>

CSS:

ul .slider {

    position: relative;
}

ul .slider li {

    opacity: 0;
    position:absolute;
    left: 0;
    top:0;
    transition: .5s;
    -webkit-transition: .5s;
    -moz-transition: .5s;
    -ms-transition: .5s;
    -o-transition: .5s;
    margin: 15px;
    padding: 15px;
    border: 2px solid rgba(228, 10, 10, 0);
    background-color: rgb(69, 78, 206);
}

ul .slider li:first-child {

    opacity: 1;
}

ul .slider li:target {

    opacity: 1;
}

nav .menu {

    position: relative;
    top: 200px;
    left: 200px;
}

#slider1 {

    background-color: #00324b;
    color: #fff;
}

Responder

Pablo Iglesias
Pablo Iglesias

Hola Tincho, por desgracia no podemos revisar cada problema que nos plantean en comentarios al detalle, pero es que además me estás poniendo solo el código del slider y el problema va más allá de simplemente eso.

Hay un problema en cómo interactúa el slider con el resto de la página.
Si estás aprendiendo, lo mejor que te puedo recomendar es que hagas un buen curso como este para aprender los fundamentos de HTML y CSS: www.campusmvp.es/.../...a-desarrolladores_185.aspx

Vas a aprender mejor y más rápido que copiando y mezclando código de distintos sitios sin tener totalmente claro lo que estás haciendo. Y dominando bien los fundamentos, después le podrás sacar mucho más partido a cualquier tutorial.

Responder

Saludos
Quisiera saber un codigo para incrustar animaciones .js o html en varios slides y que se cambien con flechas

Responder

sapoTonto
sapoTonto

Sigo sin entender, porque al agregarle mas slides no funciona, les quito los elementos agregados y vuelvee a funcionar. Ose que aun no le hagarro el royo, pero gracias broder, no como todos esos youtuberos que hablan mas m!erdas que lo que aportan.

Responder

No funciona, solo en una pagina dedicada al slider, asumo porque al introducirlo por debajo del header que ya contiene un navigator, esconde el nav del header y desaparece el nav del  "slider".
Al ponerlo, el nav del aslider asumio la posicion del header, entonces dedique el slider con una clase y el nav del slider regreso abajo del  div con las anclas.
Introduje el codigo y no pada nada, ni siquira de color cambio.

Responder

José Manuel Alarcón
José Manuel Alarcón

Hola:

Por supuesto que funciona. Lo que ocurre es que si lo metes en otra página con más HTML y, sobre todo, con más CSS, hay interacciones entre lo existente y lo que le añades. En eso consiste saber CSS: en ver qué interacciones se producen y arreglarlas. Es lo que tiene aplicar "recetas" sin más: que en cuanto se presenta un problema no sabes arreglarlo.

Si aprendes HTML y CSS bien, este tipo de problemas o cualquier otro que se te presente sabrás arreglarlo. Y esa es la idea detrás de todos los cursos de campusMVP: aprender BIEN las cosas y no quedarse solo en las "recetas", al contario que ocurre en otras formaciones.

Mientras solo aprendas a aplicar "recetas" te encontrarás constantemente con este tipo de problemas.

Saludos.

Responder

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.