Jak mogę kontrolować prędkość przesuwania karuzeli bootstrap w elementach?

86

Widzę, że możesz ustawić interwał, ale chcę kontrolować szybkość przesuwania się elementów?

   // Sets interval...what is transition slide speed?
    $('#mainCarousel').carousel({
    interval: 3000
});
genxgeek
źródło
Googlersi -> spowolnienie INTERWAŁU (czas między wyświetleniem następnego obrazu) ::: stackoverflow.com/a/38203373/1985648
Don Cheadle

Odpowiedzi:

116

Prędkość nie może być kontrolowana przez API. Chociaż możesz zmodyfikować CSS, który za to odpowiada. W carousel.lesspliku znajdź

.item {
    display: none;
    position: relative;
    .transition(.6s ease-in-out left);
}

i zmień .6sna co chcesz.


Jeśli nie używasz .less, znajdź w bootstrap.csspliku:

.carousel-inner > .item {
    position: relative;
    display: none;
    -webkit-transition: 0.6s ease-in-out left;
    -moz-transition: 0.6s ease-in-out left;
    -o-transition: 0.6s ease-in-out left;
    transition: 0.6s ease-in-out left;
}

i zmień 0.6sna wybrany czas. Możesz również chcieć edytować czas w wywołaniu funkcji poniżej:

.emulateTransitionEnd(2000) 

co bootstrap.jsw funkcji Carousel.prototype.slide. To synchronizuje przejście i zapobiega znikaniu ślizgu przed zakończeniem przejścia.

EDYCJA 08.07.2014

Jak zauważył @YellowShark, zmiany w JS nie są już potrzebne. Zastosuj tylko zmiany CSS.

EDIT 20/8/2015 Teraz, po edycji pliku css, wystarczy edytować CAROUSEL.TRANSITION_DURATION (w bootstrap.js) lub c.TRANSITION_DURATION (jeśli używasz bootstrap.min.js) i zmienić wartość w nim (Domyślnie 600). Ostateczna wartość musi być taka sama, jaką umieściłeś w pliku css (na przykład 10s w css = 10000 in .js)

EDIT 16/01/2018 Dla Bootstrap 4, aby zmienić czas przejścia na np. 2 sekundy, dodaj

$(document).ready(function() {
  jQuery.fn.carousel.Constructor.TRANSITION_DURATION = 2000  // 2 seconds
});

do pliku JS swojej witryny, a

.carousel-inner .carousel-item {
  transition: -webkit-transform 2s ease;
  transition: transform 2s ease;
  transition: transform 2s ease, -webkit-transform 2s ease;
}

do pliku CSS witryny.

Dmitry Efimenko
źródło
1
Dziękuję za odpowiedź! Próbowałem umieścić to drugie w moich stylach mojej głównej strony .html i zmieniłem .6 na .1 i nie przyniosło to żadnego efektu przy używaniu chrome.
genxgeek
Nie jest jasne ... czy próbowałeś zmodyfikować pliki bootstrap, czy po prostu dodałeś te rzeczy do własnego css? Bezpieczniej jest edytować pliki bootstrap. W przeciwnym razie musisz upewnić się, że style ładują się jako ostatnie i nadpisują style bootstrap.
Dmitry Efimenko
2
Chciałem tylko podkreślić, że NIE musisz modyfikować żadnego javaScript (już), ten wiersz w kodzie pobiera teraz wartość .css ('czas trwania przejścia') , więc wystarczy dodać trochę CSS, jak opisano powyżej, i Otóż ​​to. (Upewnij się też, że element karuzeli ma klasę „slajd”, nie jestem pewien, czy jest to wymienione w dokumentach).
YellowShark
5
W Bootstrap 3 (w każdym razie v3.3.5) JS nie pobiera już tej wartości czasu trwania z CSS. Można to łatwo ustawić bez modyfikowania Bootstrapa, jak na przykład:jQuery.fn.carousel.Constructor.TRANSITION_DURATION = 1000;
Walf
1
jQuery.fn.carousel.Constructor.TRANSITION_DURATION zwraca undefined. Jak to zmienić? Przejście działa i przesuwa się powoli, ale obraz, który się wysuwa, jest wyświetlany: brak; za szybko.
Ben
95

Po prostu napisz data-intervalw divzawierającym karuzelę:

<div id="myCarousel" class="carousel slide" data-ride="carousel" data-interval="500">

Przykład zaczerpnięty z w3schools .

jaswinder singh
źródło
Spróbuj sformatować swoje pytanie w bardziej właściwy sposób. Przy okazji. tylko link nie są uważane za dobre odpowiedzi.
ckruczek
1
Ostrzeżenie: „interwał danych” jest mierzony w milisekundach. 500 = 0,5 sekundy (tak szybko). Jeśli masz jakiś tekst do wyświetlenia na slajdach, 10000 (10 sekund) jest lepsze. Działa w porządku. Myślę, że to powinna być akceptowana odpowiedź.
Renascienza
19
Ta odpowiedź jest nieprawidłowa . data-intervalokreśla przedział czasu, po którym przesuwa się nowy slajd. Nie określa, ile czasu zajmuje przesunięcie jednego slajdu.
user31782
1
Dzięki stary, to uratowało mi dzień. +1 i powinno być zaznaczone jako prawidłowa odpowiedź, zamiast edytować plik bootstrap.css.
FONGOH MARTIN
2
Szukałem tej dokładnej odpowiedzi ... ale wcześniej próbowałem innej odpowiedzi, zanim zdałem sobie sprawę, że ma to związek z szybkością slajdów, podczas gdy ta odpowiedź dotyczy odstępów czasu między slajdami. Dziękuję za dołączenie tej odpowiedzi, ponieważ właśnie tego chciałem! (nawet jeśli 500 to za szybko, ale to inna historia)
Malachi
13

Musisz ustawić interwał w głównym DIV jako tag interwału danych. To będzie działać dobrze i możesz dać inny czas różnym slajdom.

<div class="carousel" data-interval="5000">
Ali Umair
źródło
Czy możesz podać przykład. Muszę podać inny przedział czasu dla slajdów różnicowych, które są skonfigurowane w moim kontrolerze zwróconym z wywołania interfejsu API. Czy możemy wyświetlać strony internetowe również za pomocą suwaka?
Archna
1
data-interval określa przedział czasu, po którym przesuwa się nowy slajd, a nie czas trwania animacji.
Ricardo Vigatti
11

W przypadku Twitter Bootstrap 3:

Musisz zmienić przejście CSS, jak określono w innej odpowiedzi:

.carousel-inner > .item {
    position: relative;
    display: none;
    -webkit-transition: 0.6s ease-in-out left;
    -moz-transition: 0.6s ease-in-out left;
    -o-transition: 0.6s ease-in-out left;
    transition: 0.6s ease-in-out left;
}

Na przykład od 0,6 sekundy do 1,5 sekundy.

Ale jest też trochę Javascript do zmiany. W pliku bootstrap.js znajduje się wiersz:

.emulateTransitionEnd(600)

Należy to zmienić na odpowiednią liczbę milisekund. Więc przez 1,5 sekundy zmieniłbyś liczbę na 1500:

.emulateTransitionEnd(1500)
Chris Harrison
źródło
Chris, super. Dzięki!
genxgeek
8

Zauważyłem jedną rzecz, że Bootstrap 3 dodaje style za pomocą zarówno a, jak .6si 0.6s. Dlatego może być konieczne wyraźne zdefiniowanie czasu trwania przejścia w ten sposób (CSS)

    .carousel-inner>.item {
    -webkit-transition: 0.9s ease-in-out left;
    transition: 0.9s ease-in-out left;
    -webkit-transition: 0.9s, ease-in-out, left;
    -moz-transition: .9s, ease-in-out, left;
    -o-transition: .9s, ease-in-out, left;
    transition: .9s, ease-in-out, left;
    }
bkrall
źródło
1
U mnie nie działa :( nadal
toczy się
7

Z Bootstrap 4, po prostu użyj tego CSS:

.carousel .carousel-item {
    transition-duration: 3s;
}

Zmień 3swybrany czas trwania.

kmoser
źródło
1
bardzo, bardzo fajnie :)
Mohammed Baashar
6

pracowałem nad dodaniem tego na końcu mojego widoku:

<script type="text/javascript">
$(document).ready(function(){
     $("#myCarousel").carousel({
         interval : 8000,
         pause: false
     });
});
</script>

daje to karuzeli odstęp 8 sekund

Erik
źródło
3

nie potrzeba żadnego zewnętrznego kodu, wystarczy użyć data-interval=""atrybutu

więcej informacji odwiedź getbootstrap

<div id="carouselExampleCaptions" class="carousel slide" data-ride="carousel" data-interval="2500">

kiedy chcesz zmienić prędkość zmień "2500"

Chethana Kalpa
źródło
2

Jeśli chcesz to zrobić programowo, aby zmienić (na przykład) prędkość w oparciu o określone warunki na być może tylko jednej z wielu karuzel, możesz zrobić coś takiego:

Jeśli kod HTML wygląda tak:

<div id="theSlidesList" class="carousel-inner" role="listbox">
  <div id="Slide_00" class="item active"> ...
  <div id="Slide_01" class="item"> ...
  ...
</div>

JavaScript wyglądałby tak:

$( "#theSlidesList" ).find( ".item" ).css( "-webkit-transition", "transform 1.9s ease-in-out 0s" ).css( "transition", "transform 1.9s ease-in-out 0s" )

Dodaj więcej plików .css (...), aby uwzględnić inne przeglądarki.

Jelgab
źródło
2

po bootstrap.min.jsdołączeniu lub zdekompresowaniu jednego, możesz po prostu dodać interwał jako parametr, jak poniżej. U jQuery("#numbers").carousel({'interval':900 });mnie działa

Patrick Mutwiri
źródło
2

Jeśli nie chcesz zmieniać plików js programu bootstrap, możesz również bezpośrednio wstrzyknąć żądaną wartość do wtyczki jquery (bootsrap 3.3.6).

Wymaga to oczywiście, aby karuzela była aktywowana ręcznie przez js, a nie bezpośrednio przez atrybut data-ride.

Na przykład:

var interval = 3500;
$.fn.carousel.Constructor.TRANSITION_DURATION = interval - 500;
elem.carousel({
    interval : interval
});
Andreas
źródło
Podoba mi się to podejście, ponieważ nie wymaga edycji bootstrap.jsi sprawia, że ​​jest „nieaktualne” ..
TryingToImprove
Po zmianie na 200 nie widzę już płynnej animacji, obrazy znikną w środku przejścia
TomSawyer,
Cześć @TomSawyer - animacje są utrzymywane przez css, ale ważne jest, aby TRANSITON_DURATION był wystarczająco długi, aby pokryć pełne przejście. w javascript po prostu określa, kiedy inklasa jest ustawiona i kiedy jest ponownie usuwana. Jeśli chcesz skrócić animację, sprawdź, gdzie jest zdefiniowana w mniejszych plikach.
Andreas
2

W przypadku bootstrap 4 z scss możesz nadpisać zmienną konfiguracyjną $carousel-transition-durationw _variables.scssnastępujący sposób:

$carousel-transition-duration: 2s;

Lub dla indywidualnego czasu trwania elementu ustaw

.carousel-item {
    transition-duration: 2s;
}

Twojego konkretnego elementu w twoim css / scss.

shaack
źródło
1

U mnie zadziałała zmiana interwału w pliku bootstrap.js

  Carousel.DEFAULTS = {
    interval: 2000,      // <----- change this
    pause: 'hover',
    wrap: true,
    keyboard: true
  }
paulo62
źródło
1
To steruje częstotliwością animacji, a nie szybkością pojedynczej animacji.
Walf
1

Aby uzupełnić poprzednie odpowiedzi, po edycji pliku CSS wystarczy edytować CAROUSEL.TRANSITION_DURATION(w bootstrap.js ) lub c.TRANSITION_DURATION(jeśli używasz bootstrap.min.js ) i zmienić jego wartość (domyślnie 600). Ostateczna wartość musi być taka sama, jak umieszczona w pliku CSS (na przykład 10 w CSS = 10000 w .js)

Carousel.VERSION  = '3.3.2'
Carousel.TRANSITION_DURATION = xxxxx /* Your number here*/
Carousel.DEFAULTS = {
interval: 5000 /* you could change this value too, but to add data-interval="xxxx" to your html it's fine too*/
pause: 'hover',
wrap: true,
keyboard: true
}
Sergio Blanco
źródło
1

Jeśli chcesz edytować szybkość, z jaką slajdy wchodzą i wychodzą (a nie czas pomiędzy zmianą slajdów, zwany interwałem), w programie bootstrap 3.3.5 | Po załadowaniu stylów bootstrap CDN, nadpisz style we własnym zestawie stylów css, używając następujących klas. 1.5 to zmiana czasu.

.carousel-inner > .item {
-webkit-transition: 1.5s ease-in-out ;
-o-transition: 1.5s ease-in-out ;
transition: 1.5s ease-in-out ;
}
.carousel-inner > .item {
-webkit-transition: -webkit-transform 1.5s ease-in-out;
-o-transition: -o-transform 1.5s ease-in-out;
transition: transform 1.5s ease-in-out;

}

potem będziesz musiał zamienić funkcję karuzeli w javascript. Aby to zrobić, po załadowaniu nadpisujesz domyślną funkcję bootstrap.min.js. (Moim zdaniem bezpośrednie nadpisywanie plików bootstrap nie jest dobrym pomysłem). więc utwórz mynewscript.js i załaduj go po bootstrap.min.js i dodaj nową funkcję karuzeli. Jedyną linią, którą chcesz edytować, jest ta Carousel.TRANSITION_DURATION = 1500. 1500 to 1,5. Mam nadzieję że to pomoże.

    +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.5'

  Carousel.TRANSITION_DURATION = 1500

  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);
Cameron
źródło
1

W swoim CSS:

.carousel-item {
    transition-duration: 1.5s, 1.5s;
}

Uważaj, czas jest zawarty w przedziale danych zdefiniowanym dla karuzeli.

Mam nadzieję, że to pomoże... :)

Ovidiu Cosma
źródło
0

Cała karuzela

  <script type="text/javascript">
              $(document).ready(function () {
            $('.carousel').carousel({
                interval: 15000
            })
        });

    </script>
سیدرسول میرعظیمی
źródło
Proszę podać wyjaśnienie wraz z odpowiedzią
Panther
1
Po raz kolejny określa to po prostu interwał, a nie czas przejścia
Tim Hallman
0

Dodaj interwał danych

data-interval="20000"
Pankaj Upadhyay
źródło
0

W pliku main.js lub bootstrap.js zmień wartość autoplayTimeout

    $('.carousel').each(function () {
        $(this).owlCarousel({
            nav: $(this).data('nav'),
            dots: $(this).data('dots'),
            loop: $(this).data('loop'),
            margin: $(this).data('space'),
            center: $(this).data('center'),
            dotsSpeed: $(this).data('speed'),
            autoplay: $(this).data('autoplay'),
            transitionStyle: $(this).data('transition'),
            animateOut: $(this).data('animate-out'),
            animateIn: $(this).data('animate-in'),
            autoplayTimeout: 3000,
            responsive: {
                0: {
                    items: 1,
                },
                400: {
                    items: $(this).data('slide-sm'),
                },
                700: {
                    items: $(this).data('slide-md'),
                },
                1000: {
                    items: $(this).data('slide'),
                }
            }
        });
    });

W. KIJEDI
źródło
0

Możesz tego użyć

<div id="carouselExampleSlidesOnly" class="carousel slide" data-ride="carousel" data-interval="4000">

Po prostu dodaj data-interval = "1000", gdzie następny obrazek. nastąpi po 1 sek.

Jovan Ilic
źródło
-1

Jeśli używasz modułu ngCarousel, edytuj zmienną interwałową w pliku @ ng-bootstrap / ng-bootstrap / carousel-config.js w następujący sposób:

var NgbCarouselConfig = /** @class */ (function () {
function NgbCarouselConfig() {
    this.interval = 10000;
    this.wrap = true;
    ...
}
...
user773881
źródło