Menú contextual personalizado usando JavaScript
- Traducción
- Tutorial
Las aplicaciones web hoy en día se están convirtiendo en un nuevo paso hacia el desarrollo de la web. Estos están lejos de ser sitios de información ordinarios. Ejemplos de aplicaciones web avanzadas incluyen Gmail y Dropbox. A medida que las aplicaciones web crecen en funcionalidad, disponibilidad y utilidad, también aumenta la necesidad de aumentar la eficiencia de su uso. Esta guía analizará la creación de algo tan útil como su propio menú contextual y, en particular:
En su computadora, al hacer clic derecho en el escritorio aparecerá el menú contextual del sistema operativo. Desde aquí probablemente puedas crear una nueva carpeta, obtener información y hacer algo más. El menú contextual del navegador permite, por ejemplo, obtener información sobre una página, ver sus fuentes, guardar una imagen, abrir un enlace en una nueva pestaña, trabajar con el portapapeles, etc. Además, el conjunto de acciones disponibles depende de dónde exactamente hizo clic, es decir, del contexto. Este es el comportamiento estándar previsto por los desarrolladores de navegadores [ Y sus extensiones].
Las aplicaciones web están empezando poco a poco a sustituir los menús contextuales estándar por los suyos propios. Grandes ejemplos son los mismos Gmail y Dropbox. La única pregunta es ¿cómo crear tu propio menú contextual? En el navegador, cuando hace clic con el botón derecho del mouse, se activa el evento del menú contextual. Tendremos que anular el comportamiento predeterminado y hacer que muestre el nuestro en lugar del menú estándar. No es tan difícil, pero lo veremos paso a paso, por lo que será bastante extenso. Primero, creemos la estructura básica de la aplicación para que el ejemplo que se está desarrollando no esté completamente divorciado de la realidad.
Lista de tareas Imaginemos que estamos creando una aplicación que permite mantener una lista de tareas. Entiendo que probablemente ya estés increíblemente cansado de todas estas listas de tareas, pero que así sea. La página de la aplicación contiene una lista de tareas pendientes. Para cada tarea, está disponible un conjunto típico de acciones CRUD: obtener información sobre la tarea, agregar una nueva, editar, eliminar.Un ejemplo del resultado está en CodePen. Puedes mirar allí de inmediato si eres demasiado vago para leer o quieres asegurarte de que estás realmente interesado en seguir leyendo. Bueno, por ahora, comencemos el desarrollo paso a paso de nuestro plan. Usaré algunos trucos CSS modernos y crearé una lista de tareas simple usando atributos de datos. También usaré el restablecimiento de estilo de Eric Meyer y restableceré la propiedad de tamaño del cuadro para todos los elementos en el cuadro de borde:
*, *::antes, *::después ( tamaño de caja: cuadro-borde; )
No usaré prefijos en CSS, pero la demostración de CodePen incluye un prefijo automático.
- Ir al supermercado
Si usa CodePen, puede habilitar el prefijo automático y la conexión de restablecimiento de CSS en la configuración. En caso contrario, tendrás que hacer todo manualmente, si este proceso aún no se ha automatizado. Recuerde que nuestro objetivo es crear un menú contextual, por lo que no se implementará el procesamiento de acciones. Ahora agreguemos algo más de CSS:
/* tareas */ .tasks (estilo de lista: ninguno; margen: 0; relleno: 0; ) .task ( visualización: flex; justificar contenido: espacio entre; relleno: 12px 0; borde inferior: sólido 1px # dfdfdf; ) .tarea: último hijo ( borde inferior: ninguno; )
El conjunto completo de estilos (y todo lo demás) se presenta en CodePen. Y aquí estarán las partes más importantes del código, marcado y diseño. Pero finalmente acerquémonos a nuestro menú contextual. Describamos nuestro menú contextual: marcado. La base de nuestro menú es la misma que la de cualquier otro menú: una lista desordenada anidada en la etiqueta de navegación. Cada acción se representará como un elemento de lista con un enlace. Cada enlace es responsable de una acción específica. Como mencioné anteriormente, necesitamos tres acciones en el menú contextual:
Si no tiene idea de dónde colocar este marcado, colóquelo antes de la etiqueta del cuerpo de cierre. Antes de pasar a CSS, aclaremos un par de puntos:
.context-menu ( display: none; posición: absoluta; z-index: 10; ) .context-menu--active ( display: block; ) Expandiendo nuestro menú contextual - JavaScript Comencemos viendo cómo registrar el evento del menú contextual . Abramos una función autoejecutable y capturemos el evento en todo el documento. También registraremos el evento en la consola para obtener información:
(función() ( "usar estricto"; document.addEventListener("menú contextual", función(e) ( console.log(e); )); ))();
Si abre la consola y hace clic derecho en algún lugar, verá que el evento realmente se muestra allí. Hay mucha información diferente aquí que podemos usar. Estamos especialmente interesados en las coordenadas. Antes de cancelar el comportamiento predeterminado, tengamos en cuenta que no es necesario hacer esto en todo el documento, sino solo en los elementos de la lista de tareas. Teniendo esto en cuenta, deberás completar los siguientes pasos:
(función() ( "usar estricto"; var taskItems = document.querySelectorAll(".task"); para (var i = 0, len = taskItems.length; i< len; i++) { var taskItem = taskItems[i]; contextMenuListener(taskItem); } function contextMenuListener(el) { el.addEventListener("contextmenu", function(e) { console.log(e, el); }); } })();
Si observa la consola, puede ver que se activa un evento único cada vez que hace clic en un elemento de la lista de tareas. Ahora, además de cancelar el comportamiento predeterminado, implementamos la visualización del menú contextual agregándole una clase auxiliar.
Pero primero, agreguemos una ID al menú para que sea más fácil de recuperar a través de JS. También agregaremos una variable de estado de menú menuState y una variable con la clase activa. Tenemos tres variables:
menú var = document.querySelector("#menú contextual"); var estado del menú = 0; var active = "menú contextual--activo";
Sigamos adelante. Revisemos la función contextMenuListener y agreguemos toggleMenuOn, que muestra el menú:
función contextMenuListener(el) ( el.addEventListener("contextmenu", función(e) ( e.preventDefault(); toggleMenuOn(); )); ) función toggleMenuOn() ( if (menuState!== 1) ( menuState = 1 ; menú.classList.add(activo);
En este punto ya puede acceder a nuestro menú contextual con el botón derecho del ratón. Pero no podemos decir que funcione correctamente. En primer lugar, no está ubicado donde nos gustaría. Para solucionar el problema, necesitarás un poco de matemáticas. En segundo lugar, todavía no es posible cerrar este menú. Dado cómo funcionan los menús contextuales normales, nos gustaría que nuestra implementación se cerrara cuando se hace clic en el menú y cuando se presiona Escape. Además, hacer clic derecho fuera de nuestro menú debería cerrarlo y, en su lugar, requerir abrir el menú predeterminado. Intentemos solucionar todo esto.
mucho codigo
(función() ("uso estricto"; /////////////////////////////////////// / / /////////////////////////////////// // // FUNCIONES DE AYUDA // FUNCIONES AUXILIARES // / /// ////////////////////////////////// //////////// //// //////////////////// /** * Algunas funciones auxiliares aquí * Aquí están las funciones auxiliares en sí */ ////// //////. ////////////////////////// ///////////////// /////// ////////////// // // FUNCIONES C O R E F U N C I O N S // FUNCIONES DEL NÚCLEO // ////////////////// /////// ////////////// /////////////////////////// ///////// // /** * Variables */ var taskItemClassName = "task"; var menu = document.querySelector("#context-menu"); activeClassName = "context-menu--active" /** * Inicializa el código de nuestra aplicación. . * Inicializa el código de nuestra aplicación. */ function init() ( contextListener(); clickListener(); keyupListener(); ) /* * * Escucha los eventos del menú contextual * Manejando el evento del menú contextual */ function contextListener() /**. * Escucha eventos de clic.
* Manejo del evento de clic.
* Mostrar el menú contextual.
*/ function toggleMenuOn() ( if (menuState !== 1) ( menuState = 1; menu.classList.add(activeClassName); ) ) /** * Ejecute la aplicación.
función contextListener() ( document.addEventListener("menú contextual", función(e) ( if (clickInsideElement(e, taskItemClassName)) ( e.preventDefault(); toggleMenuOn(); ) )); )
Al tener una función auxiliar que hace parte del trabajo sucio por nosotros y detectar el evento del menú contextual en todo el documento, ahora podemos cerrar el menú al hacer clic fuera de él. Para hacer esto, agregue la función toggleMenuOff y edite contextListener:
función contextListener() ( document.addEventListener("menú contextual", función(e) ( if (clickInsideElement(e, taskItemClassName)) ( e.preventDefault(); toggleMenuOn(); ) else ( toggleMenuOff(); ) )); ) función alternarMenuOff() ( if (menuState!== 0) ( menuState = 0; menu.classList.remove(activeClassName); ) )
Ahora haga clic derecho en el elemento de la lista. Y luego, en algún otro lugar del documento. ¡Voilá! Nuestro menú se cerró y se abrió el menú estándar. Luego haremos algo similar para el evento de clic, de modo que más de un botón derecho lo cierre:
función clickListener() ( document.addEventListener("clic", función(e) ( var botón = e.cual || e.botón; if (botón === 1) ( toggleMenuOff(); ) )); )
Este fragmento de código es ligeramente diferente del anterior porque Firefox. Después de soltar el botón derecho del mouse, el evento de clic se activa en Firefox, por lo que aquí tenemos que verificar adicionalmente que realmente se haya producido un clic izquierdo. Ahora el menú no parpadea cuando se hace clic derecho. Agreguemos un controlador similar para presionar la tecla ESC:
función keyupListener() ( ventana.onkeyup = función(e) ( if (e.keyCode === 27) ( toggleMenuOff(); ) ) )
Disponemos de un menú que se abre y cierra según lo previsto, interactuando con el usuario de forma natural. Finalmente posicionemos el menú e intentemos manejar los eventos dentro de él. Posicionamiento de nuestro menú contextual Dado el HTML y CSS actuales, nuestro menú aparece en la parte inferior de la pantalla. Pero nos gustaría que apareciera donde se produjo el clic. Corrijamos esta desafortunada omisión. Primero, agreguemos otra función auxiliar que obtenga las coordenadas exactas del clic. Llamémoslo getPosition e intentemos que maneje diferentes peculiaridades del navegador:
función getPosition(e) ( var posx = 0; var posy = 0; if (!e) var e = window.event; if (e.pageX || e.pageY) ( posx = e.pageX; posy = e. pageY; ) else if (e.clientX || e.clientY) ( posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; posy = e.clientY + document.body.scrollTop + document.documentElement. desplazarseArriba;) retorno (x: posx, y: posy))
Nuestro primer paso en el posicionamiento del menú es preparar tres variables. Agreguémoslos al bloque de código correspondiente:
var posiciónmenú; var posiciónmenúX; var posiciónmenúY;
Creemos una función positionMenu que tome un solo argumento: un evento. Por ahora, déjalo imprimir las coordenadas del menú en la consola:
función positionMenu(e) ( menuPosition = getPosition(e); console.log(menuPosition); )
Editemos contextListener para iniciar el proceso de posicionamiento:
función contextListener() ( document.addEventListener("menú contextual", función(e) ( if (clickInsideElement(e, taskItemClassName)) ( e.preventDefault(); toggleMenuOn(); positionMenu(e); ) else ( toggleMenuOff(); ) ));
Haga clic en el menú contextual nuevamente y mire la consola. Asegúrese de que el puesto esté realmente disponible y registrado. Podemos usar estilos en línea para configurar las propiedades superior e izquierda usando JS. Aquí está la nueva versión de positionMenu:
función positionMenu(e) ( menuPosition = getPosition(e); menuPositionX = menuPosition.x + "px"; menuPositionY = menuPosition.y + "px"; menu.style.left = menuPositionX; menu.style.top = menuPositionY; )
Llama a todas partes ahora. ¡El menú aparece en todas partes! Esto es sorprendente, pero hay un par de cosas que deben abordarse:
var ancho de menú; var altura del menú;
Como recordarás, nuestro menú está oculto por defecto, por lo que no puedes simplemente calcular su tamaño. En nuestro caso, el menú es estático, pero en el uso real su contenido puede cambiar según el contexto, por lo que es mejor calcular el ancho y alto en el momento de abrirlo. Obtengamos los valores requeridos dentro de la función positionMenu:
menuWidth = menu.offsetWidth; altura del menú = menú.alturadesplazamiento;
Introduzcamos dos variables más, pero esta vez para el tamaño de la ventana:
var ancho de ventana; var altura de la ventana;
Calculemos sus valores de forma similar:
ancho de ventana = ventana.anchointerior; altura de la ventana = ventana.alturainterior;
En última instancia, supongamos que queremos mostrar el menú a no menos de 4 píxeles del borde de la ventana. Puedes comparar los valores, como dije anteriormente, y ajustar la posición de esta manera:
var clickCoords; var clickCoordsX; var clickCoordsY; // función positionMenu actualizada función positionMenu(e) ( clickCoords = getPosition(e); clickCoordsX = clickCoords.x; clickCoordsY = clickCoords.y; menuWidth = menu.offsetWidth + 4; menuHeight = menu.offsetHeight + 4; windowWidth = ventana. InnerWidth; windowHeight = ventana.innerHeight; si ((windowWidth - clickCoordsX)< menuWidth) { menu.style.left = windowWidth - menuWidth + "px"; } else { menu.style.left = clickCoordsX + "px"; } if ((windowHeight - clickCoordsY) < menuHeight) { menu.style.top = windowHeight - menuHeight + "px"; } else { menu.style.top = clickCoordsY + "px"; } }
Ahora nuestro menú va muy bien. Queda por hacer algo con el cambio de tamaño de la ventana. Ya hablé sobre cómo lo hace Dropbox, pero en su lugar cerraremos el menú contextual. [ Este comportamiento está mucho más cerca del estándar.] Agregue la siguiente línea a la función de inicio:
resizeListener();
Y escribamos la función en sí:
función resizeListener() ( ventana.onresize = función(e) ( toggleMenuOff(); ); )
Genial. Encadenamiento de eventos a elementos del menú contextual Si su aplicación es más compleja que este ejemplo y planea tener contenido de menú contextual dinámico, tendrá que profundizar en lo que sucede a continuación para descubrir usted mismo los detalles que faltan. En nuestra aplicación todo es más sencillo y solo hay un menú con un conjunto constante de acciones. De esta manera, puede verificar rápidamente qué elemento se seleccionó y procesar esa selección. En nuestro ejemplo, simplemente guardaremos el elemento seleccionado en una variable y escribiremos su ID de datos y la acción seleccionada en la consola. Para hacer esto, edite el marcado del menú:
A continuación, almacenemos en caché todos los objetos necesarios:
var contextMenuClassName = "menú contextual"; var contextMenuItemClassName = "menú contextual__item"; var contextMenuLinkClassName = "menú contextual__enlace"; var contextMenuActive = "menú contextual--activo"; var taskItemClassName = "tarea"; var tareaItemInContext; var clickCoords; var clickCoordsX; var clickCoordsY; menú var = document.querySelector("#menú contextual"); var menuItems = menu.querySelectorAll(".context-menu__item"); var estado del menú = 0; var ancho de menú; var altura del menú; var posiciónmenú; var posiciónmenúX; var posiciónmenúY; var ancho de ventana; var altura de la ventana;
Ha aparecido una variable taskItemInContext, a la que se le asigna un valor cuando hace clic derecho en un elemento de la lista. Lo necesitaremos para registrar los ID de los elementos. También hay nuevos nombres de clases. Ahora repasemos la funcionalidad.
La función de inicialización sigue siendo la misma. El primer cambio afecta a contextListener, porque queremos almacenar en taskItemInContext el elemento en el que el usuario hizo clic, y la función clickInsideElement devuelve exactamente esto:
función contextListener() ( document.addEventListener("menú contextual", función(e) ( taskItemInContext = clickInsideElement(e, taskItemClassName); if (taskItemInContext) ( e.preventDefault(); toggleMenuOn(); positionMenu(e); ) else ( tareaItemInContext = nulo; alternarMenuOff();
Lo restablecemos a nulo si no se hizo clic derecho en un elemento de la lista. Bueno, vamos a abordar clickListener. Como mencioné anteriormente, por razones de simplicidad simplemente imprimiremos la información en la consola. Actualmente, cuando se detecta un evento de clic, se realizan varias comprobaciones y se cierra el menú. Hagamos algunos ajustes y comencemos a procesar el clic dentro del menú contextual, realizando alguna acción y solo luego cerrando el menú:
función clickListener() ( document.addEventListener("clic", función(e) ( var clickeElIsLink = clickInsideElement(e, contextMenuLinkClassName); if (clickeElIsLink) ( e.preventDefault(); menuItemListener(clickeElIsLink); ) else ( var botón = e.cual || e.botón; si (botón === 1) (toggleMenuOff(); ) ));
Es posible que hayas notado que se llama a la función menuItemListener. Lo definiremos un poco más adelante. Las funciones keyupListener, resizeListener y positionMenu permanecen sin cambios. Editaremos ligeramente las funciones toggleMenuOn y toggleMenuOff, cambiando los nombres de las variables para una mejor legibilidad del código:
función toggleMenuOn() ( if (menuState!== 1) ( menuState = 1; menu.classList.add(contextMenuActive); ) ) función toggleMenuOff() ( if (menuState!== 0) ( menuState = 0; menu.classList .remove(contextMenuActive);
Finalmente implementamos menuItemListener:
función menuItemListener(enlace) ( console.log("ID de tarea - " + taskItemInContext.getAttribute("id-datos") + ", Acción de tarea - " + link.getAttribute("acción-datos")); toggleMenuOff(); )
Con esto concluye el desarrollo de la funcionalidad.
- Cromo 39
- Safari 7
- Firefox 33
Base de código para este tutorial
Un menú contextual es un menú que aparece al hacer clic derecho en la pantalla. Normalmente, estos menús se utilizan para facilitar la realización de acciones favoritas, como ordenar carpetas y archivos, abrir una nueva ventana de aplicación o acceder a la configuración del sistema.
Durante muchos años, el término "menú contextual" se refería principalmente a aplicaciones nativas. Sin embargo, ahora tenemos la oportunidad de aprovecharlo también en aplicaciones web. Un ejemplo es el administrador de archivos en Gmil. Este menú se implementa usando código javascript:
En el futuro, podremos crear menús contextuales para sitios basados en HTML5. Le invitamos a familiarizarse con este enfoque.
Desarrollo del menú contextual.
HTML5 nos presentó 2 elementos nuevos: menú y elemento de menú, y le permiten crear menús contextuales. Para que el navegador trate el elemento del menú como un "menú contextual", debemos configurar el tipo de menú en contexto y también darle una identificación única.
A continuación se muestra un ejemplo en el que creamos un menú contextual con estas propiedades.
Editar contenido
Selección de correo electrónico
También tenemos la posibilidad de agregar submenús ramificando el elemento del menú de esta manera:
Editar contenido
Selección de correo electrónico
Facebook
Gorjeo
Ahora, para que el menú contextual aparezca en la pantalla al hacer clic derecho, usamos un nuevo atributo HTML llamado menú contextual. Este atributo se utiliza para identificar un menú con el ID especificado. Dado nuestro ejemplo anterior, podemos definir nuestro menú contextual usando contextmenu=context-menu-id.
Podemos configurar el atributo en la etiqueta del cuerpo si queremos utilizar el menú contextual en toda la página. También podemos agregarlo a un elemento HTML para que el menú se use exclusivamente dentro de ese elemento.
Ahora aparecerá un nuevo menú contextual dentro del menú del sistema operativo, como se ve en el siguiente ejemplo.
Agregar un icono
Estamos seguros de que muchos de vosotros habéis visto menús contextuales que utilizan iconos. En algunos casos, un icono puede ser una gran ayuda visual para ayudar a los usuarios a encontrar el menú. Además, también permite a los usuarios entender para qué sirve el menú.
También podemos agregar un ícono a nuestro menú contextual HTML5 usando el atributo de ícono:
Editar contenido
Selección de correo electrónico
Facebook
Gorjeo
Esto es lo que veremos en la ventana del navegador.
Hacer que el menú funcione
En esta etapa, nuestro nuevo menú contextual no funcionará cuando se haga clic en él. Sin embargo, podemos darle vida muy fácilmente con un poco de código javascript. En nuestro ejemplo, el menú se llama Selección de correo electrónico. Este menú permite a los usuarios enviar texto seleccionado por correo electrónico.
Para que funcione, agreguemos una función que permita a los usuarios usar el código detrás de ella.
Función getSelectedText() (
var texto = "";
si(ventana.getSelection) (
texto = ventana.getSelection().toString();
) else if (documento.selección && documento.selección.tipo != "Control") (
texto = documento.selección.createRange().texto;
}
devolver texto;
};
Luego creamos otra función, digamos sendEmail(), que abre el cliente de correo electrónico. El asunto del correo electrónico será el texto ingresado en el título del documento y el cuerpo del correo electrónico se completará con el texto seleccionado.
Función enviarcorreo electrónico() (
var cuerpoTexto = getSelectedText();
window.location.href = "mailto:?subject="+ document.title +"&body="+ bodyText +"";
};
Finalmente, agregamos esta funcionalidad a nuestro menú mediante el atributo onclick.
Selección de correo electrónico
Anteriormente os hemos hablado de cómo utilizar HTML5 EditableContent, que nos permite editar contenido web directamente en la página. Podemos utilizar esta función agregándola a nuestro menú llamado "Editar contenido".
En conclusión
Personalmente, estamos muy entusiasmados con esta nueva característica. Vemos muchas oportunidades en ello. Desafortunadamente, al momento de escribir este material, solo Firefox admitía esta propiedad. Esperamos que otros navegadores se conecten pronto.
Puede ver una demostración a continuación (solo funciona en Firefox).
16/11/15 1.2KEn este artículo, proporcionaré una descripción general de dos elementos HTML5: y, que se incluyen en la especificación de elementos interactivos. Estos dos elementos se encuentran entre los menos discutidos entre los desarrolladores, probablemente debido a su falta de soporte en los principales navegadores. Firefox es el único navegador que admite esta etiqueta.
Elemento de menú frente a elemento de navegaciónCuando hablamos de menú, es importante no confundirlo con una etiqueta, que es un elemento de navegación HTML. Crea un bloque de navegación de página web con enlaces que le permiten navegar a través de secciones de una página o hacia otras páginas del sitio.
Un elemento es un conjunto de comandos de menú. El principio de funcionamiento es similar al de las aplicaciones de escritorio o móviles. Las aplicaciones de escritorio suelen utilizar menús para realizar diversas tareas. Por ejemplo, el menú "Desenfocar" en Photoshop. Está diseñado para realizar tareas de difuminado de la capa seleccionada:
Menú Desenfocar en Photoshop
Ésta es la principal diferencia entre estos dos elementos;
debe contener enlaces que ayuden a los usuarios a navegar por páginas web y al mismo tiempo les permitan realizar tareas específicas.Usando el elemento
El elemento está destinado a crear menús contextuales, menús emergentes y menús de barra de herramientas. Pero la compatibilidad con las dos últimas funciones de etiquetas aún no se ha implementado en ningún navegador, incluido Firefox.
Por ahora, nos centraremos en crear el menú contextual.Menú contextual
El menú contextual aparece cuando hacemos clic derecho en la aplicación. Las opciones de visualización dependen de dónde hizo clic el usuario:
El menú contextual original en OS X y UbuntuPuede agregar menús contextuales a páginas web a través de complementos de JavaScript o JQuery. El problema es que estos métodos utilizan una gran cantidad de marcas y el script en sí elimina el menú contextual original del navegador. Esto puede resultar en una implementación que no cumpla con las expectativas del usuario:
Menú contextual personalizado en Google Drive
Solución originalElementos y agregará nuevos elementos a la versión del menú contextual original. En el siguiente ejemplo, agregaremos un nuevo elemento del menú contextual a la etiqueta llamada "Hola mundo":
Hola Mundo
Las partes principales del fragmento de código anterior son los atributos: id, tipo y menú contextual, que definen el tipo de menú como contexto, así como el área donde se debe mostrar el nuevo menú.
En nuestro caso, al hacer clic derecho, aparecerá un nuevo menú en cualquier parte del documento, ya que lo asignamos usando el atributo de menú contextual para toda la sección del cuerpo.
Puede limitar el rango dentro de una sección específica de la página asignando un valor al atributo del menú contextual en los elementos, etc.:
Hola Mundo
Cuando vemos este código en un navegador (actualmente solo Firefox), veremos que el elemento de menú que declaramos aparece en la parte superior de la lista:
Nuevo elemento de menú, "Hola mundo", que se carga como parte del menú contextual original
Agregar submenús e íconosLos submenús son un grupo de elementos con acciones relacionadas o similares. El menú Rotación de imagen en Photoshop es un gran ejemplo de esto. Incluye varios elementos de submenú que permiten al usuario seleccionar el ángulo de rotación y la dirección de rotación.
Usar el elemento de menú al agregar submenús es simple y directo. Anida otro elemento con un atributo de etiqueta para declarar el nombre del menú, así:
Girar 90 grados Girar 180 grados Voltear horizontalmente Voltear verticalmente
Cuando ejecutamos este código en el navegador, encontraremos un nuevo menú con cuatro elementos de submenú:
IconosTambién se introdujo un nuevo atributo de ícono para agregar íconos a la izquierda de los elementos del menú. Vale la pena señalar que este atributo solo se aplica a . Especifique la ruta al ícono para icon , por ejemplo así:
Girar 900 Girar 1800 Voltear horizontalmente Voltear verticalmente
Y aparecerán iconos en nuestro menú, como puedes ver en la imagen a continuación:
Cada elemento del submenú ahora está ilustrado con un icono.
Agregar funciones al menúHemos creado lo que parece un menú contextual, pero aún no funciona como un menú funcional. Podemos solucionar este problema usando JavaScript.
Tomemos nuestro ejemplo con el submenú "Rotar imagen" y agreguemos una función que rotará la imagen en la que hicimos clic derecho. Las transformaciones y transiciones CSS3 pueden realizar la rotación de imágenes en el navegador. Aquí hay un estilo que rotará la imagen 90 grados:
Girar-90 ( transformar: girar (90 grados); )
Después de especificar el estilo, debemos escribir una función para aplicarlo a la imagen.
Rara vez se utiliza un menú contextual personalizado en la interfaz de una página web. Después de todo, no es del todo obvio para el usuario que en algún elemento deba hacer clic no con el botón izquierdo, sino con el derecho del mouse y seleccionar un elemento de la lista. Además, no a todos los visitantes de un sitio web les gusta utilizar el botón derecho del ratón, y en los teléfonos inteligentes no existe ningún botón derecho, sólo una imitación. A pesar de estas características, HTML5 tiene la capacidad de crear sus propios menús contextuales; esto se implementa hasta ahora sólo en Firefox, y aun así de una manera única.
Primero, veamos cómo se crean los diferentes menús en general. Para hacer esto, use una combinación de etiquetas y (ejemplo 1).
Ejemplo 1: menú contextual
HTML5 IE Cr Op Sa Fx
Menú contextual
El atributo contextmenu nos dice que nuestro menú es contextual y al mismo tiempo apunta a una etiqueta con el identificador dado (en este caso edit).
Hasta el momento, ningún navegador entiende el ejemplo anterior, incluido Firefox. Para ello, en lugar de una etiqueta, debes insertar una etiqueta no estándar (ejemplo 2).
HTML5 IE Cr Op Sa Fx
Menú contextual
Ejemplo 2: Menú en Firefox
El código resultó no ser válido, pero cuando haces clic en la imagen en Firefox, aparece un hermoso menú (Fig. 1).
Este menú aún no funciona como se esperaba, así que rediseñémoslo. Primero, agreguemos un ícono al lado del elemento del menú usando el atributo de ícono, para que el menú se vea más bonito. El valor es una ruta relativa o absoluta al archivo gráfico. Luego debe asegurarse de que cuando haga clic en un elemento del menú, se produzca alguna acción. Para hacer esto, usaremos el evento onclick y lo usaremos para llamar a la función deseada. El ejemplo 3 muestra la creación de un menú contextual para texto; si selecciona "Editar" en él, el texto se puede editar. De hecho, se utiliza un campo de texto oculto, que se vuelve visible cuando se llama a la función edit(), mientras que el texto en sí se oculta durante la edición. Después de presionar Enter, el texto del formulario se inserta en lugar del párrafo de texto, creando la impresión de que esto es lo que editamos. El formulario se vuelve a ocultar una vez finalizada la edición.
Ejemplo 3: edición de texto
HTML5 IE Cr Op Sa Fx
Menú contextual #edit ( ancho: 200px; borde: 1px sólido #ccc; pantalla: ninguna; ) función editar() ( document.getElementById("text").style.display = "none"; document.getElementById("edit" ).style.display = "bloquear"; document.getElementById("edit").value = document.getElementById("text").innerHTML; document.getElementById("edit").focus() ( document.getElementById( "texto").innerHTML = document.getElementById("edit").value; document.getElementById("edit").style.display = "none"; document.getElementById("text").style .display = "bloque " )
Texto de ejemplo
El nuevo menú se muestra en la Fig. 2.
Arroz. 2. Menú con icono
Como puede ver en el ejemplo, crear un menú contextual no es diferente de crear otros elementos interactivos. Cuando hacemos clic en un elemento del menú, nuestra función se llama usando el controlador onclick, y luego esta función hará lo que queramos. Firefox 8 fue el primer navegador que admitió menús contextuales HTML5, pero es sorprendente por qué los desarrolladores de Firefox introdujeron sus propios menús contextuales personalizados. Hay varios escenarios posibles aquí:
- la etiqueta se agregará a la especificación HTML5;
- esta etiqueta quedará obsoleta y no será compatible con futuras versiones de Firefox;
Sólo queda esperar la respuesta de otros navegadores en los que finalmente se implementará la etiqueta, así como varios menús basados en ella.