I am using Bootstrap to create a carousel, I have large images so when the screen is smaller than the image, the ratio is not kept.
How could I change that?
Here is my code:
.carousel .item {
height: 500px;
}
.carousel img {
position: absolute;
top: 0;
left: 0;
min-width: 100%;
height: 500px;
}
http://jsfiddle.net/DRQkQ/
I need the image to fit 100% width but keep its height of 500px (I think it's 500px) this should mean that on smaller screen we don't see the far left and far right of the image.
I tried containing the image in a div and add
overflow: hidden;
width: 100%;
height: 500px;
display: block;
margin: 0 auto;
But it doesn't work
Thank you!
1 method is to use a div with a specified size, use css to set the image as a background image for the div and set background-size to fit, contain or cover. 2 A better approach is to use an image manipulation program like photoshop, i personally use an online application called https://www.photopea.com.
In the CSS for the <div>, add a percentage value for padding-bottom and set the position to relative, this will maintain the aspect ratio of the container. The value of the padding determines the aspect ratio. ie 56.25% = 16:9.
The Simple Solution Using CSSBy setting the width property to 100%, you are telling the image to take up all the horizontal space that is available. With the height property set to auto, your image's height changes proportionally with the width to ensure the aspect ratio is maintained.
The issue lays here, on bootstrap CSS:
img {
max-width: 100%;
width: auto 9;
height: auto;
vertical-align: middle;
border: 0;
-ms-interpolation-mode: bicubic;
}
Having set max-width: 100%;
the image won't be any larger than the viewport. You need to override that behavior on your CSS:
.carousel img {
position: absolute;
top: 0;
left: 0;
min-width: 100%;
height: 500px;
max-width: none;
}
Note the max-width: none;
added at the bottom. This is the default max-width value and unsets the limit.
Here's your fiddle updated.
I think it is better to handle it with CSS3 object-fit
attribute.
If you have image with fixed width and height and still if you want to preserve the aspect ratio, you can use object-fit:contain;
. It will maintain the ratio with given height and width.
For example :
img {
height: 100px;
width: 100px;
object-fit: contain;
}
You can find more details here : http://www.creativebloq.com/css3/control-image-aspect-ratios-css3-2122968
Hope this will be useful to someone.
Delete the img
tag inside the carousel item and add a background. In this way you can use the CSS3 cover property.
.item1 {
background: url('bootstrap/img/bg.jpg') no-repeat center center fixed;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
}
to maintain aspect ratio & full coverage of carousel div:
img {
object-fit: cover;
overflow: hidden;
}
I was able to achieve this by commenting out the height line from the carousel.css line as shown below:
.carousel-inner > .item > img {
position: absolute;
top: 0;
left: 0;
min-width: 100%;
/*height: 500px;*/
}
This code finally worked for me:
.carousel .item {
background:#F9F9F9;
border:1px solid #E0E0E0;
overflow:hidden;
margin-bottom:1em;
margin-top:1em;
padding:5px;
}
.carousel-inner > .item > img {
border: 1px solid #DDDDDD;
float: left;
margin: 0pt 3px;
padding: 2px;
height: none;
width: 100%;
}
.carousel-inner > .item > img:hover {
border: 1px solid #000000;
}
As others have mentioned, css3 works nicely for this. I used full width, fixed height for the container, then scaled the image keeping aspect ratio with 'cover', then throw away the overflow:
.carousel .carousel-inner img {
width: 100%;
height: 30em;
object-fit: cover;
overflow: hidden;
}
Apparently, the above mentioned solutions did not work for me (I don't know why?) but I found another workaround using javascript.
Basically, this is a more tedious method but also works. You use jQuery to set the carousel height to the width divided by a certain aspect ratio.
Here is my code:
var aspectRatio = 2.5; //Width to Height!!!
var imageWidth;
var imageHeight;
//bind the window resize event to the method -
//change in carousel width is only triggered when size of viewport changes
$(window).on("resize", methodToFixLayout);
//updates the carousel width when the window is resized
function methodToFixLayout(e){
imageWidth = carousel.width();
console.log("");
console.log("Method width" + imageWidth);
console.log("");
imageHeight = imageWidth / aspectRatio;
carouselContainer.height(imageHeight);
carousel.height(imageHeight);
carouselPic.height(imageHeight);
//solve the carousel glitch for small viewports - delete the carousel
windowWidth = $(window).width();
if (windowWidth < 840){
carousel.hide();
$("#side-navbar").hide();
} else {
carousel.show();
$("#side-navbar").show();
}
}
It seems to work for me fine.
Hope it works for you too.
You can either set the aspect ratio yourself, or use another method. First, set the window width and height to a view dimension where the picture appears well formatted. Query the width and height, and work out the ratio. Return the window back to the original width and height. The user would not notice the change at all but the dimensions would be recorded.
Most of these answers are old enough that they only apply to Bootstrap 3. Here's a solution for Bootstrap 4 that not only retains the same aspect ratio, but also fits the images into the carousel so they're as large as possible without being distorted. This prevents the carousel from "jumping" when transitioning between slides with different aspect ratios.
For images whose aspect ratio doesn't match that of the carousel, you'll see the div.stretchy-wrapper
background color around the edges. You can set it to any other color, or remove it entirely to let the container's background color show through.
To alter the carousel's aspect ratio, change the padding-top
property of div.stretchy-wrapper
. Note that images are specified by setting the background-image
property of each .carousel-item
, which is a slight departure from the Bootstrap standard but which still works perfectly well.
https://codepen.io/km0ser/pen/BazyemW
/* https://www.w3schools.com/howto/tryit.asp?filename=tryhow_css_aspect_ratio_169 */
div.stretchy-wrapper {
background-color: green;
position: relative;
width: 100%;
padding-top: 56.25%; /* 16:9 Aspect Ratio */
}
div.stretchy-wrapper > div {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
background-size: contain;
background-repeat: no-repeat;
background-position: center center;
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
<div class="container">
<div id="carouselExampleControls" class="carousel slide" data-ride="carousel">
<div class="stretchy-wrapper carousel-inner">
<div class="carousel-item active" style="background-image:url('https://picsum.photos/1600/900');">
</div>
<div class="carousel-item" style="background-image:url('https://picsum.photos/900/1600');">
</div>
<div class="carousel-item" style="background-image:url('https://picsum.photos/400/300');">
</div>
<div class="carousel-item" style="background-image:url('https://picsum.photos/300/400');">
</div>
</div>
<a class="carousel-control-prev" href="#carouselExampleControls" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#carouselExampleControls" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div><!-- carousel -->
</div><!-- container -->
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With