如何用JS在按钮点击时显示不同的div?

2024-03-28

我正在尝试制作一个有 2 张卡片的部分,每张卡片都有一个按钮和一个小的描述性文本。 我想要实现的是,当我单击按钮时,会发生 3 件事:

1 该按钮更改内容,从“+”变为“-”,但这是我最不担心的。

2 一个div显示与该卡对应的信息,占用100 vw 和

3、如果显示一个div并点击另一张卡上的另一个按钮,第一个div消失,第二个div出现并占据100vw

-----我在用什么?我正在使用 HTML5、CSS、Vanilla Js、Bootstrap(主要用于 css)-----

这就是我想要实现的目标:

这就是我所取得的成就:

var jsaccordion = {
    init : function (target) {  
      var headers = document.querySelectorAll("#" + target + " .accordion-btn");
      if (headers.length > 0) { for (var head of headers) {
        head.addEventListener("click", jsaccordion.select);
      }}
    },

    select : function () {        
      this.classList.toggle("open");
    }
  };
  window.addEventListener('load', function(){
    jsaccordion.init("accordion-container");
  });
.accordion-text {
  display: none;
  color: #808080;
  padding: 15px;
  border: 1px solid #ffcc4b;
}
.accordion-btn.open + .accordion-text{
  display: block;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet"/>

<div class='row'>
<div id="accordion-container" class='col-6'>
    <div class="my-3">
      <h3 class=" text-center">First one</h3>
      <button class='mx-auto d-block accordion-btn btn btn-white border-primary'>+</button>
         <div class="accordion-text">
            <p>
some specific and special information for the first div.</p>
         </div>
     </div>
</div>
           
<div id="accordion-container" class='col-6'>
    <div class="my-3">
      <h3 class='text-center'>second one</h3>
       <button class='mx-auto d-block accordion-btn btn btn-white border-primary'>+</button>
        
         <div class="accordion-text">
            <p>some specific and special information for the second div.</p>
         </div>
     </div>
</div>
          
</div>

请帮助我,我不知道该怎么做


在 jQuery 中执行此操作要容易得多,但以下是我使用 Vanilla JS 的方法。

  • 这个想法是,将不基于这两个元素但更基于浏览器窗口的东西居中,就是使用共享容器(在任一元素之外)进行打印。这也消除了定位中的猜测工作。
  • 单击该按钮后,应从折叠面板复制信息,并将其打印到目标容器。另外,在单击该按钮时,检查另一个是否处于活动状态以删除active班级。将类添加到活动容器以更改按钮符号+ and -,使用 CSS 伪元素。
  • 将箭头保留在折叠式容器内还可以更轻松地根据其所在的 HTML 元素定位它们。
  • 旁注:您只能在整个页面上使用 HTML ID 一次,否则对多个实例使用一个类。这是参考#accordion-container.
var sharedCont = document.getElementById('shared-container');
var allCont = document.querySelectorAll('#accordion-container');

var jsaccordion = {
    init : function (target) {  
        var headers = document.querySelectorAll("#" + target + " .accordion-btn");
        if (headers.length > 0) { for (var head of headers) {
            head.addEventListener("click", jsaccordion.select);
        }}
    },

    select : function () {        
        var targ1 = this.parentElement.closest('#accordion-container'), // find parent
            targText = targ1.querySelector('.accordion-text').innerHTML; // grab text for shared container

        if( targ1.classList.contains('active') ){ 

            // when clicked, if active, reset them all
            targ1.classList.remove('active');
            sharedCont.innerHTML = '';
            sharedCont.classList.remove('active');

        } else {
            // when clicked, reset them all, then activate
            for (let i = 0; i < allCont.length; i++) {
                var el = allCont[i];
                el.classList.remove('active');
            }

            targ1.classList.add('active');
            sharedCont.innerHTML = targText;
            sharedCont.classList.add('active');

        }
    }
};
window.addEventListener('load', function(){
    jsaccordion.init("accordion-container");
});
body {
    max-width: 90%;
    margin: 0 auto;
    overflow: hidden;
}
#accordion-container {
    position: relative;
}
#accordion-container button::before {
    content: '+' !important;
}
#accordion-container.active button::before {
    content: '-' !important;
}
#accordion-container.active::after {
    content: '';
    width: 0; 
    height: 0; 
    border-left: 15px solid transparent;
    border-right: 15px solid transparent;
    border-bottom: 15px solid orange;
    position: absolute;
    bottom: -2rem;
    left: 50%;
    transform: translateX(-50%);
    color: orange;
    z-index: 100;
    font-size: 3rem;
    line-height: 1;
}
#accordion-container .accordion-text {
    display: none;
    color: #808080;
    padding: 15px;
    border: 1px solid #ffcc4b;
}
/* .accordion-btn.open + .accordion-text{
    display: block;
} */

#shared-container {
    margin-top: 2rem;
    display: block;
    width: 100%;
    padding: 2rem;
    border: 1px solid orange;
    display: none;
}
#shared-container.active {
    display: block;
    text-align: center;
}
#shared-container p {
    margin: 0;
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Testing testing testing</h1>

    <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet"/>

    <div class='row'>
        <div id="accordion-container" class='col-6'>
            <div class="my-3">
            <h3 class=" text-center">First one</h3>
            <button class='mx-auto d-block accordion-btn btn btn-white border-primary'></button>
                <div class="accordion-text">
                    <p>Egestas erat imperdiet sed euismod nisi porta. Ipsum dolor sit amet consectetur adipiscing. Maecenas pharetra convallis posuere morbi leo urna molestie. Nullam vehicula ipsum a arcu. Gravida cum sociis natoque penatibus et magnis. Duis convallis convallis tellus id interdum velit laoreet. </p>
                </div>
            </div>
        </div>
                
        <div id="accordion-container" class='col-6'>
            <div class="my-3">
            <h3 class='text-center'>second one</h3>
            <button class='mx-auto d-block accordion-btn btn btn-white border-primary'></button>
                
                <div class="accordion-text">
                    <p>Tempus egestas sed sed risus pretium quam vulputate dignissim. Risus at ultrices mi tempus imperdiet. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Nisl vel pretium lectus quam id leo.</p>
                </div>
            </div>
        </div>
                
    </div>
    <div id="shared-container"></div>
</body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用JS在按钮点击时显示不同的div? 的相关文章

  • “Backbone.js 视图”中的单击事件不起作用

    我尝试开始使用backbone js 但我发现当我不使用 body 作为视图的el时 该事件不起作用 这是代码 您可以将其另存为 html 文件并运行
  • ngClassOdd/ngClassEven 未按预期工作

    使用 Angular 版本 1 2 15 我发现了一个错误 该错误似乎从版本 1 2 2 开始直到 1 2 15 重现 Plunker 演示 http plnkr co edit 3nExMtZ92AQS7BvLsQ8m p preview
  • 使用 JavaScript 访问 Jekyll 变量并通过 DOM 操作传递它

    我很可能有错误逻辑 但我刚刚学习 JavaScript 和 Jekyll 我的目标是通过 JavaScript 操作 HTML 元素 并将一些 Jekyll 变量放置在该元素的内部 HTML 中 一切都从本地开发目录加载jekyll ser
  • 有没有办法覆盖 Google 路线服务缩放值?

    我使用下面的代码来获取两点之间的路线 directionsService route request function response status if status google maps DirectionsStatus OK di
  • 滚动内容上的 CSS 框阴影

    我想要一个带有插入框阴影的 div 其中包含滚动的内容 不幸的是 盒阴影不会投射在内容中的元素上 而是投射在背景上 但我希望它也覆盖内容元素 我偶然发现了这个解决方案 http jsfiddle net HPkd3 http jsfiddl
  • 在 Javascript 中获取类的所有实例

    我以为这个问题已经有了答案 但我似乎找不到答案 如何在 Javascript 中的此类的所有实例上运行特定的类方法 这必须在我不知道实例名称的情况下完成 我想我可以在类中使用某种静态变量来存储所有实例 但这在 JS 中似乎不存在 那么如何在
  • vuetify v-text-field 给定值后背景颜色发生变化

    我正在使用 vuetify 创建登录表单 并使用 v text field 作为输入 当有字段建议时就会出现问题 例如 我的浏览器中保存了多封电子邮件 它会在电子邮件字段上为我提供这些电子邮件的建议 到目前为止一切都很好 但是当我选择其中之
  • @Page { size:landscape} 过时了吗?

    CSS 规则 page size landscape 应该强制浏览器以横向模式打印页面 stackoverflow 上的许多问题 许多其他编程网站以及参考著作 例如 O Reilly 的 HTML XTHML 权威指南 第五版 中都提到了这
  • 如何使用Sinon监视导入的函数?

    假设我们想使用 Sinon 测试另一个函数是否调用了一个特定函数 fancyModule js export const fancyFunc gt console log fancyFunc export default const fan
  • AJV自定义关键字验证

    我正在使用 AJV 库来验证我的 JSON 架构 我希望能够验证Startdate成为一个字符串 如果不是字符串 则应将其转换为N A 目前 它仅转换undefined to N A 但是 在这些情况下 它不会按预期工作 null gt 空
  • 动态创建多个上传文件

    我想知道是否有人知道动态创建上传表单的最佳方法 这就是我想要实现的目标 下面显示的代码允许一次上传 我想要一个按钮 按下该按钮后 应添加另一种形式用于文件上传 因此 如果我想上传 假设有 7 个文件 我想按按钮 7 次来创建这些上传表单 每
  • 在 JS 中的浏览器中输入 url 时,偏移哈希标签链接以调整固定标头

    我希望创建一个页面 允许哈希标签跳转到页面的某些内容 e g http example com page1 http example com page1是一个普通页面 http example com page1 info http exa
  • 使用 Excel 从 Lotus Notes 发送电子邮件并具有附件和 HTML 正文

    是的 我正在尝试通过 Lotus Notes 发送 Excel 电子表格的电子邮件 它有一个附件 并且正文需要采用 HTML 格式 从我读过的所有代码来看 我有一些代码应该允许我这样做 但事实并非如此 如果没有 HTML 正文 附件将发送
  • ASP.Net Web 应用程序 Jquery Photoviewer 和 Ajaxical 更新

    有一个错误我的网站 http new mnarfezhom com 请进入右数第三个菜单 有些图像只能通过 jquery photoviewer 显示 onlclick 这很好用 现在 当我单击页面底部的 Ajaxical 更新按钮时 问题
  • 我想从 Cakefile 运行 d3

    我想从命令行执行一些 d3 代码 最初我只是尝试了类似的方法 task data Build some data with d3 gt d3 require lib d3 v2 console log d3 version d3 versi
  • 数据与线的日期和时间转换

    我使用 D3 V5 创建了此图表 另外 我已在小提琴上附加了示例数据 您可以点击此处查看 https plnkr co edit pINxcS9yt9AuJmSk02Fs p preview 我已经包括了tick函数代码块 它在向左滑动的路
  • Spring MVC - 两次提供内容

    我已经花了一周时间寻找有关如何将内容服务器到我的网页的指导 两次 因为使用 Model 或 ModelAndView 切断内容一次可以工作 但如果用户再次与页面交互 我希望它加载更多内容同一页 Java Spring 后端方法 Get 有效
  • jquery/javascript: function(e){.... e 是什么?为什么需要它?它实际上做了什么/完成了什么?

    myTable click function e var clicked e target clicked css background red 有人可以向我解释一下这一点 并解释为什么需要 e 以及它实际上做了什么 Using e只是一个
  • 从另一个窗口获取 Javascript 错误

    我创建了一些测试代码来打开一个新窗口并尝试从父窗口捕获新窗口中的 JavaScript 错误 问题是它只适用于 Firefox All of 测试 html code
  • 使用 v-bind Vue.js 的多个变量

    我试图在以下代码中传递多个变量 div div 但我收到以下错误 Vue warn 无法生成渲染函数 SyntaxError 意外的标记 在 我尝试更换 with a 但我得到 Vue warn 无法生成渲染函数 SyntaxError I

随机推荐

  • 如何在 Windows 7 上的 Python 2.7.1 中安装 easy_install

    我已在 Windows 7 上安装了 Python 2 7 1 但无法安装 easy install 请帮我 我通常只是跑步ez setup py http peak telecommunity com dist ez setup py I
  • 如何在Eclipse中引用不在src中的文件

    我正在尝试获取 MyBatis 的资源 该教程指出我的连接工厂中需要以下内容 String resource org mybatis example Configuration xml Reader reader Resources get
  • 如何更好地优化 iOS 上的网络?

    我在 GitHub 上创建了一个项目 以便我可以学习如何优化 iOS 应用程序的网络 我大量使用了块和 GCD 在观看 WWDC 2012 视频和过去几年的视频后 我了解到我可以使用 NSOperationQueue 做更多事情 具体来说
  • 在IIS上使用swagger发布web api

    在遵循此示例后 我正在尝试弄清楚如何使用 Swagger SwashBuckle 发布 net core 3 API 所以它可以在本地运行 当我按 F5 IIS Express 时 会在下面启动该网站http localhost 8033
  • 如何构建具有开放问题的 Dialogflow CX 代理?

    我正在尝试为 StackOverflow 之类的东西构建一个 Dialogflow 代理 它负责处理用户提出完整的问题 我想存储答案 并将其反馈给用户 例如 User I get an error CX Which error Java l
  • 扩展用户管理器

    在我的 NET Core 2 0 MVC 项目中 我添加了附加值来扩展 ApplicationUser public class ApplicationUser IdentityUser public string Name get set
  • java- libgdx build.gradle 与 AdMob 不同

    我正在为 android 构建一个应用程序并使用 libGdx 我检查了一百万个关于如何添加 Admob 的教程 每个教程都要求调整 build gradle 文件 但我的文件与他们的文件不一样 他们有依赖项和不同的东西 知道如何在我的 b
  • NSURLConnection 委托方法未执行

    我正在运行 Apple 的以下示例代码 NSString requestURL NSString alloc initWithString http google com NSURLRequest theRequest NSURLReque
  • numpy 中的数组按行排序

    我想按第一行对 numpy 中的数组进行排序 例如 import numpy as np test np array 1334 71601720318 930 9757468052002 1018 7038817663818 0 0 1 0
  • SDL - 绘制“负”圆圈(战争迷雾)

    我有这个 800x600square 我想绘制到屏幕上 我想在其中 切割 圆圈 其中 alpha 为 0 基本上我是在地图上绘制整个矩形 因此在我绘制的这些 圆圈 中 您可以看到地图 否则您会看到灰色方块 所以 我假设你想在你的一款游戏中添
  • 使用 jQuery datepicker 和 Angular 2 更改事件

    当我使用 jQuery datepicker 插件时 我在捕获更改事件时遇到一些问题 并且我尝试使用 change 方法来捕获更改 但似乎当我使用此插件时 角度无法捕获它 Component selector foo element tem
  • iframe 中的回调方法将值返回给 opener

    我必须在 iframe 中调用回调方法才能将值返回给 opener I know 挤压盒 http digitarald de project squeezebox 有 分配 打开 关闭 静态方法 但我不明白它是如何工作的 有人可以帮助我吗
  • 如何在文本文件更改时重新初始化 java servlet

    我有一个 servlet 它在初始化期间从文本文件中提取数据 现在我正在使用 cron 作业更新该文本文件 比如每天上午 10 点 并希望在每次该特定文件发生更改时重新初始化 servlet 我可以遵循的第二种方法是将 servlet 的重
  • 引用声明是否为引用对象引入了新名称?

    In 这个问题 https stackoverflow com q 33344259 560648我们知道 RVO 不能应用于像这样的表达式p first 在评论中还建议 RVO 通常不适用于类似这样的表达式r在声明之后auto r p f
  • 局部声明隐藏实例变量警告

    本地声明隐藏 self treatmentId treatmentId 附近的实例变量消息弹出窗口和 self treatmentName treatmentName implementation Treatment synthesize
  • 如何检索LDAP数据库的所有属性

    我在用LDAP模块 of python连接到LDAP服务器 我可以查询数据库 但我不知道如何查询检索数据库中存在的字段 这样我就可以提前通知用户查询数据库 告诉他他试图访问的字段不在数据库中 例如 如果存在的字段只是 cn memberOf
  • Flexbox 填充底部在 Firefox 和 Safari 中失败

    当向下滚动时 parentdiv 你应该在底部看到它的红色背景 因为padding bottom 这适用于 Chrome 但不适用于 Safari 和 Firefox container display flex width 200px h
  • iOS - 用于故事板检测 iPad / iPhone 设备的逻辑

    我需要将故事板定义为应用程序委托文件中身份验证脚本的一部分 用于将相关数据传递到特定视图 一切正常 但通过以这种方式定义我的故事板 我覆盖所有设备 iPad或iPhone 的路径 我希望我的应用程序是通用的 并遵循依赖于设备的不同故事板 因
  • 如何在 Laravel 5.3 中执行“内部”重定向

    我了解如何使用redirect 方法重定向用户 但此方法返回302代码 浏览器必须发出第二个HTTP请求 是否可以在内部将请求转发到不同的控制器和操作 我正在中间件中进行此检查 因此我的句柄函数如下所示 public function ha
  • 如何用JS在按钮点击时显示不同的div?

    我正在尝试制作一个有 2 张卡片的部分 每张卡片都有一个按钮和一个小的描述性文本 我想要实现的是 当我单击按钮时 会发生 3 件事 1 该按钮更改内容 从 变为 但这是我最不担心的 2 一个div显示与该卡对应的信息 占用100 vw 和