Optionsfelder und Beschriftung werden in derselben Zeile angezeigt

78

Warum können meine Beschriftungen und Optionsfelder nicht in derselben Zeile bleiben. Was kann ich tun?

Hier ist meine Form:

<form name="submit" id="submit" action="#" method="post">
    <?php echo form_hidden('what', 'item-'.$identifier);?>

    <label for="one">First Item</label>
    <input type="radio" id="one" name="first_item" value="1" />

    <label for="two">Second Item</label>
    <input type="radio" id="two" name="first_item" value="2" />
    <input class="submit_form" name="submit" type="submit" value="Choose" tabindex="4" />
</form>
Gandalf StormCrow
quelle
2
Könnten Sie die ganze Seite und das entsprechende CSS anzeigen? Wenn Sie nur das von Ihnen bereitgestellte Snippet in den Text einer HTML-Seite einfügen, befindet sich alles in derselben Zeile, sodass eine CSS-Regel vorhanden sein muss, die dies verhindert.
Darin Dimitrov
Welches XHTML-Schema verwenden Sie?
Emre Yazici
@Darin Dimitrov Ich habe eine große CSS-Datei, die hier veröffentlicht werden soll. Das wäre keine gute Idee. Worauf sollte ich innerhalb der (mit mehreren Stylesheets) achten oder wie kann ich diese separat stylen?
Gandalf StormCrow
@eyazici <! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Strict // DE" " w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd "> <html xmlns = " w3.org/1999 / xhtml ">
Gandalf StormCrow
1
Versuchen Sie, Firebug zu installieren und verwenden Sie die Funktion "Inspizieren", um die CSS-Regeln aufzulisten, die für Ihre Elemente gelten.
Tobias Cohen

Antworten:

95

Wenn Sie die HTML-Struktur verwenden, die ich in dieser Frage dargelegt habe, können Sie einfach Ihre Beschriftung und Eingabe nach links verschieben und den Abstand / Rand anpassen, bis die Dinge in einer Reihe stehen.

Und ja, Sie möchten, dass Ihr Optionsfeld einen Klassennamen für den alten IE hat. Und wenn alle in derselben Zeile wären, wäre es gemäß dem Markup, mit dem ich oben verlinkt habe, so:

fieldset {
      overflow: hidden
    }
    
    .some-class {
      float: left;
      clear: none;
    }
    
    label {
      float: left;
      clear: none;
      display: block;
      padding: 0px 1em 0px 8px;
    }
    
    input[type=radio],
    input.radio {
      float: left;
      clear: none;
      margin: 2px 0 0 2px;
    }
<fieldset>
      <div class="some-class">
        <input type="radio" class="radio" name="x" value="y" id="y" />
        <label for="y">Thing 1</label>
        <input type="radio" class="radio" name="x" value="z" id="z" />
        <label for="z">Thing 2</label>
      </div>
    </fieldset>

Nipun Tharuksha
quelle
2
(Ich würde vorschlagen, tatsächlich
1
<label for = "x"> Sache 1 </ label> sollte <label for = "y"> Sache 1 </ label> sein
podeig
1
@D_N, können Sie bitte die Bezeichnung für das Attribut korrigieren? Ich habe es versucht, aber meine Bearbeitung war weniger als 6 Zeichen, so dass ich nicht einreichen konnte.
iancrowther
Für eine Weile verschwunden. Danke, dass du das behoben hast.
@animuson hat eine bessere Lösung, die die Eingabe innerhalb des Etiketts verschachtelt. Scrollen Sie nach unten und unterstützen Sie stattdessen diesen! <label for="one"> <input type="radio" id="one" name="first_item" value="1" /> First Item </label>
Joseph Cho
61

Was ich immer getan habe, ist einfach das Optionsfeld in das Etikett zu wickeln ...

<label for="one">
<input type="radio" id="one" name="first_item" value="1" />
First Item
</label>

So etwas hat immer für mich funktioniert.

animuson
quelle
7
Das funktioniert nicht von alleine, nichts hindert die Wörter innerhalb des Etiketts daran, in verschiedene Zeilen aufgeteilt zu werden. Sie müssten das Etikett anzeigen lassen: Block oder Leerzeichen: Nowrap. Ich bin mir auch nicht sicher, ob es semantisch korrekt ist, die Eingabe innerhalb des Etiketts zu haben.
Tom
11
Es ist gültig, dass die Eingabe durch das Beschriftungselement umbrochen wird. Siehe w3.org/TR/html5/forms.html#the-label-element
Pisang Gesek
4
Der Vorteil der Eingabe des Etiketts besteht darin, dass der Text anklickbar ist, um das Optionsfeld zu aktivieren, anstatt dass der Benutzer direkt auf das Radio klicken muss. Dies ist nützlich für Personen, die mobile Geräte verwenden und keine haben Genauigkeit der Klicks, die Sie mit einem Mauszeiger erhalten würden.
MistyDawn
10

Möglicherweise haben Sie eine Breite für Ihre Eingabe- Tags irgendwo in Ihrem CSS angegeben .

Fügen Sie ein class="radio"zu Ihren Radio-Boxen und ein input.radio {width: auto;}zu Ihrem CSS hinzu.

Alexar
quelle
1
Der bessere Weg, dies zu tun, wäre, den Eingabetyp-Selektor in Ihrem CSS zu verwenden, anstatt eine neue Klasse hinzuzufügen. Sie können einfach input:radio { /* styles here */ }oder input[type="radio"] { /* styles here */ }zu Ihrem CSS hinzufügen . Es ist nicht erforderlich, eine separate Klasse zu verwenden, um die Stilregeln anzugeben, wenn Sie sie auch auf alle Elemente anwenden, die ein Funkeingang sind.
MistyDawn
5

Setzen Sie sie beide zu display:inline.

casraf
quelle
5

Hmm. Standardmäßig <label>ist display: inline;und <input>ist (zumindest ungefähr) display: inline-block;, daher sollten sich beide in derselben Zeile befinden. Siehe http://jsfiddle.net/BJU4f/

Vielleicht ein Sheet setzt labeloder inputzu display: block?

Paul D. Waite
quelle
2

Ich gehe davon aus, dass das Problem darin besteht, dass sie in separate Zeilen eingeschlossen werden, wenn das Fenster zu eng ist. Wie andere bereits betont haben, sollten Beschriftung und Eingabe standardmäßig "display: inline;" sein. Wenn Sie also keine anderen Stilregeln haben, die dies ändern, sollten sie in derselben Zeile gerendert werden, wenn Platz vorhanden ist.

Ohne Änderung des Markups gibt es keine Möglichkeit, dies nur mit CSS zu beheben.

Der einfachste Weg, dies zu beheben, besteht darin, das Optionsfeld und die Beschriftung in ein Blockelement wie a poder a diveinzuschließen und dann zu verhindern, dass dieses umbrochen wird, indem Sie es verwenden white-space:nowrap. Zum Beispiel:

<div style="white-space:nowrap;">
  <label for="one">First Item</label>
  <input type="radio" id="one" name="first_item" value="1" />
</div>
Tom
quelle
2

Ich vermeide es immer zu benutzen, float:leftaber stattdessen benutze ichdisplay: inline

.wrapper-class input[type="radio"] {
  width: 15px;
}

.wrapper-class label {
  display: inline;
  margin-left: 5px;
  }
<div class="wrapper-class">
  <input type="radio" id="radio1">
  <label for="radio1">Test Radio</label>
</div>

Ross
quelle
1

Ich benutze diesen Code und funktioniert einwandfrei:

input[type="checkbox"], 
input[type="radio"],
input.radio,
input.checkbox {
    vertical-align:text-top;
    width:13px;
    height:13px;
    padding:0;
    margin:0;
    position:relative;
    overflow:hidden;
    top:2px;
}

Möglicherweise möchten Sie den Spitzenwert neu einstellen (hängt von Ihrem ab line-height). Wenn Sie keine IE6-Kompatibilität wünschen, müssen Sie diesen Code nur in Ihre Seite einfügen. Andernfalls müssen Sie Ihren Eingaben eine zusätzliche Klasse hinzufügen (Sie können dafür jQuery - oder eine andere Bibliothek - verwenden;))

Ionuț Staicu
quelle
1

** Verwendete Tabelle, um Radio und Text in einer Zeile auszurichten

<div >
  <table>
    <tbody>
      <tr>
        <td><strong>Do you want to add new server ?</strong></td>
        <td><input type="radio" name="addServer" id="serverYes" value="1"></td>
        <td>Yes</td>
        <td><input type="radio" name="addServer" id="serverNo" value="1"></td>
        <td>No</td>

      </tr>
    </tbody>
  </table>
</div>

** **.

Raushan Kumar
quelle
1
Bitte fügen Sie eine kurze Erklärung hinzu, was Sie getan haben, damit der Autor Ihre Lösung besser verstehen kann
giuseppedeponte
0

Ich konnte Ihr Problem in Google Chrome 4.0, IE8 oder Firefox 3.5 mit diesem Code nicht reproduzieren. Das Etikett und das Optionsfeld blieben in derselben Zeile.

Versuchen Sie, beide in ein <p>Tag einzufügen, oder stellen Sie das Optionsfeld so ein, dass es inline ist, wie es The Elite Gentleman vorgeschlagen hat.

soren121
quelle
0

Hinweis: Traditionell wird das Label-Tag für Menüs verwendet. z.B:

<menu>
<label>Option 1</label>
<input type="radio" id="opt1">

<label>Option 2</label>
<input type="radio" id="opt2">

<label>Option 3</label>
<input type="radio" id="opt3">  
</menu>
sherb
quelle
1. Nein, ist es nicht - es dient zum Beschriften von Formularelementen , ob in einem Menü oder nicht. 2. Sie sollen angeben, welches Formularelement die Bezeichnung beschreibt, indem Sie die Formularelemente idals Wert des forAttributs auf das <label>Element setzen. Ihr Beispiel lässt das aus.
Paul D. Waite
0

Ich hatte das ähnliche Problem, alle Optionsfelder in derselben Zeile zu halten. Nachdem ich alles versucht hatte, was ich konnte, funktionierte nichts für mich außer dem folgenden. Was ich meine, ist einfach die Verwendung einer Tabelle, um das Problem zu beheben, dass Optionsfelder in derselben Zeile angezeigt werden.

<table>
<tr>
    <td>
        <label>
            @Html.RadioButton("p_sortForPatch", "byName", new { @checked = "checked", @class = "radio" }) By Name
        </label>
    </td>
    <td>
        <label>
            @Html.RadioButton("p_sortForPatch", "byDate", new { @class = "radio" }) By Date
        </label>
    </td>
</tr>
</table>
Dhruv Rangunwala
quelle
0

Wenn das Problem darin besteht, dass Beschriftung und Eingabe bei zu schmalem Fenster in zwei Zeilen eingeschlossen werden, entfernen Sie das Leerzeichen zwischen ihnen. z.B:

<label for="one">First Item</label>
<input type="radio" id="one" name="first_item" value="1" />

Wenn Sie Leerzeichen zwischen den Elementen benötigen, verwenden Sie nicht unterbrechende Leerzeichen ( &amp; nbsp;) oder CSS.

kevingessner
quelle
0
fieldset {
  overflow: hidden
}

.class {
  float: left;
  clear: none;
}

label {
  float: left;
  clear: both;
  display:initial;
}

input[type=radio],input.radio {
  float: left;
  clear: both;     
}
Saurav Bisht
quelle