2012-02-02 16 views
14

Semplice, Vorrei solo che sia così quando un utente sta trascinando un oggetto e che raggiungano il fondo o la parte superiore della finestra (10px o giù di lì), la pagina (circa 3000px lungo) Scrolls delicatamente verso il basso o verso l'alto, fino a quando non spostano il cursore (e quindi l'elemento trascinato) fuori regione.Come utilizzare JQuery/Javascript per scorrere verso il basso una pagina quando il cursore si trova sul bordo superiore o inferiore dello schermo?

Un elemento è un tag li che utilizza jquery per rendere trascinabili gli elementi dell'elenco. Per essere specifici:

Attualmente uso window.scrollBy (x = 0, y = 3) per scorrere la pagina e avere le variabili di:

  1. e.pageY ... fornisce assoluti Y-coordinate del cursore sulla pagina (non relativa a schermo)
  2. $ .scrollTop() ... fornisce offse t dalla parte superiore della pagina (quando la barra di scorrimento è completamente alzata, è 0)
  3. $ .height() ... fornisce l'altezza dell'area visualizzabile nel browser/viewport dell'utente
  4. body.offsetHeight .. altezza dell'intera pagina

Come posso ottenere questo e quale evento lo ospita meglio (attualmente è il mouseover)? Le mie idee:

  1. uso un un if/else per verificare se è in alto o in basso regione, scorrere verso l'alto se e.pageY sta dimostrando che è in alto, verso il basso se e.page & è in fondo e quindi chiama $ ('li'). mouseover() per iterare attraverso ...
    1. Utilizzare un ciclo do while ... questo ha funzionato moderatamente bene in realtà, ma è difficile smettere di scorrere fino a lontano. Ma io non sono sicuro di come controllare le iterazioni ....

Il mio ultimo tentativo:

  ('li').mouseover(function(e) { 

      totalHeight = document.body.offsetHeight; 
      cursor.y = e.pageY; 
      var papaWindow = window; 
      var $pxFromTop = $(papaWindow).scrollTop(); 
      var $userScreenHeight = $(papaWindow).height(); 
      var iterate = 0; 

      do { 
       papaWindow.scrollBy(0, 2); 
       iterate++; 
       console.log(cursor.y, $pxFromTop, $userScreenHeight); 
      } 

      while (iterate < 20); 
     }); 
+0

FYI, io sono solo preoccupato per i nuovi browser, principalmente FF e Chrome ... IE 7 o meno non esiste nel mio "mondo" – webDevAndEverythingElse

+0

hi, hanno ora ottenuto una soluzione di lavoro per questo problema? puoi postarlo? Ho un problema simile pubblicato qui: http://stackoverflow.com/questions/11222047/how-to-scroll-when-cursor-is-on-the-edge-of-div#comment14738038_11222047 – Xerxes

risposta

3

funziona abbastanza bene ora, l'utente ha solo bisogno di "jiggle" il mouse quando trascinare gli elementi a volte per mantenere lo scorrimento, ma per lo scorrimento solo con la posizione del mouse la sua piuttosto solido . Ecco quello che ho finalmente finito per usare:

$("li").mouseover(function(e) { 

    e = e || window.event; var cursor = { y: 0 }; cursor.y = e.pageY; //Cursor YPos 
    var papaWindow = parent.window; 
    var $pxFromTop = $(papaWindow).scrollTop(); 
    var $userScreenHeight = $(papaWindow).height(); 

    if (cursor.y > (($userScreenHeight + $pxFromTop)/1.25)) { 

     if ($pxFromTop < ($userScreenHeight * 3.2)) { 

        papaWindow.scrollBy(0, ($userScreenHeight/30)); 
      } 
     } 
    else if (cursor.y < (($userScreenHeight + $pxFromTop) * .75)) { 

     papaWindow.scrollBy(0, -($userScreenHeight/30)); 

     } 

    }); //End mouseover() 
+0

The * if ($ pxFromTop <($ userScreenHeight * 3.2)) * è tale che l'utente non può scorrere oltre il fondo della lista – webDevAndEverythingElse

+0

Ci dovrebbe essere un}); dopo il tuo codice. Altrimenti genera errori. (Non ho potuto modificare perché è inferiore a 6 caratteri) – LunaticNeko

+0

Grazie a @LunaticNeko, l'ho aggiornato, devo averlo perso nella copia incolla – webDevAndEverythingElse

0

Questo non funzionerà come l'evento solo incendi mentre siete mouse è oltre il li.

('li').mouseover(function(e) { }); 

Devi essere in grado di dire la posizione del mouse rispetto al viewport quando un elemento viene trascinato. Quando gli utenti iniziano a trascinare un oggetto, associare un evento "mousemove" al corpo e quindi controllare la posizione del mouse e scorrere quando necessario.

$("body").on("mousemove", function(event) { 
// Check mouse position - scroll if near bottom or top 
}); 

Non dimenticare di rimuovere l'evento quando l'utente interrompe il trascinamento.

$("body").off("mousemove", function(event) { 
// Check mouse position - scroll if near bottom or top 
}); 
+0

Grazie Jon! Lavorerò cercando di implementarlo con questa idea, ma a prima vista sembra certamente risolvere il mio dilemma su quale evento utilizzare. Se puoi offrire qualcosa di aggiuntivo sulla formula/logica per il calcolo della posizione del cursore rispetto alla finestra corrente, mi piacerebbe anche ascoltarlo! GRAZIE! – webDevAndEverythingElse

+0

@bribissell Prova questo link: http://docs.jquery.com/Tutorials:Mouse_Position – Jon

+0

Sicuramente accetterò la tua risposta finché riesco a farlo funzionare. Non mi sono dimenticato di te! (Ma la logica di posizionamento del mouse mi sta davvero bloccando in questo momento, nel peggiore dei casi Accetto il tuo da quando hai risposto per prima cosa con informazioni utili) – webDevAndEverythingElse

0

ricevo una newsletter settimanale (e-mail) da CodeProject, e aveva un po 'di roba che sembra certamente come si possa risolvere il mio problema ...speriamo che questo può aiutare gli altri:

  1. http://johnpolacek.github.com/scrollorama/ - JQuery basa e anima il rotolo

  2. https://github.com/IanLunn/jQuery-Parallax - basato JQuery, simile al precedente

  3. http: // remysharp. it/2009/01/26/elemento-in-vista-evento-plugin/- JQuery, rileva se un elemento è attualmente in vista dell'utente (super utile per questo problema!)

  4. Anche il sito in # 2 ha avuto un certo codice interessante:

    var windowHeight = $window.height(); 
    var navHeight = $('#nav').height()/2; 
    var windowCenter = (windowHeight/2); 
    var newtop = windowCenter - navHeight; 
    //ToDo: Find a way to use these vars and my original ones to determine scroll regions 
    
0

Questo potrebbe non essere esattamente quello che vuoi, ma potrebbe aiutare. Scorrerà automaticamente quando il mouse si trova sul "bordo dello schermo" (una regione definita dall'utente). Supponiamo di avere una barra larga 40 px sulla destra dello schermo, se il mouse raggiunge il primo 1px, inizierà a scorrere. Ogni px ci passi dentro, la velocità aumenterà. Ha anche una bella animazione di andamento.

http://www.smoothdivscroll.com/v1-2.htm

+0

Sembra interessante, lo controllerò domani mattina – webDevAndEverythingElse

+0

Sicuramente utile, e probabilmente potrebbe essere la forma più elegante di questa soluzione, tuttavia avrei dovuto ridurla un po '. Attualmente, il plug-in è configurato solo per scorrere verso sinistra e verso destra, NON verso il basso e verso l'alto. Immagino che non dovrebbe essere troppo difficile cambiarlo, e se potessi, sarebbe la soluzione perfetta. Troppo lavoro per ora però! Grazie per la risposta – webDevAndEverythingElse