Формы открываются по клику на кнопки
<section>
<div class="container">
<div class="form">
<fieldset>
<button class="button">Добавить подписку</button>
<button class="button">Убрать подписку</button>
<button class="button">Посмотреть подписку</button>
</fieldset>
</div>
</div>
</section>
</section>
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
section {
min-height: 100vh;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
background-color: aliceblue;
}
fieldset{
margin: 0;
padding: 0;
border: none;
display: grid;
}
.container {
max-width: 400px;
width: 90%;
padding: 20px;
box-shadow: 0px 0px 20px #00000020;
border-radius: 8px;
background-color: white;
}
.button {
width: 100%;
height: 40px;
background-color: #563C68;
border: none;
font-size: 15px;
color: #fff;
cursor: pointer;
margin: 20px 0;
padding: 10px;
}
Есть форма fieldset внутри нее кнопки, при нажатии на каждую из кнопок должно открываться индивидуальная форма и появляться вместо предыдущей.
Подскажите, пожалуйста, как такое можно реализовать? Необходимо использовать чистый JS
Ответы (2 шт):
Автор решения: Проста Miha
Как же с девушками сложно).
Но я постарался и вот что получилось
→ Ссылка
Вот что я придумал, надеюсь это вам поможет
P.S : Кнопку закрытия вы можете поменять на любую иконку, изобрадения и т.д но не забудьте добавить класс btn-close
const overlay = document.querySelectorAll(".button");
const btns = document.querySelectorAll(".btn-close");
for(let i = 0 ; i < overlay.length; i++){
overlay[i].addEventListener("click", function(){
this.nextElementSibling.classList.toggle("active");
})
btns[i].addEventListener("click", function(){
this.parentElement.parentElement.classList.toggle("active");
})
}
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
section {
min-height: 100vh;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
background-color: aliceblue;
}
fieldset{
margin: 0;
padding: 0;
border: none;
display: grid;
}
.container {
max-width: 400px;
width: 90%;
padding: 20px;
box-shadow: 0px 0px 20px #00000020;
border-radius: 8px;
background-color: white;
}
.button {
width: 100%;
height: 40px;
background-color: #563C68;
border: none;
font-size: 15px;
color: #fff;
cursor: pointer;
margin: 20px 0;
padding: 10px;
}
.overlay{
position: fixed;
width: 100%;
height: 100%;
display: none;
justify-content: center;
align-items: center;
top: 0;
left: 0;
background-color: rgba(0, 0, 0, .4);
}
.overlay > div{
position: relative;
width: 640px;
padding: 24px;
background-color: white;
}
.overlay > div h1{
text-align: center;
margin-bottom: 24px;
}
.overlay span{
position: absolute;
right: 24px;
top: 24px;
font-size: 1.5em;
cursor: pointer;
}
.active{
display: flex;
}
<section>
<div class="container">
<div class="form">
<fieldset>
<button class="button">Добавить подписку</button>
<div class="overlay">
<div>
<h1>Добавить подписку</h1><span class="btn-close">X</span>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Provident eaque, quo possimus corrupti accusantium ab. Quas vitae atque a temporibus labore sunt, ullam rerum eaque tenetur, quisquam quidem, officia unde.</p>
</div>
</div>
<button class="button">Убрать подписку</button>
<div class="overlay">
<div>
<h1>Убрать подписку</h1><span class="btn-close">X</span>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Provident eaque, quo possimus corrupti accusantium ab. Quas vitae atque a temporibus labore sunt, ullam rerum eaque tenetur, quisquam quidem, officia unde.</p>
</div>
</div>
<button class="button">Посмотреть подписку</button>
<div class="overlay">
<div>
<h1>Посмотреть подписку</h1><span class="btn-close">X</span>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Provident eaque, quo possimus corrupti accusantium ab. Quas vitae atque a temporibus labore sunt, ullam rerum eaque tenetur, quisquam quidem, officia unde.</p>
</div>
</div>
</fieldset>
</div>
</div>
</section>
Как же с девушками сложно).
Но я постарался и вот что получилось
const btnsNext = document.querySelectorAll(".btn-next");
const btnsPrev = document.querySelectorAll(".btn-prev");
for (let i = 0; i < btnsNext.length; i++) {
btnsNext[i].addEventListener("click", nextForm);
}
for (let i = 0; i < btnsPrev.length; i++) {
btnsPrev[i].addEventListener("click", prevForm);
}
function nextForm() {
this.parentElement.parentElement.parentElement.classList.remove("active");
this.parentElement.parentElement.parentElement.nextElementSibling.classList.add("active");
}
function prevForm() {
this.parentElement.parentElement.parentElement.classList.remove("active");
this.parentElement.parentElement.parentElement.previousElementSibling.classList.add("active");
}
body {
width: 100%;
min-height: 100vh;
margin: 0;
display: flex;
justify-content: center;
align-items: center;
font-family: consolas;
}
form {
width: 375px;
box-shadow: 0 0 5px 0 rgba(0, 0, 0, .4);
padding: 24px;
}
.block-form {
display: none;
}
.active {
display: flex;
justify-content: center;
align-items: center;
flex-wrap: wrap;
}
.sub-block-form {
width: 100%;
display: flex;
flex-wrap: wrap;
margin: 24px 0;
}
.sub-block-form label {
width: 100%;
font-size: 20px;
margin-bottom: 12px;
}
.sub-block-form input,
.sub-block-form select {
padding: 6px 12px;
width: 100%;
}
.form-btn {
display: flex;
justify-content: space-between;
}
.sub-block-form button,
.sub-block-form input[type="submit"] {
padding: 12px 24px;
cursor: pointer;
width: auto;
}
<form>
<div class="block-form form-1 active">
<h3>Шаг 1</h3>
<div class="sub-block-form">
<label for="firstname">Имя</label>
<input type="text" id="firstname">
</div>
<div class="sub-block-form">
<label for="lastname">Фамилия</label>
<input type="text" id="lastname">
</div>
<div class="sub-block-form form-btn">
<div class="sub-block-form-left"></div>
<div class="sub-block-form-right"><button type="button" class="btn-next">Дальше</button></div>
</div>
</div>
<div class="block-form form-2">
<h3>Шаг 1</h3>
<div class="sub-block-form">
<label for="email">Почта</label>
<input type="email" id="email">
</div>
<div class="sub-block-form">
<label for="age">Возраст</label>
<input type="email" id="age">
</div>
<div class="sub-block-form">
<label for="sex">Пол</label>
<select value="" id="sex">
<option value="f">Женский</option>
<option value="m">Мужской</option>
</select>
</div>
<div class="sub-block-form form-btn">
<div class="sub-block-form-left"><button type="button" class="btn-prev">Назад</button></div>
<div class="sub-block-form-right"><button type="button" class="btn-next">Дальше</button></div>
</div>
</div>
<div class="block-form form-3">
<h3>Шаг 1</h3>
<div class="sub-block-form">
<label for="password">Пароль</label>
<input type="password" id="password">
</div>
<div class="sub-block-form">
<label for="confirm-password">Повторите пароль</label>
<input type="password" id="confirm-password">
</div>
<div class="sub-block-form form-btn">
<div class="sub-block-form-left"><button type="button" class="btn-prev">Назад</button></div>
<div class="sub-block-form-right"><input type="submit" value="Отправить"></div>
</div>
</div>
</form>
Автор решения: WestVell
→ Ссылка
почему бы не сделать скрытый элемент popup и повесть слушатель на кнопку при клике на которую будет classList.add добавлять класса со всплытием окна с popup
<button type="button"
aria-label="Кнопка редактирования профиля"
class="button button_item_edit"></button>
<div class="popup popup_element_profile">
какой-то контент
</div>
.popup {
display: flex;
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
justify-content: center;
align-items: center;
background-color: rgba(0, 0, 0, 0.5);
opacity: 0;
visibility: hidden;
transition: visibility 1s, opacity .5s ease;
}
.popup_open {
visibility: visible;
opacity: 1;
}
const handleClick = document.querySelector('.button_item_edit')
const popupElement = document.querySelector('.popup_element_profile')
handleClick.addEventListener('click', () => popupElement.classList.add('popup_open'))
как-то так только свои переменные и имена классов