Twitter Bootstrap карусель разной высоты изображения вызывают подпрыгивающие стрелки
Я использую класс карусели Bootstrap, и до сих пор это было просто, однако одна проблема, с которой я столкнулся, заключается в том, что изображения разной высоты заставляют стрелки подпрыгивать вверх и вниз, чтобы приспособиться к новой высоте..
Это код, который я использую для моей карусели:
<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>
проблема также проиллюстрирована в этом jsfiddle (правда не мое, я нашел это на отдельный вопрос, пытаясь решить эту проблему!)
мой вопрос: Как я могу заставить карусель оставаться на фиксированной высоте (второй эскиз в скрипке) и центрировать меньшие изображения, сохраняя заголовки и стрелки в статическом положении относительно карусели?
12 ответов:
похоже, что bootstrap less / CSS заставляет автоматическую высоту избегать растяжения изображения, когда ширина должна измениться, чтобы быть отзывчивой. Я переключил его, чтобы сделать ширину автоматической и зафиксировать высоту.
<div class="item peopleCarouselImg"> <img src="http://upload.wikimedia.org/..."> ... </div>затем я определяю img с классом
peopleCarouselImgтакой:.peopleCarouselImg img { width: auto; height: 225px; max-height: 225px; }я фиксирую свой рост до 225px. Я позволяю ширине автоматически регулироваться, чтобы сохранить правильное соотношение сторон.
Это, кажется, работает для меня.
попробуйте это (я использую Сасс):
.carousel { max-height: 700px; overflow: hidden; .item img { width: 100%; height: auto; } }вы можете обернуть
.carouselна.containerЕсли вы хотите.
попробуйте с этим кодом jQuery, который нормализует высоту слайдов карусели 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 }); } }
вот решение, которое сработало для меня; я сделал это таким образом, поскольку контент в Карусели был динамически сгенерирован из пользовательского контента (поэтому мы не могли использовать статическую высоту в таблице стилей) - это решение также должно работать с экранами разного размера:
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(); }технически это не реагирует, но для моих целей
on window resizeделает это вести себя ответственно.
решение, приведенное ранее, приводит к ситуации, когда изображения могут быть слишком малы для коробки карусели. Правильное решение проблемы натыкаясь управления является изменение загрузки в CSS.
исходный код:
.carousel-control { top: 40%; }переопределите переменную с фиксированным значением внутри вашей собственной таблицы стилей (300px работал в моем дизайне):
.carousel-control { top: 300px; }надеюсь, это решит вашу проблему.
включите этот JavaScript в нижний колонтитул (после загрузки jQuery):
$('.item').css('min-height',$('.item').height());
Если вы хотите иметь эту работу с изображениями любой высоты и без фиксации высоты, просто сделать это:
$('#myCarousel').on("slide.bs.carousel", function(){ $(".carousel-control",this).css('top',($(".active img",this).height()*0.46)+'px'); $(this).off("slide.bs.carousel"); });
в случае, если кто-то лихорадочно гуглить, чтобы решить прыгающие изображения карусель вещь, это помогло мне:
.fusion-carousel .fusion-carousel-item img { width: auto; height: 146px; max-height: 146px; object-fit: contain; }
совсем недавно я тестирую этот источник CSS для загрузочной карусели
высота, установленная на 380, должна быть установлена равной самому большому / самому высокому изображению, которое отображается...
пожалуйста, проголосуйте вверх / вниз этот ответ основан на тестировании юзабилити со следующим CSS спасибо.
/* 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; }
вы можете использовать эти строки в файле css:
ul[rn-carousel] { > li { position: relative; margin-left: -100%; &:first-child { margin-left: 0; } } }
эта функция jQuery работала лучше всего для меня. Я использую bootstrap 4 в теме WordPress, и я использовал полный jQuery вместо 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(); });источник:
Comments