美文网首页
三、手风琴Accordion

三、手风琴Accordion

作者: 幸福幸福幸福 | 来源:发表于2017-03-31 10:59 被阅读492次

一个最简单的例子:

<html>
<head>
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
    <script src="https://cdn.bootcss.com/angular-ui-bootstrap/2.5.0/ui-bootstrap-tpls.min.js"></script>
</head>
<body ng-app="myApp" ng-controller="accordionCtrl">
<uib-accordion close-others="oneAtATime">
    <!-- 注意这里要用attr形式的,element形式不行 -->
    <div uib-accordion-group class="panel-default" heading="Static Header, initially expanded" is-open="status.isFirstOpen"
         is-disabled="status.isFirstDisabled">
        This content is straight in the template.
    </div>
</uib-accordion>

<script>
    angular.module('myApp', ['ui.bootstrap']).controller('accordionCtrl', function ($scope)
    {
        $scope.oneAtATime = true;
        $scope.status = {
            isFirstOpen: true,
            isFirstDisabled: false
        };
    });
</script>
</body>
</html>

效果如下:


先介绍一下标签中各属性的作用(有的在上面这个例子中还没有出现)

  • uib-accordion的属性:
    close-others:默认true,是否同时只能打开一个
    template-url:字符串(eg:head.html),在ui-bootstrap-tpls.js文件中使用的模板名称

  • uib-accodrion-group的属性
    heading:string(默认none),面板标题
    template-url:内容模板指向,可以指向当前文件内script标签的id,也可以指向一个新的文件,一般用内部script标签的形式,下面会有例子(重要)
    is-disabled:默认false,面板是否禁用
    is-open:默认false,面板初始状态(打开or关闭)
    panel-class:面板样式(这个是class属性的值,不是属性名),默认panel-default.可用值:panel-primary, panel-success, panel-info,panel-warning,panel-danger

下面写几种常用写法。

  1. 配合ng-repeat生成面板
    <html>
    <head>
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
    <script src="https://cdn.bootcss.com/angular-ui-bootstrap/2.5.0/ui-bootstrap-tpls.min.js"></script>
    </head>
    <body ng-app="myApp" ng-controller="accordionCtrl">
    <uib-accordion close-others="oneAtATime">

    <div uib-accordion-group class="panel-default" heading="{{ group.title }}"
    is-disabled="status.isFirstDisabled" ng-repeat="group in groups">
    {{ group.content }}
    </div>
    </uib-accordion>

     <script>
         angular.module('myApp', ['ui.bootstrap']).controller('accordionCtrl', function ($scope)
         {
             $scope.groups = [
                 {title:'第一个面板',content:'第一个面板的内容'},
                 {title:'第二个面板',content:'第二个面板的内容'}
             ];
             $scope.status = {
                 isFirstOpen: true,
                 isFirstDisabled: false
             };
             $scope.oneAtATime = true;
         });
     </script>
     </body>
     </html>
    

效果如图:


  1. 面板中包含动态生成的内容
    <html>
    <head>
    <meta charset="utf-8">
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
    <script src="https://cdn.bootcss.com/angular-ui-bootstrap/2.5.0/ui-bootstrap-tpls.min.js"></script>
    </head>
    <body ng-app="myApp" ng-controller="accordionCtrl">
    <uib-accordion close-others="oneAtATime">

    <div uib-accordion-group class="panel-default" heading="点击按钮动态添加item"
    is-disabled="status.isFirstDisabled">
    <div ng-repeat="item in items">{{ item }}</div>
    <button class="btn btn-success" ng-click="addItem()">点击添加item</button>
    <button class="btn btn-success" ng-click="reduceItem()">点击删除item</button>
    </div>
    </uib-accordion>

     <script>
         angular.module('myApp', ['ui.bootstrap']).controller('accordionCtrl', function ($scope)
         {
             $scope.groups = [
                 {title:'第一个面板',content:'第一个面板的内容'},
                 {title:'第二个面板',content:'第二个面板的内容'}
             ];
             $scope.items = ["item 1","item 2","item 3"];
             $scope.addItem = function(){
                 var newItemNo = $scope.items.length+1;
                 $scope.items.push("item "+newItemNo);
             };
             $scope.reduceItem = function(){
                 $scope.items.splice(-1,1);
             }
             $scope.status = {
                 isFirstOpen: true,
                 isFirstDisabled: false
             };
             $scope.oneAtATime = true;
         });
     </script>
     </body>
     </html>
    

效果如图:


点击按钮之后,面板内容增删,面板大小自适应。

  1. 使用自定义模板
    uib-accordion-group默认的模板是uib/template/accordion/accordion-group.html,模板内容包含在ui-bootstrap-tpls-1.3.2.js文件中,可以参考原生的模板内容写一个自定义模板,然后用template-url来引用。
    <html>
    <head>
    <meta charset="utf-8">
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
    <script src="https://cdn.bootcss.com/angular-ui-bootstrap/2.5.0/ui-bootstrap-tpls.min.js"></script>
    </head>
    <body ng-app="myApp" ng-controller="accordionCtrl">

    <script type="text/ng-template" id="group-template.html">
    <div class="panel {{panelClass || 'panel-default'}}">
    <div class="panel-heading">
    <h4 class="panel-title" style="color:#fa39c3">
    <a href tabindex="0" class="accordion-toggle" ng-click="toggleOpen()" uib-accordion-transclude="heading">
    <span ng-class="{'text-muted': isDisabled}">{{heading}}</span>
    </a>
    </h4>
    </div>
    <div class="panel-collapse collapse" uib-collapse="!isOpen">
    <div class="panel-body" style="text-align: right" ng-transclude></div>
    </div>
    </div>
    </script>

     <uib-accordion close-others="oneAtATime">
         <div uib-accordion-group class="panel-default" heading="点击按钮动态添加item"
              is-disabled="status.isFirstDisabled" template-url="group-template.html">   <!-- heading与模板内的{{ heading绑定 }}-->
             <div ng-repeat="item in items">{{ item }}</div>
             <button class="btn btn-success" ng-click="addItem()">点击添加item</button>
             <button class="btn btn-success" ng-click="reduceItem()">点击删除item</button>
         </div>
     </uib-accordion>
     
     <script>
         angular.module('myApp', ['ui.bootstrap']).controller('accordionCtrl', function ($scope)
         {
             $scope.groups = [
                 {title:'第一个面板',content:'第一个面板的内容'},
                 {title:'第二个面板',content:'第二个面板的内容'}
             ];
             $scope.items = ["item 1","item 2","item 3"];
             $scope.addItem = function(){
                 var newItemNo = $scope.items.length+1;
                 $scope.items.push("item "+newItemNo);
             };
             $scope.reduceItem = function(){
                 $scope.items.splice(-1,1);
             }
             $scope.status = {
                 isFirstOpen: true,
                 isFirstDisabled: false
             };
             $scope.oneAtATime = true;
         });
     </script>
     </body>
     </html>
    

效果图:


可以看到样式已经改变为新定义的模板样式

  1. 使用自定义的面板标题
    如果面板的标题是简单的字符串文本,使用heading属性就足够了,但是如果内容较为复杂,比如有图标,那么可以使用uib-accordion-heading来自定义标题。
    <html>
    <head>
    <meta charset="utf-8">
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
    <script src="https://cdn.bootcss.com/angular-ui-bootstrap/2.5.0/ui-bootstrap-tpls.min.js"></script>
    <style>
    .accordion-toggle { display: block; }
    </style>
    </head>
    <body ng-app="myApp" ng-controller="accordionCtrl">

     <uib-accordion close-others="oneAtATime" is-open="status.open">
         <div uib-accordion-group class="panel-default" ng-click="$event.stopPropagation()"
              is-disabled="status.isFirstDisabled" is-open="status.open">
             <!--自定义面板标题,注意在uib-accordion里定义了is-open=status.open,然后可以通过开关状态来改变字体图标-->
             <uib-accordion-heading>
                 自定义的面板标题 <i class="pull-right glyphicon" ng-class="{'glyphicon-chevron-down': status.open, 'glyphicon-chevron-right': !status.open}"></i>
             </uib-accordion-heading>
             <!-- 面板内容部分 -->
             <div ng-repeat="item in items">{{ item }}</div>
             <button class="btn btn-success" ng-click="addItem()">点击添加item</button>
             <button class="btn btn-success" ng-click="reduceItem()">点击删除item</button>
         </div>   
     </uib-accordion>
     
     <script>
         angular.module('myApp', ['ui.bootstrap']).controller('accordionCtrl', function ($scope)
         {
             $scope.groups = [
                 {title:'第一个面板',content:'第一个面板的内容'},
                 {title:'第二个面板',content:'第二个面板的内容'}
             ];
             $scope.items = ["item 1","item 2","item 3"];
             $scope.addItem = function(){
                 var newItemNo = $scope.items.length+1;
                 $scope.items.push("item "+newItemNo);
             };
             $scope.reduceItem = function(){
                 $scope.items.splice(-1,1);
             }
             $scope.status = {
                 isFirstOpen: true,
                 isFirstDisabled: false
             };
             $scope.oneAtATime = true;
         });
     </script>
     </body>
     </html>
    

在实际使用中,如果想在点击每个面板标题时就展开控件,而不是点击文字才展开,那么加入这个样式:
.accordion-toggle { display: block; }
如果想在面板标题中加入可点击的元素(按钮,复选框等),并且点击这些元素时不展开控件,那么要在这些元素上阻止事件冒泡:
ng-click="$event.stopPropagation()"

相关文章

网友评论

      本文标题:三、手风琴Accordion

      本文链接:https://www.haomeiwen.com/subject/hqjpottx.html