2013-05-21 10 views
11

Ho scritto un sito Web che ha una funzione che fa scorrere la visualizzazione degli utenti nella parte superiore della pagina. La chiamata in questione è:jQuery che anima la parte superiore fino a 0 non funziona su Windows Phone

$('html,body').animate({scrollTop:0}, 150, 'swing'); 

Questo funziona bene su tutti i browser desktop, ma su Windows Phone, scorre solo l'utente su circa 180 pixel, poi si ferma. Ho provato a sostituire la funzione con:

$('html,body').scrollTop(0); 

E scatta verso l'alto su desktop, ma scorre verso l'alto al telefono. Credo che questa esigenza di Internet Explorer Mobile tenti di animare senza problemi lo scorrimento e causa il problema. Se questo è il caso (o se no, qualcuno potrebbe correggermi), come posso sovrascrivere questa funzione per far funzionare l'animazione?

EDIT

Anche se la sua, sembra di lavorare in una capacità limitata, ho sostituito il codice non è l'ideale scorrimento con questo:

$('html,body').animate({scrollTop:0}, 150, 'swing', function() { 
    $('html,body').scrollTop(0); 
}); 

Ma sarebbe bene sapere se c'è un'opzione per disabilitare lo scorrimento regolare in Mobile IE in modo programmatico.

risposta

7

su Windows Phone 8, sono in esecuzione nello stesso problema. Attualmente sto facendo il seguente hack, dove attende che l'animazione sia "completa" e poi esegue uno window.scrollTo standard per assicurarci che venga fatto scorrere nella posizione corretta.

scrollHmtlBody: function (scrollToTarget, duration) { 
    $('html, body').animate({ scrollTop: scrollToTarget }, duration); 

    // Windows Phone doesn't animate properly, 
    // this makes sure it scrolls to the appropriate position (eventually) 
    setTimeout(function() { 
     window.scrollTo(0, scrollToTarget); 
    }, duration + 75); 
} 

io non sono contento del risultato - funziona, ma a causa delle 75ms ritardare ha un'esitazione prima si "finiture" l'animazione di scorrimento. Con meno di un ritardo, Windows Phone apparentemente si rifiuta di eseguire l'azione scrollTo (forse pensa che stia attualmente "scorrendo"?)

Posso finire per ricorrere a una clausola if/else con rilevamento dispositivo, ma in questo momento Sto cercando di trovare una soluzione migliore piuttosto che percorrere quella strada.

+0

sì, questo è simile a quello che ho fatto alla fine. Tranne che, invece di avere la chiamata 'setTimeout' al di fuori di' .animate', faceva parte dell'argomento di callback completo in '.animate'. Sembra funzionare bene, ma sì, è fastidioso avere il ritardo in seguito. Un programma di rilevamento dispositivi (lato server) sarebbe bello includere uno script diverso, purché tutta l'animazione della finestra sia gestita in uno script indipendente – topherg

+0

Yah, per qualche motivo non funzionerebbe all'interno della richiamata sull'emulatore. Dovrebbe avere un vero W8Phone entro la fine della settimana per vedere se questo fa la differenza. – LocalPCGuy

+0

A volte, ciò che ho trovato accade è che l'animazione inizia, quindi si fermerà in un punto. Penso che sia perché, mentre scorre, si interrompe, quindi si ferma invece. Potrebbe essere necessario uno script per determinare il numero di pixel tra il luogo in cui ci si trova, dove si sta andando, quindi se è possibile calcolare la velocità (che non dovrebbe richiedere troppo tempo), è possibile determinare il tempo di scorrimento di WP. Quindi, con un po 'di padding (diciamo 5ms) si può chiamare 'scrollTo (0)'. Avrà un po 'di gioco. Goditi il ​​tuo nuovo telefono – topherg

0

ho risolto in questo modo

Il link: < a href = "# di" data-target = "di" class = "scroll-to" > proposito </a >

Il nome ancoraggio #about lo fa funzionare su dispositivi con scorrimento continuo

 function scrollToElement(elementId) { 
      var top = $("#" + elementId).offset().top; 
      $('html,body').animate({ scrollTop: top }, 250); 
     } 

     $(".scroll-to").click(function() { 
      scrollToElement($(this).data("target")); 
     }); 
+0

non ha fatto alcuna differenza. L'ho implementato in una pagina di test, ma sarebbe solo a breve distanza, quindi si fermerebbe – topherg

1

Nessuna di queste soluzioni ha funzionato per me sia su Windows Phone 7. che cosa ha fatto il lavoro è stato quello di rimuovere animate() e affidarsi semplicemente a scrollTop sul tag html. Spero che questo aiuti qualcuno.

questo:

$('html').scrollTop(distance); 

invece di:

$('html,body').animate({ scrollTop: distance }, 250); 
+0

Anche se funziona bene, ha lo sfortunato effetto collaterale di rimuovere qualsiasi animazione su dispositivi che non eseguono l'animazione (come Chrome sul desktop) – topherg

1

Ho avuto lo stesso problema sul mio Windows Phone 8. Nel mio caso, avevo bisogno di scorrere la finestra verso il basso ma sul telefono non funzionava.

Alla fine ho utilizzato una combinazione di soluzioni @topherg e @LocalPCGuy con una leggera variazione per portare lo schermo verso il basso.

Ecco il mio codice in caso aiuta qualcun altro:

$("html, body").stop().animate({ 
    scrollTop: $("#last-message").offset().top 
}, 2000, 'swing', function() { 
    $("html, body").scrollTop($("#last-message").offset().top); 
}); 

setTimeout(function() { 
    window.scrollTo(0, document.body.scrollHeight); 
}, 2075); 

Dove # ultimo messaggio è il div che voglio scorrere fino a. Sembra un po 'hacky, ma anche Windows Phone: P

Problemi correlati