Wie kann ein HTML-Optionsfeld vertikal an seiner Beschriftung ausgerichtet werden?

94

Ich habe ein Formular mit Optionsfeldern, die sich in derselben Zeile wie ihre Beschriftungen befinden. Die Optionsfelder sind jedoch nicht vertikal mit ihren Beschriftungen ausgerichtet, wie im folgenden Screenshot gezeigt.

Die Optionsfelder.

Wie kann ich die Optionsfelder vertikal an ihren Beschriftungen ausrichten?

Bearbeiten:

Hier ist der HTML-Code:

<input checked="checked" type="radio" name="user_level" id="rd1" value="1"/>
<label for="rd1">radio 1</label><br/>
<input type="radio" name="user_level" id="rd2" value="2"/>
<label for="rd2">radio 2</label><br/>
<input type="radio" name="user_level" id="rd3" value="3"/>
<label for="rd3">radio 3</label><br/>

Und der CSS-Code:

label{
    padding:5px;
    color:#222;
    font-family:corbel,sans-serif;
    font-size: 14px;
    margin: 10px;
}
Ninjacoder
quelle
1
Wie sieht Ihr Code im Moment aus?
George
@ninjacoder Aktualisiere deine Frage mit dem Code.
Muthu Kumaran

Antworten:

147

Versuche dies:

input[type="radio"] {
  margin-top: -1px;
  vertical-align: middle;
}
Zakangelle
quelle
9
Dies funktionierte für mich, aber ich musste ein hinzufügen, height= 100%;da mein übergeordnetes Element die Höhe nicht explizit festlegte.
DaKaZ
1
Dies schien mir den beständigsten Ansatz zwischen Mac, Windows und Linux mit Chrome, Firefox oder IE zu bieten. Außerdem habe ich festgestellt, dass ich, wenn ich mein Etikett auffülle und das Radio in das Etikett einbaue, möglicherweise den Rand oben auf einen Wert von weniger als -1 Pixel (wie -3 Pixel) einstellen muss, je nachdem, wie viel Polsterung ich verwendet habe dieses Etikett. (Ich mag es, meinen Radio-Box-Etiketten eine Schwebefarbe und einen abgerundeten
Randeffekt
3
Um zu erklären, warum dies die einzig richtige Antwort ist: Einige Elemente in HTML haben Standardrand- oder Auffüllwerte, z. B. die Elemente <p> oder <li> oder Optionsfelder. Sie können dies sehen, wenn Sie in den Entwicklermodus (F12) wechseln und die Maus über das Tag bewegen. Tatsächlich ist dies ein gutes Verhalten, da der Browser selbst CSS verwendet, um vordefinierte Elemente zu positionieren, die der Benutzer dann zurücksetzen kann. Aber es kann verwirrend sein, wenn Sie nicht wissen, warum etwas überhaupt falsch ausgerichtet ist. Versuchen Sie also immer, Einstellungen zu überschreiben, die Sie nicht festgelegt haben, wenn dies standardmäßig seltsam aussieht.
StanE
Dies scheint nicht zu funktionieren, wenn Sie die Schriftgröße erhöhen oder verringern. Bitte beweisen Sie mir jedoch ein funktionierendes Beispiel!
Beschützer ein
15
input {
    display: table-cell;
    vertical-align: middle
}

Setzen Sie Klasse für alle Radio. Dies funktioniert für alle Optionsfelder auf der HTML-Seite.

Geige

vusan
quelle
Dies ist bei weitem die beste Lösung, die ich dafür gesehen habe. Radio Button Label Alignment hat mich bis dahin jahrelang geplagt. Funktioniert jedes Mal für mich.
G-Man
Beachten Sie, dass dies unterbrochen wird, wenn das Etikett mehrere Textzeilen enthält.
Daan
13

Ich weiß, dass ich die Antwort von Menuka Devinda ausgewählt hatte, aber als ich mir die Kommentare darunter ansah, stimmte ich zu und versuchte, eine bessere Lösung zu finden. Ich habe es geschafft und meiner Meinung nach ist es eine viel elegantere Lösung:

input[type='radio'], label{   
    vertical-align: baseline;
    padding: 10px;
    margin: 10px;
 }

Vielen Dank an alle, die eine Antwort angeboten haben, Ihre Antwort blieb nicht unbemerkt. Wenn Sie noch weitere Ideen haben, können Sie diese Frage gerne selbst beantworten.

Ninjacoder
quelle
9

Versuchen Sie, vertical-align:topin die CSS hinzuzufügen

label{
    padding:5px;
    color:#222;
    font-family:corbel,sans-serif;
    font-size: 14px;
    margin: 10px;
    vertical-align:top;
}​

Test: http://jsfiddle.net/muthkum/heAWP/

Muthu Kumaran
quelle
1
Dies hält nicht an, wenn Sie die Schriftgröße erhöhen oder verringern.
Beschützer ein
@Protectorone Das ist eine alte Antwort und spezifisch für die OP-Frage. Wenn Sie versuchen, dasselbe mit zu tun, font-sizeversuchen Sie es mit display:flex. Hier ist eine Demo, jsfiddle.net/et8z47q5
Muthu Kumaran
8

Könnte auch ein bisschen Flexibilität zu den Antworten hinzufügen.

.Radio {
  display: inline-flex;
  align-items: center;
}

.Radio--large {
  font-size: 2rem;
}

.Radio-Input {
  margin: 0 0.5rem 0;
}
<div>
  <label class="Radio" for="sex-female">
    <input class="Radio-Input" type="radio" id="sex-female" name="sex" value="female" />
    Female
  </label>

  <label class="Radio" for="sex-male">
    <input class="Radio-Input" type="radio" id="sex-male" name="sex" value="male" />
    Male
  </label>
</div>


<div>
  <label class="Radio Radio--large" for="sex-female2">
    <input class="Radio-Input" type="radio" id="sex-female2" name="sex" value="female" />
    Female
  </label>

  <label class="Radio Radio--large" for="sex-male2">
    <input class="Radio-Input" type="radio" id="sex-male2" name="sex" value="male" />
    Male
  </label>
</div>

Dominic
quelle
7

Sie können dies tun:

input {
    vertical-align:middle;
}

label{
    color:#222;
    font-family:corbel,sans-serif;
    font-size: 14px;
}

DEMO

Shailender Arora
quelle
Sehr gut. Ich wollte die Schaltfläche anstelle der Beschriftung ausrichten, und das macht den Trick.
Posfan12
1

So etwas sollte funktionieren

CSS:

input {
    float: left;
    clear: left;
    width: 50px;
    line-height: 20px;
}

label {
    float: left;
    vertical-align: middle;
}
Damien Overeem
quelle
1
label, input {
    vertical-align: middle;
}

Ich richte nur den vertikalen Mittelpunkt der Felder an der Grundlinie des übergeordneten Felds plus der halben x-Höhe (en.wikipedia.org/wiki/X-height) des übergeordneten Felds aus.

Pavel Blagodov
quelle
1

Viele dieser Antworten sagen zu verwenden vertical-align: middle;, was die Ausrichtung nahe bringt, aber für mich ist es immer noch um ein paar Pixel versetzt. Die Methode, mit der ich eine echte 1: 1-Ausrichtung zwischen den Etiketten und den Funkeingängen erhalten habe, ist folgende vertical-align: top;:

label, label>input{
    font-size: 20px;
    display: inline-block;
    margin: 0;
    line-height: 28px;
    height: 28px;
    vertical-align: top;
}
<h1>How are you?</h1>
<fieldset>
	<legend>Your response:</legend>
	<label for="radChoiceGood">
		<input type="radio" id="radChoiceGood" name="radChoices" value="Good">Good
	</label>
	
	<label for="radChoiceExcellent">
		<input type="radio" id="radChoiceExcellent" name="radChoices" value="Excellent">Excellent
	</label>
	
	<label for="radChoiceOk">
		<input type="radio" id="radChoiceOk" name="radChoices" value="OK">OK
	</label>
</fieldset>

JHS
quelle
1

Ich mag es, die Eingaben in die Beschriftungen einzufügen (zusätzlicher Bonus: Jetzt brauchen Sie das forAttribut nicht mehr auf der Beschriftung) und vertical-align: middledie Eingaben zu setzen.

label > input[type=radio] {
    vertical-align: middle;
    margin-top: -2px;
}

#d2 {  
    font-size: 30px;
}
<div>
	<label><input type="radio" name="radio" value="1">Good</label>
	<label><input type="radio" name="radio" value="2">Excellent</label>
<div>
<br>
<div id="d2">
	<label><input type="radio" name="radio2" value="1">Good</label>
	<label><input type="radio" name="radio2" value="2">Excellent</label>
<div>

(Das -2px margin-top ist Geschmackssache.)

Eine andere Option, die ich wirklich mag, ist die Verwendung einer Tabelle. (Halten Sie Ihre Pitchgabeln! Es ist wirklich schön!) Es bedeutet, dass Sie das forAttribut allen Ihren Beschriftungen und ids Ihren Eingaben hinzufügen müssen . Ich habe diese Option für Beschriftungen mit langem Textinhalt über mehrere Zeilen empfohlen.

<table><tr><td>
    <input id="radioOption" name="radioOption" type="radio" />
    </td><td>
    <label for="radioOption">                     
        Really good option
    </label>
</td></tr></table>

Beschützer eins
quelle
0

Ich stimme zwar zu, dass Tabellen nicht für Design-Layouts verwendet werden sollten, obwohl sie allgemein angenommen werden, dass sie die Validierung bestehen. dh das Tabellen-Tag ist nicht veraltet. Die beste Möglichkeit zum Ausrichten von Optionsfeldern ist die vertikale Ausrichtung des mittleren CSS mit an den Eingabeelementen angepassten Rändern.

PixelBlender
quelle
-1

Das Hinzufügen display:inline-blockzu den Etiketten und das Geben von Etiketten padding-topwürde dies beheben, denke ich. Auch nur das Setzen line-heightauf den Etiketten würde auch.

Anriëtte Myburgh
quelle
-3

Es gibt mehrere Möglichkeiten, eine, die ich bevorzugen würde, ist die Verwendung einer Tabelle in HTML. Sie können eine Tabelle mit zwei Spalten und drei Zeilen hinzufügen und die Optionsfelder und das Etikett platzieren.

<table border="0">

<tr>
  <td><input type="radio" name="sex" value="1"></td>
  <td>radio1</td>

</tr>
<tr>
  <td><input type="radio" name="sex" value="2"></td>
  <td>radio2</td>

</tr>
</table>
neuer Tag
quelle
6
Bitte verwenden Sie keine Tabellen für Layoutzwecke.
PeeHaa
4
-1 Tabellen sollten nicht für das Layout verwendet werden und dieser Code wird die Validierung nicht bestehen ... @ninjacoder, warum zum Teufel hast du das als "Antwort" ausgewählt?
Tereško
7
In der Tat ... im Ernst ... jedes Mal, wenn jemand lehrt, Tabellen für Form-Markups zu verwenden, stirbt irgendwo auf der Welt ein süßes Kätzchen ...
Damien Overeem
2
@PeeHaa, tereško, Damien Overeem Ich denke ihr habt wahrscheinlich recht, ich konnte meine eigene Lösung finden, die ich unten hier gepostet habe. Danke Leute! Ihre Hilfe und Ihr Rat werden sehr geschätzt.
Ninjacoder
2
Ich habe die anderen Optionen ausprobiert und sie waren nicht sehr gut. Tabellen funktionieren. .tablecell{dispay:table-cell;} ... <div class="tablecell">scheint eher eine wackelige Problemumgehung für Leute zu sein, die nicht zugeben wollen, dass sie Tabellen verwenden ...