Używam Twitter Bootstrap w projekcie. Oprócz domyślnych stylów ładowania początkowego dodałem także własne
//My styles
@media (max-width: 767px)
{
//CSS here
}
Używam również jQuery do zmiany kolejności niektórych elementów na stronie, gdy szerokość rzutni jest mniejsza niż 767px.
$(document).load($(window).bind("resize", checkPosition));
function checkPosition()
{
if($(window).width() < 767)
{
$("#body-container .main-content").remove().insertBefore($("#body-container .left-sidebar"));
} else {
$("#body-container .main-content").remove().insertAfter($("#body-container .left-sidebar"));
}
}
Problem, który mam, polega na tym, że szerokość obliczona przez $(window).width()
i szerokość obliczona przez CSS nie wydają się takie same. Kiedy $(window).width()
zwraca 767, css oblicza szerokość rzutni jako 751, więc wydaje się, że jest 16px inna.
Czy ktoś wie, co to powoduje i jak mogę rozwiązać problem? Ludzie zasugerowali, że szerokość paska przewijania nie jest brana pod uwagę, a używanie $(window).innerWidth() < 751
jest właściwą drogą. Jednak idealnie chcę znaleźć rozwiązanie, które oblicza szerokość paska przewijania i jest zgodne z moim zapytaniem o media (np. Gdy oba warunki sprawdzają się w stosunku do wartości 767). Ponieważ na pewno nie wszystkie przeglądarki będą miały szerokość paska przewijania 16 pikseli?
Odpowiedzi:
Jeśli nie musisz obsługiwać IE9, możesz po prostu użyć
window.matchMedia()
( dokumentacja MDN ).window.matchMedia
jest w pełni zgodny z zapytaniami o media CSS, a obsługa przeglądarki jest całkiem dobra: http://caniuse.com/#feat=matchmediaAKTUALIZACJA:
Jeśli musisz obsługiwać więcej przeglądarek, możesz użyć metody mq Modernizra , obsługuje ona wszystkie przeglądarki, które rozumieją zapytania o media w CSS.
źródło
Modernizr.mq
zwraca tylko wartość logiczną, więc musisz wywołać ją samodzielnie w moduleonresize
obsługi zdarzeń.window.matchMedia
jest zalecanym sposobem, ponieważ nie wywoła reflow , w zależności od tego, jak często wywołać funkcję może to spowodować problemy z wydajnością. Jeśli nie chcesz bezpośrednio korzystać z Modernizra, możesz skopiować kod źródłowy z src / mq.js i src / injectElementWithStyles.js .Sprawdź regułę CSS, która zmienia zapytanie dotyczące mediów. Gwarantuje to, że zawsze będzie działać.
http://www.fourfront.us/blog/jquery-window-width-and-media-queries
HTML:
JavaScript:
CSS:
źródło
<div id="xs-indicator" class="xs-visible">
Może to wynikać z
scrollbar
użyciainnerWidth
zamiastwidth
podobnegoMożesz także dostać
viewport
podobnePowyższy kod Źródło
źródło
innerWidth()
lub możesz użyć go jak$('body').innerWidth();
Zobacz to stackoverflow.com/questions/8339377/...window.innerWidth
nie jest zgodny z zapytaniami o media CSS w Safari 8, jeśli paski preferencji są włączone w preferencjach systemowych OSX.tak, wynika to z paska przewijania. Właściwe źródło odpowiedzi: wprowadź opis linku tutaj
źródło
Być może lepszą praktyką jest nieokreślanie szerokości dokumentu przez JS, ale jakaś zmiana wprowadzona przez zapytanie css @media. Dzięki tej metodzie możesz być pewien, że funkcja JQuery i zmiana css zachodzą w tym samym czasie.
css:
jquery:
źródło
Ostatnio miałem ten sam problem - także z Bootstrap 3.
Ani $ .width () ani $ .innerWidth () nie będzie dla ciebie działać.
Najlepszym rozwiązaniem, jakie wymyśliłem - i jest specjalnie dostosowane do BS3 -
jest sprawdzenie szerokości
.container
elementu.Jak zapewne wiesz, jak
.container
działa ten element,jest to jedyny element, który da ci bieżącą szerokość ustawioną przez reguły BS css.
To idzie mniej więcej tak
źródło
Posługiwać się
To rozwiązało mój problem
źródło
Oto alternatywa dla wspomnianych wcześniej metod, które polegają na zmianie czegoś za pomocą CSS i odczytaniu go za pomocą Javascript. Ta metoda nie wymaga
window.matchMedia
ani Modernizr. Nie potrzebuje również dodatkowego elementu HTML. Działa przy użyciu pseudoelementu HTML do „przechowywania” informacji o punkcie przerwania:Użyłem
body
jako przykładu, możesz użyć do tego dowolnego elementu HTML. Możesz dodać dowolny ciąg lub liczbę docontent
pseudoelementu. Nie musi być „mobilny” i tak dalej.Teraz możemy odczytać te informacje ze Javascript w następujący sposób:
W ten sposób zawsze jesteśmy pewni, że informacje o punkcie przerwania są poprawne, ponieważ pochodzą bezpośrednio z CSS i nie musimy mieć problemów z uzyskaniem odpowiedniej szerokości ekranu za pomocą Javascript.
źródło
querySelector()
lubgetPropertyValue()
. Możesz także szukać pojedynczego cudzysłowu w wyrażeniu regularnym (ponieważ nie jest spójne). To:window.getComputedStyle(document.body, ':after').content.replace(/"|'/g, '')
. Aby uczynić to nieco tańszym, możesz owinąć go podkreślnikiem / lodash._debounce()
z ~ 100ms oczekiwaniem. Wreszcie, dołączenie atrybutów do <html> udostępnia dane wyjściowe dla innych rzeczy, takich jak klauzule wyłączania podpowiedzi szukające surowych flag / danych poza zmiennymi. Przykład: gist.github.com/dhaupin/f01cd87873092f4fe2fb8d802f9514b1JavaScript zapewnia więcej niż jedną metodę sprawdzania szerokości rzutni. Jak zauważyłeś, innerWidth nie obejmuje szerokości paska narzędzi, a szerokości paska narzędzi będą się różnić w zależności od systemu. Istnieje również opcja outerWidth , która obejmie szerokość paska narzędzi. W Mozilla JavaScript API stanowi:
Stan javascript jest taki, że nie można polegać na określonym znaczeniu outerWidth w każdej przeglądarce na każdej platformie.
outerWidth
nie jest dobrze obsługiwany w starszych przeglądarkach mobilnych , ale cieszy się obsługą głównych przeglądarek stacjonarnych i większości nowszych przeglądarek smartfonów.Jak wskazał ausi,
matchMedia
byłby to świetny wybór, ponieważ CSS jest lepiej ustandaryzowany (matchMedia używa JS do odczytu wartości rzutni wykrytych przez CSS). Ale nawet przy przyjętych standardach nadal istnieją opóźnione przeglądarki, które je ignorują (IE <10 w tym przypadku, co sprawia, że matchMedia nie jest bardzo przydatna przynajmniej do śmierci XP).W skrócie , jeśli rozwijają się tylko dla przeglądarek desktopowych i nowszych przeglądarek mobilnych, outerWidth powinno dać to, czego szukasz, z pewnych zastrzeżeń .
źródło
Oto mniej zaangażowany sposób radzenia sobie z zapytaniami medialnymi. Obsługa wielu przeglądarek jest nieco ograniczona, ponieważ nie obsługuje mobilnego IE.
Zobacz dokumentację Mozilla więcej szczegółów.
źródło
Spróbuj tego
źródło
Obejście, które zawsze działa i jest zsynchronizowane z zapytaniami o media CSS.
Dodaj div do ciała
Dodaj styl i zmień je, wprowadzając określone zapytanie o media
Następnie w JS sprawdź styl, który zmieniasz, wprowadzając zapytanie o media
Ogólnie rzecz biorąc, możesz sprawdzić dowolny styl, który jest zmieniany, wprowadzając określone zapytanie o media.
źródło
Najlepszym rozwiązaniem dla różnych przeglądarek jest użycie Modernizr.mq
link: https://modernizr.com/docs/#mq
Modernizr.mq pozwala programowo sprawdzić, czy bieżący stan okna przeglądarki odpowiada zapytaniu medialnemu.
Uwaga Przeglądarka nie obsługuje zapytań o media (np. Stara IE) mq zawsze zwróci false.
źródło
źródło
Co robię ;
i wywołać zmienną aWidth gdziekolwiek później.
Musisz umieścić getWidth () w treści dokumentu, aby upewnić się, że szerokość paska przewijania jest policzona, w przeciwnym razie szerokość paska przewijania odjęta od getWidth ().
źródło
Implementacja suwaka slick i wyświetla różne liczby slajdów w bloku w zależności od rozdzielczości (jQuery)
źródło
Spróbuj tego
Aby uzyskać więcej informacji, kliknij tutaj
źródło