Chcę tylko, aby jakiś prosty JQ / JS sprawdził, czy bieżąca strona / okno (a nie konkretny element) ma pionowy pasek przewijania.
Googlowanie daje mi rzeczy, które wydają się zbyt skomplikowane tylko w przypadku tej podstawowej funkcji.
Jak to zrobić?
javascript
jquery
scroll
Drzewiasty
źródło
źródło
overflow
właściwość thebody
jest ustawionahidden
gdzieś wzdłuż linii, nie zadziała. Jednak ustawienie ukryte na ciele jest niezwykle rzadkie.$(document)
zamiast$("body")
tego musiałem użyć , to działało dla mnie, gdy ciało nie działało (mam absolutnie ustawiony kontener ze współczynnikiem proporcji na szerokość / wysokość)Spróbuj tego:
Dzięki temu dowiesz się tylko, czy wysokość przewijania w pionie jest większa niż wysokość widocznej zawartości.
hasVScroll
Zmienna będzie zawierać prawdziwe, czy fałszywe.Jeśli chcesz dokładniej sprawdzić, dodaj następujący kod do powyższego kodu:
źródło
cStyle.overflow === 'scroll'
?cStyle.overflow == "visible"
może wyświetlać paski przewijania, gdy element jestdocument.body
. Ale powinno być (hasVScroll && cStyle.overflow == "visible" && element.nodeName == "BODY"). Poza tym musi to sprawdzić,cStyle.overflow === 'scroll'
jak wskazałeś.Wypróbowałem poprzednią odpowiedź i wygląda na to, że $ ("body") nie działa. Height () niekoniecznie reprezentuje całą wysokość html.
Poprawiłem rozwiązanie w następujący sposób:
źródło
Przywróćmy to pytanie z martwych;) Jest powód, dla którego Google nie daje prostego rozwiązania. Specjalne przypadki i dziwactwa przeglądarki wpływają na obliczenia i nie jest to tak banalne, jak się wydaje.
Niestety, pojawiają się problemy z przedstawionymi tutaj rozwiązaniami. Nie chcę ich wcale dyskredytować - są świetnymi punktami wyjścia i dotykają wszystkich kluczowych właściwości potrzebnych do bardziej solidnego podejścia. Ale nie polecałbym kopiowania i wklejania kodu z innych odpowiedzi, ponieważ
$( document ).width()
i.height()
padają ofiarą błędnego wykrywania rozmiaru dokumentu przez jQuery .window.innerWidth
, jeśli przeglądarka to obsługuje, powoduje, że kod nie wykrywa pasków przewijania w przeglądarkach mobilnych, gdzie szerokość paska przewijania wynosi zwykle 0. Są one wyświetlane tylko tymczasowo jako nakładka i nie zajmują miejsca w dokumencie . Powiększanie na telefonie komórkowym również staje się w ten sposób problemem (długa historia).html
ibody
na wartości inne niż domyślne (co się wtedy stanie jest trochę skomplikowane - zobacz ten opis ).Spędziłem więcej czasu niż sobie wyobrażałem na znalezieniu rozwiązania, które „po prostu działa” (kaszel). Algorytm mam wymyślić jest teraz częścią wtyczki, jQuery.isInView , która naraża się
.hasScrollbar
metodę . Jeśli chcesz, zajrzyj do źródła .W scenariuszu, w którym masz pełną kontrolę nad stroną i nie musisz zajmować się nieznanym CSS, użycie wtyczki może być przesadą - w końcu wiesz, które przypadki skrajne mają zastosowanie, a które nie. Jeśli jednak potrzebujesz wiarygodnych wyników w nieznanym środowisku, to nie sądzę, aby przedstawione tutaj rozwiązania były wystarczające. Lepiej jest używać dobrze przetestowanej wtyczki - mojej lub kogoś innego.
źródło
window.scrollbars
obiekt , który ma jedną właściwość,visible
. Brzmi obiecująco, ale tak nie jest. Nie jest obsługiwany w IE, w tym w IE11. I to właśnie mówi, że tam jest pasek przewijania - ale nie których jeden. Zobacz stronę testową tutaj .Ten zadziałał dla mnie:
Do ciała po prostu użyj
hasVerticalScroll()
.źródło
clientHeight
jest lepszeoffsetHeight
tutaj. W przeciwnym razie możesz mieć grubą ramkę i wrócić, gdy jest, nie ma paska przewijania.źródło
Co dziwne, żadne z tych rozwiązań nie informuje, czy strona ma pionowy pasek przewijania.
window.innerWidth - document.body.clientWidth
poda szerokość paska przewijania. To powinno działać w każdej przeglądarce IE9 + (nie testowane w mniejszych przeglądarkach). (Lub, aby ściśle odpowiedzieć na pytanie,!!(window.innerWidth - document.body.clientWidth)
Czemu? Załóżmy, że masz stronę, na której zawartość jest wyższa niż wysokość okna, a użytkownik może przewijać w górę / w dół. Jeśli używasz Chrome na komputerze Mac bez podłączonej myszy, użytkownik nie zobaczy paska przewijania. Podłącz mysz, a pojawi się pasek przewijania. (Zwróć uwagę, że to zachowanie można zastąpić, ale jest to domyślny AFAIK).
źródło
Znalazłem rozwiązanie waniliowe
źródło
window.innerWidth > document.documentElement.clientWidth
jest to prawda, alewindow.innerHeight > document.documentElement.clientHeight
tak nie jest. Wygląda na to, że w tym przypadku było odwrotnie. Nie jestem programistą JS, potrzebuję go tylko do testów Selenium. Jestem wdzięczny za podpowiedzi.Ten powie ci, czy masz pasek przewijania, czy nie. Dołączyłem kilka informacji, które mogą pomóc w debugowaniu, które będą wyświetlane jako alert JavaScript.
Umieść to w tagu script, po zamykającym tagu body.
źródło
Napisałem zaktualizowaną wersję odpowiedzi Keesa C. Bakkera:
Funkcja zwraca prawdę lub fałsz w zależności od tego, czy strona ma pionowy pasek przewijania, czy nie.
Na przykład:
źródło
używam
źródło
Wystarczy porównać szerokość elementu głównego dokumentu (tj. Elementu html) z wewnętrzną częścią okna:
Jeśli potrzebujesz również znać szerokość paska przewijania:
źródło
Inne rozwiązania nie działały w jednym z moich projektów i skończyło się sprawdzaniem właściwości overflow css
ale zadziała tylko wtedy, gdy pasek przewijania zniknie przez zmianę właściwości, nie zadziała, jeśli zawartość jest równa lub mniejsza niż okno.
źródło