English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Se puede implementar fácilmente el arrastre en el extremo CP utilizando jQuery. Sin embargo, no funciona bien en el extremo móvil. Por lo tanto, escribí yo mismo un demo de arrastre en el extremo móvil, utilizando principalmente eventos de toque (touchstart, touchmove y touchend).
La función implementada por este demo es: los elementos arrastrables (en este caso, las imágenes) se encuentran en una lista y estos elementos pueden ser arrastrados a una área designada. Después de llegar a la área designada (consola), el elemento se inserta en la consola y el elemento arrastrado original regresa a su posición original, el nuevo elemento sigue siendo arrastrable en la consola y también puede ser arrastrado fuera de la consola.
En este demo, se utilizan tres módulos: el módulo AJAX, el módulo drag y el módulo position. El módulo AJAX se utiliza para realizar solicitudes AJAX (por lo que todos los recursos de imágenes se obtienen a través de solicitudes AJAX), el módulo drag se utiliza para implementar el arrastre de elementos y el módulo position se utiliza para realizar operaciones de posición de elementos (como inicialización de posición, restauración y eliminación). El archivo de entrada del demo es indx.js y los tres archivos de módulos anteriores se almacenan en la misma carpeta. Después de completar la codificación, se utiliza webpack para empaquetar. El código de desarrollo se encuentra en la carpeta app y el código empaquetado se encuentra en la carpeta build.
I. Introducción a los eventos de toque
Los eventos de toque tienen tres, que son touchstart, touchmove y touchend. El evento touchstart se desencadena cuando los dedos tocan la pantalla. touchmove se dispara continuamente cuando los dedos se deslizan sobre la pantalla. Durante este evento, cancelar su comportamiento por defecto puede evitar que la página se desplace. touchend se desencadena cuando los dedos se apartan de la pantalla. Además de las propiedades comunes de los eventos de ratón, los objetos de eventos de estos tres eventos de toque también contienen las siguientes tres propiedades:
touches: es un array de objetos Touch que representan las operaciones de toque actuales.
targetTouches: es un array de objetos Touch específicos del objetivo del evento.
changeTouches: es un array de objetos Touch que indica lo que ha cambiado desde la última vez que se produjo un toque.
En este caso, se necesita obtener la posición del punto de toque en relación con la ventana de visualización, utilizo event.targetTouches[0].clientX y event.targetTouches[0].clientY
Código del módulo AJAX
var $ = require('jquery'); var ajax = { //Obtener la lista inicial de imágenes arrastrables getInitImg: function(parent) { var num = 50; $.ajax({ type: "GET", async: false,//Se utiliza la carga sincrónica porque se necesita que las imágenes se carguen antes de poder realizar otras operaciones url:'/Home/picwall/index', success: function(result) { if(result.status === 1) { $.each(result.data, function (index, item) { var src = item.pic_src; var width = parseInt(item.width); var height = parseInt(item.height); var ratio = num / height; var img = $('').attr("src", src).height(num).width(parseInt(width * ratio)); parent.append(img); }); } }, dataType:'json' }); } }; module.exports = ajax;//Expone el módulo ajax
Tres. Código del módulo position
var $ = require('jquery'); var position = { //Inicializar la posición, gap es un objeto que representa el espacio entre elementos init:function(parent,gap){ var dragElem = parent.children(); //asegúrese de que el elemento padre esté ubicado en posición relativa if(parent.css('position') !== "relative"){ parent.css('position','relative'); } parent.css({ 'width':"100%", 'z-index':'10'}} }); //Ancho actual del contenido de la lista var ListWidth = 0; //Ubicado en qué columna var j = 0; dragElem.each(function(index,elem){ var curEle = $(elem); //Establecer la posición inicial del elemento curEle.css({ position:"absolute", top:gap.Y, left:ListWidth + gap.X }); //Agregar una identificación única a cada elemento, útil para restaurar la posición inicial curEle.attr('index',index); //Guardar la posición inicial del elemento position.coord.push({ X:ListWidth + gap.X, Y:gap.Y }); j++; //Establecer la altura del elemento padre parent.height( parseInt(curEle.css('top')) + curEle.height() + gap.Y); ListWidth = curEle.offset().left + curEle.width(); }); }, //Insertar el elemento hijo dentro del elemento padre addTo:function(child,parent,target){ //Las coordenadas del elemento padre en la ventana del navegador var parentPos = { X:parent.offset().left, Y:parent.offset().top }; //Las coordenadas del objetivo en relación con la ventana del navegador var targetPos = { X:target.offset().left, Y:target.offset().top }; //asegúrese de que el elemento padre esté ubicado en posición relativa if(parent.css('position') !== "relative"){ parent.css({ 'position':'relative' }); } parent.css({ 'z-index':'12'}} }); //insertar el elemento hijo dentro del elemento padre parent.append(child); //determinar la posición del elemento hijo dentro del elemento padre y garantizar que el tamaño del elemento hijo no cambie child.css({ position:absolute, top:targetPos.Y - parentPos.Y, left:targetPos.X - parentPos.X, width:target.width(), height:target.height() }); }, //restaurar el elemento a su posición original restore:function(elem){ //obtener la identificación del elemento var index = parseInt( elem.attr('index') ); elem.css({ top:position.coord[index].Y, left:position.coord[index].X }); }, //coordenadas iniciales del elemento arrastrado coord:[], //juzgar si el elemento A está dentro del rango del elemento B isRang:function(control,dragListPar,$target){ var isSituate = undefined; if(control.offset().top > dragListPar.offset().top){ isSituate = $target.offset().top > control.offset().top && $target.offset().left > control.offset().left && ($target.offset().left + $target.width()) < (control.offset().left + control.width()); }else{ isSituate = ($target.offset().top + $target.height())<(control.offset().top + control.height()) && $target.offset().top > control.offset().top && $target.offset().left > control.offset().left && ($target.offset().left + $target.width()) < (control.offset().left + control.width()); } return isSituate; } }; module.exports = position;
cuatro. Código del módulo drag
var $ = require('jquery'); var position = require('./position.js'); var drag = { //el ID del padre del elemento arrastrado dragParen:undefined, //el valor del id de la consola de operaciones control:undefined, //la posición del bloque de desplazamiento con respecto a la ventana de visualización position:{ X:undefined, Y:undefined }, //la posición del punto de toque con respecto a la ventana de visualización, actualizada constantemente durante el deslizamiento touchPos:{ X:undefined, Y:undefined }, //la posición del punto de toque con respecto a la ventana de visualización al comenzar a tocar startTouchPos:{ X:undefined, Y:undefined }, //la posición del punto de toque con respecto al bloque de desplazamiento touchOffsetPos:{ X:undefined, Y:undefined }, //obtener el valor del id del elemento de arrastre del padre y el id del control de consola setID:function(dragList,control){ this.dragParent = dragList; this.control = control; }, touchStart:function(e){ var target = e.target; //Prevenir la propagación e.stopPropagation(); //Prevenir el zoom y el desplazamiento predeterminados del navegador e.preventDefault(); var $target = $(target); //la posición del punto de toque cuando el dedo toca la pantalla por primera vez drag.startTouchPos.X = e.targetTouches[0].clientX; drag.startTouchPos.Y = e.targetTouches[0].clientY; //la posición del elemento de toque con respecto a la ventana de visualización drag.position.X = $target.offset().left; drag.position.Y = $target.offset().top; //la posición del punto de toque con respecto a la ventana de visualización, actualizada constantemente durante el deslizamiento drag.touchPos.X = e.targetTouches[0].clientX; drag.touchPos.Y = e.targetTouches[0].clientY; //la posición del punto de toque con respecto al elemento de toque drag.touchOffsetPos.X = drag.touchPos.X - drag.position.X; drag.touchOffsetPos.Y = drag.touchPos.Y - drag.position.Y; //asignar el evento touchMove al elemento de destino $target.unbind('touchmove').on('touchmove',drag.touchMove); }, touchMove:function(e){ var target = e.target; //Prevenir la propagación e.stopPropagation(); //Prevenir el zoom y el desplazamiento predeterminados del navegador e.preventDefault(); var $target = $(target); //obtener la posición del punto de toque drag.touchPos.X = e.targetTouches[0].clientX; drag.touchPos.Y = e.targetTouches[0].clientY; //modificar la posición del bloque de desplazamiento $target.offset({ arriba: drag.touchPos.Y - drag.touchOffsetPos.Y, izquierda: drag.touchPos.X - drag.touchOffsetPos.X }); //Asignar el evento touchend al elemento de movimiento $target.unbind('touchend').on('touchend',drag.touchEnd); }, touchEnd:function(e) { var target = e.target; //Prevenir la propagación e.stopPropagation(); //Prevenir el zoom y el desplazamiento predeterminados del navegador e.preventDefault(); var $target = $(target); var parent = $target.parent(); //Obtener el elemento padre de la consola y la lista de arrastre arrastrada var control = $("#" + drag.control); var dragListPar = $('#' + drag.dragParent); //¿Está el elemento arrastrado en la consola? var sitControl = position.isRang(control, dragListPar, $target); //Después de soltar el arrastre, si el elemento arrastrado es la lista de arrastre if (parent.attr('id') === drag.dragParent) { //Si el elemento está en la consola if (sitControl) { var dragChild = $target.clone(); //Asignar el evento touchstart al elemento clonado dragChild.unbind('touchstart').on('touchstart',drag.touchStart); //Insertar el elemento clonado en la consola position.addTo(dragChild, control, $target); } //Restaurar el elemento táctil original a su posición inicial position.restore($target); } // Después de soltar el arrastre, si el elemento arrastrado es el elemento padre de la consola y el elemento se desplazó fuera de la consola if (parent.attr('id') === drag.control && !sitControl) { $target.remove(); } } }; module.exports = drag;
Cinco. Código del archivo de entrada index.js
require('../css/base.css'); require('../css/drag.css'); var $ = require('jquery'); var drag = require('./drag.js'); var position = require('./position.js'); var ajax = require('./ajax.js'); var dragList = $('#dragList'); //El espacio horizontal y vertical entre los elementos arrastrables var gap = { X:20, Y:10 }; //Obtener la lista de elementos arrastrables a través de ajax ajax.getInitImg(dragList); //Inicializar la posición de los elementos arrastrables position.init(dragList,gap); //Establecer la altura del panel de control. La altura del panel de control es la altura de la pantalla menos la altura del listado arrastrable var control = $('#control'); control.height( $(window).height() - dragList.height() ); //Asignar el evento touchstart a cada elemento arrastrable var dragElem = dragList.children(); dragElem.each(function(index,elem){ $(elem).unbind('touchstart').on('touchstart',drag.touchStart); }); //El id del elemento padre del elemento arrastrable es dragList, y el id del panel de operaciones es control drag.setID('dragList','control');
Seis: paqueteo de webpack
Se ha utilizado la idea de programación modular, escribiendo diferentes implementaciones de funcionalidades en diferentes módulos, y se puede utilizar require() para importar lo que se necesite. Sin embargo, el navegador no tiene definida la función require. Por lo tanto, el código anterior no se puede ejecutar directamente en el navegador y debe ser paqueteado primero. Si no estás familiarizado con webpack, puedes ver este artículo. El archivo de configuración de webpack es el siguiente:
var autoHtml = require('html-webpack-plugin'); var webpack = require('webpack'); var extractTextWebpack = require('extract-texto-webpack-plugin');// esta extensión puede separar archivos css, permitiendo que los archivos css se encuentren en archivos separados module.exports = { entry:{ 'index':'./app/js/index.js', 'jquery':['jquery'] }, output:{ path:'./build/', filename:'js/[name].js' }, module:{ loaders:[ { test:/\.css/, loader:extractTextWebpack.extract('style','css') } ] }, plugins:[ new extractTextWebpack('css/[name].css',{ allChunks:true }), new webpack.optimize.CommonsChunkPlugin({ name:'jquery', filename:'js/jquery.js' }), new autoHtml({ title:"Arrastrar y soltar", filename:"drag.html", template:'./app/darg.html', inject:true } ] };
Lo que se ha mencionado anteriormente es lo que el editor ha presentado a todos los amigos sobre la función de arrastrar y soltar en el terminal de jQuery (desarrollo modular, eventos táctiles, webpack), esperamos que sea útil para todos. Si tienen alguna pregunta, dejen un mensaje y el editor les responderá a tiempo. También les agradezco mucho el apoyo a la página web de la tutorial de grito en este momento!
Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha cargado por los usuarios de Internet de manera autónoma, este sitio web no posee los derechos de propiedad, no se ha procesado editorialmente por humanos y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de copyright, le invitamos a enviar un correo electrónico a: notice#w3Aviso: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha cargado por los usuarios de Internet de manera autónoma, este sitio web no posee los derechos de propiedad, no se ha procesado editorialmente por humanos y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de copyright, le invitamos a enviar un correo electrónico a: notice#w