Eyoz

CSS 制作内容折叠面板


实现思路:面板默认为折叠状态,点击面板展开内容,再次点击收缩面板。使用 <input><label> 来制作内容区域,模拟点击事件,并使用伪类选择器 :checked 模拟点击状态,选中则展开内容,反之则收缩内容。

<div class="accordion">
  <input type="checkbox" class="accordion__input" id="accordion--1" />
  <label for="accordion--1" class="accordion__label">
    <p class="accordion__label--number">01</p>
    <p class="accordion__label--text">Click to expand the content.</p>
    <svg
      xmlns="http://www.w3.org/2000/svg"
      class="accordion__label--icon"
      fill="none"
      viewBox="0 0 24 24"
      stroke="currentColor"
      stroke-width="2">
      <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7" />
    </svg>

    <div class="accordion__label--content">
      <p>
        Lorem ipsum, dolor sit amet consectetur adipisicing elit. Accusantium
        dolor at sequi obcaecati cupiditate. Voluptates repellendus cupiditate
        aperiam! Incidunt amet quo neque.
      </p>
      <ul>
        <li>Lorem ipsum, dolor sit amet consectetur adipisicing elit.</li>
        <li> Quasi accusamus corporis totam tempora suscipit ab obcaecati. </li>
        <li>Tempora, et atque officia at consequatur laborum!</li>
        <li>Repudiandae praesentium illo voluptate in, atque enim.</li>
      </ul>
    </div>
  </label>
</div>
*,
*::before,
*::after {
  margin: 0;
  padding: 0;
  box-sizing: inherit;
}

html {
  box-sizing: border-box;
}

body {
  font-family: sans-serif;
  color: #343a40;
}

.accordion {
  width: 700px;
  margin: 40px auto;
  background-color: #fff;
  box-shadow: 0 0 4px rgba(0, 0, 0, 0.15);
}

.accordion__input {
  opacity: 0;
  visibility: hidden;
}

.accordion__label {
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: 24px;
  align-items: center;
  padding: 0 24px;
}

.accordion__label--content {
  grid-column: 2 / 3;
  height: 0;
  opacity: 0;
  visibility: hidden;
  overflow: hidden;
  transition: all 0.5s;
}

.accordion__label--content p {
  margin-bottom: 24px;
  line-height: 1.7;
}

.accordion__label--content ul {
  margin-left: 20px;
  color: #868e96;
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.accordion__input:checked ~ .accordion__label .accordion__label--content {
  height: 270px;
  opacity: 1;
  visibility: visible;
  padding-bottom: 10px 0;
}

.accordion__label--number,
.accordion__label--text {
  font-size: 24px;
  font-weight: 500;
}

.accordion__label--icon {
  width: 24px;
  height: 24px;
  stroke: #087f5b;
}

.accordion__label--number {
  color: #ced4da;
}