Я встроил длинное видео в эту загрузочную карусель.
Телефонное видео на слайде 2 «не стандартного размера», т.е. имеет размер 4x5, поэтому я использовал собственный код:
class="vidbox embed-Response embed-Response-4by5"
/* Пользовательское соотношение сторон для видео 4x5 / .embed-response-4by5 { отступ-дно: 125%; / Соотношение сторон 5/4 */ }
масштабирование видео работает отлично, но оно не принимает МАКСИМАЛЬНУЮ ВЫСОТУ, например. 900 пикселей или 90vh
Есть идеи?
последний код ниже:
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1.0">
<title>Multiple Responsive Slideshows</title>
<!-- Bootstrap CSS -->
<link href = "https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel = "stylesheet">
<style>
body {
background-color: violet;
margin: 10px; /* Reset margin to 0 */
padding: 0; /* Reset padding to 0 */
}
.container {
background-color: green;
margin-bottom: 50px;
padding: 10px;
display: flex;
justify-content: center;
align-items: center; }
.slideshow-container {
position: relative;
width: 100%;
margin: auto;
overflow: hidden;
background-color: #b9dbe5;
display: flex; /* Use flexbox layout */
justify-content: center; /* Center items horizontally */
align-items: center; /* Center items vertically */
}
.carousel-item {
text-align: center; /* Center images horizontally */
}
.slideshow-container img,
.slideshow-container iframe {
max-width: 100%;
max-height: 100%;
object-fit: contain;
}
/* Show arrows only on hover */
.slideshow-container:hover .prev,
.slideshow-container:hover .next {
display: block;
}
.prev, .next {
display: none;
cursor: default; /* Change cursor to default */
z-index: 1000;
color: silver;
font-weight: bold;
font-size: 30px;
position: absolute;
top: 50%;
transform: translateY(-50%);
width: auto;
padding: 16px;
border-radius: 0 3px 3px 0;
user-select: none;
text-decoration: none; /* Remove underline */
}
.prev:hover, .next:hover {
text-decoration: none; /* Remove underline */
color: silver; /* Change color on hover */
}
.prev {
left: 0;
}
.next {
right: 0;
border-radius: 3px 0 0 3px;
}
.prev.disabled, .next.disabled {
pointer-events: none;
opacity: 0.5;
}
/* //////// Media query //////// */
@media screen and (max-width: 650px) {
body {
background-color: goldenrod;
/* Videos and can be full width on mobile */
}
.carousel-item img {
width: 100% !important;
padding: 0 !important;
}
.carousel-item iframe {
width: 100% !important;
height: 100% !important;
padding: 0 !important;
}
.vidbox {
width: 100% !important;
height: 100% !important;
max-width: 100% !important;
max-height: 100% !important;
}
}
/* Custom aspect ratio for 4x5 video */
.embed-responsive-4by5 {
padding-bottom: 125%; /* 5/4 aspect ratio */
}
</style>
</head>
<body>
<div class = "container" style = "max-width: 1000px">
<div id = "myCarousel1" class = "slideshow-container carousel slide" data-ride = "carousel" data-interval = "false">
<!-- Image Slides -->
<div class = "carousel-inner">
<div class = "carousel-item active">
<img src = "https://source.unsplash.com/random/1200x600/?kitten" style = "padding: 30px;">
</div>
<!-- Video Slide -->
<div class = "carousel-item">
<div style = "max-height: 700px">
<div id = "phone" class = "vidbox embed-responsive embed-responsive-4by5" style = "max-height: 700px; margin: auto; text-align: center;">
<iframe src = "https://player.vimeo.com/video/912417077?badge=0&autopause=0&player_id=0&app_id=58479" frameborder = "0" allow = "autoplay; fullscreen; picture-in-picture" allowfullscreen style = "padding: 0px"></iframe>
</div>
</div>
</div>
<!-- Video Slide -->
<div class = "carousel-item">
<div id = "nochill" class = "vidbox embed-responsive embed-responsive-16by9" style = "max-width: 800px; margin: auto; text-align: center;">
<iframe src = "https://player.vimeo.com/video/143374377?h=760ef66606&title=0&byline=0&portrait=0" frameborder = "0" allow = "autoplay; fullscreen; picture-in-picture" allowfullscreen style = "padding: 0px;"></iframe>
</div>
</div>
<!-- Navigation Arrows -->
<!-- Navigation Arrows -->
<a class = "prev" href = "#myCarousel1" data-slide = "prev">❮</a>
<a class = "next" href = "#myCarousel1" data-slide = "next">❯</a>
</div>
</div>
<!-- Bootstrap JS -->
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src = "https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<!-- Navigation Click anywhere to navigate -->
<script>
$(document).ready(function(){
$('.carousel-inner').on('click', function(e) {
if (e.pageX < $(this).width() / 2) {
$(this).closest('.carousel').carousel('prev');
} else {
$(this).closest('.carousel').carousel('next');
}
});
});
</script>
</body>
</html>
Bootstrap v4 использует устаревший метод управления соотношением сторон, известный как «хак top-padding
».
Короче говоря, при применении процентного вертикального заполнения к элементу уровня блока отступ будет рассчитываться на основе width
, а не на основе height
. До появления aspect-ratio
в CSS это был удобный способ управления aspect-ratio
среди некоторых других. И это работает кроссбраузерно.
Итак, то, что кажется высотой обертки, на самом деле является top-padding
. Высота контента равна 0
(и она должна оставаться такой, чтобы сохранить aspect-ratio
). Но из-за этого max-height
не имеет никакого эффекта.
Однако вы можете контролировать max-height
, контролируя max-width
, поскольку вы уже знаете aspect-ratio
.
Суммируя:
/* max-height: 600px; */
max-width: 480px;
При более внимательном рассмотрении реализации соотношения сторон начальной загрузки v4 по умолчанию кажется, что есть способ заставить max-height
работать с элементом, используя трюк с верхним заполнением, добавив к нему псевдоэлемент :before
с тем же процентным вертикальным заполнением. В этом случае:
.embed-responsive-4by5::before {
padding-top: 125%;
}
Единственное, что меня немного смущает, это то, что если вы используете «встроить адаптивный» с одним из стандартных размеров Bootstrap, например. 1x1 или 16x9, вы МОЖЕТЕ установить максимальную высоту, и она работает нормально (например, class = "vidbox embed-Response embed-Response-1by1" style = "max-width: 20vh;") ... это только если вы попробуете и создайте собственный адаптивный формат для встраивания, например. 4x5, эта максимальная высота не работает, и это меня смущает. Любые идеи?
Это довольно интересно. Я присмотрелся и понял, что это связано с тем, что встроенные элементы по умолчанию имеют псевдоэлемент ::before
с тем же top-padding
, что и iframe видео. Итак, если вы добавите .embed-responsive-4by5::before { padding-top: 125%; }
к своему, max-height
должен начать работать. Я добавлю это в ответ.
Ссылка: «Поможет ли использование последней/новейшей версии начальной загрузки лучше контролировать подобные вещи?». Вопрос слишком расплывчатый, чтобы на него можно было ответить. В целом, v5
предоставляет разработчикам больше возможностей управления и настройки, при этом отказываясь от зависимости jQuery и поддержки IE. Полный список изменений смотрите в разделе Переход на версию 5.
спасибо, изменив css с помощью этого дополнительного ::, прежде чем это исправили. есть ли шанс, что ты поможешь мне понять, почему?
Можете ли вы проверить приведенное ниже решение? Надеюсь, это сработает для вас.
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1.0">
<title>Multiple Responsive Slideshows</title>
<!-- Bootstrap CSS -->
<link href = "https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel = "stylesheet">
<style>
body {
background-color: violet;
margin: 10px;
/* Reset margin to 0 */
padding: 0;
/* Reset padding to 0 */
}
.container {
background-color: green;
margin-bottom: 50px;
padding: 10px;
display: flex;
justify-content: center;
align-items: center;
}
.slideshow-container {
position: relative;
width: 100%;
margin: auto;
overflow: hidden;
background-color: #b9dbe5;
display: flex;
/* Use flexbox layout */
justify-content: center;
/* Center items horizontally */
align-items: center;
/* Center items vertically */
}
.carousel-item {
text-align: center;
/* Center images horizontally */
}
.slideshow-container img,
.slideshow-container iframe {
max-width: 100%;
max-height: 100%;
object-fit: contain;
}
/* Show arrows only on hover */
.slideshow-container:hover .prev,
.slideshow-container:hover .next {
display: block;
}
.embed-responsive-4by5.vidbox {
padding-bottom: clamp(100px, 125%, 500px) !important;
}
.prev,
.next {
display: none;
cursor: default;
/* Change cursor to default */
z-index: 1000;
color: silver;
font-weight: bold;
font-size: 30px;
position: absolute;
top: 50%;
transform: translateY(-50%);
width: auto;
padding: 16px;
border-radius: 0 3px 3px 0;
user-select: none;
text-decoration: none;
/* Remove underline */
}
.prev:hover,
.next:hover {
text-decoration: none;
/* Remove underline */
color: silver;
/* Change color on hover */
}
.prev {
left: 0;
}
.next {
right: 0;
border-radius: 3px 0 0 3px;
}
.prev.disabled,
.next.disabled {
pointer-events: none;
opacity: 0.5;
}
/* //////// Media query //////// */
@media screen and (max-width: 650px) {
body {
background-color: goldenrod;
/* Videos and can be full width on mobile */
}
.carousel-item img {
width: 100% !important;
padding: 0 !important;
}
.carousel-item iframe {
width: 100% !important;
height: 100% !important;
padding: 0 !important;
}
.vidbox {
width: 100% !important;
height: 100% !important;
max-width: 100% !important;
max-height: 100% !important;
}
}
/* Custom aspect ratio for 4x5 video */
.embed-responsive-4by5 {
padding-bottom: 125%;
/* 5/4 aspect ratio */
}
</style>
</head>
<body>
<div class = "container" style = "max-width: 1000px">
<div id = "myCarousel1" class = "slideshow-container carousel slide" data-ride = "carousel" data-interval = "false">
<!-- Image Slides -->
<div class = "carousel-inner">
<div class = "carousel-item active">
<img src = "https://source.unsplash.com/random/1200x600/?kitten" style = "padding: 30px;">
</div>
<!-- Video Slide -->
<div class = "carousel-item">
<div style = "max-height: 700px">
<div id = "phone" class = "vidbox embed-responsive embed-responsive-4by5" style = "max-height: 700px; margin: auto; text-align: center;">
<iframe src = "https://player.vimeo.com/video/912417077?badge=0&autopause=0&player_id=0&app_id=58479" frameborder = "0" allow = "autoplay; fullscreen; picture-in-picture" allowfullscreen style = "padding: 0px"></iframe>
</div>
</div>
</div>
<!-- Video Slide -->
<div class = "carousel-item">
<div id = "nochill" class = "vidbox embed-responsive embed-responsive-16by9" style = "max-width: 800px; margin: auto; text-align: center;">
<iframe src = "https://player.vimeo.com/video/143374377?h=760ef66606&title=0&byline=0&portrait=0" frameborder = "0" allow = "autoplay; fullscreen; picture-in-picture" allowfullscreen style = "padding: 0px;"></iframe>
</div>
</div>
<!-- Navigation Arrows -->
<!-- Navigation Arrows -->
<a class = "prev" href = "#myCarousel1" data-slide = "prev">❮</a>
<a class = "next" href = "#myCarousel1" data-slide = "next">❯</a>
</div>
</div>
<!-- Bootstrap JS -->
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src = "https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<!-- Navigation Click anywhere to navigate -->
<script>
$(document).ready(function() {
$('.carousel-inner').on('click', function(e) {
if (e.pageX < $(this).width() / 2) {
$(this).closest('.carousel').carousel('prev');
} else {
$(this).closest('.carousel').carousel('next');
}
});
});
</script>
</body>
</html>
Я использовал padding-bottom: clamp(100px, 125%, 500px) !important;
CSS, где 100 пикселей — это минимальное отступы, а 500 пикселей — максимальное. Вы можете изменить его в соответствии с вашими требованиями.
это также дало отличное решение, спасибо за помощь!
привет, это ТАК полезно, спасибо. и использовать это как обходной путь для определения высоты тоже очень полезно. Могу ли я спросить - позволяет ли использование последней/новейшей версии начальной загрузки лучше контролировать подобные вещи? Могу ли я установить точную максимальную высоту? любопытно, стоит ли перестраиваться в более новой версии, если эта/другие важные вещи намного лучше/управляемы? еще раз спасибо.