iScroll Scrollen Vergangenheit Unten?
Sie kann leicht sehen, dass das problem auf der ersten Seite hier: http://m.vancouverislandlife.com/
Blättern Sie nach unten (Folie) und lassen Sie den Inhalt auf die Seite verlassen und es nicht wieder auf die Beine und ist für immer verloren. Aber auf Seiten, deren Inhalte hat überlauf der Seite und ist daher angenommen werden kann, das scrollen funktioniert einwandfrei (siehe Unterkünfte > b&b ' s, und Blättern Sie nach unten für ein Beispiel).
Bemerkte ich, dass auf meinem computer, das scrollen auf der ersten Seite ist immer fest an -899px
. Ich kann nicht finden, jemand anderes, der dieses problem erlebt und egal was ich versuche, ich kann es nicht reparieren! Hilfe!!!
(Es ist nicht wirklich dringend, da die Zielgruppe von iPhones und iPod Touches sind nicht davon betroffen, da Sie so wenig screen-Raum.)
Okay, neues problem. Zum lösen der iScroll Problem, ich gerade erstellt ein benutzerdefiniertes Skript. Jedoch funktioniert es nicht richtig auf die eigentliche Gerät. Auf desktop-Browsern, es funktioniert Prima. Auf mobilen, gelegentlich springt zurück an die Spitze und gewann ' T erkennen, einige berührt. Dies ist wahrscheinlich, weil der Weg, den ich abgebrochen, das Standard-event-und musste greifen, um ein bisschen ein hack. Wie kann ich dieses Problem beheben? (Yup - einfaches problem für ein +500 bounty. Nicht schlecht, nicht wahr?)
Hier ist das Skript, und die website ist an der üblichen Stelle:
function Scroller(content) {
function range(variable, min, max) {
if(variable < min) return min > max ? max : min;
if(variable > max) return max;
return variable;
}
function getFirstElementChild(element) {
element = element.firstChild;
while(element && element.nodeType !== 1) {
element = element.nextSibling;
}
return element;
}
var isScrolling = false;
var mouseY = 0;
var cScroll = 0;
var momentum = 0;
if("createTouch" in document) {
content.addEventListener('touchstart', function(evt) {
isScrolling = true;
mouseY = evt.pageY;
evt.preventDefault();
}, false);
content.addEventListener('touchmove', function(evt) {
if(isScrolling) {
evt = evt.touches[0];
var dY = evt.pageY - mouseY;
mouseY = evt.pageY;
cScroll += dY;
momentum = range(momentum + dY * Scroller.ACCELERATION, -Scroller.MAX_MOMENTUM, Scroller.MAX_MOMENTUM);
var firstElementChild = getFirstElementChild(content);
content.style.WebkitTransform = 'translateY(' + range(cScroll, -(firstElementChild.scrollHeight - content.offsetHeight), 0).toString() + 'px)';
}
}, false);
window.addEventListener('touchend', function(evt) {
isScrolling = false;
}, false);
} else {
content.addEventListener('mousedown', function(evt) {
isScrolling = true;
mouseY = evt.pageY;
}, false);
content.addEventListener('mousemove', function(evt) {
if(isScrolling) {
var dY = evt.pageY - mouseY;
mouseY = evt.pageY;
cScroll += dY;
momentum = range(momentum + dY * Scroller.ACCELERATION, -Scroller.MAX_MOMENTUM, Scroller.MAX_MOMENTUM);
var firstElementChild = getFirstElementChild(content);
content.style.WebkitTransform = 'translateY(' + range(cScroll, -(firstElementChild.scrollHeight - content.offsetHeight), 0).toString() + 'px)';
}
}, false);
window.addEventListener('mouseup', function(evt) {
isScrolling = false;
}, false);
}
function scrollToTop() {
cScroll = 0;
content.style.WebkitTransform = '';
}
function performAnimations() {
if(!isScrolling) {
var firstElementChild = getFirstElementChild(content);
cScroll = range(cScroll + momentum, -(firstElementChild.scrollHeight - content.offsetHeight), 0);
content.style.WebkitTransform = 'translateY(' + range(cScroll, -(firstElementChild.scrollHeight - content.offsetHeight), 0).toString() + 'px)';
momentum *= Scroller.FRICTION;
}
}
return {
scrollToTop: scrollToTop,
animationId: setInterval(performAnimations, 33)
}
}
Scroller.MAX_MOMENTUM = 100;
Scroller.ACCELERATION = 1;
Scroller.FRICTION = 0.8;
bounce:true
? Sie könnten sich bewusst sein, es aber position:fixed
funktioniert nicht im mobile safari (bis IOS 5). Aber dann in ios5, brauchen Sie sich nicht jedes plugin unterstützt kinetisches scrollen nativ. Wenn Sie das plugin eine option ist, haben Sie sich an touchScroll und Scroll-Fähigkeit?bounce: true
keinen Unterschied macht und ich nicht möchte, dass die Benutzer in der Lage sein, um einen Bildlauf über die Kanten sowieso. Ich bin der Tatsache bewusst, dass position: fixed
funktioniert nicht im mobile Safari (aber es ist ja nicht so unterstützte, wie es ist unwirksam, weil mobile Safari nutzt einen gleitenden viewport statt eines festen ein), ich bin nicht auf iOS5 sowieso, und ja, ändern Sie das plugin eine option ist, so werde ich diejenigen ansehen, danke.Ich habe versucht, um das setup dieses lokal, war aber nicht erfolgreich (vielleicht durch die ajax-Aufrufe, welche ich nicht haben, der php oder vielleicht war es spät in der Nacht). Ist es möglich für Sie zu dump static html, dass ich spielen kann (jsfiddle Schraube Dinge)? Erstaunlich, letztes Jahr war ich mit etwas anderem kinetisches scrollen mit guten Ergebnissen, ich konnte Sie nicht finden die gleichen plugin (und ich habe auf bewegt von diesem client auch). Ich werde jedenfalls versuchen Sie es erneut.
Hier ein jsFiddle: jsfiddle.net/minitech/QDuwk/1 funktionieren Die links nicht natürlich, aber das scrollen ist da. Sie kann wechseln es oben, von der Seite und nicht in der Lage sein, es wieder zu bekommen.
wurde dies jemals gelöst? Es ist ärgerlich, dass es Schriftrollen, die außerhalb der Inhalte Grenzen.
InformationsquelleAutor Ry- | 2011-08-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass Andrew war auf der rechten Spur mit Bezug auf die Einstellung der Höhe des
#wrapper
div. Als er wies darauf hin, dassNormalerweise würde dies funktionieren. Aber jetzt, dass Sie ' ve verändert Ihre
#content
zuposition: fixed
der wrapper-element ist nicht mehr der "Verpackung" Ihrer Inhalte, sothat.wrapperH
den Wert 0 hat, Dinge zu brechen.Disclaimer: ich habe nicht das ganze script, so kann ich Sie hier falsch
Wenn die manuelle Einstellung von Höhe zu
#wrapper
sagen500px
wird es,Die Dummheit hier ist, dass, wenn es gibt eine Menge von Inhalten und das Fenster ist klein,
that.scrollerH
ist relativ nahe dem Wert 500, sagen700px
. Der Unterschied der beiden wäre200px
, so können Sie nur Blättern 200 Pixel, damit den Eindruck erweckend, dass es gefroren ist. Dies läuft darauf hinaus, wie man das einstellen dasmaxScrollY
Wert.- Lösung (bei Chrome zumindest):
Seit
#wrapper
effektiv, enthält keine Inhalte, wir können nicht in die Berechnungen ein. Jetzt sind wir mit der linken, die einzige Sache, die wir sicher bekommen diese Dimensionen aus,#content
. In diesem speziellen Fall scheint es, dass die Verwendung des content-ElementsscrollHeight
Ausbeute, was wir wollen. Dies ist wahrscheinlich die, die das erwartete Verhalten,scrollerH
ist dieoffsetHeight
, die in etwa der Höhe, was Sie im Fenster sehen.scroller.scrollHeight
ist die Höhe, die Scrollbar ist. Wenn der Inhalt nicht mehr als die Länge der Seite, sind Sie etwa gleichwertig zu einem anderen. Das bedeutet, dass nicht scrollen. Wenn es gibt eine Menge von Inhalten, die Differenz dieser beiden Werte den Betrag von Blättern, die Sie benötigen.Gibt es noch kleinere Fehler, und dieses sieht wie es das schon gibt. Wenn Sie haben eine Menge von Inhalten, die letzten Elemente werden abgedeckt durch die bar, wenn Bildlauf nach unten. Um dies zu beheben, können Sie einen offset einstellen, wie
Die Nummer 75 willkürlich. Es ist wahrscheinlich am besten, wenn es die Höhe des Balkens selbst mit 2 oder 3 Pixeln, für ein bisschen Polsterung. Viel Glück!
Edit:
Ich habe vergessen zu erwähnen, Letzte Nacht, aber hier sind zwei Beispiel-Seiten, die ich verwendet Debuggen das problem.
Lange Seite
Kurze Seite
Okay, die Frage hat sich jetzt geändert - bitte versuchen Sie zu beantworten!
Ich bin damit Sie das Kopfgeld für die Mühe, und es wird Ihnen gehen sowieso. Versuchen Sie bitte zu helfen, mit der neuen Frage, obwohl.
Hm, hab ich nie gemacht mobile-device-Codierung vor. Ich werde einen Stich an es entweder heute Abend oder morgen Abend.
InformationsquelleAutor Anh-Kiet Ngo
Kann dies ein CSS-Problem. In deinem stylesheet (mobile.css Zeile 22), versuchen Sie, entfernen
position:fixed
aus#content
.Dass erlauben sollte, das Dokument zu Blättern, in der Regel (vertikale Bildlaufleiste, die auf einem computer "aufschiebbaren" auf einem mobilen browser).
Elemente mit
position:fixed
verlassen Sie den normalen Fluss des Dokuments, deren Positionierung relativ zum browser-Fenster. Dies ist wahrscheinlich, warum Sie Probleme mit dem scrollen. Feste Positionierung ist in der Regel für Elemente, die bleiben immer an der gleichen Stelle, auch wenn die Seite gescrollt wird (dh. eine notification bar "angeheftet" an der Spitze der Seite).Probieren Sie es aus - entfernen
position: fixed
, und ändern Sie den Seiten - der gesamte Inhalt verschwindet bei der Umstellung.Versuchen Sie
position:fixed;
zuposition:absolute;
, das sollten Sie bewahren Sie Ihre übergänge.Schon versucht, dass in das erste problem. Überraschend, es hat nicht funktioniert.
InformationsquelleAutor SteamDev
Keine endgültige Lösung, aber eine Richtung würde ich gehen:
#wrapper und #content overflow:hidden gepaart #Inhalt Position:fixed und scheinbar die Ursache des Problems.
Wenn position: fixed entfernt von #content, Bildlauf ist möglich, aber die "leere" divs falsch geschichtet (getestet in Firefox 5).
InformationsquelleAutor TJ.
Ihre wrapper-div-Element zu haben scheint, eine Höhe von 0. Also die Berechnungen sind negativ, die Einstellung, es ist die Höhe, um die Fenster-Höhe wird korrekt das scroll-Problem. Wenn ich manuell die Wrapper-Höhe über firebug und Chrome debug bar die scroll-Funktionen wie es sollte.
Du #content div zu haben scheint, seine Größe ändern auf Größe, wahrscheinlich eine bessere Idee zu haben, die #wrapper-div-Element seine Größe ändern und dann #Inhalt Erben der Größe.
[Bearbeiten]
Sie glauben mir das nicht so codez, Aus iscroll-lite.js
In Ihre Seite ein, die übersetzt,
Wenn ein scrollen beendet ist, wird dieser code aufgerufen wird.
Sehen, dass
that.maxScrollY > 0 ?
? Wenn maxScrollY negativ ist, dann scrollen bis nie bounce-back.Sind Sie positiv? Blick auf die Dokumentation Es sagt der wrapper benötigt eine Höhe eingestellt werden. Zumindest müssen Sie die Höhe und es ist etwas anderes falsch.
ps, eine Einstellung von 100% wird nicht funktionieren, müssen Sie die # - Wrapper Höhe in
px
sIch bin positiv. Auch bei der Einstellung der Höhe in Pixel, es funktioniert nicht.
InformationsquelleAutor Andrew
Landete ich nur mein eigenes, kleines Skript, sodass das scrollen von:
und ändern ein paar andere Teile. Es hat sparen eine Menge download-Zeit, nehme ich an, auch.
Ich bin immer noch zu akzeptieren, die Antworten und die Auszeichnung der bounty in 5 Tagen, obwohl.
firstElementChild.offsetHeight
wie es zu sein scheint, was Sie wollen. Wenn das erste element hat eine Mengeoverflow: hidden/scroll
Inhalt, Ihre Berechnung aus. Zweitens ist die Verwendungcontent.children[0]
stattgetElementsByTagName()
.children
ist ein array mit allen HTML-element, so dass es nicht-text-Knoten. Drittens, da du tust-(A - B)
ichNgo: Danke für die
offsetHeight
Tipp, weiß nicht, was ich dachte, war es... aber über dieoverflow
möglichen problem, ich habe einen dedizierten "innere"<div>
und es ist tatsächlich das einzige Kind. Danke auch für diechildren
Tipp, ich hatte es geändert, Weg vongetElementsByTagName()
zu meiner eigenen Methode, aber natürlich, die sieht viel schneller. Und schließlich, ich werde es ändern, umB - A
. Es ist eine alpha-version jetzt 🙂 Da habe ich es gepostet ich hab Schwung wie iScroll hat und setzen Sie es in Ihrem eigenen Objekt. Noch zu kommen, ist die Stornierung der Standard-scrollen, aber.Ngo: ich habe bearbeitet Sie meine Frage, es zu ändern und meine aktualisierte Skript. Es wurde vor kurzem geändert-von "fast arbeiten ohne hacks" zu "fast zu arbeiten, aber mit hacks" so ist es sollte leicht zu beheben.
InformationsquelleAutor Ry-
Geändert Frage erfordert eine neue Antwort. Ich warf einen Blick auf den code, und ich sah, dass Sie berechnet den Schwung auf jedem Schritt von der "verschieben" - Funktion. Dies ist jedoch nicht sinnvoll, weil die Dynamik wird verwendet, wenn das verschieben beendet ist. Was dies bedeutete, wurde zur Erfassung der position der Maus an den Anfang, und dann berechnen Sie die Differenz am Ende. Also fügte ich zwei neue Variablen,
Innerhalb des start-event (mousedown/touchstart), fügte ich hinzu,
Dann habe ich die folgende für meine end-handler -,
Ich habe auch entfernt die momentum-Berechnung aus dem inneren des mousemove - /touchmove. Das tun dies entfernt die springen, um Verhalten, ich sah auf mein iPhone. Ich sehe andere unerwünschte Verhaltensweisen, die als gut (das ganze Fenster "Rollen"), aber ich vermute, dass Sie gearbeitet haben, um loszuwerden, von denen, so dass ich nicht versuchen.
Glück. Hier ist ein codiert bis Seite, dass ich dupliziert für meine Prüfung. Ich habe auch die Freiheit nahm, überarbeiten Sie den code für diesen Abschnitt zu entfernen, einige duplizierten code. Es ist unter mobile3.js wenn Sie möchten, um es zu betrachten.
InformationsquelleAutor Anh-Kiet Ngo