$(document).ready(function(){// Check if body height is higher than window height :)if($("body").height()> $(window).height()){
alert("Vertical Scrollbar! D:");}// Check if body width is higher than window width :)if($("body").width()> $(window).width()){
alert("Horizontal Scrollbar! D:<");}});
+1, ale ze względu na dokładność sprawdza tylko, czy treść rozszerza się dalej niż widoczny obszar. Jeśli overflowwłaściwość the bodyjest ustawiona hiddengdzieś wzdłuż linii, nie zadziała. Jednak ustawienie ukryte na ciele jest niezwykle rzadkie.
Nie działa to, jeśli wysokość treści odpowiada wysokości okna, co ma miejsce, gdy wysokość dokumentu dokładnie odpowiada rzutni, a następnie dodawany jest poziomy pasek przewijania . To zmusi vert. pasek przewijania, ale wysokość dokumentu / treści / okna jest taka sama; NIE zaalarmuje "pionowego paska przewijania", nawet jeśli taki istnieje.
Pomyślałem, że wspomnę, że $(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ść)
Mam stronę raportu w przeglądarce Chrome, gdzie początkowo wyświetla pasek przewijania i znika w ciągu kilku milisekund, co wygląda jak zachowanie przeglądarki, ponieważ jej nie zaprogramowałem. Więc ta funkcja zawsze zwraca prawdę w moim przypadku ...
@TiuTalk for me $ ("body"). Height () i $ (window) .height () daje tę samą wartość, zamiast tego używam $ (document) .height ()> $ (window) .height () to działa mnie.
var hasVScroll = document.body.scrollHeight > document.body.clientHeight;
Dzięki temu dowiesz się tylko, czy wysokość przewijania w pionie jest większa niż wysokość widocznej zawartości. hasVScrollZmienna będzie zawierać prawdziwe, czy fałszywe.
Jeśli chcesz dokładniej sprawdzić, dodaj następujący kod do powyższego kodu:
// Get the computed style of the body elementvar cStyle = document.body.currentStyle||window.getComputedStyle(document.body,"");// Check the overflow and overflowY properties for "auto" and "visible" values
hasVScroll = cStyle.overflow =="visible"|| cStyle.overflowY =="visible"||(hasVScroll && cStyle.overflow =="auto")||(hasVScroll && cStyle.overflowY =="auto");
Powoduje to, że hasVScroll ma wartość true, gdy overflowY jest „widoczne”, niezależnie od tego, czy scrollHeight jest większa niż clientHeight. Może miałeś na myśli cStyle.overflow === 'scroll'?
@BT cStyle.overflow == "visible" może wyświetlać paski przewijania, gdy element jest document.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:
// Check if body height is higher than window height :) if($(document).height()> $(window).height()){
alert("Vertical Scrollbar! D:");}// Check if body width is higher than window width :) if($(document).width()> $(window).width()){
alert("Horizontal Scrollbar! D:<");}
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ż
nie rejestrują efektu pozycjonowanej treści w sposób niezawodny dla różnych przeglądarek. Odpowiedzi oparte na rozmiarze ciała całkowicie to pomijają (treść nie jest przesuniętym elementem nadrzędnym takiej treści, chyba że jest pozycjonowana). A te odpowiedzi sprawdzają się $( document ).width()i .height()padają ofiarą błędnego wykrywania rozmiaru dokumentu przez jQuery .
Poleganie na 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).
Wykrywanie może zostać odrzucone, gdy ludzie jawnie ustawią przepełnienie zarówno elementu, jak htmli bodyna wartości inne niż domyślne (co się wtedy stanie jest trochę skomplikowane - zobacz ten opis ).
W większości odpowiedzi wypełnienie ciała, obramowanie lub marginesy nie są wykrywane i zniekształcają wyniki.
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ę .hasScrollbarmetodę . 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.
Dzięki. Dość skomplikowane! Jeśli nie chcesz / nie musisz być kompatybilny wstecz, czy jest może łatwiejsze rozwiązanie dla przeglądarek HTML5? Chodzi mi o to, że być może kodery przeglądarki / w3c były na tyle miłe, aby po prostu powiedzieć nam, czy na elemencie są paski przewijania, czy nie? ;-)
@Leo Nie jestem tego świadomy. Cóż, nie jest to window.scrollbarsobiekt , 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 .
Dzięki @hashchange. To brzmi niesamowicie głupio, że po prostu mówi, czy jest jakiś pasek przewijania, więc myślę, że to jeszcze jakiś test. Choć trochę obiecujące. ;-)
@BT Ok, świetnie. Teraz pozwól, że poprowadzę cię do wejścia do króliczej nory;) Oto demo, w którym zawartość nie wystarczy do wypełnienia okna. Twoje wykrywanie działa w FF, ale kończy się niepowodzeniem w Chrome. A oto kolejne demo, w którym pozycjonowany element jest umieszczony daleko w dół strony. Twoje wykrywanie działa w Chrome, ale kończy się niepowodzeniem w FF.
@BT I wydaje mi się, że możemy dostać się do kilku dziwnych trybów awarii, kiedy zaczynamy bawić się ustawieniami przepełnienia, ponieważ ich zachowanie jest trochę dziwne , ale na tym się zatrzymałem.
Co dziwne, żadne z tych rozwiązań nie informuje, czy strona ma pionowy pasek przewijania.
window.innerWidth - document.body.clientWidthpoda 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).
Przetestowałem to w Chrome 65 i działa. Ale kiedy dostosuję go do poziomych pasków przewijania, wynik jest dziwny: jeśli są wyświetlane zarówno poziomy, jak i pionowy pasek przewijania, window.innerWidth > document.documentElement.clientWidthjest to prawda, ale window.innerHeight > document.documentElement.clientHeighttak 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.
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.
overflow
właściwość thebody
jest ustawionahidden
gdzieś wzdłuż linii, nie zadziała. Jednak ustawienie ukryte na ciele jest niezwykle rzadkie.