ugrás a tartalomhoz

jQuery drag & drop + clone

KapulaGábor · 2013. Jan. 8. (K), 14.44
Olyan oldalt készítek, ahol különböző méretű DIV-eket lehet a képernyőn tologatni - egérrel húzogatni és variálni, cserélgetni az elhelyezkedésüket. Ez lenne a drag&drop + clone.

Amit eddig összehoztam működik és egész jó. Hozzáteszem, nem vagyok programozó, nem értem a javascript utasításokat, funkciókat, satöbbi - én csak a HTML-t és a CSS-t vágom. Úgy valósítottam meg az aktuális állapotot, hogy olvastam a jQuery specifikációt és tanulmányoztam a hivatalos demók forráskódját - ezekből kombináltam ki, hogy merre van az előre. De elakadtam, mert most már úgyhiszem, kombinálni kellene az utasításokat.

Amit nem sikerült magvalósítanom s amihez segítséget szeretnék kérni a következő:
- amikor egy dragged elemet újra mozgatni kezdünk, akkor is jelenjen meg a droppable container hover állapota
- kellene egy törlés gomb arra az esetre, hogy ha egy dragged elemet szeretnék eltávolítani
- amikor egy kiválasztott elemet drag&drop beejtünk, az 1px elmozdulással kerül a containerbe - ez nem kellene, zavaró, mert utána minden elemet egyesével a helyére kell igazgatni
- a beejtett elemek egymás alá kerülnek, akár a képernyőből is kifutva. Ehelyett jó lenne az, ha oda kerülnének, ahol elengedjük őket
- szeretném, ha a dragged elemek nem csak a container-hez tapadnának, hanem egymáshoz is

A doctype HTML5, forráskódja így néz ki:
  1. <div class="col-1"> <!-- ezek a draggable elemek -->  
  2. <div class="mozgat f-szurke f75x30"><p>F 75x30</p></div>  
  3. <div class="mozgat f-szurke f75x45"><p>F 75x45</p></div>  
  4. </div>  
  5.   
  6. <p class="clr">&nbsp;</p>  
  7.   
  8. <div id="osszerakas"> <!-- ezek pedig a dropable -->  
  9.   <div id="snaptarget1" class="bal-oszlop tapad bal"></div>  
  10.   <div id="snaptarget2" class="kozepso-oszlop tapad bal"></div>  
  11.   <div id="snaptarget3" class="jobb-oszlop tapad jobb"></div>  
  12. </div>  
Eddig jutottam a jQuery-vel
  1. <script src="js/jquery-1.8.3.js" type="text/javascript"></script>  
  2. <script src="js/jquery-ui.js" type="text/javascript"></script>  
  3. <script>  
  4. $(function () {  
  5.   $(".mozgat").draggable({  
  6.     helper: "clone",  
  7.     appendTo: "body",  
  8.     revert: "invalid",  
  9.     scroll: false  
  10.   });  
  11.   $("#snaptarget1,#snaptarget2,#snaptarget3").droppable({  
  12.     accept: ".mozgat",  
  13.     activeClass: "snaptarget-hover",  
  14.     drop: function (event, ui) {  
  15.       $(this).append($(ui.draggable).clone());  
  16.       $("#snaptarget1 .mozgat,#snaptarget2 .mozgat,#snaptarget3 .mozgat").addClass("item");  
  17.       $(".item").removeClass("ui-draggable mozgat");  
  18.       $(".item").draggable({  
  19.         containment: "#osszerakas",  
  20.         grid: [1, 1],  
  21.         snap: ".tapad",  
  22.         snapMode: "inner",  
  23.         stack: ".item"  
  24.       });  
  25.     }  
  26.   });  
  27. });  
  28. </script>  
És ez itt a CSS
  1. * { padding0margin0; }  
  2. .clr { clearboth; }  
  3. body { background-color#4A5157font-familysans-serif; }  
  4. .col-1, .col-2, .col-3 {  
  5.   positionrelative;  
  6.   floatleft;  
  7.   margin-right7px; }  
  8. .mozgat { cursormovemargin-bottom7px; }  
  9. .f75x30 {  
  10.   width150pxheight60px;  
  11.   line-height60px;  
  12.   border-radius: 2px; }  
  13. .f75x45 {  
  14.   width150pxheight90px;  
  15.   line-height90px;  
  16.   border-radius: 2px; }  
  17. .f75x30 p, .f75x45 p {  
  18.   font-familysans-serif;  
  19.   font-size18px;  
  20.   color: Gainsboro;  
  21.   text-aligncenter;  
  22.   text-shadow0px 1px 1px rgba(000, .4); }  
  23. .jobb { floatright; }  
  24. .bal { floatleft; }  
  25. .f-szurke { background-color#999999; }  
  26. #osszerakas { margin0 autowidth788pxheight500px; }  
  27. .item {  
  28.   cursormove;  
  29.   border1px solid #333;  
  30.   border-collapsecollapse; }  
  31. #snaptarget1#snaptarget2#snaptarget3 {  
  32.   positionrelative;  
  33.   border1px solid #4A5157;  
  34.   border-collapsecollapse; }  
  35. #snaptarget1 { width210pxheight369px; }  
  36. #snaptarget2 { width362pxheight276px; }  
  37. #snaptarget3 { width210pxheight369px; }  
  38. .snaptarget-hover { background-color#616A72; }  
Ha csak valamely részhez tudsz megoldást adni, azt is köszönöm.
 
1

Sok, hosszú, rosszul formált!

T.G · 2013. Jan. 8. (K), 23.42
Sok a kérdés, hosszú a kódrészlet, nem jól olvasható a kód. Ezek miatt nem kap az ember könnyen még iránymutatást sem.

Elsőként a kódot hozd működő állapotba pl. a http://jsfiddle.net -en, azt linkeld inkább. Ám még ott is túl sok ez, gondolom ha működne ez 2 mozgatható elemmel, akkor már meg tudnád oldani 6-tal is, ám mégis a css kétharmada eltűnne.

Húzd ki a kevésbé fontos kérdéseket, mivel túl sokat kérdeztél, ezért nehéz másnak hozzákezdeni.

A JS formázásra ügyeljél, elsőre nem is látszódik, hogy a drop-ban van egy draggable, pontosan használd a tab-okat, egy ilyen fontos rész ne vesszen el! Viszont több mindent elhagyhatsz, tesztelés szempontjából az opacity nem annyira érdekes, ki lehet hagyni, rövidítsd a kódot, hogy aki belenéz, az könnyebben lássa át! Vagy akár kommentet is írhatnál, az utolsó sor mit csinál? (egy-két szónál több nem kell, ám néha annyi hasznos tud lenni) Bár lelövöm a poént, induláskor a $(".item") üres.
2

Oké, veszem az adást -

KapulaGábor · 2013. Jan. 9. (Sze), 19.07
Oké, veszem az adást - köszönöm a javaslatod.
Kiszedtem a kódból ami nem szükséges, és elkészítettem a JS Fidle demót is.

a drop-ban van egy draggable

erre gondolsz? accept: ".mozgat"

A "lelőtt poént" sajnos nem tudom értelmezni, mert mint az elején jeleztem, nem értek a javascripthez. Megfogalmaznád kérlek úgy, hogy még egy ilyen hozzá nem értőnek is érthető legyen?
3

Re

T.G · 2013. Jan. 10. (Cs), 08.57
- az új elemeknél meg kell tartani a mozgat osztályt és akkor mozgatásuk esetén a droppable ugyanúgy fog működni.
- a törlés gombot egyszerűen bele kell tenni a div-be (és megadni, hogy csak akkor látszódjon, amikor az elemnek van tapad osztálya is)
- a harmadik és negyedik kérdésed ugyanarra vonatkozik, a pozíciókat máshogy kell kezelni, azt az elemet, amit mozgatsz azt tedd position: absolute-ba, sok kellemetlenségtől szabadulsz meg.
- ha a klónozott elemek is kapnak tapad osztályt, akkor tapadni fognak.
http://jsfiddle.net/T2HmG/1/
4

Köszönöm szépen

KapulaGábor · 2013. Jan. 10. (Cs), 21.30
Hát tudod... szóhoz sem jutok. TG, nagyon szépen köszönöm.
A törlés gombot megpróbálom beleintegrálni a javaslatod alapján, aztán ezzel akkor úgy tűnik minden a helyére került.

Mégegyszer köszönöm(!).
5

jQuery noConflict

KapulaGábor · 2013. Jan. 23. (Sze), 23.00
TG, szeretnék mégegyet kérdezni: hogyan lehet egy ilyen
  1. <script type="text/javascript">  
  2.   $.noConflict();  
  3.   jQuery(document).ready(function($) {  
  4.   // szerintem ide jönne a lényeg...  
  5.   });  
  6. </script>  
dologba becsomagolni mindent amit csináltunk?
6

Pontosan, ahogy írtad.

Poetro · 2013. Jan. 24. (Cs), 01.23
Pontosan, ahogy írtad.
7

Bár nem TG vagyok,

Pepita · 2013. Jan. 24. (Cs), 01.55
de úgy, hogy odaírod. Lehet egy fv-en belül több fv-ed is, figyelj, hogy mind helyesen legyen lezárva. Oda kerül a lényeg, ahova írtad.

Szerk:
Hoppá, sokáig volt nyitvahagyva a lap, Poetro megelőzött. Részemről törölhető.
8

Köszönöm mindkettőtöknek.

KapulaGábor · 2013. Jan. 25. (P), 19.25
A problémám abból fakad, hogy nem értek a javascripthez, ezért kérdezek ilyeneket.

Az "fv" gondolom függvényt jelenthet. Namost, többször is előfordul ilyen }); izé, gondolom ez zárja le a függvényt, és nem tudom hány darab ilyen lehet a noconfilcton belül, vagy hogy mit jelent a "helyes lezárás"... Most már biztosan sejtitek mekkora láma vagyok ehhez.

A JS Fiddle homokozóban látható hogy mit építgetek, arról lenne szó.
9

Hányszor izé?...

Pepita · 2013. Feb. 1. (P), 16.30
többször is előfordul ilyen }); izé,

function(paraméter){utasítás1;utasítás2;...;}
Ez - így egyben - egy függvény (igen, fv-nek szoktam rövidíteni). A paraméter elhagyható.
Ha ezt beteszem egy - tetszőleges - utasítást vagy fv-t tartalmazó sorba (a "végére") zárójelek közé, akkor lesz belőle
Valami(function(paraméter){utasítás1;utasítás2;...;});
Most direkt nem kódszínezőbe tettem, hogy egy sorban láthasd. Ennek a végén ott az "izé", ami egyrészt a Valami utasítás paraméterének záró-zárójele a "programsor vége" jellel, másrészt a névnélküli fv utasítászárójelének "bezáró fele".
A programozó számára a jobb átláthatóság érdekében szoktunk ugye (itt-ott) sortörést, tabulátort használni a kódokban. Emiatt fordulhat elő, hogy "magában" látod az "izét".

hány darab ilyen lehet a noconfilcton belül

A fv-ek egymásba ágyazása "adott mélységig" lehetséges. Nem tudok arról, hogy a jQuery-ben ez meg lenne határozva (:)), viszont erősen függ a futtató környezet (böngésző, oprendszer) erőforrásaitól (vas).
Ha a verem túlcsordul, akkor aztán lesz conflict...