English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
È facile implementare il trascinamento su CP utilizzando jQuery. Ma non funziona bene sui dispositivi mobili. Quindi ho scritto un demo di trascinamento per dispositivi mobili, che utilizza principalmente eventi di tocco (touchstart, touchmove e touchend).
La funzione implementata da questo demo è: gli elementi trascinabili (in questo caso, le immagini) si trovano nella lista e possono essere trascinati in un'area designata. Una volta raggiunta l'area designata (console), l'elemento viene inserito nella console e l'elemento trascinato originale torna alla sua posizione originale, mentre il nuovo elemento può essere trascinato nella console e può anche essere trascinato fuori dalla console.
In questo demo, ci sono tre moduli, rispettivamente il modulo ajax, il modulo drag e il modulo position. Il modulo ajax viene utilizzato per implementare le richieste ajax (tutti i risorse di immagine sono ottenute tramite richieste ajax), il modulo drag viene utilizzato per implementare il trascinamento degli elementi, e il modulo position viene utilizzato per gestire la posizione degli elementi (ad esempio, inizializzazione della posizione, ripristino, rimozione). Il file di ingresso del demo è indx.js e i tre moduli precedenti sono conservati nella stessa cartella. Dopo la codifica, il codice viene compresso utilizzando webpack. Il codice di sviluppo si trova nella cartella app e il codice compresso si trova nella cartella build.
1. Introduzione agli eventi di tocco
Ci sono tre eventi di tocco, ovvero touchstart, touchmove e touchend. L'evento touchstart viene attivato quando il dito tocca lo schermo. L'evento touchmove viene attivato continuamente quando il dito scorre sulla superficie dello schermo. Durante l'evento, annullare il comportamento predefinito può prevenire lo scorrimento della pagina. L'evento touchend viene attivato quando il dito lascia lo schermo. Oltre alle proprietà comuni degli eventi del mouse, gli oggetti degli eventi di tocco contengono anche le seguenti tre proprietà:
touches:array di oggetti Touch che rappresentano l'operazione di tocco attuale
targetTouches:array di oggetti Touch specifici per l'obiettivo dell'evento
changeTouches:array di oggetti Touch che rappresentano cosa è cambiato dal tocco precedente
In questo esempio, è necessario ottenere la posizione del punto di tocco rispetto al viewport, utilizzo event.targetTouches[0].clientX e event.targetTouches[0].clientY
Il codice del modulo ajax del secondo livello
var $ = require('jquery'); var ajax = { //Ottenere l'elenco iniziale delle immagini trascinabili getInitImg:function(parent){ var num = 50; $.ajax({ type:"GET", async:false,//qui si utilizza il caricamento sincrono, perché è necessario che le immagini siano caricate prima di eseguire altre operazioni 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;//Esportare il modulo ajax
Il codice del modulo position del terzo livello
var $ = require('jquery'); var position = { //初始化位置,gap是一个表示元素间距的对象 init:function(parent,gap){ var dragElem = parent.children(); //Assicura che l'elemento genitore sia posizionato in modo relativo if(parent.css('posizione') !== "relativa"){ parent.css('position','relative'); } parent.css({ 'larghezza':'100%' 'z-index':'10' }); //Larghezza del contenuto della lista corrente var ListWidth = 0; //Posizione nella colonna var j = 0; dragElem.each(function(index,elem){ var curEle = $(elem); //Imposta la posizione iniziale dell'elemento curEle.css({ posizione:"assoluta", cima:gap.Y, sinistra:ListWidth + gap.X }); //Aggiungi un identificatore unico a ciascun elemento, utile per ripristinare la posizione iniziale curEle.attr('index',index); //Salva la posizione iniziale dell'elemento posizione.coord.push({ X:ListWidth + gap.X, Y:gap.Y }); j++; //Imposta l'altezza dell'elemento genitore parent.height( parseInt(curEle.css('cima')) + curEle.height() + gap.Y); ListWidth = curEle.offset().left + curEle.width(); }); }, //Inserisci l'elemento figlio nell'elemento genitore addTo:function(child,parent,target){ //Coordinate dell'elemento genitore rispetto al viewport var parentPos = { X:parent.offset().left, Y:parent.offset().top }; //Coordinate della posizione del target rispetto al viewport var targetPos = { X:target.offset().left, Y:target.offset().top }; //Assicura che l'elemento genitore sia posizionato in modo relativo if(parent.css('posizione') !== "relativa"){ parent.css({ 'posizione':'relativa' }); } parent.css({ 'z-index':'12' }); //Inserisci l'elemento figlio nell'elemento genitore parent.append(child); //Determina la posizione del figlio nell'elemento genitore e garantisce che la dimensione del figlio non cambi child.css({ posizione:assoluta, cima:targetPos.Y - parentPos.Y, sinistra:targetPos.X - parentPos.X, larghezza:target.width(), height:target.height()} }); }, //Ripristina l'elemento alla sua posizione originale restore:function(elem){ //Ottieni l'identificatore dell'elemento var index = parseInt( elem.attr('index') ); elem.css({ top:position.coord[index].Y, left:position.coord[index].X }); }, //Coordinate iniziali dell'elemento di trascinamento coord:[], //Determina se l'elemento A si trova all'interno dell'area dell'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()); } 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;
Codice del modulo drag
var $ = require('jquery'); var position = require('./position.js'); var drag = { //Id del padre dell'elemento di trascinamento dragParen:undefined, //Valore dell'id della console di controllo control:undefined, //Posizione del blocco di movimento rispetto al viewport position:{ X: undefined, Y: undefined }, //Posizione del punto di tocco rispetto al viewport, aggiornata durante lo scorrimento touchPos:{ X: undefined, Y: undefined }, //Posizione del punto di tocco rispetto al viewport all'inizio del tocco startTouchPos:{ X: undefined, Y: undefined }, //Posizione del punto di tocco rispetto al blocco di movimento touchOffsetPos:{ X: undefined, Y: undefined }, //获取拖拽元素父元素id和控制台的ID的值 setID: function(dragList, control){ this.dragParent = dragList; this.control = control; }, touchStart: function(e){ var target = e.target; // Blocca la propagazione e.stopPropagation(); // Blocca lo zoom e lo scorrimento predefiniti del browser e.preventDefault(); var $target = $(target); //手指刚触摸到屏幕上时,触摸点的位置 drag.startTouchPos.X = e.targetTouches[0].clientX; drag.startTouchPos.Y = e.targetTouches[0].clientY; //触摸元素相对视口的位置 drag.position.X = $target.offset().left; drag.position.Y = $target.offset().top; //触摸点相对于视口的位置,滑动过程中不断更新 drag.touchPos.X = e.targetTouches[0].clientX; drag.touchPos.Y = e.targetTouches[0].clientY; //触摸点相对于触摸元素的位置 drag.touchOffsetPos.X = drag.touchPos.X - drag.position.X; drag.touchOffsetPos.Y = drag.touchPos.Y - drag.position.Y; //给目标元素绑定touchMove事件 $target.unbind('touchmove').on('touchmove', drag.touchMove); }, touchMove: function(e){ var target = e.target; // Blocca la propagazione e.stopPropagation(); // Blocca lo zoom e lo scorrimento predefiniti del browser e.preventDefault(); var $target = $(target); //获得触摸点的位置 drag.touchPos.X = e.targetTouches[0].clientX; drag.touchPos.Y = e.targetTouches[0].clientY; //修改移动块的位置 $target.offset({ top: drag.touchPos.Y - drag.touchOffsetPos.Y, left: drag.touchPos.X - drag.touchOffsetPos.X }); //给移动元素绑定touchend事件 $target.unbind('touchend').on('touchend', drag.touchEnd); }, touchEnd: function(e) { var target = e.target; // Blocca la propagazione e.stopPropagation(); // Blocca lo zoom e lo scorrimento predefiniti del browser e.preventDefault(); var $target = $(target); var parent = $target.parent(); // Ottieni il padre dell'elemento console e dell'elenco di trascinamento var control = $("#" + drag.control); var dragListPar = $('#' + drag.dragParent); // Se l'elemento trascinato è nel console var sitControl = position.isRang(control, dragListPar, $target); // Dopo il trascinamento, se l'elemento trascinato è il padre dell'elenco di trascinamento if (parent.attr('id') === drag.dragParent) { // Se l'elemento è nel console if (sitControl) { var dragChild = $target.clone(); // Assegna l'evento touchstart all'elemento clonato dragChild.unbind('touchstart').on('touchstart',drag.touchStart); // Inserisci l'elemento clonato nel console position.addTo(dragChild, control, $target); } // Ripristina l'elemento di tocco originale alla posizione iniziale position.restore($target); } // Dopo il trascinamento, se l'elemento trascinato è il padre del console e l'elemento è stato trascinato fuori dal console if (parent.attr('id') === drag.control && !sitControl) { $target.remove(); } } }; module.exports = drag;
V. Codice del file di ingresso 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'); // Spazi orizzontali e verticali degli elementi trascinabili var gap = { X:20, Y:10 }; // Ottenere la lista degli elementi trascinabili tramite ajax ajax.getInitImg(dragList); // Inizializzare la posizione degli elementi trascinabili position.init(dragList,gap); // Impostare l'altezza della console. L'altezza della console è l'altezza dello schermo meno l'altezza della lista di trascinamento var control = $('#control'); control.height($(window).height() - dragList.height()); // Assegnare l'evento touchstart a ciascun elemento trascinabile var dragElem = dragList.children(); dragElem.each(function(index,elem){ $(elem).unbind('touchstart').on('touchstart',drag.touchStart); }); // L'id del padre dell'elemento trascinabile è dragList, l'id della console è control drag.setID('dragList','control');
Sezione 6: compressione webpack
L'idea di programmazione modulare è stata utilizzata qui, con diverse funzionalità implementate in moduli diversi. Se si desidera utilizzare una funzionalità specifica, si può utilizzare require() per importarla. Tuttavia, il browser non ha la definizione del metodo require. Pertanto, il codice sopra non può essere eseguito direttamente nel browser e deve essere prima compresso. Se non sei familiare con webpack, puoi leggere questo articolo, il file di configurazione di webpack è come segue:
var autoHtml = require('html-webpack-plugin'); var webpack = require('webpack'); var extractTextWebpack = require('extract-text-webpack-plugin');// Questo plugin può separare i file CSS, rendendo i file CSS situati in file separati 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:"Trascinamento", filename:"drag.html", template:'./app/darg.html', inject:true } ] };
Come sopra descritto, l'editor ha introdotto jQuery Mobile Drag & Drop (sviluppo modulare, eventi touch, webpack) agli utenti. Spero che sia utile a tutti. Se avete qualsiasi domanda, lasciate un messaggio, l'editor risponderà tempestivamente. In questo senso, ringrazio anche tutti i sostenitori del sito Web di Yell Call教程!
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright è dell'autore originale, il contenuto è stato contribuito e caricato volontariamente dagli utenti di Internet, questo sito non possiede il diritto di proprietà, non è stato editato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a notice#oldtoolbag.com (sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito cancellerà immediatamente il contenuto sospetto di violazione del copyright.