单击按钮时旋转 Font Awesome 图标并触发手风琴过渡

2024-01-31

我是解决方案的一部分,但我坚持在单击实际的“披露”按钮时让 FA 图标旋转。我似乎也不知道该把它放在哪里transition属性,以便让披露内容框顺利打开,类似于手风琴,例如这个:

https://www.w3schools.com/howto/howto_js_accordion.asp https://www.w3schools.com/howto/howto_js_accordion.asp

但我认为转换不起作用,因为披露框内容设置为display: none;直到单击按钮并且 JS 得到处理以显示该框。

所以我猜想期望的反应是:单击按钮 -> FA Chevron 旋转 90 度指向下 -> 披露内容框以平滑过渡打开 -> 单击按钮关闭,过程相反。

我尝试将 FA 旋转嵌套在我的隐藏内容框 JS 中,因为我注意到单击公开按钮时 Firefox 的检查器中的“活动”状态,但这似乎没有什么区别。旋转图标的代码工作正常,但仅当单击图标本身而不是实际的公开按钮时才有效。

我试图通过向 FA 图标添加透明背景并让它在“披露”按钮后面运行来绕过它,但当然,然后整个背景都会旋转,而不仅仅是图标,所以这没有成功。

$(".discIconRotate").click(function() {
  $(this).toggleClass("iconDown");
})

var acc = document.getElementsByClassName("disclosureBtn");
var i;

for (i = 0; i < acc.length; i++) {
  acc[i].addEventListener("click", function() {
    this.classList.toggle("active");

    /* Toggle between hiding and showing the active panel */
    var disclosureContent = this.nextElementSibling;
    disclosureContent.classList.toggle("disclosureBlock");
    var disclosureBtn = this.nextElementSibling;
    disclosureBtn.classList.toggle("discIconRotate.iconDown");
  });
}
.specialContainer {
  display: flex;
  flex-direction: row;
  gap: 0.35em 0.35em;
  max-width: 1345px;
  flex-wrap: wrap;
  align-items: flex-start;
  background-color: transparent;
  margin: 0.35em auto 0em auto;
  padding: 0rem 0rem 0rem 0rem;
}

.specialContainer>div {
  background-color: #E7E6E6;
  position: relative;
  max-width: 1345px;
  text-align: center;
  outline: 1px solid black;
  float: left;
  width: calc(50% - 0.25em);
  height: auto;
  margin: 0em auto 0em auto;
  box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.6);
}

.disclosureContainer {
  display: block;
  width: 100%;
  height: auto;
  background-color: #E7E6E6;
  text-align: center;
  padding: 0em 0em 0em 0em;
  margin: 0em 0em 0em 0em;
}

.disclosureContent {
  font-family: Oswald Regular, Univers, Helvetica Neue, Helvetica, Arial;
  color: #646464;
  background: #E7E6E6;
  display: none;
  overflow: hidden;
  font-size: 0.6rem;
  line-height: 0.8rem;
  text-align: justify;
  font-weight: 400;
  text-justify: inter-word;
  margin: 0rem 0rem 0rem 0rem;
  padding: 0em 0.55em 0.1em 0.55em;
  transition: display 0.2s ease-out;
}

.disclosureBtn {
  background-color: transparent;
  border: none;
  border-collapse: collapse;
  width: 100%;
  height: 18px;
  display: block;
  margin: 0em auto 0em auto;
  padding: 0em 0em 0em 0em;
  cursor: pointer;
  text-decoration: none;
  transform: translateY(-5px);
}

.disclosureBtnTxt {
  font-family: Oswald Regular, Univers, Helvetica Neue, Helvetica, Arial;
  font-weight: 400;
  display: inline-block;
  color: #646464;
  padding: 0em 0em 0em 0em;
  margin: 0em auto 0em auto;
  text-align: center;
  text-decoration: none;
  font-size: 0.5rem;
  line-height: 0.8rem;
  letter-spacing: 0.01rem;
  cursor: pointer;
}

.fa-chevron-right {
  color: #646464;
  display: inline-block;
  font-size: 0.5rem;
  margin: 0rem 0rem 0rem 0rem;
  padding: 0rem 0rem 0rem 0rem;
  transition: 0.2s all;
}

.discIconRotate {
  transform-origin: center;
  -moz-transition: all 0.2s linear;
  -webkit-transition: all 0.2s linear;
  transition: all 0.2s linear;
}

.discIconRotate.iconDown {
  transform-origin: center;
  -moz-transform: rotate(90deg);
  -webkit-transform: rotate(90deg);
  transform: rotate(90deg);
}

.disclosureBlock {
  display: block;
}
<link rel=" stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" integrity="sha512-1ycn6IcaQQ40/MKBW2W4Rhis/DbILU74C1vSrLJxCq57o941Ym01SwNsOMqvEBFlcgUa6xLiPY/NS5R+E6ztJQ==" crossorigin="anonymous" referrerpolicy="no-referrer">

<div class="specialContainer">
  <div class="row">
    Offer Container 1
    <section class="disclosureContainer">
      <a class="disclosureBtn">
        <p class="disclosureBtnTxt"><i class="fa fa-chevron-right discIconRotate"></i>&nbsp;Disclosure</p>
      </a>
      <p class="disclosureContent">
        Lorem ipsum dolor sit amet, consectetur adipiscing 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. Duis aute irure dolor
        in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
    </section>
  </div>
  <div class="row">
    Offer Container 2
    <section class="disclosureContainer">
      <a class="disclosureBtn">
        <p class="disclosureBtnTxt"><i class="fa fa-chevron-right discIconRotate"></i>&nbsp;Disclosure</p>
      </a>
      <p class="disclosureContent">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore m`agna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </p>
    </section>
  </div>
  <div class="row">
    Offer Container 3
    <section class="disclosureContainer">
      <a class="disclosureBtn">
        <p class="disclosureBtnTxt"><i class="fa fa-chevron-right discIconRotate"></i>&nbsp;Disclosure</p>
      </a>
      <p class="disclosureContent">
        Lorem ipsum dolor sit amet, consectetur adipiscing 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>
    </section>
  </div>
  <div class="row">
    Offer Container 4
    <section class="disclosureContainer">
      <a class="disclosureBtn">
        <p class="disclosureBtnTxt"><i class="fa fa-chevron-right discIconRotate"></i>&nbsp;Disclosure</p>
      </a>
      <p class="disclosureContent">
        Lorem ipsum dolor sit amet, consectetur adipiscing 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>
    </section>
  </div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

这是我的jsfiddle:http://jsfiddle.net/astombaugh/7no5xzmr/98/ http://jsfiddle.net/astombaugh/7no5xzmr/98/


只需将图标类切换语句移至按钮单击处理程序中,并相应地调整 CSS。 (使用 CSS 遍历 DOM 通常比使用 JavaScript 更容易,但两者都可以。)

就文本转换而言,我实现了一个简单的最大高度/不透明度解决方案,但这可能无法适应广泛变化的内容高度。看我怎样才能过渡高度:0;高度:自动;使用CSS? https://stackoverflow.com/questions/3508605/how-can-i-transition-height-0-to-height-auto-using-css以获得更多选择。

其他提示:

  • 除非您实际上支持古老的浏览器,否则您不需要这些供应商前缀。看https://caniuse.com/css-transitions https://caniuse.com/css-transitions.
  • 您可能不应该使用段落元素来包含按钮。这不是段落内容。我已经用 div 替换了它们。看https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p.
  • 您将 jQuery 与原始 JavaScript 混合在一起。我会使用其中之一。要么全面利用 jQuery,要么(更好)努力消除它(如果您确实不需要它)。看https://youmightnotneedjquery.com https://youmightnotneedjquery.com.
  • 考虑使用const and let代替var。它们更现代、更具体。看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const and https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let.
  • 如果您创建的常量或变量仅用于一种用途,请考虑替换该值以减少代码。
  • 浮动是一种麻烦且过时的布局技术。它们几乎没有合法用途,应该避免使用内联块和弹性盒策略。 (无论如何,这里似乎没有必要。我已经将其删除了。)
const acc = document.getElementsByClassName("disclosureBtn");
let i;

for (i = 0; i < acc.length; i++) {
  acc[i].addEventListener("click", function() {
    this.classList.toggle("active");
    this.classList.toggle("iconDown");

    // Toggle between hiding and showing the active panel
    this.nextElementSibling.classList.toggle("disclosureBlock");
    this.nextElementSibling.classList.toggle("discIconRotate.iconDown");
  });
}
.specialContainer {
  display: flex;
  flex-direction: row;
  gap: 0.35em 0.35em;
  max-width: 1345px;
  flex-wrap: wrap;
  align-items: flex-start;
  background-color: transparent;
  margin: 0.35em auto 0em auto;
  padding: 0rem 0rem 0rem 0rem;
}

.specialContainer .row {
  background-color: #E7E6E6;
  position: relative;
  max-width: 1345px;
  text-align: center;
  outline: 1px solid black;
  width: calc(50% - 0.25em);
  height: auto;
  margin: 0em auto 0em auto;
  box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.6);
}

.disclosureContainer {
  display: block;
  width: 100%;
  height: auto;
  background-color: #E7E6E6;
  text-align: center;
  padding: 0em 0em 0em 0em;
  margin: 0em 0em 0em 0em;
}

.disclosureContent {
  font-family: Oswald Regular, Univers, Helvetica Neue, Helvetica, Arial;
  color: #646464;
  background: #E7E6E6;
  max-height: 0;
  opacity: 0;
  overflow: hidden;
  font-size: 0.6rem;
  line-height: 0.8rem;
  text-align: justify;
  font-weight: 400;
  text-justify: inter-word;
  margin: 0rem 0rem 0rem 0rem;
  padding: 0em 0.55em 0.1em 0.55em;
  transition: all 0.2s ease-out;
}

.disclosureBtn {
  background-color: transparent;
  border: none;
  border-collapse: collapse;
  width: 100%;
  height: 18px;
  display: block;
  margin: 0em auto 0em auto;
  padding: 0em 0em 0em 0em;
  cursor: pointer;
  text-decoration: none;
  transform: translateY(-5px);
}

.disclosureBtnTxt {
  font-family: Oswald Regular, Univers, Helvetica Neue, Helvetica, Arial;
  font-weight: 400;
  display: inline-block;
  color: #646464;
  padding: 0em 0em 0em 0em;
  margin: 0em auto 0em auto;
  text-align: center;
  text-decoration: none;
  font-size: 0.5rem;
  line-height: 0.8rem;
  letter-spacing: 0.01rem;
  cursor: pointer;
}

.fa-chevron-right {
  color: #646464;
  display: inline-block;
  font-size: 0.5rem;
  margin: 0rem 0rem 0rem 0rem;
  padding: 0rem 0rem 0rem 0rem;
  transition: 0.2s all;
}

.discIconRotate {
  transform-origin: center;
  transition: all 0.2s linear;
}

.iconDown .fa {
  transform-origin: center;
  transform: rotate(90deg);
}

.disclosureBlock {
  max-height: 100px;
  opacity: 1;
}
<link rel=" stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" integrity="sha512-1ycn6IcaQQ40/MKBW2W4Rhis/DbILU74C1vSrLJxCq57o941Ym01SwNsOMqvEBFlcgUa6xLiPY/NS5R+E6ztJQ==" crossorigin="anonymous" referrerpolicy="no-referrer">

<div class="specialContainer">
  <div class="row">
    Offer Container 1
    <section class="disclosureContainer">
      <a class="disclosureBtn">
        <div class="disclosureBtnTxt"><i class="fa fa-chevron-right discIconRotate"></i>&nbsp;Disclosure</div>
      </a>
      
      <p class="disclosureContent">
        Lorem ipsum dolor sit amet, consectetur adipiscing 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. Duis aute irure dolor
        in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
    </section>
  </div>
  
  <div class="row">
    Offer Container 2
    <section class="disclosureContainer">
      <a class="disclosureBtn">
        <div class="disclosureBtnTxt"><i class="fa fa-chevron-right discIconRotate"></i>&nbsp;Disclosure</div>
      </a>
      
      <p class="disclosureContent">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore m`agna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </p>
    </section>
  </div>
  
  <div class="row">
    Offer Container 3
    <section class="disclosureContainer">
      <a class="disclosureBtn">
        <div class="disclosureBtnTxt"><i class="fa fa-chevron-right discIconRotate"></i>&nbsp;Disclosure</div>
      </a>
      
      <p class="disclosureContent">
        Lorem ipsum dolor sit amet, consectetur adipiscing 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>
    </section>
  </div>
  
  <div class="row">
    Offer Container 4
    <section class="disclosureContainer">
      <a class="disclosureBtn">
        <div class="disclosureBtnTxt"><i class="fa fa-chevron-right discIconRotate"></i>&nbsp;Disclosure</div>
      </a>
      
      <p class="disclosureContent">
        Lorem ipsum dolor sit amet, consectetur adipiscing 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>
    </section>
  </div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单击按钮时旋转 Font Awesome 图标并触发手风琴过渡 的相关文章

随机推荐

  • 存储过程中的返回计数

    我编写了一个存储过程来返回计数 但我得到了一个空值 谁能告诉我我的存储过程中的问题出在哪里 set ANSI NULLS ON set QUOTED IDENTIFIER ON go ALTER PROCEDURE dbo Validate
  • 如何在没有安装服务器的情况下设置 MySQL Workbench 的客户端配置?

    假设我在没有服务器的 Windows 7 上安装了 MySQL Workbench 并且正在连接到远程服务器 如何为工作台设置客户端配置 如 my ini 中的 client 部分 或者也许我以错误的方式获取它并且客户端从它连接到的服务器加
  • Java - Spring Ws - 在 XSD 文件中加载相对包含 (Tomcat 8)

    我创建了一个 Spring Web 服务 它使用以下代码从 XSD 文件集合创建动态 WSDL Resource schema new ClassPathResource schema service XCPD SupportMateria
  • Typescript 中的泛型类型返回

    我有一个 Interface find 其中包含方法 cal 类a1和a2实现了该接口 a1 返回数字 a2 返回字符串 我如何定义一个接口来解决我的问题 下面是所提到内容的片段 interface Ifind cal string cla
  • 用于 Docker 的部署 Rails 应用

    阅读了很多资源 但从部署的角度仍然对 Docker 感到困惑 尝试找出 Docker 环境下 Rails 应用程序的最佳实践 特别感兴趣如何解决以下问题 1 从先前部署的容器访问日志 可以停止 销毁该容器 Rsyslog 系统日志 2 回滚
  • 如何在多项选择的表单服务中分配Go_To_Page?

    刚刚开始在 Google Apps 脚本中使用表单服务 需要根据给出的答案引导表单将用户带到特定页面 这是我当前的代码 form addMultipleChoiceItem setTitle What would you like to d
  • JQuery - 获取调用元素 id

    Problem 在自动完成的源函数中 我想获取选择器的 ID 有没有办法可以遍历调用堆栈并得到这个 做JQuery有这个抽象级别吗 Why 我将在页面上有多个自动完成功能 并且每个自动完成功能将在服务器端以不同的方式处理 我必须使用另一个函
  • 仪器中没有出现泄漏,即使我确信它们存在

    我正在检查仪器是否有泄漏 并且我已设置每秒检查一次 但没有出现泄漏 我确信我的应用程序中一定有一些 有什么可以阻止这些出现吗 有没有一种好方法可以创建泄漏 以便我可以测试仪器中是否出现泄漏 Thanks 创建泄漏很容易 id someObj
  • C++17 中的 std::make_shared() 更改

    In cppref http en cppreference com w cpp memory shared ptr make shared 以下情况直到 C 17 才成立 代码如f std shared ptr
  • 有没有类似 CSS 源映射的东西?

    我使用 jQuery 动态地将 CSS 标签添加到页面中 text css appendTo document head 在 Chrome 开发者工具中查看时 所有 CSS 都显示为 localhost 这并不总是有帮助 有没有类似 CSS
  • DataGrid ScrollIntoView - 如何滚动到未显示的第一行?

    我正在尝试向下滚动带有代码的 WPF DataGrid 我用 int itemNum 0 private void Down Click object sender RoutedEventArgs e if itemNum 1 gt dat
  • C++1y 没有从 std::bind 到 std::function 的可行转换

    我正在尝试将转发函数存储到std function 如果我使用std bind 我收到错误消息 例如no viable conversion from 如果我使用 lambda 它编译没问题 这是示例代码 include
  • 输入文本框后台的 jQuery 自动完成

    我有一个 jQuery 文本框自动完成脚本 它使用 PHP 脚本来查询 MySQL 数据库 目前 结果显示在文本框下方 但我希望它看起来就像在文本框中淡出一样 我怎样才能做这样的事情 Google Instant 搜索框就是一个例子 我当前
  • Memcached – GET 和 SET 操作是原子的吗?

    场景如下 一个查询 memcached 缓存的简单网站 批处理作业每 10 15 分钟更新一次相同的缓存 使用该模式是否会出现任何问题 例如缓存未命中 我担心所有可能发生的比赛状况 例如 如果网站对 memcached 中缓存的对象执行 G
  • 以 Scaffold 作为子项的 InheritedWidget 似乎不起作用

    我希望在 Flutter 应用程序的根级别使用 InheritedWidget 以确保经过身份验证的用户的详细信息可供所有子小部件使用 本质上使 Scaffold 成为 IW 的子级 如下所示 override Widget build B
  • WebView 不接受某些 cookie

    我正在 Webview 中加载一个网站 该网站使用一些 cookie 来存储会话 我写了以下几行来接受cookie CookieSyncManager createInstance this CookieSyncManager getIns
  • DOM4J:检索按属性值过滤的节点值

    我有一个给定的 xml 结构如下
  • iOS 17 中的 SwiftUI View 泄漏

    似乎 View 及其成员在演示后不会取消分配 main struct ExampleApp SwiftUI App State var show false var body some Scene WindowGroup VStack Bu
  • 如何使用openlayers在浏览器中显示高分辨率图像

    我正在尝试使用 openlayers 5 在浏览器中显示高分辨率图像 我找到了一个有关如何使用 Zoomify 创建图像图块并使用 openlayers 地图渲染它的示例 但我无法将它用于我自己的形象 我对此完全陌生 我问的问题可能很琐碎
  • 单击按钮时旋转 Font Awesome 图标并触发手风琴过渡

    我是解决方案的一部分 但我坚持在单击实际的 披露 按钮时让 FA 图标旋转 我似乎也不知道该把它放在哪里transition属性 以便让披露内容框顺利打开 类似于手风琴 例如这个 https www w3schools com howto