Załóżmy, że mam coś <div>
, co chciałbym wyśrodkować na ekranie przeglądarki (rzutnia). Aby to zrobić, muszę obliczyć szerokość i wysokość <div>
elementu.
Czego powinienem użyć? Podaj informacje na temat zgodności przeglądarki.
javascript
html
xhtml
dhtml
snortasprocket
źródło
źródło
Odpowiedzi:
Powinieneś użyć właściwości
.offsetWidth
i.offsetHeight
. Zauważ, że należą do elementu, a nie.style
.var width = document.getElementById('foo').offsetWidth;
Funkcja
.getBoundingClientRect()
zwraca wymiary i położenie elementu jako liczby zmiennoprzecinkowe po wykonaniu transformacji CSS.źródło
.offsetWidth
i developer.mozilla.org/en/Determining_the_dimensions_of_elements.offsetHeight
offsetWidth
wyniesie 0, jeśli element jestdisplay:none
, podczas gdy obliczonewidth
mogą nadal mieć dodatnią wartość w tym przypadku.visibility:hidden
nie wpływa naoffsetWidth
.offsetWidth
zwraca „całe” pole zawierające treść, dopełnienie i obramowania; podczas gdyclientWidth
zwraca rozmiar samego pola zawartości (więc będzie miał mniejszą wartość, ilekroć element będzie miał niezerowe wypełnienie i / lub ramkę). (zmodyfikowany dla jasności)Spójrz na
Element.getBoundingClientRect()
.Metoda ta zwraca obiekt zawierający
width
,height
i pewne inne przydatne wartości:Na przykład:
Wierzę, że to nie ma kwestii, które
.offsetWidth
i.offsetHeight
zrobić gdzie czasami powrócić0
(omówione w komentarzach tutaj )Inną różnicą jest to, że
getBoundingClientRect()
mogą zwracać ułamkowe piksele, gdzie.offsetWidth
i.offsetHeight
zaokrąglą do najbliższej liczby całkowitej.Uwaga IE8 :
getBoundingClientRect
nie zwraca wysokości i szerokości w IE8 i niższych. *Jeśli musisz obsługiwać IE8, użyj
.offsetWidth
i.offsetHeight
:Warto zauważyć, że obiekt zwracany tą metodą nie jest tak naprawdę normalnym obiektem. Jego właściwości nie są wyliczalne (więc na przykład
Object.keys
nie działają od razu po wyjęciu z pudełka).Więcej informacji na ten temat tutaj: Jak najlepiej przekonwertować ClientRect / DomRect na zwykły obiekt
Odniesienie:
.offsetHeight
: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetHeight.offsetWidth
: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetWidth.getBoundingClientRect()
: https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRectźródło
offsetHeight
ioffsetWidth
nie.UWAGA : ta odpowiedź została napisana w 2008 roku. W tamtym czasie najlepszym rozwiązaniem dla wielu przeglądarek było użycie jQuery. Zostawiam tutaj odpowiedź dla potomnych, a jeśli używasz jQuery, jest to dobry sposób na zrobienie tego. Jeśli używasz innego frameworka lub czystego JavaScriptu, prawdopodobnie jest to akceptowana odpowiedź.
Jak jQuery 1.2.6 można użyć jednej z podstawowych funkcji CSS ,
height
iwidth
(lubouterHeight
iouterWidth
, w razie potrzeby).źródło
Na wszelki wypadek przydaje się każdemu, umieszczam pole tekstowe, przycisk i div wszystkie z tym samym css:
Próbowałem w chrome, firefox i ie-edge, próbowałem z jquery i bez, i próbowałem z i bez
box-sizing:border-box
. Zawsze z<!DOCTYPE html>
Wyniki:
źródło
Według MDN: Określanie wymiarów elementów
offsetWidth
ioffsetHeight
zwraca „całkowitą ilość miejsca, jaką zajmuje element, w tym szerokość widocznej zawartości, paski przewijania (jeśli istnieją), dopełnienie i obramowanie”clientWidth
iclientHeight
zwróć „ile miejsca zajmuje faktycznie wyświetlana treść, w tym wypełnienie, ale bez obramowania, marginesów lub pasków przewijania”scrollWidth
iscrollHeight
zwróć „rzeczywisty rozmiar treści, bez względu na to, ile jest obecnie widoczna”Zależy to zatem od tego, czy mierzona zawartość będzie poza bieżącym widocznym obszarem.
źródło
Musisz go tylko obliczyć dla IE7 i starszych (i tylko wtedy, gdy treść nie ma ustalonego rozmiaru). Sugeruję użycie komentarzy warunkowych HTML, aby ograniczyć włamanie do starych IE, które nie obsługują CSS2. W przypadku wszystkich innych przeglądarek użyj tego:
To idealne rozwiązanie. Wyśrodkowuje
<div>
dowolny rozmiar i zawija go do rozmiaru zawartości.źródło
Łatwo jest modyfikować style elementów, ale trudno jest odczytać wartość.
JavaScript nie może odczytać żadnej właściwości stylu elementu (elem.style) pochodzącej z css (wewnętrznego / zewnętrznego), chyba że użyjesz wbudowanego wywołania metody getComputedStyle w javascript.
Element: element do odczytu wartości.
pseudo: pseudoelement, jeśli jest wymagany, na przykład :: przed. Pusty ciąg lub brak argumentu oznacza sam element.
Wynikiem jest obiekt o właściwościach stylu, taki jak elem.style, ale teraz w odniesieniu do wszystkich klas css.
Na przykład tutaj styl nie widzi marginesu:
Zmodyfikowano więc kod javaScript, aby zawierał getComputedStyle elementu, który ma uzyskać szerokość / wysokość lub inny atrybut
Obliczone i rozwiązane wartości
W CSS istnieją dwie koncepcje:
Dawno, dawno temu getComputedStyle został stworzony, aby uzyskać obliczone wartości, ale okazało się, że rozwiązane wartości są znacznie wygodniejsze i standard się zmienił.
W dzisiejszych czasach getComputedStyle faktycznie zwraca rozstrzygniętą wartość właściwości.
Proszę zanotować:
getComputedStyle wymaga pełnej nazwy właściwości
Istnieją inne niespójności. Na przykład niektóre przeglądarki (Chrome) pokazują 10px w poniższym dokumencie, a niektóre z nich (Firefox) - nie:
aby uzyskać więcej informacji https://javascript.info/styles-and-classes
źródło
element.offsetWidth i element.offsetHeight powinny zrobić, jak sugerowano w poprzednim poście.
Jeśli jednak chcesz wyśrodkować zawartość, istnieje na to lepszy sposób. Zakładając, że używasz xhtml strict DOCTYPE. ustaw margines: 0, właściwość auto i wymaganą szerokość w pikselach do tagu body. Treść zostaje wyśrodkowana w stosunku do strony.
źródło
... wydaje się, że CSS pomaga umieścić div na środku ...
źródło
możesz także użyć tego kodu:
źródło
jeśli chcesz wyśrodkować go w porcie wyświetlania przeglądarki; możesz to osiągnąć tylko za pomocą CSS
źródło
Oto kod WKWebView, który określa wysokość określonego elementu Dom (nie działa poprawnie dla całej strony)
źródło
swift
kod iOS , prawda? Nie JavaScript. Zastrzegam sobie zdanie negatywne (b / c może to być naprawdę przydatne), ale pamiętaj, że to nie odpowiada na pytanie i prawdopodobnie byłoby bardziej odpowiednie w przypadku innego, specyficznego dla iOS pytania. Jeśli jeszcze nie istnieje, może zastanów się nad pytaniem i odpowiedzią na to pytanie.Jeśli offsetWidth zwraca wartość 0, można uzyskać właściwość szerokości stylu elementu i wyszukać ją dla liczby. „100px” -> 100
/\d*/.exec(MyElement.style.width)
źródło