Timeline(Línea del tiempo) responsive Css con efecto 3D

En este artículo experimentaremos un timeline responsive css 3d con la perspectiva y el uso de un truco de entrada de radio para crear una estructura de toque de un solo clic con css. La idea es mostrar un post de un artículo y al hacer clic en la entrada de radio asociada, el contenido se expandirá y girará en 3D, dándole profundidad a todo el asunto. Estaremos usando CSS transformación 3D, transiciones y selectores asociados.

Algunos archivos utilizados en este demo no se publicarán pero los enlaces a sus respectivas webs los encontrarás al finalizar la explicación este ejemplo es para ver que podemos crear efectos impreionantes con solo css

Archivos a utilizar para esta línea del tiempo…

Index.html

estilo.css

Index.html dentro del index colocaremos archivos a utilizar dentro de <head> para un orden dentro de nuestra página..

//nuestro estilo
<link rel="stylesheet" type="text/css" href="css/estilo.css" />

Seleccion del timeline dentro del body o justo donde queremos que aparezca su efecto…

<ul class="timeline">
    <li class="event">
        <input type="radio" name="tl-group" checked/>
        <label></label>
            <div class="thumb user-4"><span>Datetime</span></div>
                <div class="content-perspective">
                    <div class="content">
                        <div class="content-inner">
                        <h3>Título 3</h3>
                        <p>Contenido a mostrar</p>
                    </div>
                </div>
            </div>
    </li>
</ul>

Explicación : Se crea una lista desordenada la cual será ordenada mediante css con sus respectivas clases , Se añaden varias listas cuantos desee mostrar con su respectiva clase event , cada event contiene una radio , una etiqueta vacía una imagen miniatura y un contenedor.

El contenedor tiene una clase perspectiva para su posterior uso , todas las entradas de radio contienen el mismo nombre por lo tanto al dar clic solo se activará uno por evento..

La imagen en miniatura tiene una clase llamad thumb y una clase adicional llamad user-1 a user-8 tal cual como está en el demo se podrá usar o añadir tantas como ud. desee…

Estilo.css.- Tendremos en cuenta el codigo necesario para este demo el resto de archivos como fuentes e iconos se encontrarán en los archivos de descarga…

Resetearemos el estilo a cero aunque podríamos omitir pero después necesitaríamos ajustar estos parámetros a cada clase..

*,
*:after,
*:before {
    padding: 0;
    margin: 0;
}

Seguimos con el css y su explicación :

//Añadimos una fuente creada en Fontello.com esta fuente obtendrá dos flechas y dos estados. 
//que asociaremos con input[type="radio"]:checked, la letra la usaremeos de font awesome en su web encontrarás 
//los archivos de descarga y su información para su uso. 

@font-face {
    font-family: 'fontawesome-selected';
    src: url("font/fontawesome-selected.eot");
    src: 
    url("font/fontawesome-selected.eot?#iefix") format('embedded-opentype'), 
    url("font/fontawesome-selected.woff") format('woff'), 
    url("font/fontawesome-selected.ttf") format('truetype'), 
    url("font/fontawesome-selected.svg#fontawesome-selected") format('svg');
    font-weight: normal;
    font-style: normal;
}


//configuramos una clase llamada timeline y le añadimos algo de relleno..
.timeline {
    position: relative;
    list-style-type: none;
    padding: 30px 0 50px 0;
    font-family: 'Gorditas', Arial, sans-serif;
}

//la línea blanca la crearemos con un seudo elemento creada en  Patternify.com (generador de css) 
.timeline:before {
    content: '';
    position: absolute;
    width: 5px;
    height: 100%;
    top: 0;
    left: 165px;
    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAJUlEQVQIW2NkQAP/gYARWQwkAOLDBeECjEAAkkEWAKtEFwAJAgAZEBP+oM1IkwAAAABJRU5ErkJggg==);
}

//la clase event será de posicion relativa con margenes abajo y derecha para que no se distorcione mediante la rotación 3D
.event {
    position: relative;
    margin-bottom: 80px;
    padding-right: 40px;
}

//las imagenes en miniaturas con su respectiva clase se usará un seudo elemento para un fondo de zigzag en su rotación 3D  
.thumb {
    position: absolute;
    width: 100px;
    height: 100px;
    box-shadow: 
        0 0 0 8px rgba(65,131,142,1), 
        0 1px 1px rgba(255,255,255,0.5);
    background-repeat: no-repeat;
    border-radius: 50%;
    -webkit-transform: scale(0.8) translateX(24px);
    -moz-transform: scale(0.8) translateX(24px);
    -o-transform: scale(0.8) translateX(24px);
    -ms-transform: scale(0.8) translateX(24px);
    transform: scale(0.8) translateX(24px);
}

.thumb:before {
    content: '';
    position: absolute;
    height: 8px;
    z-index: -1;
    background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAAPElEQVQYV2NkQAP/gYARCNDFUQRgirAphitEl0TngxXisg5ZnBGXIpgbYfIYjkb3BNxGbBLYxIgyEaQRAA8KKAWYsZtjAAAAAElFTkSuQmCC);
    width: 51px;
    top: 42px;
    left: 100%;
    margin-left: 8px;
}

.thumb span {
    color: #41838e; 
    width: 100%;
    text-align: center;
    font-weight: 700;
    font-size: 15px;
    text-transform: uppercase;
    position: absolute;
    bottom: -30px;
}

//Para las imagenes en miniatura usaremos la propiedad background-image 
//se podría usar img como  propiedad eso es dependiendo de cada programador..
.user-1 {
    background-image: url(../images/brannigan.png);
}

.user-2 {
    background-image: url(../images/amy_wong.png);
}

.user-3 {
    background-image: url(../images/leela.png);
}
.user ......


//Se coloca a  los label y radio la misma anchura y altura
//al dar clic en la etiqueta los hacemos a la misma vez en el input radio 
//colocamos un icono con un pseudo elemento incluido anteriormente
.event label,
.event input[type="radio"] {
    width: 24px;
    height: 24px;
    left: 158px;
    top: 36px;
    position: absolute;
    display: block;
}

.event input[type="radio"] {
    opacity: 0;
    z-index: 10;
    cursor: pointer;
}

.event label:after {
    font-family: 'fontawesome-selected';
    content: 'e702';
    background: #fff;
    border-radius: 50%;
    color: #41838E;
    font-size: 26px;
    height: 100%;
    width: 100%;
    left: -2px;
    top: -3px;
    line-height: 24px;
    position: absolute;
    text-align: center;
}


//Creamos la clase  content-perspective  se le da relleno 
//y color y dandole una transformación de 10 grados
//dandole un empuje hacia la derecha en el content 
.content-perspective {
    margin-left: 230px;
    position: relative;

    -webkit-perspective: 600px;
    -moz-perspective: 600px;
    -o-perspective: 600px;
    -ms-perspective: 600px;
    perspective: 600px;
}

.content-perspective:before {
    content: '';
    width: 37px;
    left: -51px;
    top: 45px;
    position: absolute;
    height: 1px;
    z-index: -1;
    background: #fff;
}

.content {
    -webkit-transform: rotateY(10deg);
    -moz-transform: rotateY(10deg);
    -o-transform: rotateY(10deg);
    -ms-transform: rotateY(10deg);
    transform: rotateY(10deg);

    -webkit-transform-origin: 0 0;
    -moz-transform-origin: 0 0;
    -o-transform-origin: 0 0;
    -ms-transform-origin: 0 0;
    transform-origin: 0 0;

    -webkit-transform-style: preserve-3d;
    -moz-transform-style: preserve-3d;
    -ms-transform-style: preserve-3d;
    -o-transform-style: preserve-3d;
    transform-style: preserve-3d;
}

.content-inner {
    position: relative;
    padding: 20px;
    color: #333;
    border: none;
    border-left: 5px solid #41838e;
    box-shadow: 0 4px 6px rgba(0,0,0,0.1);
    background: #fff;
}

.content-inner h3 {
    font-size: 26px;
    padding: 5px 0 5px 0;
    color: #41838e;
}


//Fijamos el parrafo que contiene el content inner
//se juega con la opcaidad dando un toeque de parpadeo
//El objetivo es ampliar el párrafo y animar el valor de opacidad alfa del RGBA a 1, 
//la simulación de un aumento gradual.
.content-inner p {
    font-size: 1.8px;
    max-height: 0px;
    overflow: hidden;
    color: rgba(0,0,0,0);
    text-align: left;
}

//Añadimos la flecha a la derecha con el icon font visto anteriormente
.content-inner:before {
    font-family: 'fontawesome-selected';
    content: '25c2';
    font-weight: normal;
    font-size: 54px;
    line-height: 54px;
    position: absolute;
    width: 30px;
    height: 30px;
    color: #41838e;
    left: -22px;
    top: 19px;
    z-index: -1;
}

//La clase thumb creará una transición entre imagenes 
//dando tiempo de retardo entre clic y clic
.thumb,
.thumb span,
.content-inner h3 {
    transition: all 0.6s ease-in-out 0.2s;
}

//Le damos transiciones de sombra dentro del contenido 
//El parrafo le damos color y transición  
.content-inner {
    transition: box-shadow 0.8s linear 0.2s;
}.content {
    transition: transform 0.8s cubic-bezier(.59,1.45,.69,.98) 0.2s;
}
.content-inner p {
    transition: max-height 0.5s linear, color 0.3s linear;
}

//Para el evento radio se le dará un un icono diferente y color a su sombra
.event input[type="radio"]:checked + label:after {
    content: '2714';
    color: #F26328;
    box-shadow: 0 0 0 5px rgba(255, 255, 255, 0.8);
}

//Cambiamos el color al titulo y a la linea del contenido
.event input[type="radio"]:checked ~ .content-perspective:before {
    background: #F26328;
}
 
.event input[type="radio"]:checked ~ .content-perspective .content-inner h3 {
    color: #F26328;
}

//El contenido se centrará y cambiamos el estilo de color
//diferente al anterior
//los parrafos seanimarán a un maximo de 260pixeles opacando su color
//a la vez cambiamos el color de la flecha

.event input[type="radio"]:checked ~ .content-perspective .content {
    transform: rotateY(-5deg);
}
.event input[type="radio"]:checked ~ .content-perspective .content-inner {
    border-color: #F26328;
    box-shadow: 10px 0px 10px -6px rgba(0, 0, 0, 0.1);
}
.event input[type="radio"]:checked ~ .content-perspective .content-inner p {
    max-height: 260px; /* Add media queries */
    color: rgba(0,0,0,0.6);
    transition-delay: 0s, 0.6s;
}
.event input[type="radio"]:checked ~ .content-perspective .content-inner:before {
    color: #F26328;
}


//aumentamos la esala de la imagen con una caja de sombra
//la fecha cambia de color 
.event input[type="radio"]:checked ~ .thumb {
    transform: scale(1);
    box-shadow: 
        0 0 0 8px rgba(242,99,40,1), 
        0 1px 1px rgba(255,255,255,0.5);
}
.event input[type="radio"]:checked ~ .thumb span {
    color: #F26328;
}


//Sustituimos el zigzag a color naranja
.event input[type="radio"]:checked ~ .thumb:before {
    background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAAPUlEQVQYV2NkQAOfUjX+882+wYgujiIAU4RNMVwhuiQ6H6wQl3XI4oy4FMHcCJPHcDS6J2A2EqUQpJhohQBbNyaHFmzEqgAAAABJRU5ErkJggg==);
}


//Comprobamos con este codigo que se ajuste a pantllas establecidas en el css
@media screen and (max-width: 850px) { 
    .content-inner h3 {
        font-size: 20px;
    }

    .content-inner p {
        font-size: 14px;
        text-align: justify;
    }

    .event input[type="radio"]:checked ~ .content-perspective .content-inner p {
        max-height: 500px; 
    }
}

@media screen and (max-width: 540px) {
    .timeline::before {
        left: 50px;
    }

    .event { 
        padding-right: 0px;
        margin-bottom: 100px;
    }


    .thumb {
        -webkit-transform: scale(0.8);
        -moz-transform: scale(0.8);
        -o-transform: scale(0.8);
        -ms-transform: scale(0.8);
        transform: scale(0.8);
    }

    .event input[type="radio"] {
        width: 100px;
        height: 100px;
        left: 0px;
        top: 0px;
    }

    .thumb:before,
    .event input[type="radio"]:checked ~ .thumb:before {
        background: none;
        width: 0;
    }

    .event label {
        display: none;
    }

    .content-perspective {
        margin-left: 0px; 
        top: 80px;
    }

    .content-perspective:before {
        height: 0px; 
    }

    .content {
        -webkit-transform: rotateX(-10deg);
        -moz-transform: rotateX(-10deg);
        -o-transform: rotateX(-10deg);
        -ms-transform: rotateX(-10deg);
        transform: rotateX(-10deg);
    }

    .event input[type="radio"]:checked ~ .content-perspective .content {
        -webkit-transform: rotateX(10deg);
        -moz-transform: rotateX(10deg);
        -o-transform: rotateX(10deg);
        -ms-transform: rotateX(10deg);
        transform: rotateX(10deg);
    }

    .content-inner {
        border-left: none;
        border-top: 5px solid #41838e;
    }

    .event input[type="radio"]:checked ~ .content-perspective .content-inner {
        border-color: #F26328;
        box-shadow: 0 10px 10px -6px rgba(0, 0, 0, 0.1);
    }

    .content-inner:before {
        content: '25b4';
        left: 33px;
        top: -32px;
    }

    .event input[type="radio"]:checked ~ .content-perspective .content-inner p {
        max-height: 300px; 
    }
}

Créditos :

MARY LOU

Lea Verou

http://www.patternify.com/

http://www.fontello.com/

http://fortawesome.github.io/Font-Awesome/

Probado en :

Funciona en navegadores que soportan las propiedades css escritas anteriormente..

Demostración

Visita nuestro nuevo sistema Timeline de twitter hecho en Php mysql