В настоящее время я немного разбираюсь в HTML и CSS, но мне трудно понять, как заставить эту форму вести себя так, как я хотел бы. Цель состоит в том, чтобы первые три поля сохранили свое текущее поведение, но чтобы поля Тема и Сообщение были соответствующего размера и располагались на отдельных строках.
Я пытался добавить div
s, изменить настройки отображения и положения в классе и добавить отдельные классы, чтобы попытаться настроить таргетинг на поля, которые я хочу вести по-другому.
.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-кода для создания интерактивных элементов.
Не могли бы вы добавить и изменить свои стили, как показано ниже
.optin .form-group {
position: relative;
}
.optin__title {
margin-bottom: 70px;
}
.optin__input:focus ~ label {
top: -45px;
}
Есть несколько вариантов, и все они достаточно просты. Вот один [который, как я думаю, из вашего описания, это то, что вы ищете]:
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>