Как изменить стиль и положение поля ввода внутри формы

В настоящее время я немного разбираюсь в HTML и CSS, но мне трудно понять, как заставить эту форму вести себя так, как я хотел бы. Цель состоит в том, чтобы первые три поля сохранили свое текущее поведение, но чтобы поля Тема и Сообщение были соответствующего размера и располагались на отдельных строках.

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

.optin {
    background-color: #F7F9FA;
    border-radius: 5px;
    padding: 40px 70px 20px;
    box-shadow: 0px 20px 40px 0px rgba(61, 65, 84, 0.15); }
    .optin__title {
        font-size: 20px;
        margin-bottom: 32px; }
    .optin__form {
        display: flex; }
    .optin__form-group--active > label {
        top: -20px;
        font-size: 14px;
        color: #FA6262; }
    .optin .form-group {
        flex: 1 0 0;
        margin-right: 20px;
        margin-bottom: 20px; }
    .optin__label {
        position: absolute;
        font-weight: 500;
        font-size: 15px;
        top: 12px;
        left: 0;
        pointer-events: none;
        transition: all 0.2s ease-in-out; }
    .optin__input {
        padding: 0;
        margin-bottom: 0;
        font-size: 15px;
        font-weight: 500;
        background-color: transparent;
        border: 0;
        border-radius: 0;
        border-bottom: 1px solid #D5D9ED; }
        .optin__input:focus {
            background-color: transparent; }
        .optin__input:focus ~ label {
            top: -20px;
            font-size: 14px;
            color: #FA6262; }
    @media only screen and (max-width: 767px) {
        .optin {
            padding: 30px; }
            .optin__form {
                display: block; } }
          <div class = "optin">
            <h3 class = "optin__title">{{ .Site.Params.home.formtitle }}</h3>
            <form class = "optin__form">
              <div class = "optin__form-group form-group">                    
                <input type = "text" class = "form-input optin__input" id = "optin-name" required>
                <label for = "optin-name" class = "optin__label">{{ .Site.Params.home.formname }}</label>
                <span class = "input-underline"></span>
              </div>

              <div class = "optin__form-group form-group">
                <input type = "email" class = "form-input optin__input" id = "optin-email" required>
                <label for = "optin-email" class = "optin__label">{{ .Site.Params.home.formemail }}</label>
                <span class = "input-underline"></span>
              </div>

              <div class = "optin__form-group form-group">
                <input type = "text" class = "form-input optin__input" id = "optin-company">
                <label for = "optin-company" class = "optin__label">{{ .Site.Params.home.formcompany }}</label>
                <span class = "input-underline"></span>
              </div>

              <div class = "optin__form-group form-group">
                <input type = "text" class = "form-input optin__input" id = "optin-company">
                <label for = "optin-subject" class = "optin__label">{{ .Site.Params.home.formsubject }}</label>
                <span class = "input-underline"></span>
              </div>

              <div class = "optin__form-group form-group">
                <input type = "text" class = "form-input optin__input" id = "optin-company">
                 <label for = "optin-message" class = "optin__label">{{ .Site.Params.home.formsubject }}</label>
                <span class = "input-underline"></span>
              </div>

              <button class = "optin__btn btn btn--md btn--color btn--button">{{ .Site.Params.home.formsubmit }}</button>                 
            </form>
          </div>

Изменение .optin__form в CSS на display: relative дает мне желаемое поведение, но, к сожалению, оно применяется ко всем полям.

🤔 А знаете ли вы, что...
HTML поддерживает механизмы для встраивания JavaScript-кода для создания интерактивных элементов.


397
2

Ответы:

Не могли бы вы добавить и изменить свои стили, как показано ниже

.optin .form-group {
    position: relative;
}
.optin__title {
    margin-bottom: 70px;
}
.optin__input:focus ~ label {
    top: -45px;
}

Решено

Есть несколько вариантов, и все они достаточно просты. Вот один [который, как я думаю, из вашего описания, это то, что вы ищете]:

  • Поместите первые три элемента в отдельный div (я назвал его optin__form-row). Это будут поля имени/электронной почты/компании в верхней строке формы.
  • Установите display на flex на этом. Все будет по-прежнему выглядеть так же, поэтому:
  • Удалите display: flex; из класса .optin__form — вам не нужна форма while для гибкости, теперь вы просто хотите, чтобы элементы располагались друг над другом.
  • добавьте display:block и width:100% к .optin-input. Это подтолкнет элементы ввода к полной разрешенной ширине.

Вам все еще нужно немного отсортировать интервалы/отступы/поля, но это должно дать вам макет, который, я думаю, вы ищете.

.optin {
  background-color: #f7f9fa;
  border-radius: 5px;
  padding: 40px 70px 20px;
  box-shadow: 0px 20px 40px 0px rgba(61, 65, 84, 0.15);
}
.optin__title {
  font-size: 20px;
  margin-bottom: 32px;
}

.optin__form-row {
  display: flex;
  width: 100%;
}
/* NOTE I changed this from .optin .form-group
 * to `optin__form-group & added relative positioning: */
.optin__form-group {
  flex: 1 0 0;
  margin-right: 20px;
  margin-bottom: 20px;
  position: relative;
}
.optin__form-group--active > label {
  top: -20px;
  font-size: 14px;
  color: #fa6262;
}
.optin__label {
  position: absolute;
  font-weight: 500;
  font-size: 15px;
  top: 12px;
  left: 0;
  pointer-events: none;
  transition: all 0.2s ease-in-out;
}
.optin__input {
  padding: 0;
  margin-bottom: 0;
  font-size: 15px;
  font-weight: 500;
  background-color: transparent;
  border: 0;
  border-radius: 0;
  border-bottom: 1px solid #d5d9ed;
  display: block;
  width: 100%;
}
.optin__input:focus {
  background-color: transparent;
}
.optin__input:focus ~ label {
  top: -20px;
  font-size: 14px;
  color: #fa6262;
}
/* NOTE I'm just commenting this out for the purposes of
 * the snippet:

@media only screen and (max-width: 767px) {
  .optin {
    padding: 30px;
  }
  .optin__form {
    display: block;
  }
}
*/
<div class = "optin">
  <h3 class = "optin__title">Form Title</h3>
  <form class = "optin__form">
    <div class = "optin__form-row">
    <div class = "optin__form-group form-group">
      <input type = "text" class = "form-input optin__input" id = "optin-name" required>
      <label for = "optin-name" class = "optin__label">Name</label>
      <span class = "input-underline"></span>
    </div>

    <div class = "optin__form-group form-group">
      <input type = "email" class = "form-input optin__input" id = "optin-email" required>
      <label for = "optin-email" class = "optin__label">Email</label>
      <span class = "input-underline"></span>
    </div>

    <div class = "optin__form-group form-group">
      <input type = "text" class = "form-input optin__input" id = "optin-company">
      <label for = "optin-company" class = "optin__label">Company</label>
      <span class = "input-underline"></span>
    </div>
    </div>
    <div class = "optin__form-group form-group">
      <input type = "text" class = "form-input optin__input" id = "optin-company">
      <label for = "optin-subject" class = "optin__label">Subject</label>
      <span class = "input-underline"></span>
    </div>

    <div class = "optin__form-group form-group">
      <input type = "text" class = "form-input optin__input" id = "optin-company">
      <label for = "optin-message" class = "optin__label">Subject</label>
      <span class = "input-underline"></span>
    </div>

    <button class = "optin__btn btn btn--md btn--color btn--button">Submit</button>
  </form>
</div>