美文网首页
Bootstrap插件解析6 折叠版

Bootstrap插件解析6 折叠版

作者: 波拉拉 | 来源:发表于2020-03-16 23:06 被阅读0次

    1 使用方法

    <!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">
        <title>Bootstrap 101 Template</title>
        <link href="bootstrap.css" rel="stylesheet">
        <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
        <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    </head>
    <body>
    <div class="panel-group container" id="accordion" >
        <div class="panel panel-default">
            <div class="panel-heading" id="headingOne">
                <h4 class="panel-title">
                    <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseOne" >
                        Collapsible Group Item #1
                    </a>
                </h4>
            </div>
            <div id="collapseOne" class="panel-collapse collapse in">
                <div class="panel-body">
                    Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
                </div>
            </div>
        </div>
        <div class="panel panel-default">
            <div class="panel-heading"  id="headingTwo">
                <h4 class="panel-title">
                    <a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" >
                        Collapsible Group Item #2
                    </a>
                </h4>
            </div>
            <div id="collapseTwo" class="panel-collapse collapse">
                <div class="panel-body">
                    Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
                </div>
            </div>
        </div>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="bootstrap.js"></script>
    <script>
    </script>
    </body>
    </html>
    

    2 整体结构

    (function ($) {
    // 构造函数
        var Collapse = function (element, options) {};
    //    静态变量
        Collapse.VERSION = '3.3.7';
    //    原型方法
        Collapse.prototype.dimension = function () {};//处理尺寸
        Collapse.prototype.show = function () {};
        Collapse.prototype.hide = function () {};
        Collapse.prototype.toggle = function () {};
        Collapse.prototype.getParent = function () {};
    //    插件入口
        function Plugin(option) {}
    //    防冲突处理
        $.fn.collapse.noConflict = function () {};
    //    data-api实现
        $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {}
    })(jQuery);
    

    3 插件入口

    function Plugin(option) {
        return this.each(function () {
          var $this   = $(this);
          //保存自定义数据
          var data    = $this.data('bs.collapse');
          //合并选项:1 默认选项,自定义数据,参数
          var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option);
          //第一次时,默认为真,参数中有show|hide,toggle:false
          if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false;
          //第一次时实例化构造函数,保存到自定义数据
          if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)));
          //参数是字符串,执行方法
          if (typeof option == 'string') data[option]()
        })
      }
    
      var old = $.fn.collapse;
      //暴露插件
      $.fn.collapse             = Plugin;
      $.fn.collapse.Constructor = Collapse;
      //防冲突处理
      $.fn.collapse.noConflict = function () {
        $.fn.collapse = old;
        return this
      };
    
    

    4 data-api实现

      //绑定切换事件
      $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
        var $this   = $(this);
        //如果是链接,取消默认行为
        if (!$this.attr('data-target')) e.preventDefault();
    
        var $target = getTargetFromTrigger($this);
        var data    = $target.data('bs.collapse');
        var option  = data ? 'toggle' : $this.data();
    
        Plugin.call($target, option)
      })
    

    5 构造函数+静态变量

    var Collapse = function (element, options) {
        this.$element      = $(element);
        this.options       = $.extend({}, Collapse.DEFAULTS, options);
        this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
                               '[data-toggle="collapse"][data-target="#' + element.id + '"]');
        this.transitioning = null;
    
        if (this.options.parent) {
          this.$parent = this.getParent()
        } else {
          this.addAriaAndCollapsedClass(this.$element, this.$trigger)
        }
    
        if (this.options.toggle) this.toggle()
      };
    
      Collapse.VERSION  = '3.3.7';
    
      Collapse.TRANSITION_DURATION = 350;
    
      Collapse.DEFAULTS = {
        toggle: true
      };
    

    6 原型方法

    Collapse.prototype.dimension = function () {
        var hasWidth = this.$element.hasClass('width');
        return hasWidth ? 'width' : 'height'
      };
    
      Collapse.prototype.show = function () {
        if (this.transitioning || this.$element.hasClass('in')) return;//已经显示不处理
    
        var activesData;
        //折叠中的内容
        var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing');
    
        if (actives && actives.length) {
          activesData = actives.data('bs.collapse')
          if (activesData && activesData.transitioning) return
        }
        //开始事件
        var startEvent = $.Event('show.bs.collapse');
        this.$element.trigger(startEvent);
        if (startEvent.isDefaultPrevented()) return;
    
        if (actives && actives.length) {
          Plugin.call(actives, 'hide');
          activesData || actives.data('bs.collapse', null);
        }
    
        var dimension = this.dimension();
    
        this.$element
          .removeClass('collapse')
          .addClass('collapsing')[dimension](0)
          .attr('aria-expanded', true)
    
        this.$trigger
          .removeClass('collapsed')
          .attr('aria-expanded', true)
    
        this.transitioning = 1
    
        var complete = function () {
          this.$element
            .removeClass('collapsing')
            .addClass('collapse in')[dimension]('')
          this.transitioning = 0
          this.$element
            .trigger('shown.bs.collapse')
        }
    
        if (!$.support.transition) return complete.call(this)
    
        var scrollSize = $.camelCase(['scroll', dimension].join('-'))
    
        this.$element
          .one('bsTransitionEnd', $.proxy(complete, this))
          .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
      }
    
      Collapse.prototype.hide = function () {
        if (this.transitioning || !this.$element.hasClass('in')) return
    
        var startEvent = $.Event('hide.bs.collapse')
        this.$element.trigger(startEvent)
        if (startEvent.isDefaultPrevented()) return
    
        var dimension = this.dimension()
    
        this.$element[dimension](this.$element[dimension]())[0].offsetHeight
    
        this.$element
          .addClass('collapsing')
          .removeClass('collapse in')
          .attr('aria-expanded', false)
    
        this.$trigger
          .addClass('collapsed')
          .attr('aria-expanded', false)
    
        this.transitioning = 1
    
        var complete = function () {
          this.transitioning = 0
          this.$element
            .removeClass('collapsing')
            .addClass('collapse')
            .trigger('hidden.bs.collapse')
        }
    
        if (!$.support.transition) return complete.call(this)
    
        this.$element
          [dimension](0)
          .one('bsTransitionEnd', $.proxy(complete, this))
          .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
      }
    
      Collapse.prototype.toggle = function () {
        this[this.$element.hasClass('in') ? 'hide' : 'show']()
      }
    
      Collapse.prototype.getParent = function () {
        return $(this.options.parent)
          .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
          .each($.proxy(function (i, element) {
            var $element = $(element)
            this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
          }, this))
          .end()
      }
    
      Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
        var isOpen = $element.hasClass('in')
    
        $element.attr('aria-expanded', isOpen)
        $trigger
          .toggleClass('collapsed', !isOpen)
          .attr('aria-expanded', isOpen)
      }
    
      function getTargetFromTrigger($trigger) {
        var href
        var target = $trigger.attr('data-target')
          || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
    
        return $(target)
      }
    

    相关文章

      网友评论

          本文标题:Bootstrap插件解析6 折叠版

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