Crea una interfaz similar a Windows con jQuery UI
Spanish (Español) translation by Luis Chiabrera (you can also view the original English article)



¿Alguna vez has querido crear una interfaz de usuario interactiva para tu aplicación, pero no sabías cómo hacerlo? En este tutorial, crearemos una interfaz similar a Windows de forma rápida y sencilla, al ponernos manos a la obra con jQuery UI, una biblioteca de interfaz de usuario construida sobre jQuery.
¿Qué es exactamente jQuery UI?
jQuery UI proporciona abstracciones para interacción y animación de bajo nivel, efectos avanzados y widgets temáticos de alto nivel.
jQuery UI siempre ha sido una gran herramienta en el kit de cualquier desarrollador de front-end. Tiene muchos widgets y efectos diferentes que se han diseñado maravillosamente para que funcionen con la mayoría de los navegadores. ¿Quieres una forma rápida de crear una interfaz con pestañas? ¡jQuery UI los tiene! ¿Quieres crear un cuadro de diálogo modal? ¡También los tiene!
En este tutorial, aprenderemos cómo utilizar jQuery UI para crear una interfaz de usuario altamente funcional sin usar nada más. Al final, deberías estar familiarizado con la interfaz de usuario de jQuery, algunos de sus componentes y la comprensión básica de la personalización de la interfaz de usuario de jQuery. En última instancia, crearemos una interfaz de usuario similar a Windows, con cuadros de diálogo que se pueden arrastrar, cambiar de tamaño, minimizar y maximizar.
Nota: Si realmente deseas personalizar todos los rincones del tema de la interfaz de usuario de jQuery, debes consultar este tutorial titulado "Una guía masiva para los widgets de la interfaz de usuario de jQuery de temas personalizados". Es un tutorial solo para Premium, pero te garantizo que vale la pena comprarlo.
Nuestro objetivo: crear cuadros de diálogo similares a ventanas que se puedan arrastrar, redimensionar, minimizar y maximizar, que podamos implementar para diferentes tipos de aplicaciones.
Paso 1: Configuración
Para comenzar, descarga la biblioteca jQuery UI de su sitio, http://jqueryui.com. Una vez que visites el sitio, verás múltiples opciones para "personalizar" tu descarga de jQuery UI.


La página de descarga de jQuery UI Para los propósitos de nuestro tutorial, asegúrate de que todos los componentes estén seleccionados. Para el tema, selecciona el tema Flick. Verifica que también selecciones la versión 1.8.16, ya que la página de descarga de jQuery UI proporciona una versión heredada para versiones anteriores de jQuery.
La descarga de la interfaz de usuario de jQuery también debería venir con la versión 1.6.2 de la biblioteca jQuery. Si estás usando una versión más actual de jQuery, deberías usarla en su lugar. Esta es solo la versión mínima de jQuery que necesita jQuery UI.
Extrae la descarga en la carpeta pública de tu proyecto. La descarga sugiere una estructura para los recursos de tu sitio:


Estructura de archivo sugerida para los recursos de tu sitio - una carpeta
jspara tus archivos JavaScript (jQuery UI y jQuery) - una carpeta
csspara tus archivos CSS (jQuery UI theme CSS)
Siéntete libre de cambiar esto para que se adapte a tus necesidades, aunque en mi experiencia, esta es una excelente manera de organizar los recursos de tu sitio.
Después de extraer tus archivos, crea un archivo index.html que contendrá el HTML de nuestra página. El contenido del archivo HTML debe ser el siguiente:
1 |
<!DOCTYPE html>
|
2 |
<html>
|
3 |
<head>
|
4 |
<meta charset="utf-8"> |
5 |
<title>Creating a windows-like interface with jQuery UI</title> |
6 |
<!-- Load the jQuery UI CSS -->
|
7 |
<link rel="stylesheet" href="css/flick/jquery-ui-1.8.16.custom.css" type="text/css" /> |
8 |
|
9 |
<!-- Load jQuery first before jQuery UI! -->
|
10 |
<script src="js/jquery-1.6.2.min.js"></script> |
11 |
<script src="js/jquery-ui-1.8.16.custom.min.js"></script> |
12 |
</head>
|
13 |
<body>
|
14 |
</body>
|
15 |
</html>
|
Paso 2: crea el HTML para nuestras ventanas Dialog
Ahora, comencemos creando el HTML para nuestras ventanas Dialog. De acuerdo con la página de documentación de Dialog en el sitio de jQuery UI, el HTML de un cuadro Dialog es simplemente un <div>. Cualquier otro HTML dentro de <div> se convierte en el contenido del cuadro de diálogo. Sabiendo eso, crea una ventana de cuadro Dialog simple y ábrela usando jQuery UI.
Copia el siguiente código en el <body> del archivo HTML:
1 |
<div id="dialog_window_1" class="dialog_window" title="This is our first dialog window"> |
2 |
<p>Hello World!</p> |
3 |
</div>
|
Luego, inicia el cuadro Dialog ejecutando este JavaScript. Copia el siguiente código dentro del <head> del archivo HTML:
1 |
<script> |
2 |
$(document).ready(function() {
|
3 |
$('#dialog_window_1').dialog();
|
4 |
}); |
5 |
</script> |
Una vez que actualices la página, deberías ver algo como esto:



Hola Mundo!
Se puede inicializar un cuadro Dialog simplemente llamando a la función $(element_id).dialog(). Y como puedes ver, nuestro contenido dentro del <div> se convertirá en contenido para el cuadro de diálogo.
Ahora, crea un formulario simple para crear nuevos cuadros Dialog dentro del Dialog Box. Reemplaza el código Hello World! dentro de nuestro cuadro Dialog inicial con lo siguiente:
1 |
<h3>Create a new <code>Dialog</code> Window</h3> |
2 |
<table class="dialog_form"> |
3 |
<tr>
|
4 |
<th>window Title</th> |
5 |
</tr>
|
6 |
<tr>
|
7 |
<td><input type="text" id="new_window_title" /></td> |
8 |
</tr>
|
9 |
<tr>
|
10 |
<th>
|
11 |
window Content |
12 |
</th>
|
13 |
</tr>
|
14 |
<tr>
|
15 |
<td>
|
16 |
<textarea id="new_window_content"></textarea> |
17 |
</td>
|
18 |
</tr>
|
19 |
<tr>
|
20 |
<th>
|
21 |
window Buttons |
22 |
</th>
|
23 |
</tr>
|
24 |
<tr>
|
25 |
<td id="buttonlist"> |
26 |
<input type="checkbox" id="alertbutton" /><label for="alertbutton">ALERT</label> |
27 |
<input type="checkbox" id="closebutton" /><label for="closebutton">CLOSE</label> |
28 |
<input type="checkbox" id="clonebutton" /><label for="clonebutton">CLONE</label> |
29 |
</td>
|
30 |
</tr>
|
31 |
</table>
|
Cuando actualices la página, debería verse así:


Se ve un poco feo en este momento, pero no te preocupes, agregaremos algunas personalizaciones a la ventana Dialog para que se vea mejor
Paso 3: Personalizar nuestras ventanas Dialog a través de opciones de Dialog y CSS
Nuestro cuadro Dialog actualmente no se ve muy bien, pero podremos personalizarlo proporcionando algunas opciones de inicialización para nuestro código de inicialización de Dialog y, por supuesto, algo de CSS.
Reemplacemos nuestro código de inicialización con lo siguiente:
1 |
$('#dialog_window_1').dialog({
|
2 |
width: 'auto', |
3 |
height: 'auto' |
4 |
}); |
Agreguemos también algo de CSS en el <head> de nuestro HTML:
1 |
<style> |
2 |
.dialog_form th { |
3 |
text-align: left; |
4 |
}
|
5 |
|
6 |
.dialog_form textarea, .dialog_form input[type=text] { |
7 |
width: 320px; |
8 |
}
|
9 |
</style> |



¡Mucho mejor!
Analicemos algunas de las opciones que usamos en nuestro código de inicialización:
-
width- esta opción te permite establecer un ancho específico para tu cuadroDialog. También puedes configurarlo en'auto'para permitir que jQuery UI establezca el ancho dinámicamente -
height- hace prácticamente lo mismo que la opciónwidth, pero lo hace para la altura del cuadroDialogen lugar de el ancho
Hay muchas más opciones para el cuadro Dialog, pero la mayoría se ocupa del comportamiento del cuadro Dialog. Veremos algunos de estos en los pasos posteriores del tutorial.
Ahora que tenemos un cuadro Dialog atractivo con un formulario dentro, ¡agreguemos algunos Buttons a nuestro cuadro Dialog para que haga algo!
Paso 4: agregar un Button para abrir nuestra ventana Dialog
Una de las mejores cosas de jQuery UI es su modularidad. Por ejemplo, el cuadro Dialog también utiliza otros componentes de la interfaz de usuario de jQuery, como Draggable, Resizable y, lo que es más importante, el componente Button.

Ejemplo de botón de la documentación de jQuery UI
El componente Button nos permite crear botones con funciones personalizadas al hacer clic. Y al mismo tiempo, se corresponde con el tema que instalamos con jQuery UI, por lo que cambiar el tema también cambiará el aspecto del botón, manteniendo el diseño uniforme en todo el sitio.
Para empezar, crea un Button para abrir y cerrar nuestro cuadro Dialog. Agrega esto al <body> del HTML:
1 |
<button id="create_button">Create a new window</button> |
E inicialízalo agregando esto a la función $(document).ready():
1 |
$('#create_button').button();
|



Genial botón hermano
Como estamos haciendo cosas con botones, convierte nuestras checkboxes en botones también para que se vean mejor. El componente jQuery UI Button también te permite recrear un conjunto de casillas de verificación o botones de opción en un Buttonset. Para hacerlo, simplemente copia el siguiente código en el bloque de JavaScript:
1 |
$('#buttonlist').buttonset();
|
Ahora, actualiza la página para ver las nuevas casillas de verificación bonitas:


Ahora que el cuadro Dialog y el Button se muestran bien, podemos cambiar su comportamiento para que el Button abra y cierre el Dialog. Para hacerlo, actualiza el bloque de JavaScript para que se vea así:
1 |
$(document).ready(function() {
|
2 |
//initialize the button and add a click function to our button so that it"ll open the window |
3 |
$("#create_button").button().click(function() {
|
4 |
var create_dialog = $("#dialog_window_1");
|
5 |
var create_button = $(this); |
6 |
|
7 |
//if the window is already open, then close it and replace the label of the button |
8 |
if( create_dialog.dialog("isOpen") ) {
|
9 |
create_button.button("option", "label", "Create a new window");
|
10 |
create_dialog.dialog("close");
|
11 |
} else {
|
12 |
//otherwise, open the window and replace the label again |
13 |
create_button.button("option", "label", "Close window");
|
14 |
create_dialog.dialog("open");
|
15 |
} |
16 |
}); |
17 |
|
18 |
//open our dialog window, but set autoOpen to false so it doesn"t automatically open when initialized |
19 |
$("#dialog_window_1").dialog({
|
20 |
width: "auto", |
21 |
height: "auto", |
22 |
autoOpen : false |
23 |
}); |
24 |
|
25 |
//initialize our buttonset so our checkboxes are changed |
26 |
$("#buttonlist").buttonset();
|
27 |
}); |
Repasemos el código línea por línea:
- Hemos agregado una función de
clicka nuestroButtonque abre el cuadroDialogcada vez que hacemos clic en él. - Además, usamos el método
$(dialog_id).dialog('isOpen'), que devuelvetruesi nuestroDialogya está abierto yfalsesi no. - Si
Dialogestá cerrado, abrimos la ventanaDialogllamando al método$(dialog_id).dialog('open'), y cambiamos lalabeldelButtona "Close window" usando el método$(button_id) .button ('option'). - Si ya está abierto, hacemos lo contrario usando el mismo método
OptionenButtony el método$(dialog_id).dialog('close')para cerrar el cuadroDialog. - También hemos aprovechado otra opción de
Dialog, que se llamaautoOpen. Cuando se establece en verdadero, permite que la ventanaDialogse abra automáticamente cuando se inicializa. De lo contrario, la ventanaDialogsolo se puede abrir llamando al método$(dialog_id).dialog('open'), que es lo que hace el botón.



Botones funcionales y casillas de verificación hermano
Paso 5: agregar funcionalidad a nuestra ventana Dialog
Ahora que la ventana Dialog está en funcionamiento, agreguemos la funcionalidad para crear nuevas ventanas Dialog. En primer lugar, agrega algunos botones a nuestro Dialog. Afortunadamente, jQuery UI tiene la funcionalidad de agregar botones a cualquier cuadro Dialog y personalizar lo que hacen cuando se hace clic en ellos. Para hacerlo, modifica el código de inicialización agregando un parámetro buttons:
1 |
$('#dialog_window_1').dialog({
|
2 |
width: 'auto', |
3 |
height: 'auto', |
4 |
autoOpen : false, |
5 |
buttons: [ |
6 |
{
|
7 |
text: 'Create', |
8 |
click: function() {
|
9 |
alert('Yay, clicked the button!');
|
10 |
} |
11 |
} |
12 |
] |
13 |
}); |
Como puedes ver en el código de muestra, agregamos el botón "Create" simplemente agregando una opción buttons al código de inicialización. La opción button es una matriz de objetos JSON en el siguiente formato:
1 |
{
|
2 |
text: 'Name of your button', |
3 |
click: function () {
|
4 |
//Add stuff here to do when the button is clicked |
5 |
} |
6 |
} |
Para agregar más botones, simplemente puedes agregar más objetos JSON en el mismo formato a la matriz buttons. Cuando actualices la página, debería verse así:



¡Yupi, hiciste clic en el botón!
Ahora agregaremos algunas funciones a nuestro botón. Elimina la linea alert('Yay, clicked the button!'); y reemplázala con lo siguiente:
1 |
//get the total number of existing dialog windows plus one (1) |
2 |
var div_count = $('.dialog_window').length + 1;
|
3 |
|
4 |
//generate a unique id based on the total number |
5 |
var div_id = 'dialog_window_' + div_count; |
6 |
|
7 |
//get the title of the new window from our form, as well as the content |
8 |
var div_title = $('#new_window_title').val();
|
9 |
var div_content = $('#new_window_content').val();
|
10 |
|
11 |
//generate a buttons array based on which ones of our checkboxes are checked |
12 |
var buttons = new Array(); |
13 |
if( $('#alertbutton').is(':checked') ) {
|
14 |
buttons.push({
|
15 |
text: 'ALERT', |
16 |
click: function() {
|
17 |
alert('ALERTING from Dialog Widnow: ' + div_title);
|
18 |
} |
19 |
}); |
20 |
} |
21 |
|
22 |
if( $('#closebutton').is(':checked') ) {
|
23 |
buttons.push({
|
24 |
text: 'CLOSE', |
25 |
click: function() {
|
26 |
$('#' + div_id).dialog('close');
|
27 |
} |
28 |
}); |
29 |
} |
30 |
|
31 |
//append the dialog window HTML to the body |
32 |
$('body').append('<div class="dialog_window" id="' + div_id + '">' + div_content + '</div>');
|
33 |
|
34 |
//initialize our new dialog |
35 |
var dialog = $('#' + div_id).dialog({
|
36 |
width: 'auto', |
37 |
height: 'auto', |
38 |
title : div_title, |
39 |
autoOpen : true, |
40 |
buttons: buttons |
41 |
}); |
Aquí hay un paso a paso del código que acabamos de agregar arriba:
- Primero, obtén el número total de ventanas
Dialogen el sitio. - A partir de esto, genera una nueva id que se utilizará para la nueva ventana
Dialog. - Obtén el
window Titley los valores delwindow Contentdel formulario “Create a newDialogwindow”. - Comprueba si las casillas de verificación
ALERTyCLOSEestán marcadas. Si es así, crea un objeto JSON, siguiendo el formatobuttonde arriba, y empújalo en una matrizbuttons. - Genera y agrega el HTML de la ventana
Dialogdentro de la etiqueta<body>de la página - Por último, inicializa la nueva ventana
Dialogutilizando el código de inicialización como el que se utilizó en la ventanaDialogoriginal.
Juega con él y prueba diferentes combinaciones de botones. Aquí hay una captura de pantalla con todas las combinaciones posibles:



Lorem ipsum dolor sit amet
Ahora que podemos crear varias ventanas, ¡agreguemos algunas funciones de minimizar y maximizar!
Paso 6: Hacer que las ventanas Dialog sean "Minimizables" y "Maximizables"
Desafortunadamente, jQuery UI no tiene métodos integrados de minimize y maximize, pero podemos agregarlo fácilmente anulando algunas cosas en el proceso de inicialización del prototipo de jQuery UI Dialog. Esencialmente, vamos a agregar un código posterior a la inicialización que creará automáticamente un "estado minimizado", agregará un ícono de minimizar para las ventanas Dialog, así como una función que "maximiza" la ventana minimizada cuando el estado minimizado sea clickeado.
Comencemos agregando el CSS para diseñar los botones y el estado minimizado:
1 |
#dialog_window_minimized_container { |
2 |
position: fixed; |
3 |
bottom: 0px; |
4 |
left: 0px; |
5 |
}
|
6 |
|
7 |
.dialog_window_minimized { |
8 |
float: left; |
9 |
padding: 5px 10px; |
10 |
font-size: 12px; |
11 |
cursor: pointer; |
12 |
margin-right: 2px; |
13 |
display: none; |
14 |
}
|
15 |
|
16 |
.dialog_window_minimized .ui-icon { |
17 |
display: inline-block !important; |
18 |
position: relative; |
19 |
top: 3px; |
20 |
cursor: pointer; |
21 |
}
|
22 |
|
23 |
.ui-dialog .ui-dialog-titlebar-minimize { |
24 |
height: 18px; |
25 |
width: 19px; |
26 |
padding: 1px; |
27 |
position: absolute; |
28 |
right: 23px; |
29 |
top: 9px; |
30 |
}
|
31 |
|
32 |
.ui-dialog .ui-dialog-titlebar-minimize .ui-icon { |
33 |
display: block; |
34 |
margin: 1px; |
35 |
}
|
36 |
|
37 |
.ui-dialog .ui-dialog-titlebar-minimize:hover, .ui-dialog .ui-dialog-titlebar-minimize:focus { |
38 |
padding: 0; |
39 |
}
|
También necesitaremos agregar un contenedor de "estado minimizado", donde agregaremos todas las ventanas minimizadas. Agrega esto dentro de la etiqueta <body> :
1 |
<div id="dialog_window_minimized_container"></div> |
Ahora, agrega este bloque de código JavaScript después del lugar donde se carga la biblioteca jQuery UI. Esto es importante ya que no funcionará si es antes de que se cargue la biblioteca.
1 |
<script> |
2 |
var _init = $.ui.dialog.prototype._init; |
3 |
$.ui.dialog.prototype._init = function() {
|
4 |
//Run the original initialization code |
5 |
_init.apply(this, arguments); |
6 |
|
7 |
//set some variables for use later |
8 |
var dialog_element = this; |
9 |
var dialog_id = this.uiDialogTitlebar.next().attr('id');
|
10 |
|
11 |
//append our minimize icon |
12 |
this.uiDialogTitlebar.append('<a href="#" id="' + dialog_id +
|
13 |
'-minbutton" class="ui-dialog-titlebar-minimize ui-corner-all">'+ |
14 |
'<span class="ui-icon ui-icon-minusthick"></span></a>'); |
15 |
|
16 |
//append our minimized state |
17 |
$('#dialog_window_minimized_container').append(
|
18 |
'<div class="dialog_window_minimized ui-widget ui-state-default ui-corner-all" id="' + |
19 |
dialog_id + '_minimized">' + this.uiDialogTitlebar.find('.ui-dialog-title').text() +
|
20 |
'<span class="ui-icon ui-icon-newwin"></div>'); |
21 |
|
22 |
//create a hover event for the minimize button so that it looks good |
23 |
$('#' + dialog_id + '-minbutton').hover(function() {
|
24 |
$(this).addClass('ui-state-hover');
|
25 |
}, function() {
|
26 |
$(this).removeClass('ui-state-hover');
|
27 |
}).click(function() {
|
28 |
//add a click event as well to do our "minimalization" of the window |
29 |
dialog_element.close(); |
30 |
$('#' + dialog_id + '_minimized').show();
|
31 |
}); |
32 |
|
33 |
//create another click event that maximizes our minimized window |
34 |
$('#' + dialog_id + '_minimized').click(function() {
|
35 |
$(this).hide(); |
36 |
dialog_element.open(); |
37 |
}); |
38 |
}; |
39 |
</script> |
Esto es lo que hace este código:
- Deja que el código de inicialización
Dialogde la jQuery UI original se ejecute a través de_init.apply(this, arguments); - Utiliza
Appendpara agregar el icono de minimizar a la barra de título del cuadroDialog - Escribe
Appendpara agregar el HTML de estado minimizado dentro del<div> #dialog_window_minimized_container - Escribe
hoverpara agregar un evento de desplazamiento al ícono de minimizar para que obtenga la claseui-state-hovercuando se pasa el mouse sobre él, lo que agregará el efecto de "cambio de color de fondo" que vemos. - Cree un evento de clic para él que cierre la ventana
Dialogy muestre el estado minimizado - Finalmente, cree otro evento de clic para el estado minimizado que se oculta y vuelve a abrir la ventana
Dialog.
¡Y ahora, nuestra interfaz similar a Windows está completa!



interfaz similar a Windows, ¡hurra!
Conclusión
En este artículo, hemos demostrado lo fácil que es crear una interfaz de usuario hermosa y altamente funcional usando nada más que jQuery y jQuery UI. A estas alturas, ya deberías saber cómo:
- Descargar y configurar la biblioteca jQuery UI para tu proyecto
- Utilizar el componente
Dialog,ButtonyButtonsetde jQuery UI. - Crear cuadros
Dialogde forma estática y dinámica utilizando información de cualquier fuente - Crear dinámicamente diferentes
Dialog Buttonscon cada nuevo cuadroDialog. - Agregar funcionalidad personalizada al
Dialogde la jQuery UI, p. Ej. función de minimizar y maximizar. - Personalizar el proceso de inicialización de jQuery UI
Vale la pena tomar nota de que hay muchos más componentes que puedes aprovechar a través de jQuery UI. Definitivamente es una excelente manera de crear interfaces de usuario increíbles de forma rápida y sencilla. Con suerte, este artículo te ha demostrado que jQuery UI es una herramienta esencial en el conjunto de herramientas de cualquier desarrollador.
¿Has usado jQuery UI en el pasado o planeas usarlo para un proyecto futuro? ¡Háznos saber en los comentarios a continuación y muchas gracias por leer!





