javascript - 如何在 CSS 中重新创建此切换?
问题描述
我正在尝试在 CSS/HTML 和 JavaScript 中重新创建此切换。关闭时,切换显示标题:“Stap 2 Implementatie in deorganisatie”和一个图标(带有加号的圆圈)。打开时,它会显示一些文本,在其下方有一个带有可下载工具的部分,它们可以实现为彼此相邻的图像,但如果将图标和文本分开,它可能会更通用。
我已经设法创建了标题,它下面的文本,我只需要帮助:
- 关闭和打开切换的不同图标
- 切换中的额外绿色部分
- 如何在按钮上有 20px 的边框半径,但在单击/打开时只保留左上角和右上的边框半径。(见额外截图)
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
var panel = this.nextElementSibling;
if (panel.style.display === "block") {
panel.style.display = "none";
} else {
panel.style.display = "block";
}
});
}
.accordion {
background-color: #7d206a;
color: #fff;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 18px;
transition: 0.4s;
font-weight:600;
font-family:'Dosis';
border-top-left-radius:20px;
border-top-right-radius:20px;
}
.icon {
float:right;
}
.header {
color:#45b072;
}
.active, .accordion:hover {
background-color: #7d206a;
}
p {
color:#fff;
font-family:'Dosis';
}
.panel {
padding: 0 18px;
display: none;
background-color: #7d206a;
overflow: hidden;
border-bottom-left-radius:20px;
border-bottom-right-radius:20px;
}
<h2>Accordion</h2>
<button class="accordion"><span class="header">Stap 2</span> Implementatie in de organisatie<span class="icon">icon</span></button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
解决方案
这种观点可能有很多观点,但我认为你应该放弃panel.style.dipslay
并使用类方法。所以它的要点是你向包装器添加一个开放状态类,并在此基础上做一些事情。我已经为你做了一些设置,所以accordion-container--is-open
当手风琴打开时你可以使用这个类来处理你的 css
var accordions = document.querySelectorAll(".accordion-container");
accordions.forEach(element => {
const toggler = element.querySelector('.accordion')
toggler.addEventListener('click', function() {
element.classList.toggle('accordion-container--is-open')
})
})
.accordion {
display: flex;
align-items: center;
background-color: #7d206a;
color: #fff;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 18px;
transition: 0.4s;
font-weight: 600;
font-family: 'Dosis';
border-top-left-radius: 20px;
border-top-right-radius: 20px;
}
.icon {
margin-left: auto;
}
.accordion-container--is-open .icon {
color: aqua;
}
.header {
color: #45b072;
}
.active,
.accordion:hover {
background-color: #7d206a;
}
p {
color: #fff;
font-family: 'Dosis';
}
.panel {
display: none;
background-color: #7d206a;
overflow: hidden;
border-bottom-left-radius: 20px;
border-bottom-right-radius: 20px;
}
.panel > * {
padding: 0 18px;
}
.accordion-container--is-open .panel {
display: block;
}
.accordion__footer {
display: flex;
align-items: center;
height: 4rem;
background-color: lime;
}
.accordion__footer-icon {
width: 2rem;
height: 2rem;
background-color: aqua;
}
<h2>Accordion</h2>
<div class="accordion-container">
<button class="accordion"><span class="header">Stap 2</span> Implementatie in de organisatie<span class="icon">icon</span></button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<div class="accordion__footer">
<span class="accordion__footer-icon">1</span>
<span class="accordion__footer-icon">2</span>
<span class="accordion__footer-icon">3</span>
</div>
</div>
</div>
推荐阅读
- php - 更改 array_diff PHP 中的数组键
- php - 在 cakephp2.10 中使用 getLastInsertID 时获取 null
- ajax - csrf 令牌代码点火器 dropzone
- vue.js - 检测到重复键:“1”。这可能会导致更新错误。在 Vue 元素中
- android - 使用 Cygwin 构建 android-ndk-r17c 独立工具链
- flutter - 空置状态有什么意义?
- python - 在没有 Visual Studio 的情况下为 python 安装 MS C++ 14.0
- java - 使用 docx4j 复制多个 powerpoint 幻灯片
- oracle - 来自服务器的 SQL 加载程序 INFILE
- python - 在 Python 中按类对数据进行分组