Jest to jeden z mniejszych problemów CSS, który ciągle mnie trapi. W jaki sposób ludzie wokół przepełnienia stosu wyrównują się w pionie checkboxes
i labels
konsekwentnie korzystają z różnych przeglądarek ? Ilekroć wyrównuję je poprawnie w Safari (zwykle używam vertical-align: baseline
na input
), są one całkowicie wyłączone w Firefox i IE. Napraw to w Firefoksie, a Safari i IE są nieuchronnie pomieszane. Tracę na tym czas za każdym razem, gdy koduję formularz.
Oto standardowy kod, z którym pracuję:
<form>
<div>
<label><input type="checkbox" /> Label text</label>
</div>
</form>
Zwykle używam resetowania Erica Meyera, więc elementy formularza są względnie czyste od przesłonięć. Czekamy na wszelkie porady i wskazówki, które masz do zaoferowania!
height
iline-height
atrybutów, spójrz na jsfiddle.net/wepw5o57/3position
itop
rozwiązuje ten problem Przykład: jsfiddle.net/ynkjc22sOdpowiedzi:
Po ponad godzinie poprawiania, testowania i próbowania różnych stylów znaczników, myślę, że mogę mieć przyzwoite rozwiązanie. Wymagania dla tego konkretnego projektu były następujące:
Zanim przejdę do wyjaśnienia, dam ci kod:
Oto działający przykład w JSFiddle .
Ten kod zakłada, że używasz resetowania takiego jak Eric Meyer, który nie zastępuje marginesów wejściowych i dopełniania (stąd wstawianie resetu marginesów i dopełniania do wejściowego CSS). Oczywiście w środowisku na żywo prawdopodobnie zagnieżdżasz / zastępujesz elementy w celu obsługi innych elementów wejściowych, ale chciałem zachować prostotę.
Ważne uwagi:
*overflow
Deklaracja jest inline IE Hack (hack gwiazdy nieruchomość). Zarówno IE 6, jak i 7 to zauważą, ale Safari i Firefox odpowiednio go zignorują. Myślę, że może to być poprawny CSS, ale nadal lepiej jest z komentarzami warunkowymi; użyłem go dla uproszczenia.vertical-align
stwierdzeniem, które było spójne w różnych przeglądarkach, byłovertical-align: bottom
. Ustawienie tego, a następnie względne ustawienie w górę zachowało się prawie identycznie w Safari, Firefox i IE z tylko jednym pikselem lub dwoma rozbieżnościami.overflow: hidden
z jakiegoś powodu odcina dodatkową przestrzeń i pozwala pozycjonowaniu IE działać bardzo podobnie do Safari i Firefox.Mam nadzieję, że to pomoże komuś innemu! Nie próbowałem tej konkretnej techniki w żadnym innym projekcie niż ten, nad którym pracowałem dziś rano, więc zdecydowanie pomóżcie, jeśli znajdziecie coś, co działa bardziej konsekwentnie.
źródło
Czasami wyrównanie w pionie wymaga dwóch wbudowanych elementów (zakresu, etykiety, danych wejściowych itp.) Obok siebie, aby działać poprawnie. Następujące pola wyboru są odpowiednio wyśrodkowane pionowo w IE, Safari, FF i Chrome, nawet jeśli rozmiar tekstu jest bardzo mały lub duży.
Wszystkie unoszą się obok siebie w tym samym wierszu, ale nowrap oznacza, że cały tekst etykiety zawsze pozostaje obok pola wyboru.
Minusem są dodatkowe bezsensowne tagi SPAN.
Teraz, jeśli masz bardzo długi tekst etykiety, który trzeba było zawinąć bez zawijania pod polem wyboru, możesz użyć dopełnienia i wcięcia w tekście negatywnym na elementach etykiety:
źródło
display: block; float: left;
wydaje się zbędnyPracując nad rozwiązaniem One Crayon , mam coś, co działa dla mnie i jest prostsze:
Renderuje piksel za piksel tak samo w Safari (którego linii bazowej ufam), a zarówno Firefox, jak i IE7 sprawdzają się dobrze. Działa również dla różnych rozmiarów czcionek etykiet, dużych i małych. Teraz, do ustalenia linii bazowej IE dla selekcji i danych wejściowych ...
Aktualizacja: (edycja innej firmy)
Właściwa
bottom
pozycja zależy od rodziny czcionek i rozmiaru czcionki! Zauważyłem, że użyciebottom: .08em;
elementów kontrolnych i radiowych jest dobrą wartością ogólną. Przetestowałem to w Chrome / Firefox / IE11 w systemie Windows z czcionkami Arial i Calibri, używając kilku małych / średnich / dużych rozmiarów czcionek.źródło
Jedną łatwą rzeczą, która wydaje się działać dobrze, jest dostosowanie pionowej pozycji pola wyboru za pomocą wyrównania pionowego. Wciąż będzie się różnić w różnych przeglądarkach, ale rozwiązanie jest nieskomplikowane.
Odniesienie
źródło
vertical-align
iposition: relative
ponieważ działa również poprawnie w IE9 :)em
próbować
vertical-align: middle
również twój kod wydaje się być taki:
źródło
<label for="blah">
jest konieczne tylko wtedy, gdy używasz czegoś, co nie ma sensu, aby etykieta się zawijała (jak pole tekstowe; zazwyczaj używam<label for="blah">Foo</label><input id="blah" type="text" />
w tym przypadku). Z polami wyboru uważam, że jest mniej znaczników, aby je zawinąć.Wypróbuj moje rozwiązanie, wypróbowałem je w IE 6, FF2 i Chrome i renderuje piksel po pikselu we wszystkich trzech przeglądarkach.
źródło
Jedyne dla mnie idealnie działające rozwiązanie to:
Testowane dzisiaj w Chrome, Firefox, Opera, IE 7 i 8. Przykład: Fiddle
źródło
Nie przetestowałem całkowicie mojego rozwiązania, ale wydaje się, że działa świetnie.
Mój HTML to po prostu:
Następnie ustawiam wszystkie pola wyboru
24px
dla wysokości i szerokości. Aby tekst był wyrównany robię etykieta jestline-height
również24px
i przypisaćvertical-align: top;
tak:EDYCJA: Po przetestowaniu IE dodałem
vertical-align: bottom;
do danych wejściowych i zmieniłem CSS etykiety. Może się okazać, że potrzebujesz warunkowego przypadku IE css, aby uporządkować wypełnienie - ale tekst i pole są wbudowane.Jeśli ktoś stwierdzi, że to nie działa, proszę dać mi znać. Oto jest w akcji (w Chrome i IE - przeprosiny, ponieważ zrzuty ekranu zostały zrobione na siatkówce i przy użyciu paraleli dla IE):
źródło
Zazwyczaj używam wysokości linii, aby dopasować pionowe położenie mojego tekstu statycznego:
Mam nadzieję, że to pomaga.
źródło
Sztuką jest użycie wyrównania w pionie tylko w komórkach tabeli lub w wierszu blokowym, jeśli używany jest znacznik etykiety.
źródło
Na koniec spójrzmy na źródło problemu
Pola wyboru są renderowane przy użyciu obrazów (można ustawić niestandardowe za pomocą CSS). Oto (niezaznaczone) pole wyboru w FireFox, podświetlone za pomocą inspektora DOM:
A oto to samo niestylowane pole wyboru w Chrome:
Możesz zobaczyć margines (pomarańczowy); wypełnienie nie jest obecne (byłoby pokazane na zielono). Więc co to za pseudo-margines po prawej i na dole pola wyboru? Są to części obrazu użyte dla pola wyboru . Dlatego używanie po prostu
vertical-align: middle
tak naprawdę nie wystarcza i jest to przyczyną problemów w różnych przeglądarkach.Co więc możemy z tym zrobić?
Jedną z oczywistych opcji jest - zastąp zdjęcia! Na szczęście można to zrobić za pomocą CSS i zastąpić je obrazami zewnętrznymi, obrazami base64 (in-CSS), svg w CSS lub po prostu pseudoelementami. Jest to solidne podejście (w różnych przeglądarkach!), A oto przykład takiej korekty skradzionej z tego pytania :
Możesz przeczytać bardziej szczegółowe artykuły na temat takich stylizacji, takie jak niektóre wymienione tutaj ; jest poza zakresem tej odpowiedzi.
Ok, nadal co z rozwiązaniem no-custom-images-or-pseudo-elements?
TL; DR: wygląda na to, że to nie zadziała, zamiast tego użyj niestandardowego pola wyboru
Po pierwsze, zauważmy, że jeśli w innych przeglądarkach te pseudo-marginesy wewnątrz ikony pola wyboru były dowolne, nie byłoby spójnego rozwiązania. Aby go zbudować, musimy zbadać anatomię takich obrazów w istniejących przeglądarkach.
Więc jakie przeglądarki mają pseudo-marginesy w polach wyboru? Sprawdziłem Chrome 75, Vivaldi 2.5 (oparty na Chromium), FireFox 54 (nie pytaj, dlaczego tak nieaktualny), IE 11, Edge 42, Safari ?? (pożyczyłem jeden na minutę, zapomniałem sprawdzić wersję). Tylko Chrome i Vivaldi mają takie pseudo-marginesy (podejrzewam również, że wszystkie przeglądarki oparte na Chromium, takie jak Opera).
Jaki jest rozmiar tych pseudo-marginesów? Aby to rozgryźć, można użyć powiększonego pola wyboru:
mój wynik to ~ 7% szerokości / wysokości, a zatem 0,9-1,0px w jednostkach bezwzględnych. Dokładność może jednak zostać zakwestionowana: wypróbuj różne wartości
zoom
dla pola wyboru. W moich testach zarówno w Chrome, jak i Vivaldi, względny rozmiar pseudo-marginesu jest bardzo różny dlazoom
wartości 10, 20 i dla wartości 11-19 (??):scale
wydaje się bardziej spójny:więc prawdopodobnie ~ 14% i 2px są poprawnymi wartościami.
Teraz, gdy wiemy (?) Rozmiar pseudo-marginesu, zauważmy, że to nie wystarczy. Czy rozmiary ikon pól wyboru są takie same dla wszystkich przeglądarek? Niestety! Oto, co pokazuje inspektor DOM dla niestylowanych pól wyboru:
Zanim omówimy jakieś rozwiązania lub sztuczki, zapytajmy: co to jest prawidłowe wyrównanie? Co staramy się osiągnąć? Do pewnego stopnia jest to kwestia gustu, ale w zasadzie mogę myśleć o następujących aspektach „miłych” dopasowań:
tekst i pole wyboru na tej samej linii bazowej (celowo nie zmieniam tutaj pola wyboru):
lub mają tę samą środkową linię pod względem małych liter:
lub ta sama środkowa linia pod względem wielkich liter (łatwiej zobaczyć różnicę dla różnych rozmiarów czcionek):
a także musimy zdecydować, czy rozmiar pola wyboru powinien być równy wysokości małej litery, dużej litery lub czegoś innego (większy, mniejszy lub między małymi a dużymi).
W tej dyskusji nazwijmy wyrównanie ładnym, jeśli pole wyboru znajduje się na tej samej linii bazowej co tekst i ma wielkość dużej litery (wysoce dyskusyjny wybór):
Teraz jakie narzędzia musimy:
?
Jeśli chodzi o regulację wielkości pola wyboru : istnieją
width
,height
,size
,zoom
,scale
(mieć coś przeoczyłem?).zoom
iscale
nie pozwalają ustawiać rozmiaru bezwzględnego, więc mogą pomóc tylko w dostosowaniu do rozmiaru tekstu, a nie ustawiać rozmiaru w różnych przeglądarkach (chyba że możemy napisać reguły specyficzne dla przeglądarki).size
nie działa z Chrome (czy działało ze starą IE? zresztą to nie jest takie interesujące).width
iheight
działamy w Chrome i innych przeglądarkach, więc możemy ustawić wspólny rozmiar, ale znowu w Chrome ustawia rozmiar całego obrazu, a nie samego pola wyboru. Uwaga: minimalna (szerokość, wysokość) określa rozmiar pola wyboru (jeśli szerokość ≠ wysokość, pole poza kwadratem pola wyboru jest dodawane do „pseudo-marginesu”).Niefortunne jest to, że pseudo-marginesy w Chrome nie są ustawione na zero dla żadnej szerokości i wysokości, o ile widzę.
Obawiam się, że obecnie nie ma niezawodnej metody opartej tylko na CSS .
Rozważmy wyrównanie pionowe.
vertical-align
nie może dać spójnych wyników po ustawieniu namiddle
lub zbaseline
powodu pseudo-marginesu Chrome, jedyną realną opcją uzyskania tego samego „układu współrzędnych” dla wszystkich przeglądarek jest wyrównanie etykiety i danych wejściowych dotop
:(na zdjęciu: wyrównanie w pionie: góra, dół i dół bez cienia)
Jaki więc z tego wynikniemy?
Powyższy fragment działa z Chrome (przeglądarki oparte na Chromium), ale inne przeglądarki wymagają mniejszego rozmiaru pola wyboru. Wydaje się, że niemożliwe jest dostosowanie zarówno rozmiaru, jak i wyrównania w pionie w sposób, który działa wokół dziwactwa obrazu pola wyboru Chromium. Moja ostatnia propozycja to: zamiast tego użyj niestandardowych pól wyboru - unikniesz frustracji :)
źródło
Teraz, gdy Flexbox jest obsługiwany we wszystkich nowoczesnych przeglądarkach, coś takiego wydaje mi się łatwiejsze.
Oto pełna wersja demonstracyjna z prefiksowaną wersją:
Pokaż fragment kodu
źródło
Myślę, że to najłatwiejszy sposób
źródło
Nie podoba mi się pozycjonowanie względne, ponieważ powoduje, że element jest renderowany ponad wszystko inne na jego poziomie (może mieć coś nad sobą, jeśli masz złożony układ).
Odkryłem, że
vertical-align: sub
sprawia , że pola wyboru wyglądają wystarczająco dobrze wyrównane w Chrome, Firefox i Opera. Nie mogę sprawdzić Safari, ponieważ nie mam MacOS, a IE10 jest nieco wyłączony, ale okazało się, że jest to dla mnie wystarczająco dobre rozwiązanie.Innym rozwiązaniem może być próba stworzenia określonego CSS dla każdej przeglądarki i dostrojenie go za pomocą wyrównania w pionie w% / pixel / EMs: http://css-tricks.com/snippets/css/browser-specific-hacks/
źródło
Działa to dla mnie dobrze:
źródło
Wybrana odpowiedź z ponad 400 głosami pozytywnymi nie działała dla mnie w Chrome 28 OSX, prawdopodobnie dlatego, że nie została przetestowana w OSX lub że działała w czymkolwiek, co było w 2008 roku, kiedy odpowiedź na to pytanie.
Czasy się zmieniły, a nowe rozwiązania CSS3 są teraz wykonalne. Moje rozwiązanie wykorzystuje pseudoelementy do utworzenia niestandardowego pola wyboru . Więc postanowienia (plusy lub minusy, jakkolwiek na to spojrzeć) są następujące:
To rozwiązanie ukrywa pole wyboru oraz dodaje i stylizuje pseudoelementy do etykiety, aby utworzyć widoczne pole wyboru. Ponieważ etykieta jest powiązana z ukrytym polem wyboru, pole wejściowe będzie nadal aktualizowane, a wartość zostanie przesłana z formularzem.
A jeśli jesteś zainteresowany, oto moje spojrzenie na przyciski radiowe: http://jsfiddle.net/DtKrV/2/
Mam nadzieję, że ktoś uzna to za przydatne!
źródło
Nigdy nie miałem z tym problemu:
źródło
Jeśli korzystasz z formularzy internetowych ASP.NET , nie musisz martwić się o DIV i inne elementy lub stałe rozmiary. Możemy wyrównać
<asp:CheckBoxList>
tekst, ustawiającfloat:left
typ wejściowy CheckboxList w CSS.Sprawdź następujący przykładowy kod:
Kod .ASPX:
źródło
Jeśli używasz Bootstrap na Twitterze, możesz po prostu użyć
checkbox
klasy na<label>
:źródło
Z polem wyboru typu danych wejściowych owiniętym wewnątrz etykiety i przesuniętym w lewo w następujący sposób:
to działało dla mnie:
Upewnij się, że wysokość jest identyczna z wysokością linii (poziom bloku).
źródło
Zakoduj na stałe wysokość i szerokość pola wyboru, usuń dopełnienie i ustaw jego wysokość plus pionowe marginesy równe wysokości linii etykiety. Jeśli tekst etykiety jest wbudowany, umieść pole wyboru. Firefox, Chrome i IE7 + renderują identycznie następujący przykład: http://www.kornea.com/css-checkbox-align
źródło
źródło
Zazwyczaj zostawiam pole wyboru nieoznaczone, a następnie umieszczam jego „etykietę” jako osobny element. To bolesne, ale istnieje tak duża różnica między przeglądarkami między sposobem wyświetlania pól wyboru i ich etykiet (jak zauważyłeś), że jest to jedyny sposób, w jaki mogę zbliżyć się do kontrolowania, jak wszystko wygląda.
Z tego samego powodu robię to również przy tworzeniu winforms. Myślę, że podstawowym problemem z formantem pola wyboru jest to, że tak naprawdę są to dwa różne formanty: pole i etykieta. Używając pola wyboru, pozostawiasz to implementatorom kontroli, aby zdecydowali, w jaki sposób te dwa elementy są wyświetlane obok siebie (i zawsze źle to robią, gdzie źle = nie to, czego chcesz).
Naprawdę mam nadzieję, że ktoś ma lepszą odpowiedź na twoje pytanie.
źródło
CSS:
HTML:
Powyższy kod umieści elementy listy w trzykolach i po prostu zmieni szerokość w celu dopasowania.
źródło
Poniższe informacje zapewniają spójną w pikselach spójność między przeglądarkami, nawet IE9:
Podejście to jest dość rozsądne, do tego stopnia, że jest oczywiste:
Wynikiem tego jest ogólna zasada ogólna:
Rozmiar czcionki dostosowywany do formularza, zestawu pól lub elementu.
Testowane w najnowszych przeglądarkach Chrome, Safari i Firefox na komputerach Mac, Windows, Iphone i Androidzie. I IE9.
Ta metoda prawdopodobnie ma zastosowanie do wszystkich typów wprowadzania, które nie są wyższe niż jeden wiersz tekstu. Zastosuj odpowiednią regułę typu.
źródło
Wiem, że na to pytanie udzielono odpowiedzi wiele razy, ale czuję, że mam o wiele bardziej eleganckie rozwiązanie niż te, które już zostały dostarczone. I nie tylko 1 eleganckie rozwiązanie, ale 2 oddzielne rozwiązania, które łaskoczą Twoją fantazję. Powiedziawszy to, wszystko, co musisz wiedzieć i zobaczyć, znajduje się w 2 JS Fiddle, z komentarzami.
Rozwiązanie nr 1 polega na natywnym „polu wyboru” danej przeglądarki, choć z pewnym akcentem ... Jest zawarty w div, który jest łatwiejszy do pozycjonowania w różnych przeglądarkach, z przepełnieniem: ukryty, aby posiekać nadmiar rozciągniętego pola wyboru 1px (jest tak, że nie widać brzydkich granic FF)
Prosty HTML: (kliknij link, aby przejrzeć css z komentarzami, blok kodu ma zaspokoić przepływ stosu ) http://jsfiddle.net/KQghJ/
Rozwiązanie nr 2 używa „Checkbox Toggle Hack” do przełączania stanu CSS DIV, który został poprawnie umieszczony w przeglądarce i skonfigurowany za pomocą prostego duszka dla pola wyboru niezaznaczonego i zaznaczonego. Wszystko, co jest potrzebne, to dostosowanie pozycji tła za pomocą wspomnianego pola wyboru Przełącz hack. To, moim zdaniem, jest bardziej eleganckie rozwiązanie, ponieważ masz większą kontrolę nad polami wyboru i radiotelefonami i może zagwarantować, że będą wyglądać tak samo w przeglądarce.
Prosty HTML: (kliknij link, aby przejrzeć CSS z komentarzami, blok kodu ma spełnić StackOverflow) http://jsfiddle.net/Sx5M2/
Jeśli ktoś nie zgadza się z tymi metodami, proszę zostawić komentarz, chciałbym usłyszeć opinie na temat tego, dlaczego inni nie natknęli się na te rozwiązania, a jeśli tak, dlaczego nie widzę tutaj odpowiedzi na ich temat? Jeśli ktoś zobaczy, że jedna z tych metod zawodzi, dobrze byłoby to również zobaczyć, ale zostały one przetestowane w najnowszych przeglądarkach i polegają na metodach HTML / CSS, które są dość stare i uniwersalne, o ile widziałem.
źródło
Dziękuję! To też doprowadzało mnie do szału na zawsze.
W moim szczególnym przypadku działało to dla mnie:
Używam reset.css, co może wyjaśniać niektóre różnice, ale wydaje mi się, że działa to dobrze.
źródło
position: relative;
ma pewne problemy w IE z indeksem Z i animacjami, takie jak slideUp / slideDown jQuery.CSS:
jQuery:
Styl prawdopodobnie wymaga poprawek w zależności od używanego rozmiaru czcionki
<label>
PS:
Używam ie7js, aby css działał w IE6.
źródło
Używaj po prostu
vertical-align: sub
, jak już sugerowano pokrishka .Skrzypce
Kod HTML:
Kod CSS:
źródło
Proste rozwiązanie:
Testowane w Chrome, Firefox, IE9 +, Safari, iOS 9+
źródło