2017-02-13 54 views
-3

我從我的項目中刪除了bootstrap.js,僅包含carousel.js。但傳送帶現在不能正常工作。當我讀到bootstrap.js docs時,他們建議個人插件相互依賴:如何找到bootstrap js個別插件的依賴關係?

一些插件和CSS組件依賴於其他插件。如果您單獨包含插件,請確保在文檔中檢查這些依賴關係。

我閱讀整個文檔,但無處各個插件的依賴被提及,所以我的問題是我如何找到特定bootstrap.js插件的所有依賴?

+0

jQuery是一個依賴項 – Krishna9960

+0

@ Krishna9960等待我添加一個證明演示,其中jquery不是唯一的依賴項。 – user31782

+0

我沒有說過,我說過它是其中之一 – Krishna9960

回答

1

jQuery是Bootstrap的唯一所需的依賴項。該文件指的是其他依賴是正常的bootstrap.min.js一部分,但可以在構建包含(或不含) - 在這裏看到:http://getbootstrap.com/customize/#plugins

如果你只想要旋轉木馬的插件時,打開所有的複選框的插件部分,然後選擇「Carousel功能」。然後切換LESS部分中的所有複選框,然後選擇「Carousel」。在屏幕底部,你可以點擊「編譯和下載」來獲得你的自定義版本,只包括旋轉木馬的東西。

+0

您能否告訴'carousel.js'需要bootstrap.min.js的哪個部分? – user31782

+0

我不確定你的意思。如果您自定義下載,'bootstrap.min.js'專門爲Carousel功能構建。 –

+0

我無法使用官方bootstrap自定義內部版本,因​​爲我修改了carousel.js以具有用戶定義的轉換速度。我想我已經找到了依賴。讓我驗證一下。 – user31782

1

我不明白在我的問題downvotes但任何我appreaciate J.Titus和克里希納試圖幫助我。 carousel.js以外的jquery的依賴項是transition.js。雖然我想出了自己,如果有人能夠提供每個引導js插件的依賴關係的綜合列表,我將不勝感激。

證明,沒有transition.js

/* ======================================================================== 
 
* Bootstrap: carousel.js v3.3.7 
 
* http://getbootstrap.com/javascript/#carousel 
 
* ======================================================================== 
 
* Copyright 2011-2016 Twitter, Inc. 
 
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 
 
* ======================================================================== */ 
 

 

 
+function ($) { 
 
    'use strict'; 
 

 
    // CAROUSEL CLASS DEFINITION 
 
    // ========================= 
 

 
    var Carousel = function (element, options) { 
 
    this.$element = $(element) 
 
    this.$indicators = this.$element.find('.carousel-indicators') 
 
    this.options  = options 
 
    this.paused  = null 
 
    this.sliding  = null 
 
    this.interval = null 
 
    this.$active  = null 
 
    this.$items  = null 
 

 
    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) 
 

 
    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element 
 
     .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) 
 
     .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) 
 
    } 
 

 
    Carousel.VERSION = '3.3.7' 
 

 
    Carousel.TRANSITION_DURATION = 600 
 

 
    Carousel.DEFAULTS = { 
 
    interval: 5000, 
 
    pause: 'hover', 
 
    wrap: true, 
 
    keyboard: true 
 
    } 
 

 
    Carousel.prototype.keydown = function (e) { 
 
    if (/input|textarea/i.test(e.target.tagName)) return 
 
    switch (e.which) { 
 
     case 37: this.prev(); break 
 
     case 39: this.next(); break 
 
     default: return 
 
    } 
 

 
    e.preventDefault() 
 
    } 
 

 
    Carousel.prototype.cycle = function (e) { 
 
    e || (this.paused = false) 
 

 
    this.interval && clearInterval(this.interval) 
 

 
    this.options.interval 
 
     && !this.paused 
 
     && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) 
 

 
    return this 
 
    } 
 

 
    Carousel.prototype.getItemIndex = function (item) { 
 
    this.$items = item.parent().children('.item') 
 
    return this.$items.index(item || this.$active) 
 
    } 
 

 
    Carousel.prototype.getItemForDirection = function (direction, active) { 
 
    var activeIndex = this.getItemIndex(active) 
 
    var willWrap = (direction == 'prev' && activeIndex === 0) 
 
       || (direction == 'next' && activeIndex == (this.$items.length - 1)) 
 
    if (willWrap && !this.options.wrap) return active 
 
    var delta = direction == 'prev' ? -1 : 1 
 
    var itemIndex = (activeIndex + delta) % this.$items.length 
 
    return this.$items.eq(itemIndex) 
 
    } 
 

 
    Carousel.prototype.to = function (pos) { 
 
    var that  = this 
 
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) 
 

 
    if (pos > (this.$items.length - 1) || pos < 0) return 
 

 
    if (this.sliding)  return this.$element.one('slid.bs.carousel', function() { that.to(pos) }) // yes, "slid" 
 
    if (activeIndex == pos) return this.pause().cycle() 
 

 
    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) 
 
    } 
 

 
    Carousel.prototype.pause = function (e) { 
 
    e || (this.paused = true) 
 

 
    if (this.$element.find('.next, .prev').length && $.support.transition) { 
 
     this.$element.trigger($.support.transition.end) 
 
     this.cycle(true) 
 
    } 
 

 
    this.interval = clearInterval(this.interval) 
 

 
    return this 
 
    } 
 

 
    Carousel.prototype.next = function() { 
 
    if (this.sliding) return 
 
    return this.slide('next') 
 
    } 
 

 
    Carousel.prototype.prev = function() { 
 
    if (this.sliding) return 
 
    return this.slide('prev') 
 
    } 
 

 
    Carousel.prototype.slide = function (type, next) { 
 
    var $active = this.$element.find('.item.active') 
 
    var $next  = next || this.getItemForDirection(type, $active) 
 
    var isCycling = this.interval 
 
    var direction = type == 'next' ? 'left' : 'right' 
 
    var that  = this 
 

 
    if ($next.hasClass('active')) return (this.sliding = false) 
 

 
    var relatedTarget = $next[0] 
 
    var slideEvent = $.Event('slide.bs.carousel', { 
 
     relatedTarget: relatedTarget, 
 
     direction: direction 
 
    }) 
 
    this.$element.trigger(slideEvent) 
 
    if (slideEvent.isDefaultPrevented()) return 
 

 
    this.sliding = true 
 

 
    isCycling && this.pause() 
 

 
    if (this.$indicators.length) { 
 
     this.$indicators.find('.active').removeClass('active') 
 
     var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) 
 
     $nextIndicator && $nextIndicator.addClass('active') 
 
    } 
 

 
    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" 
 
    if ($.support.transition && this.$element.hasClass('slide')) { 
 
     $next.addClass(type) 
 
     $next[0].offsetWidth // force reflow 
 
     $active.addClass(direction) 
 
     $next.addClass(direction) 
 
     $active 
 
     .one('bsTransitionEnd', function() { 
 
      $next.removeClass([type, direction].join(' ')).addClass('active') 
 
      $active.removeClass(['active', direction].join(' ')) 
 
      that.sliding = false 
 
      setTimeout(function() { 
 
      that.$element.trigger(slidEvent) 
 
      }, 0) 
 
     }) 
 
     .emulateTransitionEnd(Carousel.TRANSITION_DURATION) 
 
    } else { 
 
     $active.removeClass('active') 
 
     $next.addClass('active') 
 
     this.sliding = false 
 
     this.$element.trigger(slidEvent) 
 
    } 
 

 
    isCycling && this.cycle() 
 

 
    return this 
 
    } 
 

 

 
    // CAROUSEL PLUGIN DEFINITION 
 
    // ========================== 
 

 
    function Plugin(option) { 
 
    return this.each(function() { 
 
     var $this = $(this) 
 
     var data = $this.data('bs.carousel') 
 
     var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) 
 
     var action = typeof option == 'string' ? option : options.slide 
 

 
     if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) 
 
     if (typeof option == 'number') data.to(option) 
 
     else if (action) data[action]() 
 
     else if (options.interval) data.pause().cycle() 
 
    }) 
 
    } 
 

 
    var old = $.fn.carousel 
 

 
    $.fn.carousel    = Plugin 
 
    $.fn.carousel.Constructor = Carousel 
 

 

 
    // CAROUSEL NO CONFLICT 
 
    // ==================== 
 

 
    $.fn.carousel.noConflict = function() { 
 
    $.fn.carousel = old 
 
    return this 
 
    } 
 

 

 
    // CAROUSEL DATA-API 
 
    // ================= 
 

 
    var clickHandler = function (e) { 
 
    var href 
 
    var $this = $(this) 
 
    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 
 
    if (!$target.hasClass('carousel')) return 
 
    var options = $.extend({}, $target.data(), $this.data()) 
 
    var slideIndex = $this.attr('data-slide-to') 
 
    if (slideIndex) options.interval = false 
 

 
    Plugin.call($target, options) 
 

 
    if (slideIndex) { 
 
     $target.data('bs.carousel').to(slideIndex) 
 
    } 
 

 
    e.preventDefault() 
 
    } 
 

 
    $(document) 
 
    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) 
 
    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) 
 

 
    $(window).on('load', function() { 
 
    $('[data-ride="carousel"]').each(function() { 
 
     var $carousel = $(this) 
 
     Plugin.call($carousel, $carousel.data()) 
 
    }) 
 
    }) 
 

 
}(jQuery);
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet"/> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div id="myCarousel" class="carousel slide" data-ride="carousel"> 
 
    <!-- Indicators --> 
 
    <ol class="carousel-indicators"> 
 
     <li data-target="#myCarousel" data-slide-to="0" class="active"></li> 
 
     <li data-target="#myCarousel" data-slide-to="1"></li> 
 
     <li data-target="#myCarousel" data-slide-to="2"></li> 
 
     <li data-target="#myCarousel" data-slide-to="3"></li> 
 
    </ol> 
 

 
    <!-- Wrapper for slides --> 
 
    <div class="carousel-inner" role="listbox"> 
 
     <div class="item active"> 
 
     <img src="http://www.w3schools.com/bootstrap/img_chania.jpg" alt="Chania" width="460" height="345"> 
 
     </div> 
 

 
     <div class="item"> 
 
     <img src="http://www.w3schools.com/bootstrap/img_chania2.jpg" alt="Chania" width="460" height="345"> 
 
     </div> 
 
    
 
     <div class="item"> 
 
     <img src="http://www.w3schools.com/bootstrap/img_flower.jpg" alt="Flower" width="460" height="345"> 
 
     </div> 
 

 
     <div class="item"> 
 
     <img src="http://www.w3schools.com/bootstrap/img_flower2.jpg" alt="Flower" width="460" height="345"> 
 
     </div> 
 
    </div> 
 

 
    <!-- Left and right controls --> 
 
    <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev"> 
 
     <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span> 
 
     <span class="sr-only">Previous</span> 
 
    </a> 
 
    <a class="right carousel-control" href="#myCarousel" role="button" data-slide="next"> 
 
     <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span> 
 
     <span class="sr-only">Next</span> 
 
    </a> 
 
    </div>

證明carousel.js,carousel.js與transition.js

/* ======================================================================== 
 
* Bootstrap: transition.js v3.3.7 
 
* http://getbootstrap.com/javascript/#transitions 
 
* ======================================================================== 
 
* Copyright 2011-2016 Twitter, Inc. 
 
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 
 
* ======================================================================== */ 
 

 

 
+function ($) { 
 
    'use strict'; 
 

 
    // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) 
 
    // ============================================================ 
 

 
    function transitionEnd() { 
 
    var el = document.createElement('bootstrap') 
 

 
    var transEndEventNames = { 
 
     WebkitTransition : 'webkitTransitionEnd', 
 
     MozTransition : 'transitionend', 
 
     OTransition  : 'oTransitionEnd otransitionend', 
 
     transition  : 'transitionend' 
 
    } 
 

 
    for (var name in transEndEventNames) { 
 
     if (el.style[name] !== undefined) { 
 
     return { end: transEndEventNames[name] } 
 
     } 
 
    } 
 

 
    return false // explicit for ie8 ( ._.) 
 
    } 
 

 
    // http://blog.alexmaccaw.com/css-transitions 
 
    $.fn.emulateTransitionEnd = function (duration) { 
 
    var called = false 
 
    var $el = this 
 
    $(this).one('bsTransitionEnd', function() { called = true }) 
 
    var callback = function() { if (!called) $($el).trigger($.support.transition.end) } 
 
    setTimeout(callback, duration) 
 
    return this 
 
    } 
 

 
    $(function() { 
 
    $.support.transition = transitionEnd() 
 

 
    if (!$.support.transition) return 
 

 
    $.event.special.bsTransitionEnd = { 
 
     bindType: $.support.transition.end, 
 
     delegateType: $.support.transition.end, 
 
     handle: function (e) { 
 
     if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) 
 
     } 
 
    } 
 
    }) 
 

 
}(jQuery); 
 

 

 

 
/* ======================================================================== 
 
* Bootstrap: carousel.js v3.3.7 
 
* http://getbootstrap.com/javascript/#carousel 
 
* ======================================================================== 
 
* Copyright 2011-2016 Twitter, Inc. 
 
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 
 
* ======================================================================== */ 
 

 

 
+function ($) { 
 
    'use strict'; 
 

 
    // CAROUSEL CLASS DEFINITION 
 
    // ========================= 
 

 
    var Carousel = function (element, options) { 
 
    this.$element = $(element) 
 
    this.$indicators = this.$element.find('.carousel-indicators') 
 
    this.options  = options 
 
    this.paused  = null 
 
    this.sliding  = null 
 
    this.interval = null 
 
    this.$active  = null 
 
    this.$items  = null 
 

 
    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) 
 

 
    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element 
 
     .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) 
 
     .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) 
 
    } 
 

 
    Carousel.VERSION = '3.3.7' 
 

 
    Carousel.TRANSITION_DURATION = 600 
 

 
    Carousel.DEFAULTS = { 
 
    interval: 5000, 
 
    pause: 'hover', 
 
    wrap: true, 
 
    keyboard: true 
 
    } 
 

 
    Carousel.prototype.keydown = function (e) { 
 
    if (/input|textarea/i.test(e.target.tagName)) return 
 
    switch (e.which) { 
 
     case 37: this.prev(); break 
 
     case 39: this.next(); break 
 
     default: return 
 
    } 
 

 
    e.preventDefault() 
 
    } 
 

 
    Carousel.prototype.cycle = function (e) { 
 
    e || (this.paused = false) 
 

 
    this.interval && clearInterval(this.interval) 
 

 
    this.options.interval 
 
     && !this.paused 
 
     && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) 
 

 
    return this 
 
    } 
 

 
    Carousel.prototype.getItemIndex = function (item) { 
 
    this.$items = item.parent().children('.item') 
 
    return this.$items.index(item || this.$active) 
 
    } 
 

 
    Carousel.prototype.getItemForDirection = function (direction, active) { 
 
    var activeIndex = this.getItemIndex(active) 
 
    var willWrap = (direction == 'prev' && activeIndex === 0) 
 
       || (direction == 'next' && activeIndex == (this.$items.length - 1)) 
 
    if (willWrap && !this.options.wrap) return active 
 
    var delta = direction == 'prev' ? -1 : 1 
 
    var itemIndex = (activeIndex + delta) % this.$items.length 
 
    return this.$items.eq(itemIndex) 
 
    } 
 

 
    Carousel.prototype.to = function (pos) { 
 
    var that  = this 
 
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) 
 

 
    if (pos > (this.$items.length - 1) || pos < 0) return 
 

 
    if (this.sliding)  return this.$element.one('slid.bs.carousel', function() { that.to(pos) }) // yes, "slid" 
 
    if (activeIndex == pos) return this.pause().cycle() 
 

 
    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) 
 
    } 
 

 
    Carousel.prototype.pause = function (e) { 
 
    e || (this.paused = true) 
 

 
    if (this.$element.find('.next, .prev').length && $.support.transition) { 
 
     this.$element.trigger($.support.transition.end) 
 
     this.cycle(true) 
 
    } 
 

 
    this.interval = clearInterval(this.interval) 
 

 
    return this 
 
    } 
 

 
    Carousel.prototype.next = function() { 
 
    if (this.sliding) return 
 
    return this.slide('next') 
 
    } 
 

 
    Carousel.prototype.prev = function() { 
 
    if (this.sliding) return 
 
    return this.slide('prev') 
 
    } 
 

 
    Carousel.prototype.slide = function (type, next) { 
 
    var $active = this.$element.find('.item.active') 
 
    var $next  = next || this.getItemForDirection(type, $active) 
 
    var isCycling = this.interval 
 
    var direction = type == 'next' ? 'left' : 'right' 
 
    var that  = this 
 

 
    if ($next.hasClass('active')) return (this.sliding = false) 
 

 
    var relatedTarget = $next[0] 
 
    var slideEvent = $.Event('slide.bs.carousel', { 
 
     relatedTarget: relatedTarget, 
 
     direction: direction 
 
    }) 
 
    this.$element.trigger(slideEvent) 
 
    if (slideEvent.isDefaultPrevented()) return 
 

 
    this.sliding = true 
 

 
    isCycling && this.pause() 
 

 
    if (this.$indicators.length) { 
 
     this.$indicators.find('.active').removeClass('active') 
 
     var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) 
 
     $nextIndicator && $nextIndicator.addClass('active') 
 
    } 
 

 
    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" 
 
    if ($.support.transition && this.$element.hasClass('slide')) { 
 
     $next.addClass(type) 
 
     $next[0].offsetWidth // force reflow 
 
     $active.addClass(direction) 
 
     $next.addClass(direction) 
 
     $active 
 
     .one('bsTransitionEnd', function() { 
 
      $next.removeClass([type, direction].join(' ')).addClass('active') 
 
      $active.removeClass(['active', direction].join(' ')) 
 
      that.sliding = false 
 
      setTimeout(function() { 
 
      that.$element.trigger(slidEvent) 
 
      }, 0) 
 
     }) 
 
     .emulateTransitionEnd(Carousel.TRANSITION_DURATION) 
 
    } else { 
 
     $active.removeClass('active') 
 
     $next.addClass('active') 
 
     this.sliding = false 
 
     this.$element.trigger(slidEvent) 
 
    } 
 

 
    isCycling && this.cycle() 
 

 
    return this 
 
    } 
 

 

 
    // CAROUSEL PLUGIN DEFINITION 
 
    // ========================== 
 

 
    function Plugin(option) { 
 
    return this.each(function() { 
 
     var $this = $(this) 
 
     var data = $this.data('bs.carousel') 
 
     var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) 
 
     var action = typeof option == 'string' ? option : options.slide 
 

 
     if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) 
 
     if (typeof option == 'number') data.to(option) 
 
     else if (action) data[action]() 
 
     else if (options.interval) data.pause().cycle() 
 
    }) 
 
    } 
 

 
    var old = $.fn.carousel 
 

 
    $.fn.carousel    = Plugin 
 
    $.fn.carousel.Constructor = Carousel 
 

 

 
    // CAROUSEL NO CONFLICT 
 
    // ==================== 
 

 
    $.fn.carousel.noConflict = function() { 
 
    $.fn.carousel = old 
 
    return this 
 
    } 
 

 

 
    // CAROUSEL DATA-API 
 
    // ================= 
 

 
    var clickHandler = function (e) { 
 
    var href 
 
    var $this = $(this) 
 
    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 
 
    if (!$target.hasClass('carousel')) return 
 
    var options = $.extend({}, $target.data(), $this.data()) 
 
    var slideIndex = $this.attr('data-slide-to') 
 
    if (slideIndex) options.interval = false 
 

 
    Plugin.call($target, options) 
 

 
    if (slideIndex) { 
 
     $target.data('bs.carousel').to(slideIndex) 
 
    } 
 

 
    e.preventDefault() 
 
    } 
 

 
    $(document) 
 
    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) 
 
    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) 
 

 
    $(window).on('load', function() { 
 
    $('[data-ride="carousel"]').each(function() { 
 
     var $carousel = $(this) 
 
     Plugin.call($carousel, $carousel.data()) 
 
    }) 
 
    }) 
 

 
}(jQuery);
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet"/> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div id="myCarousel" class="carousel slide" data-ride="carousel"> 
 
    <!-- Indicators --> 
 
    <ol class="carousel-indicators"> 
 
     <li data-target="#myCarousel" data-slide-to="0" class="active"></li> 
 
     <li data-target="#myCarousel" data-slide-to="1"></li> 
 
     <li data-target="#myCarousel" data-slide-to="2"></li> 
 
     <li data-target="#myCarousel" data-slide-to="3"></li> 
 
    </ol> 
 

 
    <!-- Wrapper for slides --> 
 
    <div class="carousel-inner" role="listbox"> 
 
     <div class="item active"> 
 
     <img src="http://www.w3schools.com/bootstrap/img_chania.jpg" alt="Chania" width="460" height="345"> 
 
     </div> 
 

 
     <div class="item"> 
 
     <img src="http://www.w3schools.com/bootstrap/img_chania2.jpg" alt="Chania" width="460" height="345"> 
 
     </div> 
 
    
 
     <div class="item"> 
 
     <img src="http://www.w3schools.com/bootstrap/img_flower.jpg" alt="Flower" width="460" height="345"> 
 
     </div> 
 

 
     <div class="item"> 
 
     <img src="http://www.w3schools.com/bootstrap/img_flower2.jpg" alt="Flower" width="460" height="345"> 
 
     </div> 
 
    </div> 
 

 
    <!-- Left and right controls --> 
 
    <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev"> 
 
     <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span> 
 
     <span class="sr-only">Previous</span> 
 
    </a> 
 
    <a class="right carousel-control" href="#myCarousel" role="button" data-slide="next"> 
 
     <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span> 
 
     <span class="sr-only">Next</span> 
 
    </a> 
 
    </div>