En aquest tutorial aprendrem a crear maneres emergents amb JavaScript (finestres de diàleg) sense utilitzar un framework de treball com Bootstrap, o una biblioteca de tercers. Crearem tot des de zero, oferint-nos un control complet sobre com funciona i com es veu. A
Aquí està la demostració que crearem:
1. Inicia amb el marcatge de la pàgina
Primer crearem un modal. Per fer-ho, afegirem la classe .modal
i una ID única a un contenidor. Després especificarem el diàleg establint un element .modal-dialog
com a element secundari directe de l’.modal
. El diàleg ha de contenir el contingut de l’modal. Pot ser qualsevol tipus de contingut com a text, imatges, lightboxes, notificacions / alertes d’usuaris, etc.
“Una finestra de diàleg (o modal) és un petit element d’interfície d’usuari (UI) que apareix en primer pla en un lloc web, generalment s’activa com un avís perquè l’usuari faci alguna cosa “- Adi Purdila a
Per obrir un modal, necessitarem qualsevol element amb l’atribut data-open
(normalment button
). El valor d’aquest atribut ha de ser la identificació de l’modal desitjat.
Per defecte, 1 modal es tancarà si fem clic fora dels seus límits o quan pressionem la tecla Esc
. Però també podem tancar-lo si fem clic a qualsevol element amb l’atribut data-close
(normalment button
).
A el principi , el modal apareixerà / desapareixerà amb un efecte d’esvaïment. Però tenim la capacitat d’ajustar l’efecte d’animació de l’diàleg mitjançant l’atribut data-animation.
El valor d’aquest atribut que s’ha d’afegir a .modal
pot ser qualsevol dels següents valors:
-
slideInOutDown
-
slideInOutTop
-
slideInOutLeft
a -
slideInOutRight
a -
zoomInOut
-
rotateInOutDown
a -
mixInAnimations
Veurem més de prop aquests valors en una propera secció.
per ara, anem a familiaritzar-nos amb el marcatge que es necessita per representar un només modal: a
<button type="button" class="open-modal" data-open="modal1">...</button><div class="modal"> <div class="modal-dialog"> <header class="modal-header"> ... <button class="close-modal" aria-label="close modal" data-close>✕</button> </header> <section class="modal-content">...</section> <footer class="modal-footer">...</footer> </div></div>
2. Defineix alguns estils bàsics
Amb el marcat preparat, configurarem algunes variables CSS i reiniciarem els estils: a
:root { --lightgray: #efefef; --blue: steelblue; --white: #fff; --black: rgba(0, 0, 0, 0.8); --bounceEasing: cubic-bezier(0.51, 0.92, 0.24, 1.15);}* { padding: 0; margin: 0;}button { cursor: pointer; background: transparent; border: none; outline: none; font-size: inherit;}
Després, centrarem de manera horitzontal i vertical el contingut d i la pàgina. A més, li donarem alguns estils a el botó responsable d’obrir el modal:
/*CUSTOM VARIABLES HERE*/body { display: flex; align-items: center; justify-content: center; height: 100vh; font: 16px/1.5 sans-serif;}.btn-group { text-align: center;}.open-modal { font-weight: bold; background: var(--blue); color: var(--white); padding: .75rem 1.75rem; margin-bottom: 1rem; border-radius: 5px;}
En aquest punt, centrarem la nostra atenció en els estils de l’modal.
Cada modal tindrà les següents característiques:
- Serà a pantalla completa amb una posició fixa. És a dir, es veurà com una superposició que cobreix tot l’ample i alt de la finestra.
- Tindrà un color de fons fosc.
- Estarà ocult per defecte.
- El diàleg estarà centrat de forma horitzontal i vertical.
/*CUSTOM VARIABLES HERE*/.modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; display: flex; align-items: center; justify-content: center; padding: 1rem; background: var(--black); cursor: pointer; visibility: hidden; opacity: 0; transition: all 0.35s ease-in;}
El diàleg tindrà una amplada i una altura màximes. La seva altura serà el 80% de l’alçada de la finestra. En els casos en que la seva altura excedeixi aquest valor, apareixerà una barra de desplaçament vertical:
/*CUSTOM VARIABLES HERE*/.modal-dialog { position: relative; max-width: 800px; max-height: 80vh; border-radius: 5px; background: var(--white); overflow: auto; cursor: default;}
Finalment, definirem uns quants estils simples per a cadascuna de les seccions de contingut:
/*CUSTOM VARIABLES HERE*/.modal-dialog > * { padding: 1rem;}.modal-header,.modal-footer { background: var(--lightgray);}.modal-header { display: flex; align-items: center; justify-content: space-between;}.modal-header .modal-close { font-size: 1.5rem;}.modal p + p { margin-top: 1rem;}
a
3. Alternant el modal
Una pàgina pot tenir més d’un modal. Però com es va comentar anteriorment, tots els modals estaran ocults a el principi.
Obre el modal
De la mateixa manera, una pàgina pot tenir més d’un activador obert (elements amb l’atribut data-open
). Cada vegada que es faci clic en un activador, el modal associat hauria de fer-se visible amb una animació apareixent gradualment (fade-in). Recorda que el valor de l’atribut data-open
ha de coincidir amb l’ID d’un modal.
Aquí està l’script que revela un modal:
const openEls = document.querySelectorAll("");const isVisible = "is-visible";for(const el of openEls) { el.addEventListener("click", function() { const modalId = this.dataset.open; document.getElementById(modalId).classList.add(isVisible); });}
I les classes rellevants de CSS:
.modal { visibility: hidden; opacity: 0; transition: all 0.35s ease-in;}.modal.is-visible { visibility: visible; opacity: 1;}
Tanca el modal
Amb la nostra implementació únicament pot aparèixer un modal alhora (aquest codi no suporta modals niats). Com es va esmentar en la secció de marcat anterior, hi ha tres mètodes disponibles per a ocultar amb un efecte d’esvaïment (fade-out).
Recapitulem.
En primer lloc, fent clic a l’element personalitzat que es localitza dins de l’modal:
const closeEls = document.querySelectorAll("");const isVisible = "is-visible";for (const el of closeEls) { el.addEventListener("click", function() { this.parentElement.parentElement.parentElement.classList.remove(isVisible); });}
en segon lloc, fent clic a arreu fora de l’modal: a
const isVisible = "is-visible";document.addEventListener("click", e => { if (e.target == document.querySelector(".modal.is-visible")) { document.querySelector(".modal.is-visible").classList.remove(isVisible); }});
en aquest cas, el modal (la superposició ) es comporta com un botó gegant de tancament. Per aquesta raó li vam donar cursor: pointer
.
Finalment, pressionant la tecla Esc
:
const isVisible = "is-visible";document.addEventListener("keyup", e => { if (e.key == "Escape" && document.querySelector(".modal.is-visible")) { document.querySelector(".modal.is-visible").classList.remove(isVisible); }});
És un bon moment per veure el que hem creat fins ara:
La modal es veu molt bé! Observa que cada vegada que fem clic a un activador obert, uúnicamente es carrega el modal corresponent.
Fem un pas més i examinem algunes idees per animar el seu diàleg.
4. Afegeix animacions a el diàleg
Com ho vam indicar abans, el comportament per defecte de l’modal és aparició gradual (fade-in) i esvaïment gradual (fade-out). Però hi ha l’opció d’ajustar l’efecte d’animació de la finestra emergent.
Ja he creat bastants efectes d’animació que podries utilitzar com a alternativa a l’efecte d’esvaïment. Per fer-ho, simplement has de passar l’atribut data-animation="yourDesiredAnimation"
a .modal
.
Per exemple, si vols que el diàleg aparegui amb una animació de lliscament d’esquerra a dreta, et caldrà l’efecte slideInOutLeft
.
Darrere d’escenes, hi ha dues regles que aconsegueixen aquesta animació:
/*CUSTOM VARIABLES HERE*/ .modal-dialog { opacity: 0; transform: translateX(-100%); transition: all 0.5s var(--bounceEasing);}.is-visible .modal-dialog { opacity: 1; transform: none; transition-delay: 0.2s;}
Revisa el modal amb aquest tipus d’animació aquí:
Pots revisar la resta de les animacions mirant la pestanya de CSS de el projecte final de la demostració . Depenent de la complexitat de les animacions, he utilitzat transicions CSS o animacions per crear-les.
També he fet servir la funció cubic-bezier()
per ajustar la funció de temps de totes les transicions. Si no us agrada l’efecte de rebot que produeix, sentir-se lliure de canviar-ho a una mica més suau mitjançant la variable --bounceEasing CSS
.
Mira la demostració final amb tots els efectes d’animació aquí:
Conclusió
Això és tot, amics! Durant aquest tutorial vam aprendre a crear diàlegs modals animats personalitzats sense dependre de cap framework de front-end.
Espero que hagis gaudit d’el resultat final i que la seva creació t’hagi ajudat a posar a el dia les teves habilitats de front- end.
Tingues present que no hem considerat l’accessibilitat, així que si volen millorar aquesta demostració, aquest podria ser el següent pas.
Com sempre, gràcies per llegir-nos!
Més lectures sobre finestres emergents
-
Plugins de WordPressMés de 20 de els millors plugins de WordPress per a finestres emergents i Opt-InNona Blackman
-
Disseny d’UILa millor manera d’usar finestres de diàleg (modals) en el teu disseny webAdi Purdila
-
WordPressCom crear finestres emergents espectaculars en WordPress amb Elementor ProAdi Purdila