@MuhammadUmer good catch! Jeśli frustrują Cię otrzymywanie wymiarów (i tak będzie w przypadku telefonów komórkowych bez jQuery), możesz getComputedStylerozwinąć htmltag.
pobiera rzutnię CSS@media (width) i @media (height)które zawierają paski przewijania
initial-scalea zmiany powiększenia mogą powodować nieprawidłowe skalowanie wartości mobilnych do tego, co PPK nazywa wizualną rzutnią i może być mniejsze niż @mediawartości
Zoom może powodować, że wartości będą wyłączone o 1px z powodu natywnego zaokrąglania
undefined w IE8-
document.documentElement.clientWidth i .clientHeight
równa się szerokości rzutni CSS minus szerokość paska przewijania
pasuje @media (width)i @media (height)gdy nie ma paska przewijania
to samo,jQuery(window).width() co jQuery wywołuje rzutnię przeglądarki
O ile mi czegoś nie brakuje, ta odpowiedź jest błędna. W Chrome przynajmniej document.documentElement.clientHeightzwraca wysokość strony , a window.innerHeightzwraca wysokość rzutni . Duża różnica.
W przypadku przeglądarek, które wyświetlają swoje dodatkowe paski narzędzi jako HTML z ustalonym pozycjonowaniem, to rozwiązanie nie działa, szczególnie jeśli chcesz używać w ustawianiu najwyższego kodu i wartości procentowych.
Ostrzeżenie: te wymiary nie obejmują pasków przewijania (które mają różne rozmiary w różnych przeglądarkach i platformach) i dlatego nie będą pasować do zapytań o media css, inne odpowiedzi tutaj rozwiązują jednak ten problem.
@boxed W mobilnym Safari document.documentElement.clientWidthdaje mi szerokość rzutni, podczas gdy window.innerWidth daje mi szerokość dokumentu. Tak, na odwrót.
Jeśli nie używasz jQuery, robi się brzydko. Oto fragment kodu, który powinien działać we wszystkich nowych przeglądarkach. Zachowanie jest inne w trybie dziwactwa i trybie standardów w IE. To się tym zajmuje.
Używasz clientHeightna document.documentElementelemencie, który daje rozmiar rzutni. Aby uzyskać rozmiar dokumentu, musisz to zrobić document.body.clientHeight. Jak wyjaśnia Chetan, takie zachowanie dotyczy współczesnych przeglądarek. To jest łatwe do przetestowania. Wystarczy otworzyć konsolę i wpisać document.documentElement.clientHeightkilka otwartych kart.
Wiem, że ma to akceptowalną odpowiedź, ale wpadłem na sytuację, w której clientWidthnie działało, ponieważ iPhone (przynajmniej mój) zwrócił 980, a nie 320, więc użyłem window.screen.width. Pracowałem nad istniejącą witryną, będąc „responsywnym” i musiałem zmusić większe przeglądarki do korzystania z innej meta-rzutni.
Mam nadzieję, że to komuś pomoże, może nie być idealne, ale działa w moich testach na iOS i Androidzie.
//sweet hack to set meta viewport for desktop sites squeezing down to mobile that are big and have a fixed width //first see if they have window.screen.width avail(function(){if(window.screen.width){var setViewport ={//smaller devices
phone:'width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no',//bigger ones, be sure to set width to the needed and likely hardcoded width of your site at large breakpoints
other:'width=1045,user-scalable=yes',//current browser width
widthDevice: window.screen.width,//your css breakpoint for mobile, etc. non-mobile first
widthMin:560,//add the tag based on above vars and environment
setMeta:function(){var params =(this.widthDevice <=this.widthMin)?this.phone :this.other;var head = document.getElementsByTagName("head")[0];var viewport = document.createElement('meta');
viewport.setAttribute('name','viewport');
viewport.setAttribute('content',params);
head.appendChild(viewport);}}//call it
setViewport.setMeta();}}).call(this);
function myFunction(){if(window.innerWidth !==undefined&& window.innerHeight !==undefined){var w = window.innerWidth;var h = window.innerHeight;}else{var w = document.documentElement.clientWidth;var h = document.documentElement.clientHeight;}var txt ="Page size: width="+ w +", height="+ h;
document.getElementById("demo").innerHTML = txt;}
<!DOCTYPE html><html><bodyonresize="myFunction()"onload="myFunction()"><p>
Try to resize the page.
</p><pid="demo">
</p></body></html>
Ostatecznie udało mi się znaleźć ostateczną odpowiedź w JavaScript: The Definitive Guide, 6. wydanie autorstwa O'Reilly, str. 391:
To rozwiązanie działa nawet w trybie dziwactwa, podczas gdy obecne rozwiązanie Ryanve i ScottEvernden nie.
function getViewportSize(w){// Use the specified window or the current window if no argument
w = w || window;// This works for all browsers except IE8 and beforeif(w.innerWidth !=null)return{ w: w.innerWidth, h: w.innerHeight };// For IE (or any browser) in Standards modevar d = w.document;if(document.compatMode =="CSS1Compat")return{ w: d.documentElement.clientWidth,
h: d.documentElement.clientHeight };// For browsers in Quirks modereturn{ w: d.body.clientWidth, h: d.body.clientHeight };}
poza tym, że zastanawiam się, dlaczego if (document.compatMode == "CSS1Compat")nie ma linii if (d.compatMode == "CSS1Compat"), wszystko wygląda dobrze.
1) Mówiąc o wyświetlaczach o wysokiej DPI mam na myśli wirtualne piksele wyjaśnione tutaj: stackoverflow.com/a/14325619/139361 . Każdy ekran iPhone'a ma dokładnie 320 wirtualnych pikseli. 2) Mówię, że: a) documentElement.clientWidthnie reaguje na zmianę orientacji urządzenia w iOS. b) wyświetla liczbę pikseli fizycznych (praktycznie bezużytecznych) zamiast pikseli wirtualnych
Jeśli szukasz rozwiązania innego niż jQuery, które daje prawidłowe wartości w wirtualnych pikselach na telefonie komórkowym , i uważasz, że to proste window.innerHeightlub document.documentElement.clientHeightmoże rozwiązać problem, najpierw zapoznaj się z tym linkiem: https://tripleodeon.com/assets/2011/12/ table.html
Deweloper wykonał dobre testy, które ujawniają problem: można uzyskać nieoczekiwane wartości dla Androida / iOS, poziomej / pionowej, normalnej / wysokiej gęstości wyświetlaczy.
Moja obecna odpowiedź nie jest jeszcze srebrną kulą (// todo), ale raczej ostrzeżeniem dla tych, którzy zamierzają szybko skopiować i wkleić dowolne rozwiązanie z tego wątku do kodu produkcyjnego.
Szukałem szerokości strony w wirtualnych pikselach na urządzeniach mobilnych i okazało się, że jedynym działającym kodem jest (nieoczekiwanie!) window.outerWidth. Później zbadam tę tabelę pod kątem prawidłowego rozwiązania, podając wysokość bez paska nawigacyjnego, kiedy będę miał czas.
function viewport(){var e = window, a ='inner';if(!('innerWidth' in window )){
a ='client';
e = document.documentElement || document.body;}return{ width : e[ a+'Width'], height : e[ a+'Height']};}
Uwaga: aby odczytać szerokość, użyj console.log('viewport width'+viewport().width);
Czy przetestowałeś swoją odpowiedź w różnych systemach operacyjnych, na wyświetlaczach Retina oraz w trybie poziomym / pionowym? Ten link dotyczy raczej przestarzałych systemów, ale dowodzi, że Twój kod nie działa: tripleodeon.com/wp-content/uploads/2011/12/table.html
Rozwiązaniem, które byłoby zgodne ze standardami W3C byłoby utworzenie przezroczystej div (na przykład dynamicznie z JavaScript), ustawienie jej szerokości i wysokości na 100vw / 100vh (jednostki Viewport), a następnie uzyskanie jej offsetWidth i offsetHeight. Następnie element można ponownie usunąć. Nie będzie to działać w starszych przeglądarkach, ponieważ jednostki rzutni są stosunkowo nowe, ale jeśli nie przejmujesz się nimi, ale (przyszłymi) standardami, zdecydowanie możesz pójść tą drogą:
Oczywiście możesz również ustawić objNode.style.position = "fixed", a następnie użyć 100% jako szerokość / wysokość - powinno to mieć ten sam efekt i do pewnego stopnia poprawić kompatybilność. Również ustawienie pozycji na ustaloną może być ogólnie dobrym pomysłem, ponieważ w przeciwnym razie div będzie niewidoczny, ale zajmie trochę miejsca, co spowoduje pojawienie się pasków przewijania itp.
Jeśli możemy polegać na standardach, nie potrzebujemy nawet wszystkich rozwiązań dla różnych przeglądarek. Rozwiązanie, które odpowiada w specyfikacji, nie jest rozwiązaniem.
W ten sposób to robię, wypróbowałem to w IE 8 -> 10, FF 35, Chrome 40, będzie działać bardzo płynnie we wszystkich współczesnych przeglądarkach (jak zdefiniowano window.innerWidth) oraz w IE 8 (bez okna). innerWidth) działa również płynnie, każdy problem (jak flashowanie z powodu przepełnienia: „ukryty”), zgłoś to. Tak naprawdę nie interesuje mnie wysokość rzutni, ponieważ stworzyłem tę funkcję, aby obejść niektóre responsywne narzędzia, ale można ją zaimplementować. Mam nadzieję, że to pomaga, doceniam komentarze i sugestie.
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.