J'utilise la classe de carrousel de Bootstrap et cela a été simple jusqu'à présent. Cependant, un problème que j'ai rencontré est que des images de différentes hauteurs font rebondir les flèches pour s'adapter à la nouvelle hauteur.
C'est le code que j'utilise pour mon carrousel:
<div id="myCarousel" class="carousel slide">
<div class="carousel-inner">
<div class="item active">
<img src="image_url_300height"/>
<div class="carousel-caption">
<h4>...</h4>
<p>...</p>
</div>
</div>
<div class="item">
<img src="image_url_700height" />
</div>
</div>
<!-- Carousel nav -->
<a class="carousel-control left" href="#myCarousel" data-slide="prev">‹</a>
<a class="carousel-control right" href="#myCarousel" data-slide="next">›</a>
</div>
Le problème est également illustré dans ce jsfiddle ((Certes pas le mien, j’ai trouvé ceci sur une question distincte tout en essayant de résoudre ce problème!)
Ma question est la suivante: comment puis-je forcer le carrousel à rester à une hauteur fixe (deuxième vignette dans le violon) et à centrer des images plus petites tout en maintenant les légendes et la flèche dans une position statique par rapport au carrousel?
Il semble que bootstrap less/CSS force une hauteur automatique pour éviter d’étirer l’image lorsque la largeur doit changer pour être sensible. Je l'ai basculé pour rendre la largeur automatique et fixer la hauteur.
<div class="item peopleCarouselImg">
<img src="http://upload.wikimedia.org/...">
...
</div>
Je définis ensuite img avec une classe peopleCarouselImg
comme ceci:
.peopleCarouselImg img {
width: auto;
height: 225px;
max-height: 225px;
}
Je fixe ma taille à 225px. Je laisse la largeur s'ajuster automatiquement pour maintenir le rapport d'aspect correct.
Cela semble fonctionner pour moi.
Essayez ceci (j'utilise SASS ):
.carousel {
max-height: 700px;
overflow: hidden;
.item img {
width: 100%;
height: auto;
}
}
Vous pouvez envelopper le .carousel
dans un .container
si vous le souhaitez.
Essayez avec ce code jQuery qui normalise les hauteurs de diapositives du carrousel Bootstrap
function carouselNormalization() {
var items = $('#carousel-example-generic .item'), //grab all slides
heights = [], //create empty array to store height values
tallest; //create variable to make note of the tallest slide
if (items.length) {
function normalizeHeights() {
items.each(function() { //add heights to array
heights.Push($(this).height());
});
tallest = Math.max.apply(null, heights); //cache largest value
items.each(function() {
$(this).css('min-height', tallest + 'px');
});
};
normalizeHeights();
$(window).on('resize orientationchange', function() {
tallest = 0, heights.length = 0; //reset vars
items.each(function() {
$(this).css('min-height', '0'); //reset min-height
});
normalizeHeights(); //run it again
});
}
}
Voici la solution qui a fonctionné pour moi; Je l'ai fait ainsi car le contenu du carrousel était généré dynamiquement à partir du contenu soumis par l'utilisateur (nous ne pouvions donc pas utiliser de hauteur statique dans la feuille de style).
function updateCarouselSizes(){
jQuery(".carousel").each(function(){
// I wanted an absolute minimum of 10 pixels
var maxheight=10;
if(jQuery(this).find('.item,.carousel-item').length) {
// We've found one or more item within the Carousel...
jQuery(this).carousel(); // Initialise the carousel (include options as appropriate)
// Now we iterate through each item within the carousel...
jQuery(this).find('.item,.carousel-item').each(function(k,v){
if(jQuery(this).outerHeight()>maxheight) {
// This item is the tallest we've found so far, so store the result...
maxheight=jQuery(this).outerHeight();
}
});
// Finally we set the carousel's min-height to the value we've found to be the tallest...
jQuery(this).css("min-height",maxheight+"px");
}
});
}
jQuery(function(){
jQuery(window).on("resize",updateCarouselSizes);
updateCarouselSizes();
}
Techniquement, cela n’est pas réactif, mais pour les besoins de notre on window resize
, cela se comporte de manière réactive.
La solution donnée précédemment conduit à une situation dans laquelle les images risquent d'être trop petites pour la boîte à carrousel. Une solution appropriée au problème de décalage des contrôles consiste à remplacer Bootstraps CSS.
Code original:
.carousel-control {
top: 40%;
}
Remplacez la variable par une valeur fixe dans votre propre feuille de style (300px travaillée dans ma conception):
.carousel-control {
top: 300px;
}
Espérons que cela résoudra votre problème.
Incluez ce JavaScript dans votre pied de page (après le chargement de jQuery):
$('.item').css('min-height',$('.item').height());
Si vous voulez avoir ce travail avec des images de n'importe quelle hauteur et sans fixer la hauteur, procédez comme suit:
$('#myCarousel').on("slide.bs.carousel", function(){
$(".carousel-control",this).css('top',($(".active img",this).height()*0.46)+'px');
$(this).off("slide.bs.carousel");
});
Plus récemment, je teste cette source CSS pour le carrousel Bootstrap
La hauteur réglée sur 380 doit être égale à la plus grande/plus grande image affichée ...
Veuillez voter cette réponse en fonction des tests d’utilisabilité avec les remerciements CSS suivants.
/* CUSTOMIZE THE CAROUSEL
-------------------------------------------------- */
/* Carousel base class */
.carousel {
max-height: 100%;
max-height: 380px;
margin-bottom: 60px;
height:auto;
}
/* Since positioning the image, we need to help out the caption */
.carousel-caption {
z-index: 10;
background: rgba(0, 0, 0, 0.45);
}
/* Declare heights because of positioning of img element */
.carousel .item {
max-height: 100%;
max-height: 380px;
background-color: #777;
}
.carousel-inner > .item > img {
/* position: absolute;*/
top: 0;
left: 0;
min-width: 40%;
max-width: 100%;
max-height: 380px;
width: auto;
margin-right:auto;
margin-left:auto;
height:auto;
}
Vous pouvez également utiliser ce code pour vous adapter à toutes les images du carrousel.
.carousel-item{
width: 100%; /*width you want*/
height: 500px; /*height you want*/
overflow: hidden;
}
.carousel-item img{
width: 100%;
height: 100%;
object-fit: cover;
}
Dans le cas où quelqu'un est en train de goûter fébrilement à Google pour résoudre le problème des images rebondissantes, cela m'a aidé
.fusion-carousel .fusion-carousel-item img {
width: auto;
height: 146px;
max-height: 146px;
object-fit: contain;
}
.className{
width: auto;
height: 200px;
max-height: 200px;
max-width:200px
object-fit: contain;
}
Cette fonction jQuery a fonctionné le mieux pour moi. J'utilise bootstrap 4 dans un thème WordPress et j'ai utilisé l'intégralité de jQuery au lieu de jQuery slim.
// Set all carousel items to the same height
function carouselNormalization() {
window.heights = [], //create empty array to store height values
window.tallest; //create variable to make note of the tallest slide
function normalizeHeights() {
jQuery('#latest-blog-posts .carousel-item').each(function() { //add heights to array
window.heights.Push(jQuery(this).outerHeight());
});
window.tallest = Math.max.apply(null, window.heights); //cache largest value
jQuery('#latest-blog-posts .carousel-item').each(function() {
jQuery(this).css('min-height',tallest + 'px');
});
}
normalizeHeights();
jQuery(window).on('resize orientationchange', function () {
window.tallest = 0, window.heights.length = 0; //reset vars
jQuery('.sc_slides .item').each(function() {
jQuery(this).css('min-height','0'); //reset min-height
});
normalizeHeights(); //run it again
});
}
jQuery( document ).ready(function() {
carouselNormalization();
});
La source:
Vous pouvez utiliser ces lignes dans le fichier css:
ul[rn-carousel] {
> li {
position: relative;
margin-left: -100%;
&:first-child {
margin-left: 0;
}
}
}