jestem początkującym w temacie i na razie wymyślam sobie co by zrobić co gdzieś na jakiejś stronie zauważę, aby mniej więcej miec pojęcie jak to działa - o ile samo drag and drop opanowałem, jest na to wiele przykładów to mam problemy z czymś takim jak zrobienie przesuwanego diva wraz z ładowaniem elementów. Coś takiego jak jest w każdej mapce - niestety za mało wiem, żebym sobie sam poradził, dlatego też pytam się jak takie coś można zrobić.
Przyjmując, że dany element ma rozmiar stały to musi być jakaś manipulacja jego własciwością top i left, dodatkowo trzeba by sprawdzać czy elementy można dodawać, czy jeszcze nie (i jak to lepiej zrobić dodawać wierszami czy kolumnami, tak żeby jakiś element narożny niepotrzebnie dwa razy się nie dodał). Czy elementy, które są jakby za bardzo przesunięte są usuwane, czy zostają. Chodzi mi o to, że jak przesuwam diva to przy przesunięciu go w miejsce, w którym widać granicę, ramkę i nalezy doładować brakujący fragment, a dokładnie naprzeciwko czyli z drugiej strony są elementy, które jakby wyszły poza pierwotny rozmiar,czy się je usuwa, czy zachowuje? Czyli czy dany div ma zawsze tyle samo elementów (kafelków) czy są one cały czas dodawane?
Jak poznać czy do elementy mozna juz dodawać, jest jakaś własność, która jest widoczną wyskością lub szerokością diva znajdującego się w divie mającym oferflow:hidden?

Próbuję różnych kombinacji, ale nie wiem za bardzo jak sie do tego zabrać, może ktoś wie gdzie jest taki przykład, a może to, czego szukam ma swoją nazwę i po niej mogę coś znaleźć w wyszukiwarce, chodzi mi o poradę, jak to się robi?

ps mam nadzieję, że w miare jasno opisałem o co chodzi

udało mi się coś napisać - działa, ale mam pytanie, czy można to zrobić lepiej, wydajniej, efektywniej?

na razie uzupełnia się na puszczenie myszki, wykorzytsałem do tego jquery
załozenia są takie
- przesuwany div po puszczeniu myszki ma top i left równe 0
- wewnętrze divy, obrazki mają się przystosować
- elementów wewnętrzych ma być zawsze tyle samo (czyli dodawanie wiąże się z usuwaniem)
- elementy(kafelki) są kwadratowe (dla ułatwienia)

zrobiłem klasę w JS, mniej więcej postaram się ją opisać

na początek zmienne
  1. <?php
  2. var movTest =
  3. {
  4. tiledS:256,//rozmiar boku kwadratu stanowiącego element wewnętrzny
  5. cWidth:0,//szerokość kontenera, czyli diva, który ma overflow:hidden
  6. cHeight:0,//wysokość kontenera
  7. mWidth:0,//szerokość diva z elementami (tego co jest w divie - kontenerze
  8. mHeight:0,//wyskość diva z elementemi
  9. points:{minX:0,maxX:0,minY:0,maxY:0},//punkty - określają współżędne X i Y lewego g órnego i prawego dolnego rogu
  10. border:{top:0,left:0,bottom:0,right:0},//ramka - zmienne służace do przechowywania wartości \"ile zostało\" aby wiedzieć kiedy załadować elementy, czyli przechowanie ilości px \"schowanych\" z każdej strony w div:overflow
  11. lastPos:{top:0,left:0},//zmienne przechowujący ostanią wartość top i last diva przesuwanego
  12. imgPos:{posT:Array(),posL:Array()},tablica do przechowywania wartości top i left elementów przesuwanych
  13. ?>


funkcj inicjująca - czyli pierwsze załadowanie diva
  1. <?php
  2. loadMov:function(x,y)//argumenty to x i y (lewy górny róg) kostki która ma być na środku - jeszcze nie ma centrowania, żeby to się dopasowywało do środka tej kostki, ale pewnie zrobię
  3.    {
  4.        this.cWidth=$(&#092;"#containerDiv\").width();//pobranie szerokościo kontenera
  5.        this.cHeight=$(&#092;"#containerDiv\").height();//pobranie wysokości kontenera
  6.        var elW = Math.ceil(this.cWidth/this.tiledS);//obliczenie ile elementów zmiesci się na szeokość
  7.        var elH = Math.ceil(this.cHeight/this.tiledS);//obliczenie ile elementów zmiesci się na wysokość
  8.        var bX = x - Math.floor(elW/2)-1;//wyznaczenie współżędnej X lewego górnego rogu (1 kafelek w zapasie - czyli niewidoczny)
  9.        var bY = y - Math.floor(elH/2)-1;//wyznaczenie współżędnej Y lewego górnego rogu (1 kafelek w zapasie - czyli niewidoczny)
  10.        var eX = x + Math.ceil(elW/2)+1;//wyznaczenie współżędnej X prawego dolnego rogu (1 kafelek w zapasie - czyli niewidoczny)
  11.        var eY = y + Math.ceil(elH/2)+1;//wyznaczenie współżędnej Y prawego dolnego rogu (1 kafelek w zapasie - czyli niewidoczny)
  12.        this.mWidth = (elW+2)*this.tiledS;//obliczenie szerokości diva przesuwanego
  13.        this.mHeight = (elH+2)*this.tiledS;//obliczenie wysokosci diva przesuwanego
  14.      
  15.        //wyznaczenie bieżących współżędnych lewego górnego i prawego dolnego rogu
  16.        this.points.minX = bX; this.points.maxX = eX-1;
  17.        this.points.minY = bY; this.points.maxY = eY-1;
  18.      
  19.        this.completeDiv(bY,eY,bX,eX,0,0,0);//wywołanie funkcji uzupełniającej DIV - 1,3 argumeny - lewy górny róg, 2,4 - prawy dolny róg, 5 - przesunięcie X(czyli o jaką wartość w poziomie ma być przsunięty element aby \"pasował\" do istniejących, 6 - przesunięcie Y (w pionie), 7 - punk startu X, aby nie ładować podwójnie przy konieczności uzupelnia X-ów i Y-ów, X zostawiam jako ładowany względem Y
  20.      
  21.        this.border.top = parseInt($(&#092;"#movingDiv\").css(\"margin-top\"));// -ustalenie wartości zakrytej od góry
  22.        this.border.left = parseInt($(&#092;"#movingDiv\").css(\"margin-left\"));// -ustalenie wartości zakrytej z lewej
  23.      
  24.        this.border.bottom = this.mHeight-(this.cHeight-this.border.top);// -ustalenie wartości zakrytej z dołu
  25.        this.border.right = this.mWidth-(this.cWidth-this.border.left);// -ustalenie wartości zakrytej z prawej    
  26.  
  27.        this.initPosArr((this.points.maxY-this.points.maxY)+1,true);//załadowanie wartości top do tablicy
  28.        this.initPosArr((this.points.maxX-this.points.minX)+1,false);//załadowanie wartości left
  29.      
  30.      
  31.    },
  32. ?>





wywołanie funkcji wystepujące przy inicjalizacji
  1. <?php
  2. //funkcjz uzupełniającz DIV - 1,3 argumeny - lewy górny róg, 2,4 - prawy dolny róg, 5 - przesunięcie X(czyli o jaką wartość w poziomie ma być przsunięty element aby \"pasował\" do istniejących, 6 - przesunięcie Y (w pionie), 7 - punk startu X, aby nie ładować podwójnie przy konieczności uzupelnia X-ów i Y-ów, X zostawiam jako ładowany względem Y
  3. completeDiv: function(saY,stY,saX,stX,mX,mY,sElX)
  4.    {
  5.        var elY=0; var elX = sElX;//kolejne kostki x i y
  6.        for(var i = saY; i
  7.        {
  8.                for(var j = saX;  j
  9.                {
  10.  
  11.                        $(&#092;"#movingDiv\").append($(\"<img>\").
  12.                                                css(&#092;"position\",\"absolute\").
  13.                                                css(&#092;"top\",(elY)*this.tiledS+mY).
  14.                                                css(&#092;"left\",(elX)*this.tiledS+mX).//itd
  15.                    );
  16.                    elX++;
  17.                }  
  18.                elY++; elX=sElX;
  19.        }
  20.    },
  21. ?>


funkcja przy przesuwaniu diva
  1. <?php
  2. divMoving:function()
  3.    {
  4.        this.border.top=(parseInt($(&#092;"#mapaCtnDiv\").css(\"margin-top\"))+parseInt($(\"#mapaCtnDiv\").css(\"top\")))+this.lastPos.top;//ustalenie \"zakrtyej\" góry
  5.        this.border.left=(parseInt($(&#092;"#mapaCtnDiv\").css(\"margin-left\"))+parseInt($(\"#mapaCtnDiv\").css(\"left\")))+this.lastPos.left;//ustalenie \"zakrytego\" dołu
  6.        
  7.        this.border.bottom = this.mHeight-(this.cHeight-this.border.top);//ustalenie \"zakrytej\" lewej
  8.        this.border.right = this.mWidth-(this.cWidth-this.border.left);//ustalenie \"zakrytej\" prawej
  9.    },
  10. ?>


1/3




2/3
sama główna funkcja modyfikująca kafelki

  1. <?php
  2. divStop:function()
  3.    {
  4.       this.divMoving();//uaktualnienie danych o pozycji granic z każdej ze stron
  5.        var $this = this;
  6.        var minT = 0; var minL = 0;//zmienne do prechowywania min wartości Top i Left kafelków
  7.  
  8.        $(&#092;"#movingDiv img\").each(
  9.            function(i)
  10.            {
  11.                var loopT = parseInt($(this).css(&#092;"top\"))+parseInt($(\"#movingDiv\").css(\"top\"));//nowa wartość TOP kafelka
  12.                var loopL = parseInt($(this).css(&#092;"left\"))+parseInt($(\"#movingDiv\").css(\"left\"));//nowa wartość left kafelka
  13.                $(this).css(&#092;"top\",loopT);//ustawienie wasrtości top i left
  14.                $(this).css(&#092;"left\",loopL);
  15.                if(i==0)
  16.                    {minT = loopT;minL = loopL;}    //inicjalizacja zmiennych przechowujących min
  17.                else
  18.                    {minT=(minT>loopT)?loopT:minT;
  19.                     minL=(minL>loopL)?loopL:minL;}//szukanie wartości min dla Top i Left kafelków
  20.            }
  21.        );
  22.      
  23.        this.fillPosTab(minT,(this.points.maxY-this.points.minY)+1,true);//wpisanie do tablicy wartości TOP dla kafelków
  24.        this.fillPosTab(minL,(this.points.maxX-this.points.minX)+1,false);//wpisanie do tablicy wartości LEFT dla kafelków
  25.      
  26.       $(&#092;"#movingDiv\").css(\"top\",0).css(\"left\",0);//przywrócenie divowi przesuwanemu wartości Top i Left = 0
  27.      
  28.        var modX = this.imgPos.posL[0];//podstawowy modyfikator x - pierwszy element tablicy
  29.        var modY = this.imgPos.posT[0];//podstawowy modyfikator y - pierwszy element tablicy
  30.  
  31.    //ustalenie pozycji lewego górnego i prawego dolnego elementu przed zmianą
  32.        var cMinX = this.points.minX;  var cMaxX = this.points.maxX+1;
  33.        var cMinY = this.points.minY;  var cMaxY = this.points.maxY+1;
  34.        var bModX = false;//czy była zmiana X-ow
  35.        var bModY = false;//czy była zmiana Y-ów
  36.        var yTiled=0;var xTiled=0;//ile wierszy i kolumn ma być zmodyfikowanych
  37.  
  38.    
  39.    //modyfikacja  WIERSZy    
  40.        if(this.border.top>0 || this.border.bottom<0)
  41.        {
  42.            yTiled = (this.border.top>0)?this.getElAm(this.border.top):this.getElAm(this.border.bottom);//ustalenie ilości wierszy które mają być dodane
  43.          
  44.            var bY = (yTiled>0)?this.points.minY-yTiled:this.points.maxY+1;//nowy lewy górny Y
  45.            var eY = (yTiled>0)?this.points.minY:bY-yTiled;//nowy prawy dolny Y
  46.          
  47.            this.points.minY-=yTiled;//modyfikacja wartośi Y - lewa górna
  48.            this.points.maxY-=yTiled;//modyfikacja wartośi Y - prawa dolna
  49.            
  50.            var limY=(yTiled>0)?this.imgPos.posT[this.imgPos.posT.length-yTiled-1]:this.imgPos.posT[Math.abs(yTiled)-1];// okreslenie limitu od którego kostki(kafelki) po Y mają być usunięte
  51.          
  52.            bModY = true;//ustawienie informacji, że była modyfikacja WIERSZY
  53.          
  54.            var modY_Y = (yTiled>0)?this.imgPos.posT[0]-(yTiled*this.tiledS):this.imgPos.posT[this.imgPos.posT.length-1]+this.tiledS;//modyfikator Y dla WIERSZY
  55.            var modX_Y = this.imgPos.posL[0];//modyfikator X dla WIERSZY
  56.          
  57.            this.border.top -= yTiled*this.tiledS;//ustalenie nowej wartości \"zakrytej\" dla góry
  58.            this.border.bottom -= yTiled*this.tiledS; //ustalenie nowej wartości \"zakrytej\" dla dołu
  59.        }
  60.  
  61.  
  62.    //modyfikacja  KOLUMN
  63.        if(this.border.left>0 ||this.border.right<0 )
  64.        {
  65.            xTiled=(this.border.left>0)?this.getElAm(this.border.left):this.getElAm(this.border.right);//ustalenie ilości kolumn które mają być dodane
  66.      
  67.            var bX = (xTiled>0)?this.points.minX-xTiled:this.points.maxX+1;//nowy lewy górny X
  68.            var eX = (xTiled>0)?this.points.minX:bX-xTiled;//nowy prawy dolny X
  69.              
  70.            this.points.minX-=xTiled;; //modyfikacja wartośi X - prawa dolna
  71.            this.points.maxX-=xTiled; //modyfikacja wartośi X - prawa dolna
  72.      
  73.            var limX=(xTiled>0)?this.imgPos.posL[this.imgPos.posL.length-xTiled-1]:this.imgPos.posL[Math.abs(xTiled)-1];// okreslenie limitu od którego kostki(kafelki) po X mają być usunięte
  74.          
  75.            bModX = true;//ustawienie informacji, że była modyfikacja KOLUMN
  76.        
  77.            var modY_X = this.imgPos.posT[0];//modyfikacja wartośi X - lewa górna //modyfikator X dla KOLUMN
  78.            var modX_X = (xTiled>0)?this.imgPos.posL[0]-(xTiled*this.tiledS):this.imgPos.posL[this.imgPos.posL.length-1]+this.tiledS; //modyfikator Y dla KOLUMN
  79.                  
  80.            this.border.left -= xTiled*this.tiledS;//ustalenie nowej wartości \"zakrytej\" dla lewej
  81.            this.border.right -= (xTiled*this.tiledS); //ustalenie nowej wartości \"zakrytej\" dla prawej
  82.    
  83.        }
  84. ?>

2/3

3/3
  1. <?php
  2. if(bModY || bModX)//jesli była jakaś modyfikacja
  3.        {
  4.            $("#movingDiv img").each(
  5.                    function(i)
  6.                    {
  7.             if($this.checkRemove(parseInt($(this).css("top")),limY,(yTiled>0)) && bModY)//jesli kafelek spełnia warunek to go usuń (góra lub dół)
  8.                        {
  9.                            $(this).remove();
  10.                        }
  11.                    
  12.                        if($this.checkRemove(parseInt($(this).css("left")),limX,(xTiled>0)) && bModX)//jesli kafelek spełnia warunek to go usuń (prawa lub lewa)
  13.                        {
  14.                            $(this).remove();
  15.                            remX++;
  16.                        }
  17.                    }
  18.                );
  19.       }      
  20.       this.lastPos.top = this.tiledS + this.border.top;//modyfikacja ostaniej pozycji TOP diva ruchomego uwzględniająca "zakrycie górne"
  21.       this.lastPos.left = this.tiledS + this.border.left;//modyfikacja ostaniej pozycji LEFT diva ruchomego uwzględniająca "zakrycie górne"    
  22.  
  23.  
  24.       if(bModY){   //jesli była modyfikacja Y - wiersze -
  25.          modX_Y = (bModY)?modX_Y:modY;//ustalenie modyfikacji X dla Y
  26.          modY_Y = (bModY)?modY_Y:modY;//ustalenie modyfikacji Y dla Y
  27.          cMinX = (xTiled>0)?cMinX:cMinX-xTiled;//ustalenie X który ma być początekiem dla wiersza
  28.          cMaxX = (xTiled>0)?cMaxX-xTiled:cMaxX;//ustalenie X który ma być końcem dla wiersza
  29.      //chodzi o to, że jak dodaje kafelki to kolumny dodaję w całości, a wiersze w uzglednieniu juz dodanych kolumn, czyli aby narożne pozycje się nie dublowały
  30.        
  31.          var elX = (xTiled>0)?0:Math.abs(xTiled);//od jakiego X nalezy zacząć
  32.          this.completeDiv(bY, eY, cMinX,cMaxX,modX_Y,modY_Y,elX);//uzupełnianie wierszy
  33.    
  34.      }
  35.      if(bModX){ //jesli była modyfikacja Y - kolumny -
  36.          modX_X = (bModX)?modX_X:modX;;//ustalenie modyfikacji X dla X
  37.          modY_X = ((bModX)?modY_X:modY)-(this.tiledS*yTiled);;//ustalenie modyfikacji Y dla X
  38.          this.completeDiv(cMinY-yTiled, cMaxY-yTiled,bX,eX,modX_X,modY_X,0);//uzupelnianie kolumn z uwzględnieniem ( cMaxY-yTiled) nowo dodanych wierszy
  39.      }  
  40.    }
  41. ?>


Tak to wygląda - jak na razie działa, sprawdziłem, ale być może da się to ulepszyć, zmienić, napisac to krócej, może jak ktos bedzie miał czas, ochotę i pomysł, uwagi jak to zmienić, ulepszyć to chętnie się zapoznam