Bootstrap:更改面板标题的颜色 onClick

Bootstrap: Change Color of Panel Heading onClick

嗨,我昨晚在 bootstrap 给自己上了速成班,我玩得很开心。我在网上找到了一个可折叠面板,它非常适合我希望在导航栏中实现的功能。但是,我希望面板标题的背景颜色在展开时发生变化。我对 bootstrap 的内部工作原理还不够熟悉,还不能自己搞定(很快!我希望如此)。有问题的代码如下:

            <div class="panel-group minmarg" id="accordion">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h4 class="panel-title">
                    <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
                        OPI<b class="caret"></b>
                    </a>
                </h4>
            </div>
            <div id="collapseOne" class="panel-collapse collapse">
                <div class="panel-body minmarg">
                    <ul class="nav nav-pills nav-stacked pill-trngtheme minmarg">
                        <li role="presentation"><a href="#">OPI Main Site</a>
                        </li>
                        <li role="presentation" class="active"><a href="#">Training</a>
                        </li>
                        <li role="presentation"><a href="#">Procedures</a>
                        </li>
                        <li role="presentation"><a href="#">Corrective Action</a>
                        </li>
                        <li role="presentation"><a href="#">Human Performance Improvement</a>
                        </li>
                        <li role="presentation"><a href="#">LEAN Management</a>
                        </li>
                        <li role="presentation"><a href="#">Coduct of Operations</a>
                        </li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

可以参考document

这里是你的代码:

$(".collapse").on('shown.bs.collapse',function(){
     // change background when expanded

});
$(".collapse").on('hidden.bs.collapse',function(){
     // change background when hide
});

Webforwork,您好。
toggleclass.

改变 class 怎么样?

CSS

 .panel-clr {
        background-color:greenyellow;
    }     
 .panel-clr.on {
        background-color:dodgerblue;
    }

JS

$( function() {
  $('.panel-clr').click( function() {
      $(this).toggleClass('on');
} )
}); 

希望对您有所帮助。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="../../favicon.ico">

    <title>Starter Template for Bootstrap</title>

    <!-- Bootstrap core CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">

<style>
body {
  padding-top: 50px;
}
.spacer {
  margin-top: 2%;
  margin-bottom: 2%;
}    
.block {
  height: 440px;
}  

.panel-clr {
    background-color:greenyellow;
} 
    
.panel-clr.on {
    background-color:dodgerblue;
}
  
</style>

</head>

<body>

    <nav class="navbar navbar-inverse navbar-fixed-top ">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand " href="#">Project name</a>
        </div>
        <div id="navbar" class="collapse navbar-collapse">
          <ul class="nav navbar-nav navbar-right">
            <li class="active"><a href="#">Home</a></li>
            <li><a href="#about">About</a></li>
            <li><a href="#contact">Contact</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav>

<div class="container col-lg-12 spacer"></div>
<div class="container col-lg-12">

<div class="col-lg-10 col-md-10 col-sm-10 col-xs-10 bg-info block">
         <div class="panel-group minmarg" id="accordion">
        <div class="panel ">
            <div class="panel-heading panel-clr">
                <h4 class="panel-title">
                    <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
                        OPI<b class="caret"></b>
                    </a>
                </h4>
            </div>
            <div id="collapseOne" class="panel-collapse collapse">
                <div class="panel-body minmarg">
                    <ul class="nav nav-pills nav-stacked pill-trngtheme minmarg">
                        <li role="presentation"><a href="#">OPI Main Site</a>
                        </li>
                        <li role="presentation" class="active"><a href="#">Training</a>
                        </li>
                        <li role="presentation"><a href="#">Procedures</a>
                        </li>
                        <li role="presentation"><a href="#">Corrective Action</a>
                        </li>
                        <li role="presentation"><a href="#">Human Performance Improvement</a>
                        </li>
                        <li role="presentation"><a href="#">LEAN Management</a>
                        </li>
                        <li role="presentation"><a href="#">Coduct of Operations</a>
                        </li>
                    </ul>
                </div>
            </div>
        </div>
    </div> 
      
</div>
        
    </div><!-- /.container -->


    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
    
<script> 
    
$( function() {
  $('.panel-clr').click( function() {
      $(this).toggleClass('on');
} )
});    
</script> 
    
</body>
</html>

AngularJR 的答案是正确的,但我发现以我对 css 和 non-existent 对 jQuery 的有限了解有点难以理解。另外,我正在使用 React,因此在渲染 DOM 元素后调整它们对我来说不是一个好方法。


核心原则

发生的事情的基本原理是将额外的 class 标记添加到 html 元素:

所以

<div class="panel-heading">...</div>

变成

<div class="panel-heading on">...</div>

如何添加这些额外的 class 并不重要,jQuery ($) 只是一个选项。

现在可以使用 css 选择器将不同的 css 规则应用于这两个 div:

.panel-heading {
    background-color:greenyellow;
}  

.panel-heading.on {
    background-color:dodgerblue;
}

分别。

请注意 .panel-heading.on 之间没有 space。有关详细信息,请参阅以下堆栈溢出问题:What's the difference between CSS classes .foo.bar (without space) and .foo .bar (with space).


我关于解决使用react时的问题的旁白

但是在使用 react-bootstrap 的情况下,"panel-heading" div 是由标签 <Panel> 自动创建的,而 <div class="panel-heading"> 元素不能在呈现后搜索和访问(反应生命周期很奇怪)。所以不能添加额外的classes。

因此需要将额外的 class、"on" 添加到 panel-heading div:

的 parent 元素中

html(或.jsx):

<div class="on">
    <Panel header="My Title">...STUFF...</Panel>
</div>

结果 DOM 看起来像这样(稍微简化):

<div class="on">
   <div class="panel">
       <div class="panel-heading">
           My Title
       </div>
       <div class="panel-body">
           .....STUFF.....
       </div>
   </div>
</div>

现在有一个外部 div 和 "on" class 并且 "panel-heading" div 包含在其中。

panel-heading div 现在可以使用以下选择器在 css 中设置样式:

.panel-heading {
    background-color:greenyellow;
}  

.on .panel-heading {
    background-color:dodgerblue;
}

注意 .on 选择器现在如何位于 .panel-heading 选择器之前,并且两个选择器之间还有一个 space;这是因为具有 .on class 的元素现在是具有 .panel-heading class 的元素的祖先。

注意:将额外的 "on" class 直接添加到 <Panel> 而不是将面板包含在额外的 div 中的效果类似。

现在 "onClick" 处理程序可以更改 parent 元素的 class 以影响 panel-heading 的样式,这比搜索 DOM 为正确的 "panel-heading div" (恕我直言)。至关重要的是,在我使用 React 的情况下,可以在调用渲染例程时直接为元素指定此 "on" class。