elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  [CSS3] Login + preloader
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [CSS3] Login + preloader  (Leído 2,707 veces)
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
[CSS3] Login + preloader
« en: 25 Junio 2015, 00:37 am »

Con el avance de las tecnologías de la web, se pueden hacer cada vez cosas mas bonitas, cosas que sin duda pueden dar una buena UX al usuario de nuestra web o aplicación web.

En el presente texto, haremos un login con algunas animaciones y un preloader que seguramente habrás visto en algunas webs cuando te logueas y aparece algo que demuestra que la web está cargando (animaciones por lo general).

(Click en la imagen para ir al demo)

Citar
Usuario: john.doe@gmail.com
Contraseña: abc123



1. INDEX


  • Necesitaremos importar fontawesome y nornalize.

La estructura HTML para nuestro login es sencilla:

Código
  1. <!DOCTYPE html>
  2. <html lang="es">
  3. <meta charset="UTF-8">
  4. <link rel="stylesheet" href="css/vendor/normalize.css"/>
  5. <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"/>
  6. <link rel="stylesheet" href="css/main.css"/>
  7. <title>Login</title>
  8. </head>
  9. <section class="main">
  10. <form id="loginFrm" class="form">
  11. <figure class="tooltip"></figure>
  12. <section class="form-head">
  13. <span>Login</span>
  14. <figure class="logo"></figure>
  15. <section class="form-body">
  16. <div class="group">
  17. <label for="user">Email:</label>
  18. <input type="text" id="user" class="txt">
  19. </div>
  20. <div class="group">
  21. <label for="pass">Password:</label>
  22. <input type="password" id="pass" class="txt">
  23. </div>
  24. <div class="group flex-end">
  25. <button type="submit" id="login" class="btn btn-radical">login</button>
  26. </div>
  27. </form>
  28. 'use strict';
  29. window.addEventListener('load', function() {
  30. let main = document.querySelector('.main');
  31. main.classList.add('visible');
  32. });
  33. </script>
  34. <script src="js/auth.js"></script>
  35. </body>
  36. </html>

La estructura es muy simple. Consta de un formulario con dos partes:

  • form-head: Aquí tendremos el título del form y el pin (el círculo con el ícono de un usuario).
  • form-body: Aquí tendremos todos los grupos (label/inputs) y botones.

Vemos que hay un elemento con la clase 'tooltip'. Bien, éste elemento es como su nombre lo dice, un tooltip en cual nos servirá para mostrar los errores de autenticación.

Ahora veamos el CSS. Lo primero que haremos será aplicar la propiedad box-sizinz: border-box a HTML y hacer que todos los elementos hereden de él esa propiedad.

Código
  1. html {
  2. box-sizing: border-box;
  3. }
  4. *, *:before, *:after {
  5. box-sizing: inherit;
  6. }

Luego, aplicamos estilos al container general, es decir, main:

Código
  1. .main {
  2. align-items: center;
  3. background: rgba(136,211,124,1);
  4. background: linear-gradient(to bottom, rgba(136,211,124,1) 0%,
  5. rgba(136,211,124,1) 50%,
  6. rgba(190,144,212,1) 51%,
  7. rgba(190,144,212,1) 71%,
  8. rgba(190,144,212,1) 100%);
  9. background-repeat: repeat;
  10. display: flex;
  11. height: 100vh;
  12. justify-content: center;
  13. opacity: 0;
  14. transition: all .2s linear;
  15. visibility: hidden;
  16. }
  17. .main.visible {
  18. opacity: 1;
  19. visibility: visible;
  20. }

Aplicamos display: flex, align-items: center y justify-content: center para centrar el formulario, un centrado perfecto. Para ésto, .main debe de tener un alto, el cual se lo especificamos en 100vh (100 view height).

También, le damos una opacidad de 0 y una visibilidad oculta (hidden), además un transition: all .2s ease-in para que al cambiar opacity a 1 y visibility a visible, el efecto sea suave y bonito. Aquí es donde toma importancia .visible, que solamente cambia la opacidad y la visibilidad de .main.

Ahora vayamos con el formulario:

Código
  1. .form {
  2. background-color: #f7f7f7;
  3. border: none;
  4. border-radius: 2px;
  5. box-shadow: 0 2px 5px rgba(0,0,0,.25),
  6. 0 -1px 5px rgba(0,0,0,.1);
  7. position: relative;
  8. width: 350px;
  9. }

Nada relevante. Solo tiene un color blanco humo, sin bordes, un redondeado de 2px, una sombra, un ancho y lo importante, una posición relative. Esta propiedad nos permitirá situar el pin y el tooltip con relación al formulario.

Código
  1. .form-head {
  2. align-items: center;
  3. border-radius: 2px 2px 0 0;
  4. border-bottom: 2px solid #9B59B6;
  5. display: flex;
  6. height: 45px;
  7. }
  8. .form-head > span {
  9. color: #555;
  10. font-family: 'segoe ui';
  11. font-size: 17pt;
  12. font-weight: lighter;
  13. margin-left: 12px;
  14. }

La cabecera del formulario no tiene nada que explicar. Vayamos con el pin:

Código
  1. .form-head .logo {
  2. background-position: center;
  3. background-repeat: no-repeat;
  4. background-image: url('http://urbita.com/img/default/default_user_256.png');
  5. background-size: cover;
  6. border-radius: 100%;
  7. box-shadow: 0px 2px 5px rgba(0,0,0,.25);
  8. height: 85px;
  9. left: calc(50% - 38.5px);
  10. margin: 0px;
  11. position: absolute;
  12. top: calc(0% - 38.5px);
  13. width: 85px;
  14. }

El pin tiene un ancho y alto de 85px, además un border-radius de 100%, lo que le dará la forma de un círculo. Tiene una pequeña sombra con un offset Y de 2px, lo que hará que la sombra se despligue hacia abajo. Las propiedades de background permiten que la imagen se centre y que cubra el tamaño del círculo.

La parte más importante es la propiedad position: absolute. Esta instrucción nos permite posicionar el pin de acuerdo al padre. Ahora, podemos centrarlo horizontalmente con solo left: calc(50% - 38.5px) y verticalmente con top: calc(0% - 38.5px) (por cuestión de entendimiento, si preguntas porqué no hice -38px xD). Ahora tenemos en pin centrado en la cabecera. ¿Fácil no?

Ahora, hagamos algo de magia. Hagamos al pin animado, para ésto, usaremos keyframes:

Código
  1. @keyframes spin {
  2. from { transform: rotate(0deg); }
  3. to { transform: rotate(1800deg); }
  4. }

La animación se llamará spin, y el elemento que la use empezará con una rotación de 0 grados y terminará con una rotación de 1800 grados (5 vueltas completas). Ahora, el pin la usará cuando tenga la clase 'auth', que informa que se ha hecho una autenticación en el formulario:

Código
  1. .form-head .logo.auth {
  2. animation-name: spin;
  3. animation-duration: 3000ms;
  4. animation-iteration-count: 1;
  5. animation-timing-function: linear;
  6. animation-play-state: running;
  7. animation-fill-mode: forwards;
  8. animation-delay: 0s;
  9. }

La duración será de 3 segundos. Solo iterará una vez, será a una velocidad plana (linear) y sin tardanza antes de empezar la animación.

Ahora vayamos con el cuerpo del formulario:

Código
  1. .form-body {
  2. padding: 40px 25px 10px 25px;
  3. }
  4. .group {
  5. align-items: center;
  6. display: flex;
  7. margin-bottom: 10px;
  8. }
  9. .group > label {
  10. color: #777;
  11. display: block;
  12. flex-grow: 1;
  13. font-family: 'segoe ui';
  14. }

El cuerpo de formulario tendrá un padding de 40px hacia arriba, 25px hacia los lados y 10px hacia abajo (lo último para contrarrestrar el margin-bottom de los grupos, que contiene los label y los input. Los labels serán en forma de bloque y con un flex-grow: 1 que hará que el label tenga un tamaño definido.

Pondremos éstas 2 clases como apoyo, la primera para alinear los elementos hacia el final del bloque, y el otro para un centrado absoluto:

Código
  1. .flex-end {
  2. justify-content: flex-end;
  3. }
  4. .flex-abs-center {
  5. align-items: center;
  6. justify-content: center;
  7. }

Ahora vayamos con los textboxes:

Código
  1. .txt {
  2. border: 1px solid #ddd;
  3. border-radius: 2px;
  4. color: #777;
  5. font-family: 'segoe ui';
  6. font-size: .9rem;
  7. outline: none;
  8. padding: .35rem .5rem;
  9. transition: all .2s ease;
  10. }
  11. .txt.invalid {
  12. border-color: rgba(231,76,60,.7);
  13. }
  14. .txt:hover {
  15. border-color: #ccc;
  16. }
  17. .txt:focus {
  18. border-color: #bbb;
  19. }
  20.  

Nada del otro mundo. La clase invalid solo pintará el borde del textbox de rojo. Ahora los botones:

Código
  1. .btn {
  2. border: none;
  3. border-radius: 2px;
  4. box-shadow: 0 2px 5px rgba(0,0,0,.2);
  5. font-family: 'segoe ui';
  6. font-size: .9rem;
  7. outline: none;
  8. padding: .45rem 1.25rem;
  9. text-transform: uppercase;
  10. transition: all .3s ease;
  11. }
  12. .btn-radical {
  13. background-color: #F62459;
  14. color: rgba(255,255,255,.9);
  15. margin-top: 15px;
  16. }
  17. .btn-radical:hover {
  18. background-color: #DC1F4E;
  19. }

Tampoco nada que destacar. Un redondeado de 2px, fuente segoe ui, una ligera sombra y un padding. btn-radical solo le da color (radical) y un margin-top de 15px.

Por último, finalizaremos con el tooltip:

Código
  1. .form .tooltip {
  2. background-color: rgba(0,0,0,.5);
  3. border-radius: 5px;
  4. box-shadow: 0px 2px 5px rgba(0,0,0,.25);
  5. color: rgba(255,255,255,.8);
  6. font-family: 'segoe ui';
  7. font-size: .9rem;
  8. height: 100px;
  9. left: calc(100% - 35px);
  10. margin: 0;
  11. padding: .7rem .6rem;
  12. opacity: 0;
  13. position: absolute;
  14. text-align: center;
  15. top: -140%;
  16. transition: all .4s ease-in;
  17. visibility: hidden;
  18. width: 200px;
  19. }

El tooltip tiene un alto de 200px y un ancho de 100px. Tiene una posición absoluta, lo cual nos hace ubicarlo fácilmente de acuerdo a su padre (formulario). Le damos un left para que quede tirado más a la derecha y un top negativo muy grande para desplazarlo muy arriba, además una opacidad de 1.  Le damos un top muy alto porque en la transición, lo bajaremos y así da la impresión que viene aparece de la nada (por la opacidad también).

Para hacer el efecto de la flecha, jugaremos un poco con las pseudoclases :before:

Código
  1. .form .tooltip:before {
  2. border-color: rgba(0,0,0,.5) transparent;
  3. border-style: solid;
  4. border-width: 10px 10px 0px 10px;
  5. content: "";
  6. left: 10px;
  7. position: absolute;
  8. bottom: -10px;
  9. }[/coder]
  10.  
  11. Por último, para hacerlo visible, aplicaremos una clase:
  12.  
  13. [code=css]
  14. .form .tooltip.visible {
  15. opacity: 1;
  16. top: -50%;
  17. visibility: visible;
  18. }

La clase visible, cambia la opacidad del tooltip, visiblidad y le da un top de -50%. Ésto lo que genera, es un efecto que el tooltip viene de arriba y en el camino se hace visible.

Código JS

Código
  1. 'use strict';
  2. document.addEventListener('DOMContentLoaded', function() {
  3. let loginFrm = document.querySelector('#loginFrm');
  4.  
  5. loginFrm.addEventListener('submit', function(e) {
  6. e.preventDefault();
  7.  
  8. const ANIMATION_TIMEOUT = 3000; // duration of logo animation
  9. let logo = document.querySelector('.logo');
  10. let user = document.querySelector('#user').value.toLowerCase();
  11. let pass = document.querySelector('#pass').value;
  12.  
  13. // if logo already is animated, the info is already processing
  14. if(logo.classList.contains('auth')) {
  15. return false;
  16. }
  17.  
  18. logo.classList.add('auth'); // start animation
  19.  
  20. // check credentials
  21. if(user == 'john.doe@gmail.com' && pass == 'abc123') {
  22. window.setTimeout(function() {
  23. sessionStorage.setItem('full_access', false);
  24. window.location.href = 'views/home.html';
  25. }, ANIMATION_TIMEOUT);
  26. } else {
  27. window.setTimeout(function() {
  28. logo.classList.remove('auth'); // remove animation of logo
  29. showTooltip();
  30. }, ANIMATION_TIMEOUT);
  31. }
  32. });
  33.  
  34. // show and hide tooltip
  35. function showTooltip() {
  36. let tooltip = loginFrm.querySelector('.tooltip');
  37. tooltip.textContent = 'El email o contraseña ingresados no son correctos. Verifique e inténtelo nuevamente.';
  38. tooltip.classList.add('visible');
  39. // after 4 seconds, the tooltip disappear
  40. window.setTimeout(function() {
  41. tooltip.classList.remove('visible');
  42. }, 4000);
  43. }
  44. }); // end script

El script es muy simple. Escuchamos por evento submit del formulario y obtenemos lo que se ha ingresado en las cajas de texto; también añadimos una constante llamada ANIMATION_TIMEOUT que especifica el tiempo que durará la animación del pin.

Añadimos la clase 'auth' al pin para empezar la animación. Comprueba las credenciales y si coinciden crear una sessión para el usuario (HTML5 WebStorage) y redirige hacia home, todo ésto con un delay del mismo tiempo que dura la animación, esto es, que una vez que acaba la animación, se redigirá hacia home.

Si las credenciales no coindicen, quitamos la clase 'auth' del pin para poder volver a iniciar la animación las veces que se requiera. Además, mostramos el tooltip informando de los errores de credenciales. El mismo tooltip desaparecerá al cabo de 4 segundos.

El script embebido lo único que hace es hacer visible el index para darle el efecto de 'aparición':

Código
  1. 'use strict';
  2. window.addEventListener('load', function() {
  3. let main = document.querySelector('.main');
  4. main.classList.add('visible');
  5. });



2. HOME


HTML

  • Normalize.css requerido
  • Prefixfree requerido
Código
  1. <!DOCTYPE html>
  2. <html lang="es">
  3. <meta charset="UTF-8">
  4. <link rel="stylesheet" href="../css/vendor/normalize.css"/>
  5. <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"/>
  6. <link rel="stylesheet" href="../css/home.css"/>
  7. <script src="js/vendor/prefixfree.min.js"></script>
  8. <title>Home page</title>
  9. </head>
  10. <section class="preload"><i class="fa fa-4x fa-circle-o-notch fa-spin"></i></section>
  11. <section class="main">
  12. <nav class="navbar">
  13. <!-- brand -->
  14. <a href="#" class="brand">Oh yeah!<i class="fa fa-2x fa-hand-o-right"></i></a>
  15. <!-- menu -->
  16. <ul class="menu">
  17. <li><a href="#">Messages<i class="fa fa-envelope"></i></a></li>
  18. <li>
  19. <a href="#">John doe<i class="fa fa-caret-down"></i></a>
  20. <ul>
  21. <li><a href="#" id="profile-img">
  22. <img src="http://i.imgur.com/IxWfQy2.jpg"/></a>
  23. </li>
  24. <li><a href="#">Profile<i class="fa fa-user"></i></a></li>
  25. <li><a href="#">Settings<i class="fa fa-cog"></i></a></li>
  26. <li><a href="#" id="logout">Logout<i class="fa fa-sign-out"></i></a></li>
  27. </ul>
  28. </li>
  29. </ul>
  30. </nav>
  31. </header>
  32. <script src="js/homeui.js"></script>
  33. </body>
  34. </html>

El marcado es simple. Consta de un header y un nav, con una lista incluída con dos elementos: Messages y un dropdown. El dropdown contiene una lista que son las opciones del usuario logueado.

CSS

Primero hacemos todos los elementos border-box:

Código
  1. html { box-sizing: border-box; }
  2. *, *:before, *:after { box-sizing: inherit; }

Preload:

El preload es un simple etiqueta section con un elemento i dentro, el cual será la animación. Veamos que elementos tiene:

Código
  1. .preload {
  2. align-items: center;
  3. background-color: #F22613;
  4. display: flex;
  5. height: 100vh;
  6. justify-content: center;
  7. left: 0;
  8. opacity: 0;
  9. position: absolute;
  10. top: 0;
  11. transition: all .5s ease;
  12. visibility: hidden;
  13. width: 100%;
  14. z-index: 1;
  15. }
  16. .preload.visible {
  17. opacity: 1;
  18. visibility: visible;
  19. }
  20. .preload i {
  21. color: rgba(255,255,255,.9);
  22. }

Como vemos, preload ocupa el 100%(100vh) de alto y ancho, además es de posición absoluta y se posiciona en el vértice izquierdo, lo que junto con sus medidas hace que cubra toda la pantalla. Tiene una opcidad de 0 y una visibilidad oculta (hidden) por defecto, además se comporta como flexbox y tiene un centrado absoluto (flex-align: center y justify-content: center).

El color del ícono animado es de color blanco con una opacidad de .9 (hace que se note apenas el fondo). La clase que activa la animación, se llama visible y lo único que hace es cambiar la opacidad a 1 y la visibilidad a visible.

El elemento i es animado con la ayuda de font awesome, pero se puede hacer manualmente, quizás lo veamos en otro tutorial.

Main

El main es donde están todos nuestros elementos. Es el container general. Tiene las siguientes propiedades:

Código
  1. .main {
  2. opacity: 0;
  3. transition: all .6s ease;
  4. visibility: hidden;
  5. }
  6. .main.visible {
  7. opacity: 1;
  8. visibility: visible;
  9. }

Creo que en este punto ya sabemos que significa... Oculto por defecto y cuando se aplica la clase visible, se hace visible con animación. Ahora veamos el header y el nav:

Código
  1. header {
  2. background-color: #22A7F0;
  3. color: rgba(255,255,255,.9);
  4. display: block;
  5. }
  6. .navbar {
  7. align-items: center;
  8. color: inherit;
  9. display: flex;
  10. justify-content: space-between;
  11. margin: 0px;
  12. padding: 0 .5rem;
  13. width: 100%;
  14. }

Ambos tienen un ancho de 100%. El header es block y nav es flex. El nav tiene la propiedad justify-content: space-between, que hace que los hijos de alineen hacia los lados dejando todo el espacio restante del padre entre ellos. ¿Cuáles son los hijos? Son el logo de la empresa y la lista.

El logo de la empresa tiene la clase brand y tiene los siguientes estilos:

Código
  1. .brand {
  2. align-self: stretch;
  3. align-items: center;
  4. color: inherit;
  5. display: flex;
  6. font-family: 'segoe ui';
  7. margin: 0px;
  8. padding: 0 .25rem;
  9. }
  10. .brand > i {
  11. margin-left: .8rem;
  12. }

De entrada, podemos ver que el brand tiene la propiedd align-self: stretch. Ésta propiedad sobreescribe el comportamiento por defecto de un hijo flex en fila (por defecto display: flex) en el eje Y. Es decir, si el padre especifica un align-items: center y el hijo especifica align-self, stretch, predomina el comportamiento del hijo. El valor stretch hace que el hijo se estire ocupando todo el alto del padre.

Veamos la lista y sus elementos:

Código
  1. .navbar ul {
  2. display: block;
  3. list-style: none;
  4. margin: 0px;
  5. padding: 0px;
  6. }
  7. .navbar > .menu {
  8. display: block;
  9. }
  10. .menu > li {
  11. display: inline-block;
  12. transition: all .1s ease-in;
  13. }
  14. .menu > li:hover {
  15. background-color: #1C99DD;
  16. }

La lista es un bloque y sus elementos son bloque en línea, lo que hace que se muestre en forma horizontal dentro de la lista. Además, tienen una transición que anima el cambio de fondo cuando se hace hover sobre ellos. Además, ellos tendrán un margen a la derecha de 55px siempre y cuando no sea el último elemento de la lista y sus hijos (elementos a) serán elementos de bloque y tendrán cierto padding:

Código
  1. .menu > li > a {
  2. display: block;
  3. padding: 1rem .5rem;
  4. }
  5. .menu > li > a > i {
  6. margin-left: 10px;
  7. }
  8. .menu > li:not(:last-of-type) {
  9. margin: 0 55px 0 0;
  10. }

Veamos ahora, el dropdwon que serán las opciones del usuario.

Código
  1. /* last li (profile dropdown) */
  2. .menu > li:last-of-type {
  3. position: relative;
  4. }
  5. /* dropdown */
  6. .menu > li:last-of-type > ul {
  7. background-color: #22A7F0;
  8. border-radius: .1725rem;
  9. left: -50%;
  10. opcity: 0;
  11. padding: .5rem 0;
  12. position: absolute;
  13. top: 170%;
  14. visibility: hidden;
  15. transition: all .14s ease-in;
  16. }
  17. /* arrow of menu */
  18. .menu > li:last-of-type > ul:after {
  19. border-color: #22A7F0 transparent;
  20. border-style: solid;
  21. border-width: 0 8px 8px 8px;
  22. content: "";
  23. position: absolute;
  24. right: 8px;
  25. top: -7px;
  26. }
  27. .menu > li:last-of-type:hover > ul {
  28. opacity: 1;
  29. top: 130%;
  30. visibility: visible;
  31. }
  32.  

El menú de usuario (dropdown), tendrá una posición relative, lo que permitirá aplicar a su lista interna, una posición absoluta y posicionarla debajo. La lista como ya dijimos tiene posición absoluta, una opacidad de 0, visibilidad oculta (hidden), un left de -50% lo que hará que la lista se desplace a la izquierda y un top de 170% que posiciona la lista muy abajo.

Cuando se haga hover en el menú de usuario, la lista interna se hace visible (opacidad, visibility) y el top se reduce a 130%, lo que da el efecto de desplazamiento hacia arriba mientras se hace visible.

Los li y a de la lista interna, ambos son block lo que hace que se muestre en forma de columna. Además, los li tienen se animan en cuanto se haga hover sobre ellos y se cambie el color.

Código
  1. /* dropdown list items*/
  2. .menu > li:last-of-type > ul > li, .menu > li:last-of-type > ul a {
  3. display: block;
  4. font-size: .9rem;
  5. transition: transform .1s ease-in;
  6. }
  7. /* dropdown options */
  8. .menu > li:last-of-type > ul a {
  9. padding: .5rem .9rem;
  10. width: 8rem;
  11. }
  12. /* a elements of dropdown options */
  13. .menu > li:last-of-type > ul li:hover {
  14. background-color: #1998DC;
  15. }
  16. /* margin left to dropdown icon */
  17. .menu > li:last-of-type > a > i {
  18. margin-left: .8rem;
  19. }
  20. /* dropdown options icons */
  21. .menu li:last-of-type > ul a > i {
  22. float: right;
  23. margin-top: .3125rem;
  24. }

Por último, la sección donde irá el avatar del usuario:

Código
  1. /* profile image */
  2. #profile-img {
  3. display: flex;
  4. justify-content: center;
  5. margin-bottom: 5px;
  6. pointer-events: none;
  7. width: 100%;
  8. }
  9. #profile-img > img {
  10. background-position: center;
  11. background-size: cover;
  12. border-radius: 50%;
  13. display: block;
  14. height: 5rem;
  15. width: 5rem;
  16. }

La sección que contiene la imagen del usuario es un bloque tipo flex que ocupa el 100% y que alinea la imagen al centro horizontal (justify-content: center). La imagen tiene un ancho y alto de 5rem (80px) y la imagen estará centrada y ocupara todos los 80px.

El resultado:


Código JS:

Código
  1. 'use strict';
  2. window.addEventListener('load', function() {
  3. let full_access = sessionStorage.getItem('full_access');
  4. let preload = document.querySelector('.preload');
  5. let main = document.querySelector('.main');
  6. // full_access is gived when user enter for first time
  7. if(full_access == "false") {
  8. // show preload animation
  9. preload.classList.add('visible');
  10. // animation delay 3s. After that, the main content appear
  11. window.setTimeout(function() {
  12. preload.classList.remove('visible');
  13. main.classList.add('visible');
  14. },3000);
  15. // change the flag. Now, the user has full access
  16. sessionStorage.setItem('full_access', true);
  17. }
  18. // if user has full_access, just show the page
  19. else {
  20. main.classList.add('visible');
  21. }
  22. });
  23. document.addEventListener('DOMContentLoaded', function() {
  24. document.querySelector('#logout').addEventListener('click', function(e) {
  25. e.preventDefault();
  26. // remove user's session
  27. sessionStorage.removeItem('full_access');
  28. // redirect to login
  29. window.location.href = '/PreloadCSS';
  30. });
  31. });

Primero obtenemos el item 'full_access' de la sesión. Como sabemos, en el login, lo inicializamos en false cuando se ha logueado el usuario por primera vez.Seleccionamos el preload y el main y los guardamos en variables locales.

Verificamos, si full_access es false (lo será la primera vez que se loguee) se le aplica la clase 'visible' al preload, que como recordamos, al aplicarle visible se muestra el preload y su animación.

Creamos un delay de 3 segundos (el tiempo que tarda la animación) y cuando termine removemos la clase active del preload, haciendo que se oculte y agregamos la clase visible al main, haciendo que éste se haga visible. Al final, cambiamos el valor full_access por true.

Si ya se tiene acceso total, simplemente se agrega la clase visible al main, haciendolo visible (sin mostrar el preload). Lo anterior lo aplicamos en el evento load de window.

Por último, cuando el dom esté cargado, escuchamos por evento click en la opción logout del menú de usuario, removiendo la sesión y redirigiendo al login (fíjense que éste tbn tiene un efecto).


[/code]


En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.855



Ver Perfil WWW
Re: [CSS3] Login + preloader
« Respuesta #1 en: 1 Julio 2015, 15:33 pm »

Muy chulo. Así a simple vista un par de cosas:

El logo del user por defecto:
Código
  1. http://urbita.com/img/default/default_user_256.png

Lo podrías restituir por un carácter de font-awesome (ya que lo usas).
http://fortawesome.github.io/Font-Awesome/icon/user/

Así te evitas un request y amortizas aun mas a fa. Y la otra cosa es que el live demo no funciona xD

Saludos


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Preloader [Flash]
Diseño Gráfico
Azielito 6 12,584 Último mensaje 16 Agosto 2006, 17:37 pm
por Azielito
Preloader basico en Flash 5
Diseño Gráfico
atrak44 4 5,452 Último mensaje 19 Noviembre 2004, 00:31 am
por Morris
Tutorial: Preloader en Flash MX « 1 2 »
Diseño Gráfico
prosk8er 11 13,236 Último mensaje 14 Enero 2006, 11:05 am
por jfalcon
Problema con visualización de preloader desde la web
Diseño Gráfico
Kyeffer 1 2,106 Último mensaje 8 Julio 2007, 13:13 pm
por socketz
Como hacer un preloader a partir de 2 archivos
Diseño Gráfico
Churrin515 2 3,491 Último mensaje 28 Marzo 2010, 13:09 pm
por JarBer
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines