2009-03-20 13 views
0

Hier ist meine aktuelle Situation:Wie kann ich vorübergehend verhindern, dass ein scrollbares div scrollt?

Ich habe eine Webseite mit ein paar scrollbaren divs. Jedes dieser divs enthält eine Anzahl von Objekten. Ich verwende YUI, um Popup-Menüs von Aktionen anzuzeigen, die für jedes Objekt ausgeführt werden können. Jedem Objekt ist ein eigenes Menü zugeordnet, das dynamisch erstellt und angezeigt wird. Die Popup-Menüs können groß sein und die Grenzen des scrollbaren div überlappen.

Von dem, was ich glaube, sind Probleme mit Fokus (die Menüs müssen zugänglich sein), wenn ich den Mauszeiger über eine Aktion, die auf einer Kante des scrollbaren Div liegt, das div automatisch scrollt, den Inhalt verschieben, aber verlassen das Menü ist stationär. Der Versuch, das Menü dynamisch zu verschieben, wenn dies geschieht, ist nicht etwas, was ich tun möchte, da ich glaube, dass es eine schlechte Benutzererfahrung bieten würde.

Also muss ich verhindern, dass dieses fokussierte Menü das div scrollen. Meine Idee, die beste Benutzeroberfläche zu bieten, besteht darin, zu verhindern, dass diese inneren Divs beim Öffnen eines Menüs scrollen. Dadurch bleibt das Menü an der optimalen Position, um dem Benutzer anzuzeigen, auf welches Element reagiert wird. Wenn der Benutzer durch das Feld blättern möchte, kann er klicken, um das Menü zu schließen und normal zu blättern.

Wie kann ich das tun? Ich brauche eine Lösung, die über die wichtigsten Browser hinweg funktioniert.

Mein erster Gedanke war, das Ereignis onscroll für dieses bestimmte Element zu hören. Leider scheint es keinen einfachen Weg von dort zu geben, um das Scrollen zu verhindern. Zum einen scheint mein Javascript-Ereigniscode ausgeführt zu werden, nachdem das tatsächliche Scrollen stattgefunden hat.

Dann dachte ich, dass da mein Code ausgeführt wird, nachdem das Objekt gescrollt hat, ich habe gerade zurückgesetzt konnte obj.scrollTop und obj.scrollLeft. Natürlich scheint dies zu funktionieren, obwohl ich mir Sorgen mache, dass der Benutzer bei langsamen Browsern den Inhalt im div "herumspringen" sieht. Es wäre auch sehr schön, wenn die Menge des gescrollten Elements Teil des Ereignisobjekts ist. Ist es irgendwo drin stecken? Ich suche nach einer Alternative zum Speichern der scrollTop- und scrollLeft-Variablen für dieses Element und dann deren Verwendung, während das Scrollen vorübergehend deaktiviert ist.

Was ist der beste Weg, um das gesamte Problem zu lösen?

+0

Warum möchten Sie das tun? Es klingt wie ein Benutzerfreundlichkeits-Albtraum. Kannst du erklären, was der Nutzungskontext ist? – Rahul

+0

Meine Vermutung ist, die EU zu zwingen, Bedingungen zu lesen, oder eine Lizenzvereinbarung –

+0

@Rahul Ich habe meine Frage mit detaillierteren Informationen über das, was ich versuche, aktualisiert. Es ist eine grobe Situation und ich denke, dass dies der beste Weg ist, damit umzugehen. –

Antwort

0

Ich habe einen Weg gefunden, um dieses Problem zu umgehen. Indem Sie das Menüelement aus dem scrollbaren div entfernen und es direkt an document.body anhängen, hören alle Browser auf, das div zu scrollen, um das fokussierte Element freizulegen (obwohl das Element bereits vollständig sichtbar ist).

Danke an alle für Ihre Zeit und Ihre Antworten!

3

Die einfache Antwort ist nein, Sie können das nicht tun. Es ist doppelt nein, wenn Sie eine Cross-Browser-Lösung möchten.

Bietet dem Benutzer die klare Affordanz, dass etwas gescrollt werden kann, dann leugnen sie das ist einfach nur schlechte UI-Design.

Ok, nach Ihrer Bearbeitung stellt sich heraus, dass Sie nicht wirklich versuchen, den Benutzer daran zu hindern, zu scrollen.

Die Hauptantwort bleibt jedoch wahr. Es scheint, als ob der Fokus auf ein Rechteck (wahrscheinlich ein Anker?) Gerichtet ist, das nicht vollständig sichtbar ist und eine Bildlaufbewegung verursacht. Gibt es einen Grund, warum dieses Rechteck den Fokus bekommen muss? Für die Zugänglichkeit?

+0

Ich habe die Frage aktualisiert, um besser zu beschreiben, was ich zu erreichen versuche. Ich denke zurzeit, dass die Benutzerschnittstelle sehr verwendbar und sehr gut entworfen ist. Aber die Tatsache, dass der Fokus des Menüs dazu führt, dass das darunterliegende div scrollt, ist schrecklich und ich brauche einen Weg, um es zu umgehen. –

+0

Ja, das Menü ist eine Liste von Anchor-Tags, die den Schwerpunkt auf Barrierefreiheitsfragen legen müssen. Dann ist das Menü vollständig sichtbar, aber wenn man die Maus in die Nähe der Kante des scrollbaren Div bewegt, denkt der Browser, dass er für mich scrollen sollte. –

0

Was passiert, wenn Sie nicht Überlauf haben: blättern und stattdessen verwendete man overflow: hidden und zur Verfügung gestellt nach oben/unten Tasten, die der Benutzer bei Bedarf zu blättern erlaubt? Diese Tasten könnten natürlich leicht deaktiviert werden.

+0

Objekte mit einem Überlauf von versteckt wird noch in meiner Situation scrollen. Versuchen Sie, ein div mit einem Überlauf von hidden zu erstellen, dessen Größe klein ist, aber viel Text enthält. Sie können diese Box mit dem Mausrad oder durch Klicken und Ziehen bei der Auswahl des Textes scrollen. –

+0

Sie müssenDefault() des onscroll-Ereignisses usw. verhindern. Ich nehme an :) –

+0

Ja, das habe ich ausprobiert. Funktioniert nicht. Trotzdem danke. –

0

Auch wenn es nicht die Antwort ist, die Sie suchen, wenn Sie den Anzeigewert des Div auf 'none' setzen, während die Seite geladen wird (vom Server) und dann ein Ereignis zum Laden der Seite verdrahtet hat (entweder pageLoad in ajax.net oder anhängen an das onload-Ereignis via Javascript), wodurch die div-Anzeige auf 'Blockieren' gesetzt wird. Dies würde sicherstellen, dass langsamere Browser das div nicht "herumspringen" sehen würden (könnte sogar setzen) ein 'loading'-bild im div um den benutzer zu zeigen, dass es etwas tut und nicht nur unsichtbar)

entschuldigung ich könnte keine komplexere/flüssigere lösung anbieten.

3

Ich stimme Anthony bezüglich der Darstellung der Funktionalität zu, die Sie nicht zulassen möchten. Wenn Sie das Scrollen deaktivieren, sollten Sie diesen Teil der Seite visuell deaktivieren oder entfernen.

Zu diesem Zweck können Sie ein halbtransparentes div an der Oberseite des in Frage kommenden scrollbaren div positionieren, das die Mausereignisse erfassen und optisch anzeigen würde, dass das scrollbare div für den Moment inaktiv ist. Es wäre schwierig, Cross-Browser-kompatibel zu machen und wäre nicht perfekt, aber wiederum sind es nur sehr wenige clientseitige Tricks wie diese.

Verwandte Themen