Выравнивание переключателя/флажка в HTML/CSS

Каков самый чистый способ правильно выровнять переключатели / флажки с текстом? Единственное надежное решение, которое я использовал до сих пор, основано на таблице:

<table>
<tr>
    <td><input type="radio" name="opt"></td>
    <td>Option 1</td>
</tr>
<tr>
    <td><input type="radio" name="opt"></td>
    <td>Option 2</td>
</tr>
</table>

Некоторые могут не одобрить это. Я только что потратил некоторое время (снова) на изучение бестабличного решения, но потерпел неудачу. Я пробовал различные комбинации поплавков, абсолютное/относительное позиционирование и подобные подходы. Мало того, что они в основном молча полагались на предполагаемую высоту переключателей/флажков, так еще и вели себя по-разному в разных браузерах. В идеале я хотел бы найти решение, которое не предполагает ничего о размерах или особых причудах браузера. Я согласен с использованием таблиц, но мне интересно, где есть другое решение.


person Jan Zich    schedule 28.12.2008    source источник
comment
Вы должны отредактировать свой вопрос, чтобы было ясно, что вы имеете в виду в HTML. Я собирался ответить на ваш вопрос о Java...   -  person Richard T    schedule 28.12.2008
comment
Надеюсь, @Richard T имел в виду JavaScript   -  person QueueHammer    schedule 14.12.2011
comment
Я настроил JSFIddle, чтобы проиллюстрировать некоторые предложения: jsfiddle.net/casebash/XNJxT/906   -  person Casebash    schedule 15.02.2013
comment
выровняйте правильно, что вы имеете в виду? Что считается правильно выровненным?   -  person Raedwald    schedule 11.09.2014
comment
можно выровнять в процентах: для себя я использую: vertical-align: -15%; во входном теге   -  person PhilMaGeo    schedule 04.06.2019


Ответы (13)


Я думаю, что наконец решил проблему. Одним из часто рекомендуемых решений является использование vertical-align: middle:

<input type="radio" style="vertical-align: middle"> Label

Проблема, однако, в том, что это по-прежнему приводит к видимым смещениям, хотя теоретически это должно работать. Спецификация CSS2 говорит, что:

vertical-align: middle: выравнивание вертикальной средней точки блока с базовой линией родительского блока плюс половина x-высоты родителя.

Так что он должен быть в идеальном центре (x-height - это высота символа x). Однако проблема, по-видимому, вызвана тем, что браузеры обычно добавляют случайные неровные поля к переключателям и флажкам. Можно проверить, например, в Firefox с помощью Firebug, что поле флажка по умолчанию в Firefox равно 3px 3px 0px 5px. Я не уверен, откуда это взялось, но другие браузеры, похоже, тоже имеют аналогичные поля. Итак, чтобы получить идеальное выравнивание, нужно избавиться от этих полей:

<input type="radio" style="vertical-align: middle; margin: 0px;"> Label

Тем не менее интересно отметить, что в решении на основе таблицы поля каким-то образом съедаются, и все хорошо выравнивается.

person Jan Zich    schedule 20.05.2009
comment
Действительно хороший ответ - хорошо изучен, и он работает. Чем больше я смотрю на CSS, тем более локализованные настройки полей и отступов кажутся ключевыми. Спасибо! - person penderi; 28.07.2009
comment
по состоянию на 18 апреля 2010 г. это решение не работает в Firefox 3.6.3 для win - person Chris; 18.04.2010
comment
хороший css для этого, поэтому вам не нужно стилизовать каждую кнопку и поле - input[type=radio], input[type=checkbox] {vertical-align: middle; поле: 0px; } - person perilandmishap; 25.01.2011
comment
Будет ли cssreset исправлять разные стили? - person Shane Courtrille; 19.07.2011
comment
К вашему сведению, пиксель после 0 является избыточным. Когда значение CSS равно 0, единица измерения не имеет значения, поэтому margin:0 будет достаточно. - person jedmao; 22.09.2012
comment
Я нашел эту маржу: 0; заполнение: 0; работает даже немного лучше. - person abjennings; 18.10.2012
comment
Не забудьте проверить vertical-align других элементов в той же строке (например: <label>) при использовании этого решения. - person Diogo Kollross; 03.05.2013

В Firefox и Opera работает следующее (извините, в данный момент у меня нет доступа к другим браузерам):

<div class="form-field">
    <input id="option1" type="radio" name="opt"/>
    <label for="option1">Option 1</label>
</div>

CSS:

.form-field * {
    vertical-align: middle;
}
person Community    schedule 28.12.2008
comment
я не понимаю, почему ваш ответ не был принят, это самый простой рабочий ответ для всех основных браузеров (по состоянию на 18 апреля 2010 г.) - person Chris; 18.04.2010
comment
Обратите внимание, что DOCTYPE вашего документа должен быть SRICT, чтобы увидеть эффекты VERTICAL-ALIGN. - person ; 11.09.2010
comment
Я думаю, что причина, по которой это не было принято в качестве ответа, заключается в том, что, как говорится в выбранном ответе, некоторые браузеры добавляют асимметричные значения полей, которые мешают этому подходу работать. - person DaveyDaveDave; 12.10.2011

Я нашел лучший и самый простой способ сделать это, потому что вам не нужно добавлять метки, div или что-то еще.

input { vertical-align: middle; margin-top: -1px;}

person Dario    schedule 28.10.2010
comment
Это margin-top:-1px; это дополнительный соус, который получает мой голос. У меня есть радио внутри пролета, которое я использую как кнопку. размещение только вертикального выравнивания для стиля радио помещает радио только в нижнюю часть пролета. размещение вертикального выравнивания в стиле span оставляет кнопку вверху. Только margin-top, кажется, не имеет никакого эффекта. Но сложите их вместе и вуаля - person gordon; 30.08.2012
comment
-1. Это плохая идея, вы вызываете сдвиг радиоэлемента вверх, из-за чего он не выстраивается в линию с другими окружающими элементами. Иди попробуй с несколькими радио входами один за другим с другими элементами по бокам. - person codenamezero; 24.04.2014

Я бы вообще не использовал таблицы для этого. CSS может легко сделать это.

Я бы сделал что-то вроде этого:

   <p class="clearfix">
      <input id="option1" type="radio" name="opt" />
      <label for="option1">Option 1</label>
   </p>

p { margin: 0px 0px 10px 0px; }
input { float: left; width: 50px; }
label { margin: 0px 0px 0px 10px; float: left; }

Примечание. Я использовал класс clearfix из: http://www.positioniseverything.net/easyclearing.html

.clearfix:after {
    content: ".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
}

.clearfix {display: inline-block;}

/* Hides from IE-mac \*/
* html .clearfix {height: 1%;}
.clearfix {display: block;}
/* End hide from IE-mac */
person Keith Donegan    schedule 28.12.2008
comment
Спасибо за ответ, но боюсь, что это не решает проблему выравнивания. Я должен был быть яснее. Моя цель - вертикально выровнять флажки/переключатели с их метками. - person Jan Zich; 28.12.2008
comment
Вы можете сделать это с помощью моего кода. Поэкспериментируйте с полем на этикетке, и вы также можете добавить его к элементу ввода, если хотите. Итак, метка { margin: 10px 0px 0px 10px; плыть налево; } сдвинет метку вниз на 10 пикселей. - person Keith Donegan; 28.12.2008
comment
Вы можете это сделать, но один из пунктов исходного вопроса заключался в том, чтобы ничего не предполагать о размерах переключателей/флажков. Скорее всего мой вопрос был слишком оптимистичен. - person Jan Zich; 28.12.2008

Это немного хак, но этот CSS, похоже, очень хорошо работает во всех браузерах так же, как и при использовании таблиц (кроме хрома)

input[type=radio] { vertical-align: middle; margin: 0; *margin-top: -2px; }
label { vertical-align: middle; }
@media screen and (-webkit-min-device-pixel-ratio:0) {
 input[type=radio] { margin-top: -2px; }
}

Убедитесь, что вы используете ярлыки с вашими радиостанциями, чтобы они работали. то есть

<option> <label>My Radio</label>
person Justin Vincent    schedule 08.07.2009
comment
Средства массовой информации очень помогли мне с мобильными устройствами. Спасибо! - person Sven van Zoelen; 20.08.2016

Если ваша метка длинная и состоит из нескольких строк, вам поможет установка ширины и display:inline-block.

.form-field * {
  vertical-align: middle;
}
.form-field input {
  clear:left;
}
.form-field label { 
  width:200px;
  display:inline-block;
}

<div class="form-field">
    <input id="option1" type="radio" name="opt" value="1"/>
    <label for="option1">Option 1 is very long and is likely to go on two lines.</label>
    <input id="option2" type="radio" name="opt" value="2"/>
    <label for="option2">Option 2 might fit into one line.</label>
</div>
person Mika    schedule 09.01.2011

Я обнаружил, что лучшим решением для этого было задать вводу высоту, соответствующую метке. По крайней мере, это устранило мою проблему с несоответствиями в Firefox и IE.

input { height: 18px; margin: 0; float: left; }
label { height: 18px; float: left; }

<li>
  <input id="option1" type="radio" name="opt" />
  <label for="option1">Option 1</label>
</li>
person Angus    schedule 21.10.2010
comment
Соответствующая высота исправила мои радиоприемники. Не флажки, но не беспокойтесь, так как наш site.css довольно сложный. - person SushiGuy; 09.09.2013

Следующий код должен работать :)

С уважением,



<style type="text/css">
input[type=checkbox] {
    margin-bottom: 4px;
    vertical-align: middle;
}

label {
    vertical-align: middle;
}
</style>


<input id="checkBox1" type="checkbox" /><label for="checkBox1">Show assets</label><br />
<input id="checkBox2" type="checkbox" /><label for="checkBox2">Show detectors</label><br />
person Kin    schedule 19.04.2011

Это простое решение, которое решило проблему для меня:

label 
{

/* for firefox */
vertical-align:middle; 

/*for internet explorer */
*bottom:3px;
*position:relative; 

padding-bottom:7px; 

}
person Dunx    schedule 21.06.2011

Есть несколько способов его реализации:

  1. Для стандартного флажка ASP.NET:

    .tdInputCheckBox
    { 
    position:relative;
    top:-2px;
    }
    <table>
            <tr>
                <td class="tdInputCheckBox">                  
                    <asp:CheckBox ID="chkMale" runat="server" Text="Male" />
                    <asp:CheckBox ID="chkFemale" runat="server" Text="Female" />
                </td>
            </tr>
    </table>
    
  2. Для флажка DevExpress:

    <dx:ASPxCheckBox ID="chkAccept" runat="server" Text="Yes" Layout="Flow"/>
    <dx:ASPxCheckBox ID="chkAccept" runat="server" Text="No" Layout="Flow"/>
    
  3. Для списка радиокнопок:

    <asp:RadioButtonList ID="rdoAccept" runat="server" RepeatDirection="Horizontal">
       <asp:ListItem>Yes</asp:ListItem>
       <asp:ListItem>No</asp:ListItem>
    </asp:RadioButtonList>
    
  4. Для обязательных валидаторов полей:

    <asp:TextBox ID="txtEmailId" runat="server"></asp:TextBox>
    <asp:RequiredFieldValidator ID="reqEmailId" runat="server" ErrorMessage="Email id is required." Display="Dynamic" ControlToValidate="txtEmailId"></asp:RequiredFieldValidator>
    <asp:RegularExpressionValidator ID="regexEmailId" runat="server" ErrorMessage="Invalid Email Id." ControlToValidate="txtEmailId" Text="*"></asp:RegularExpressionValidator>`
    
person Ajay Shankar    schedule 29.11.2011

Ниже я буду динамически вставлять флажок. Стиль включен для выравнивания флажка и, что наиболее важно, для обеспечения ровного переноса слов. самое главное здесь display: table-cell; для выравнивания

Визуальный базовый код.

'код для динамической вставки флажка

Dim tbl As Table = New Table()
Dim tc1 As TableCell = New TableCell()
tc1.CssClass = "tdCheckTablecell"

'get the data for this checkbox
Dim ds As DataSet
Dim Company As ina.VullenCheckbox
Company = New ina.VullenCheckbox
Company.IDVeldenperScherm = HETid
Company.IDLoginBedrijf = HttpContext.Current.Session("welkbedrijf")
ds = Company.GetsDataVullenCheckbox("K_GetS_VullenCheckboxMasterDDLOmschrijvingVC") 'ds6

'создать флажок

Dim radio As CheckBoxList = New CheckBoxList
radio.DataSource = ds
radio.ID = HETid
radio.CssClass = "tdCheck"
radio.DataTextField = "OmschrijvingVC"
radio.DataValueField = "IDVullenCheckbox"
radio.Attributes.Add("onclick", "documentChanged();")
radio.DataBind()

'подключить флажок

tc1.Controls.Add(radio)
tr.Cells.Add(tc1)
tbl.Rows.Add(tr)

стиль флажка

input[type="checkbox"] {float: left;   width: 5%; height:20px; border: 1px solid black; }

.tdCheck label {     width: 90%;display: table-cell;    align:right;}

.tdCheck {width:100%;}

и вывод HTML

<head id="HEAD1">
    <title>
        name
    </title>
    <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR" /><meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE" />
</head>
<style type='text/css'>
input[type="checkbox"] {float: left;   width: 20px; height:20px;  }
.tdCheck label {     width: 90%;display: table-cell;    align:right;}
.tdCheck {width:100%;}
.tdLabel {width:100px;}
.tdCheckTableCell {width:400px;}
TABLE
{

vertical-align:top;
border:1;border-style:solid;margin:0;padding:0;border-spacing:0;
border-color:red;
}
TD
{
vertical-align:top; /*labels ed en de items in het datagrid*/
border: 1;  border-style:solid;
border-color:green;
    font-size:30px  }
</style>
<body id="bodyInternet"  > 
    <form name="Form2" method="post" action="main.aspx?B" id="Form2">
        <table border="0">
            <tr>
                <td class="tdLabel">
                    <span id="ctl16_ID{A}" class="DynamicLabel">
                        TITLE
                    </span>
                </td>
                <td class="tdCheckTablecell">
                    <table id="ctl16_{A}" class="tdCheck" onclick="documentChanged();" border="0">
                        <tr>
                            <td>
                                <input id="ctl16_{A}_0" type="checkbox" name="ctl16${A}$0" />
                                <label for="ctl16_{A}_0">
                                    this is just dummy text to show the text will warp this is just dummy text to show the text will warp this is just dummy text to show the text will warp this is just dummy text to show the text will warp this is just dummy text to show the text will warp this is just dummy text to show the text will warp  
                                </label>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <input id="ctl16_{A}_1" type="checkbox" name="ctl16${A}$1" />
                                <label for="ctl16_{A}_1">
                                    ITEM2
                                </label>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <input id="ctl16_{A}_2" type="checkbox" name="ctl16${A}$2" />
                                <label for="ctl16_{A}_2">
                                    ITEM3
                                </label>
                            </td>
                        </tr>
                    </table>
                </td>
            </tr>
        </table>
</form>
</body>

person eilering    schedule 06.01.2013

@sfjedi

Я создал класс и присвоил ему значения css.

.radioA{
   vertical-align: middle;
}

Он работает, и вы можете проверить это по ссылке ниже. http://jsfiddle.net/gNVsC/ Надеюсь, это было полезно.

person Fight code with code    schedule 22.08.2013

person    schedule
comment
У меня это не работает в Firefox 58, это какой-то нестандартный CSS? - person Konrad Höffner; 15.02.2018