Выровнять по левому краю комбо-метку радиокнопки по вертикали на отдельных строках только с помощью CSS

Проблема

У меня есть группа переключателей, которые организованы вертикально и расположены друг над другом. Они находятся на отдельных строках с помощью тега ‹br›. Я хочу выровнять их по вертикали с помощью CSS, с выравниванием по левому краю, 100 пикселей слева. Не похоже, чтобы это было так сложно, но я еще не понял этого. Вот иллюстрация, которую я сделал, чтобы прояснить желаемый результат:

Выравнивание по умолчанию:

+----------------------------------------------------------------+
|                                                                |
|                                                                |
|                                                                |
|                                                                |
|                  * choice 1                                    |
|                  * choice 2 is a different length              |
|                  * choice 3 is also long                       |
|                                                                |
|                                                                |
|                                                                |
|                                                                |
|                                                                |
+----------------------------------------------------------------+

Желаемые переключатели с выравниванием по левому краю и метками справа:

+----------------------------------------------------------------+
|                                                                |
|                                                                |
|                                                                |
|                                                                |
|        * choice 1                                              |
|        * choice 2 is a different length                        |
|        * choice 3 is also long                                 |
|                                                                |
|                                                                |
|                                                                |
|                                                                |
|                                                                |
+----------------------------------------------------------------+

Сделано на Asciiflow.com

Код

Вот мой код:

CSS и HTML

form {
  background-color: #ffffb3;
  font-family: Arial, sans-serif;
  padding: 10px;
  border: 2px solid #000000;
  min-width: 600px;
  max-width: 690px;
  width: 80%;
  margin: 0 auto;
  min-height: 200px;
}
label {
  margin-left: 100px;
  postion: absolute;
}
/*input[type="checkbox"]:checked + */
<form method="POST" action="mailto:[email protected]">

  <h2>Visitor Survey</h2>

  <fieldset>

    <label for="myName">Your Name:</label>
    <input type="text" name="myName" id="myName">
    <br>

    <label for="email">Email Address:</label>
    <input type="text" name="email" id="email">
    <br>

  </fieldset>

  <p>What is your favorite movie?</p>

  <input type="radio" name="movie" id="transformers" value="Transformers!">
  <label for="transformers">Transformers!</label>
  <br>
  <input type="radio" name="movie" id="dark-knight" value="Dark Knight">
  <label for="dark-knight">Dark Knight</label>
  <br>
  <input type="radio" name="movie" id="goodwillhunting" value="Good Will Hunting">
  <label for="goodwillhunting">Good Will Hunting</label>

  <br>
  <br>

  <input type="submit" value="Submit Query">
  <input type="reset" value="Reset">

</form>

Что я уже пробовал

  • Искал в Интернете и Stack Overflow, но результаты не совсем подходили.
  • Я пробовал перемещать и кнопку, и метку влево, margin-left: 100px, абсолютное положение, но это не работает.
  • Я пробовал возиться с input[type="radio"] + label (но мне нужно, чтобы ярлык был первым), но безрезультатно.
  • Оборачивание переключателей и меток в набор полей.

Мои вопросы

Итак, у меня есть несколько вопросов:

  1. Как сделать это элегантно с помощью CSS без использования блоков div или полей? Или, другими словами, можно ли это сделать с помощью простого CSS, используя только селекторы label и input [type = "radio"]?
  2. Я понимаю, что наборы полей предназначены для обеспечения доступности, но мне интересно, лучше ли использовать наборы полей или это метод, который устаревает?
  3. Могу ли я выровнять радиостанции и их метки в отдельные линии по вертикали без использования тега ‹br›?

person Eric Hepperle - CodeSlayer2010    schedule 27.07.2016    source источник
comment
Хорошо отформатированный и качественный вопрос. Я тоже проверяю ваши запросы. :)   -  person Sayed Rafeeq    schedule 27.07.2016
comment
@SayedRafeeq, спасибо. Я с нетерпением жду ваших открытий.   -  person Eric Hepperle - CodeSlayer2010    schedule 27.07.2016


Ответы (2)


Что-то вроде этого?

  1. Сложите кнопку radio и комбинацию label, используя псевдоэлементы (в данном случае :after). Нет необходимости в <br>.
  2. Примените margin-left к input[type="radio"] вместо label.

Используя :after, я создал пустой блок (display: block;). Этот пустой блок помещается в конец label, поэтому следующий элемент перемещается на новую строку.

Примечание.

Для пояснения я выделил пустой блок (созданный :after) красной рамкой. При необходимости удалите.

form {
  background-color: #ffffb3;
  font-family: Arial, sans-serif;
  padding: 10px;
  border: 2px solid #000000;
  min-width: 600px;
  max-width: 690px;
  width: 80%;
  margin: 0 auto;
  min-height: 200px;
}
label {
  margin-left: 100px;
}
input[type="radio"] {
  margin-left: 100px;
}
input[type="radio"] + label {
  margin-left: 10px;
}
input[type="radio"] + label:after {
  content: '';
  display: block;
  /* Below code(border: 1px solid red;) is just for illustration, remove if necessary */
  border: 1px solid red;
}
/*input[type="checkbox"]:checked + */
<form method="POST" action="mailto:[email protected]">

  <h2>Visitor Survey</h2>

  <fieldset>

    <label for="myName">Your Name:</label>
    <input type="text" name="myName" id="myName">
    <br>

    <label for="email">Email Address:</label>
    <input type="text" name="email" id="email">
    <br>

  </fieldset>

  <p>What is your favorite movie?</p>

  <input type="radio" name="movie" id="transformers" value="Transformers!">
  <label for="transformers">Transformers!</label>
  <input type="radio" name="movie" id="dark-knight" value="Dark Knight">
  <label for="dark-knight">Dark Knight</label>
  <input type="radio" name="movie" id="goodwillhunting" value="Good Will Hunting">
  <label for="goodwillhunting">Good Will Hunting</label>

  <br>
  <br>

  <input type="submit" value="Submit Query">
  <input type="reset" value="Reset">

</form>

person Pugazh    schedule 27.07.2016
comment
Думаю, это могло быть так. Позвольте мне попробовать реализовать, и я отчитаюсь. Если сработает, отмечу это как ответ. - person Eric Hepperle - CodeSlayer2010; 27.07.2016
comment
@ CodeSlayer2010: Рад помочь! - person Pugazh; 27.07.2016
comment
Оно работает! Я отметил ваш ответ как правильный. Хотя есть один вопрос. Я только что прочитал, что W3Schools принимает псевдоэлементы :: before и :: after, но не видел ничего, что могло бы объяснить, как вы это используете. Я могу использовать их со свойством content, чтобы просто помещать вещи до / после. Вы можете объяснить, что делает label:after? - person Eric Hepperle - CodeSlayer2010; 27.07.2016

Во-первых, вы должны заключить группы форм в блоки div.
Я знаю, что вы сказали не использовать их, но это самый элегантный и простой способ. Иначе не так хорошо.

Это позволит вам избавиться от br, потому что, естественно, div определяется как display: block в CSS, что означает, что он будет в отдельных строках.

Чтобы сделать то, что вы хотите, вы должны просто выровнять эти div по левому краю и добавить 100 пикселей padding-left к каждому div.

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

person Gofilord    schedule 27.07.2016
comment
OP не хочет divs - person beerwin; 27.07.2016
comment
Я обратился к этому. Нет никаких причин НЕ использовать их. Они здесь не просто так. Это все равно, что вкрутить винт без отвертки. - person Gofilord; 27.07.2016
comment
Спасибо за ответ. Я принял ответ @Pugazh, потому что он был более правильным для того, что я искал, и включал рабочий код. - person Eric Hepperle - CodeSlayer2010; 27.07.2016