1

I'm creating a carousel to hold testimonials, but i'm having a few issues with the vertical alignment of the slides.

Ideally, the Slides will be centered upon entering the screen, but currently the slide will come in at the top, and then once the transition is over it jumps down to a centered alignment.

The Code:

html:

<div id="Testimonials" class="text-center bg-dark py-3">
  <div class="container">
    <div id="testimonial_carousel" class="carousel slide" data-ride="carousel">
      <div class="carousel-inner testimonial-carousel-inner d-flex align-items-center" role="listbox">
        <div class="carousel-item testimonial-carousel active">
          <div class="card">
            <div class="card-body"><i class="fa fa-quote-left"></i> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ultricies felis sed lectus porta, vitae vulputate turpis viverra. Suspendisse consectetur augue nulla, quis tincidunt nisi condimentum vitae. Cras congue tincidunt massa vel mattis. Quisque congue elit et mattis auctor. Nam dignissim dictum lacus id lacinia. Ut non accumsan nisi. Pellentesque.</div>
            <div class="card-body"><small>Anonymous</small></div>
          </div>
        </div>
        <div class="carousel-item testimonial-carousel">
          <div class="card">
            <div class="card-body"><i class="fa fa-quote-left"></i> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec dui leo, interdum eu faucibus nec, ornare volutpat risus. Vestibulum sem nisl, imperdiet sed rutrum et, semper eu justo. Proin porttitor nisl turpis, imperdiet condimentum urna.</div>
            <div class="card-body"><small>Anonymous</small></div>
          </div>
        </div>
        <div class="carousel-item testimonial-carousel">
          <div class="card">
            <div class="card-body"><i class="fa fa-quote-left"></i> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vestibulum gravida libero, eu elementum neque elementum sit amet. Sed ornare lectus non est luctus placerat. Donec et tristique purus. Ut vel ultrices quam. Sed aliquet, lacus sit amet vulputate imperdiet, augue ipsum gravida erat, eget rutrum ante dolor nec tellus. Praesent mattis, urna vel facilisis ullamcorper, velit arcu ultrices eros, et pellentesque nibh mi sit amet leo. Morbi porta metus vel sapien vulputate, quis congue massa tristique. Donec suscipit quis.</div>
            <div class="card-body"><small>Anonymous</small></div>
          </div>
        </div>
      </div>
      <a class="carousel-control-prev-hidden" href="#testimonial_carousel" data-slide="prev">
        <span class="carousel-control-prev-icon"></span>
      </a>
      <a class="carousel-control-next-hidden" href="#testimonial_carousel" data-slide="next">
        <span class="carousel-control-next-icon"></span>
      </a>
    </div>
  </div>
</div>

CSS

.testimonial-carousel-inner {
    height:auto;
}

.carousel-control-next-hidden,.carousel-control-prev-hidden{
    position:absolute;
    top:43.75%;
    height:50px;
    display:-webkit-box;
    display:-ms-flexbox;
    display:flex;
    -webkit-box-align:center;
    -ms-flex-align:center;
    align-items:center;
    -webkit-box-pack:center;
    -ms-flex-pack:center;
    justify-content:center;
    width:50px;
    color:#fff;
    background-color: rgba(111,111,111,0.2);
    text-align:center;
    opacity:.9
}
.carousel-control-next-hidden:hover,.carousel-control-prev-hidden:hover{
    color:#fff;
    background-color: rgba(0, 115, 255, 0.5);
    text-decoration:none;
    outline:0;
    opacity:0.9;
}


.carousel-control-prev-hidden {
    left:3%
}

.carousel-control-next-hidden {
    right:3%
}

.carousel-control-prev-icon {
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E") !important;
}

.carousel-control-next-icon {
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E") !important;
}

Javascript

$(document).ready(function() {

    $(window).resize(function() {
        standardiseHeight("testimonial-carousel");
    });


    standardiseHeight("testimonial-carousel");

    function standardiseHeight(divName) {

        // Sets a var to hold the height of the tallest slide

        $maxHeight = 0;

        // Resets previous height setting.

        $("."+divName+"-inner").css("height","auto");


        // Iterates through all slides
        $("."+divName).each(function(i, obj) {
            $thisHeight = $(this).outerHeight();

            //Compares height with the max number, sets max to the highest of the two
            if ($thisHeight > $maxHeight){
                $maxHeight = $thisHeight;
            }
        });

        // Sets the height of the container to the tallest slide
        $("."+divName+"-inner").css("height",$maxHeight+"px");
    }
});

and a jsfiddle to provide an example

https://jsfiddle.net/yL877nhz/11/

Some failed attempts to fix this include:

Setting the height for the testimonial-carousel class instead of testimonial-carousel-inner.

Setting the "d-flex align-items-center" class to the carousel items instead of the container for them

Attaching the "card" class to the "carousel-inner" div, which screwed with the transition even more.

Mossie
  • 13
  • 4

1 Answers1

0

All I do is set a flag to disallow recalculation function to run more than once at any given time. And I'm running it on window load and resize events. And I'm making all slides have equal heights.

let parsing = false,
  tCar = $('#testimonial_carousel'),
  reCalc = function() {
    if (!parsing) {
      parsing = true;
      $('.card').height('auto');
      setTimeout(() => {
        let height = 0;
        $('.carousel-item', tCar).each(function() {
          height = Math.max(height, $(this).height())
        })
        $('.card',tCar).each(function() {
          $(this).height(height);
        })
        tCar.height(height);
        parsing = false;
      })
    }
  }
$(window).on('load resize', reCalc);
.testimonial-carousel-inner {
  height: auto;
}
.card {
  justify-content: space-around;
}
div.card-body {
  flex-grow: 0;
}
.card small{
  padding: 15px;
}
#testimonial_carousel {
  transition: height .3s cubic-bezier(.4,0,.2,1);
}
.carousel-control-next-hidden,
.carousel-control-prev-hidden {
  position: absolute;
  top: calc(50% - 25px);
  height: 50px;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 50px;
  color: #fff;
  background-color: rgba(111, 111, 111, 0.2);
  text-align: center;
  opacity: .9
}

.carousel-control-next-hidden:hover,
.carousel-control-prev-hidden:hover {
  color: #fff;
  background-color: rgba(0, 115, 255, 0.5);
  text-decoration: none;
  outline: 0;
  opacity: 0.9;
}

.carousel-control-prev-hidden {
  left: 3%
}

.carousel-control-next-hidden {
  right: 3%
}

.carousel-control-prev-icon {
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E") !important;
}

.carousel-control-next-icon {
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E") !important;
}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>

  <main>
    <div id="Testimonials" class="text-center bg-dark py-3">
      <div class="container">
        <div id="testimonial_carousel" class="carousel slide" data-ride="carousel">
          <div class="carousel-inner testimonial-carousel-inner d-flex align-items-center" role="listbox">
            <div class="carousel-item testimonial-carousel active">
              <div class="card">
                <div class="card-body"><i class="fa fa-quote-left"></i> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ultricies felis sed lectus porta, vitae vulputate turpis viverra. Suspendisse consectetur augue nulla, quis tincidunt nisi condimentum vitae.
                  Cras congue tincidunt massa vel mattis. Quisque congue elit et mattis auctor. Nam dignissim dictum lacus id lacinia. Ut non accumsan nisi. Pellentesque.</div>
                <small>Anonymous</small>
              </div>
            </div>
            <div class="carousel-item testimonial-carousel">
              <div class="card">
                <div class="card-body"><i class="fa fa-quote-left"></i> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec dui leo, interdum eu faucibus nec, ornare volutpat risus. Vestibulum sem nisl, imperdiet sed rutrum et, semper eu justo. Proin porttitor nisl
                  turpis, imperdiet condimentum urna.</div>
                <small>Anonymous</small>
              </div>
            </div>
            <div class="carousel-item testimonial-carousel">
              <div class="card">
                <div class="card-body"><i class="fa fa-quote-left"></i> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vestibulum gravida libero, eu elementum neque elementum sit amet. Sed ornare lectus non est luctus placerat. Donec et tristique purus. Ut
                  vel ultrices quam. Sed aliquet, lacus sit amet vulputate imperdiet, augue ipsum gravida erat, eget rutrum ante dolor nec tellus. Praesent mattis, urna vel facilisis ullamcorper, velit arcu ultrices eros, et pellentesque nibh mi sit amet
                  leo. Morbi porta metus vel sapien vulputate, quis congue massa tristique. Donec suscipit quis.</div>
                <small>Anonymous</small>
              </div>
            </div>
          </div>
          <a class="carousel-control-prev-hidden" href="#testimonial_carousel" data-slide="prev">
      <span class="carousel-control-prev-icon"></span>
     </a>
          <a class="carousel-control-next-hidden" href="#testimonial_carousel" data-slide="next">
      <span class="carousel-control-next-icon"></span>
     </a>
        </div>
      </div>
    </div>
  </main>

Feel free to change justify-content of .card to space-between or center, if that's what you want. And don't forget to prefix.

If you're not happy with all slides having equal heights and you want the height of carousel to animate from slide to slide, I'd say it's too complex of a request to be asked for on SO, using Bootstrap v4's carousel component. You should either hire someone to code it for you or look for a carousel providing this feature out of the box (i.e: Slick).


Ref: "I'm creating a carousel for the company I am working for to hold testimonials", it roughly translates to: "I have a job I'm not qualified for so please be so kind as to work so I can get paid."
It is best you do not mention this at all. If you want people to help you, just make sure you do everything you possibly can to:

  • make it easy for others to help you
  • make your questions useful (general) enough so answers to it have a great chance of helping other people with a similar problem - in other words, don't ask very localized questions, which would only help a very specific case (yours) when answered.
tao
  • 82,996
  • 16
  • 114
  • 150
  • 1
    This is exactly what I was looking for, thanks mate. Also thanks for the heads up on presenting the question, admittedly i've lurked on the site for years but even then people can make mistakes. – Mossie Feb 22 '18 at 03:58