html - 如何确保高度:0;也包括填充?
问题描述
我有这个整洁的 CSS 手风琴,它工作得很好,直到我尝试在.accordBody
.
手风琴的整个“魔力”由简单的技巧组成,即增加.accordBody
from0
到125px
the:focus
的高度.accordHeader
。
.accordion {
border: solid 1px #cccccc;
border-radius: 0.25rem;
box-shadow: 0 2px 4px -1px #b3b3b3;
}
.accordion .accord .accordHeader,
.accordion .accord .accordBody {
background-color: #fff;
padding: 1rem;
}
.accordion .accord .accordHeader {
border-bottom: solid 1px #cccccc;
color: #000;
cursor: pointer;
}
.accordion .accord .accordBody {
padding: 0;
box-shadow: inset 0px 2px 4px -1px #e6e6e6;
height: 0;
transition: height 250ms ease;
overflow: hidden;
}
.accordion .accord:focus>*~.accordBody {
height: 125px;
overflow: auto;
}
.accordion .accord:focus+.accord .accordHeader {
border-top: solid 1px #cccccc;
}
<div class="accordion">
<div class="accord" tabindex="0">
<div class="accordHeader">
Header
</div>
<div class="accordBody">
Body
</div>
</div>
<div class="accord" tabindex="0">
<div class="accordHeader">
Header
</div>
<div class="accordBody">
Body
</div>
</div>
<div class="accord" tabindex="0">
<div class="accordHeader">
Header
</div>
<div class="accordBody">
Body
</div>
</div>
现在从视觉上看,这看起来并不美观,因为.accordBody
. 但是,如果我现在尝试添加所述填充,则设计会中断,因为填充会导致保持打开.accordBody
,尽管它height
设置为0
。
.accordion {
border: solid 1px #cccccc;
border-radius: 0.25rem;
box-shadow: 0 2px 4px -1px #b3b3b3;
}
.accordion .accord .accordHeader,
.accordion .accord .accordBody {
background-color: #fff;
padding: 1rem;
}
.accordion .accord .accordHeader {
border-bottom: solid 1px #cccccc;
color: #000;
cursor: pointer;
}
.accordion .accord .accordBody {
box-shadow: inset 0px 2px 4px -1px #e6e6e6;
height: 0;
transition: height 250ms ease;
overflow: hidden;
}
.accordion .accord:focus > * ~ .accordBody {
height: 125px;
overflow: auto;
}
.accordion .accord:focus + .accord .accordHeader {
border-top: solid 1px #cccccc;
}
<div class="accordion">
<div class="accord" tabindex="0">
<div class="accordHeader">
Header
</div>
<div class="accordBody">
Body
</div>
</div>
<div class="accord" tabindex="0">
<div class="accordHeader">
Header
</div>
<div class="accordBody">
Body
</div>
</div>
<div class="accord" tabindex="0">
<div class="accordHeader">
Header
</div>
<div class="accordBody">
Body
</div>
</div>
</div>
我如何确保它也height: 0;
包括填充?
解决方案
添加一个额外的容器并考虑边距而不是填充
.accordion {
border: solid 1px #cccccc;
border-radius: 0.25rem;
box-shadow: 0 2px 4px -1px #b3b3b3;
}
.accordion .accord .accordHeader {
background-color: #fff;
padding: 1rem;
}
.accordion .accord .accordBody {
background-color: #fff;
}
.accordion .accord .accordBody > div {
margin:1rem;
}
.accordion .accord .accordHeader {
border-bottom: solid 1px #cccccc;
color: #000;
cursor: pointer;
}
.accordion .accord .accordBody {
box-shadow: inset 0px 2px 4px -1px #e6e6e6;
height: 0;
transition: height 250ms ease;
overflow: hidden;
}
.accordion .accord:focus > * ~ .accordBody {
height: 125px;
overflow: auto;
}
.accordion .accord:focus + .accord .accordHeader {
border-top: solid 1px #cccccc;
}
<div class="accordion">
<div class="accord" tabindex="0">
<div class="accordHeader">
Header
</div>
<div class="accordBody">
<div>Body</div>
</div>
</div>
<div class="accord" tabindex="0">
<div class="accordHeader">
Header
</div>
<div class="accordBody">
<div>Body</div>
</div>
</div>
<div class="accord" tabindex="0">
<div class="accordHeader">
Header
</div>
<div class="accordBody">
<div>Body</div>
</div>
</div>
</div>
如果没有额外的包装,您可以考虑使用伪元素的一些技巧:
.accordion {
border: solid 1px #cccccc;
border-radius: 0.25rem;
box-shadow: 0 2px 4px -1px #b3b3b3;
}
.accordion .accord .accordHeader {
background-color: #fff;
padding: 1rem;
}
.accordion .accord .accordBody {
background-color: #fff;
padding:0 1rem;
}
.accordion .accord .accordBody:before,
.accordion .accord .accordBody:after{
content:"";
display:block;
height:min(100%,1rem); /* don't make it more than 1rem and it will be 0 on collapse due to 100%x0 */
}
.accordion .accord .accordHeader {
border-bottom: solid 1px #cccccc;
color: #000;
cursor: pointer;
}
.accordion .accord .accordBody {
box-shadow: inset 0px 2px 4px -1px #e6e6e6;
height: 0;
transition: height 250ms ease;
overflow: hidden;
}
.accordion .accord:focus > * ~ .accordBody {
height: 125px;
overflow: auto;
}
.accordion .accord:focus + .accord .accordHeader {
border-top: solid 1px #cccccc;
}
<div class="accordion">
<div class="accord" tabindex="0">
<div class="accordHeader">
Header
</div>
<div class="accordBody">
Body
</div>
</div>
<div class="accord" tabindex="0">
<div class="accordHeader">
Header
</div>
<div class="accordBody">
Body
</div>
</div>
<div class="accord" tabindex="0">
<div class="accordHeader">
Header
</div>
<div class="accordBody">
Body
</div>
</div>
</div>
推荐阅读
- python - Python Flask DateField 禁用周末
- linux-kernel - 错误:来自不兼容指针类型的赋值 [-Werror=incompatible-pointer-types]
- java - 如何在同一个班级发送电子邮件和短信?
- accessibility - JAWS 脚本会覆盖屏幕阅读器读取 DOM 的能力吗?
- java - 如果列表已经存在,如何将列表插入表而不重复它们(使用 Spring 和 Hibernate)
- nao-robot - 如何在对话中读取语音输入?奇聊
- javascript - npm 运行脚本 < 出乎意料
- html - 忽略嵌入式 DIV 的 CSS 边距
- groovy - 如何从 SOAPUI 中的 Json 响应中提取子字符串值
- r - 创建日期向量,更改因子和格式