• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

如何使用 CSS 和一点 JavaScript 构建 Accordion 组件

在今天的教程中,我们将学习如何使用 css 和一点 javascript 构建一个显示/隐藏组件。默认情况下,jquery 提供了slideToggle 允许我们通过滑动创建手风琴的方法。我们的挑战是用纯 JavaScript 模仿这个功能。

这是我们将要创建的组件:

See the Pen  How to Build an Accordion Component With CSS and a Touch of JavaScript by Envato Tuts+ (@tutsplus)  on CodePen.

注意<details>:这是由and元素本身提供的功能<summary>,尽管这些功能尚未在 Microsoft 浏览器中得到支持。 

  • 如何使用 CSS 和一点 JavaScript 构建 Accordion 组件  第1张

1.  html

首先,我们定义一个元素,其类 container 包含两个子元素:

  • 隐藏和显示内容的按钮(包括内联 svg 图标)

  • 实际内容

看起来是这样的:

<div class="container">

  <!-- other content here -->

 

  <button class="toggle-btn">

    <span class="more show">

      Show More info

      <svg width="24" height="24" viewBox="0 0 24 24">

        <path d="M0 7.33l2.829-2.83 9.175 9.339 9.167-9.339 2.829 2.83-11.996 12.17z"/>

      </svg>

    </span>

    <span class="less hide">

      Show Less info

      <svg width="24" height="24" viewBox="0 0 24 24">

        <path d="M0 16.67l2.829 2.83 9.175-9.339 9.167 9.339 2.829-2.83-11.996-12.17z"/>

      </svg>

    </span>

  </button>

 

  <div class="info">

    <!-- content here -->

  </div>

 

  <!-- other content here -->

</div>

2.CSS  _

CSS 非常简单。我们需要定义两个辅助类(即hide和show)。 

为了隐藏和显示目标元素,我们将使用该height属性,但我们不会在 CSS 中指定它的值。相反,我们将通过 javaScript 动态设置高度值。 

需要注意的一点是,我们不使用该display属性来切换内容的可见性。该属性不属于 可动画CSS 属性。

下面是对应的 CSS 样式:

.hide {

  display: none;

}

 

.show {

  display: flex;

}

 

.info {

  overflow: hidden;

  transition: height .5s;

}

3.  JavaScript

现在是时候讨论我们的 JavaScript 代码应该如何工作了。

首先,一旦 dom 准备好,我们就获取.info元素的高度,然后立即将其值设置为 0。

const info = document.queryselector(".info");

 

let infoHeight = info.offsetHeight;

info.style.height = 0;

请记住,根据您的内容(例如,如果它包含图像),您可能必须将上面的代码包含在load事件中。

接下来,当 .toggle-btn 单击按钮时,我们执行以下操作:

  • .less切换和.more元素的可见性。

  • .info重新计算元素的高度。如果它是 0(最初我们给它这个值),这意味着内容是隐藏的,所以我们通过设置它的高度等于它的初始高度(存储在infoHeight变量中)来显示它。另一方面,如果内容可见,我们通过将其高度设置为 0 来隐藏它。

  • 或者,我们确保.toggle-btn在幻灯片动画完成之前只单击一次(持续 500 毫秒)。 

这是实现所有这些行为的代码:

const toggleBtn = document.querySelector(".toggle-btn");

const info = document.querySelector(".info");

const less = document.querySelector(".less");

const more = document.querySelector(".more");

 

// initial height

let infoHeight = info.offsetHeight;

 

toggleBtn.addeventListener("click", function() {

  this.disabled = true;

   

  more.classList.toggle("show");

  more.classList.toggle("hide");

  less.classList.toggle("show");

  less.classList.toggle("hide");

   

  const infoNewHeight = info.offsetHeight;

  if(infoNewHeight == 0) {

    info.style.height = `${infoHeight}px`;

  } else {

    info.style.height = 0;

  }

   

  setTimeout(() => {

    this.disabled = false;

  }, 500); 

});

浏览器调整大小

下一步是确保在调整浏览器窗口大小时组件能够正常工作。 

这是必要的JS代码:

// variable definitions here

 

window.addEventListener("resize", () => {

  info.style.removeProperty("height");

  infoHeight = info.offsetHeight;

  if(more.classList.contains("hide")) {

    info.style.height = `${infoHeight}px`;

  } else {

    info.style.height = 0;

  }

});

4. 浏览器支持

我们的演示应该在所有最新的浏览器和设备上都能正常工作。另外,像往常一样,我们使用 Babel 将 ES6 代码编译为 ES5。 

结论

在这个简短的教程中,我们使用 CSS 和 JavaScript 构建了一个手风琴风格的显示/隐藏组件。感谢动画 height属性,我们设法为我们的组件添加了滑入/滑出效果。 


文章目录
  • 1. html
  • 2.CSS _
  • 3. JavaScript
    • 浏览器调整大小
  • 4. 浏览器支持
  • 结论