Search code examples
csstwitter-bootstraptwitter-bootstrap-3carousel

How to move bootstrap 3 carousel caption below images?


I have this html that shows slideshow images using bootstrap 3 :

<div class="col-sm-8">



            <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>
                <li data-target="#myCarousel" data-slide-to="4"></li>
                <li data-target="#myCarousel" data-slide-to="5"></li>
            </ol>

            <!-- Wrapper for slides -->
            <div class="carousel-inner" role="listbox">
                {% for p in posts %}
                    {% if forloop.counter == 1 %}
                    <div class="item active">
                    {% else %}
                    <div class="item">
                   {% endif %}

                    {% if p.headimage %}
                    <img src="{{ p.headimage.url }}" alt="Image" width="460" height="345">
                     {% endif %}
                      <div class="carousel-caption">
                        <h3>{{ p.title }}</h3>
                        <p>{{ p.teaser }}</p>
                      </div>
                </div>
                {% endfor %}
                </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>

</div>

I want caption to be shown below the image, not over it.

I tried to manipulate the html and css but could not achieve this, so appreciate your help.

Update: Apart from native bootstrap, I have tried these custom css directives (which did not help):

.carousel-inner { padding-bottom:95px; }
.carousel-caption { bottom:-95px; }

Solution

  • Start by changing the position of the caption element from absolute to relative:

    .carousel-caption {
        position: relative;
        left: auto;
        right: auto;
    }
    

    Demo

    $(function() {
      $('#homeCarousel').carousel({
        interval: 4000
      });
    });
    #carouselButtons {
      margin-left: 100px;
      position: absolute;
      bottom: 0;
    }
    
    .carousel .carousel-caption {
      position: relative;
      left: auto;
      right: auto;
    }
    
    .carousel .carousel-indicators li {
      background-color: red;
    }
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <link href="http://netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.min.css">
    
    <!-- Carousel -->
    <div id="homeCarousel" class="carousel slide">
      <!-- Menu -->
      <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>
      </ol>
    
      <!-- Items -->
      <div class="carousel-inner">
        <!-- Item 1 -->
        <div class="item active">
          <img src="https://via.placeholder.com/1800x600" />
    
          <div class="container">
            <div class="carousel-caption">
              <h1>Bootstrap 3 Carousel Layout</h1>
    
              <p>This is an example layout with carousel that uses the Bootstrap 3 styles.</p>
              <p><a class="btn btn-lg btn-primary" href="http://getbootstrap.com">Learn More</a>
              </p>
            </div>
          </div>
        </div>
    
        <!-- Item 2 -->
        <div class="item">
          <img src="https://via.placeholder.com/1800x600" />
          <div class="container">
            <div class="carousel-caption">
              <h1>Changes to the Grid</h1>
    
              <p>Bootstrap 3 still features a 12-column grid, but many of the CSS class names have completely changed.</p>
              <p><a class="btn btn-large btn-primary" href="#">Learn more</a>
              </p>
            </div>
          </div>
        </div>
    
        <!-- Item 3 -->
        <div class="item">
          <img src="https://via.placeholder.com/1800x600" />
          <div class="container">
            <div class="carousel-caption">
              <h1>Percentage-based sizing</h1>
    
              <p>With "mobile-first" there is now only one percentage-based grid.</p>
              <p><a class="btn btn-large btn-primary" href="#">Browse gallery</a>
              </p>
            </div>
          </div>
        </div>
      </div>
    
      <!-- Controls -->
      <a class="left carousel-control" href="#myCarousel" data-slide="prev">
        <span class="icon-prev"></span>
      </a>
      <a class="right carousel-control" href="#myCarousel" data-slide="next">
        <span class="icon-next"></span>
      </a>
    </div>
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>