У меня есть карусель изображений / видео с эскизами. Я пытаюсь сделать миниатюры отзывчивыми, но могу указать только ширину в процентах, а не высоту. Каждый раз, когда я изменяю размер окна, они теряют желаемую прямоугольную форму.
Я пробовал использовать vh, но ничего не вышло. Я хочу, чтобы эскизы имитировали то, что я сделал для этот сайт.
Вот кодовый ключ.
$(document).ready(function(){
// get all images loaded
var images = $(".chair-class");
// thumbnails containers
var thumbnailContainer = $("#thumbnails");
var iframe1 = $('#sketchfab-iframe-1')[0];
var iframe2 = $('#sketchfab-iframe-2')[0];
var player1 = $f(iframe1);
var player2 = $f(iframe2);
// generate thumbnail images
generateThumbnails(images, thumbnailContainer);
// listeners for controls arrows
$(".prev-next-button").on("click", function() {
player1.api('pause');
player2.api('pause');
// get the images
var currentImageIndex = images.index($(".chair-class[data-active=true]"));
var isPrevious = $(this).hasClass("previous");
var nextIndex;
if (isPrevious) {
if (currentImageIndex === 0) {
nextIndex = images.length - 1;
}
if (currentImageIndex > 0) {
nextIndex = currentImageIndex - 1;
}
} else {
if (currentImageIndex === images.length - 1) {
nextIndex = 0;
}
if (currentImageIndex < images.length - 1) {
nextIndex = currentImageIndex + 1;
}
}
// remove any active class from images
images.removeClass("active").attr('data-active', "false");
// get the next active image and add active class to that next current image
var $nextImage = $(images[nextIndex]);
var iframeId = $nextImage.data('iframe');
if (iframeId) {
$(images[nextIndex]).attr('data-active', "true");
$('.sketchfab-iframe').removeClass('active');
$('#' + iframeId).addClass('active');
} else {
$(images[nextIndex]).addClass("active").attr('data-active', "true");
$('.sketchfab-iframe').removeClass('active');
}
});
$(".thumb").on("click", function(event){
event.preventDefault();
var images = $(".chair-class");
var indexSelected = $(this).data("img-index");
var currentShown = images.index($(".chair-class[data-active=true]"));
if (currentShown === indexSelected) return false;
player1.api('pause');
player2.api('pause');
images.removeClass("active").attr('data-active', "false");
var iframeId = $(this).data('iframe');
if (iframeId) {
$(images[indexSelected]).attr('data-active', "true");
$('.sketchfab-iframe').removeClass('active');
$('#' + iframeId).addClass('active');
} else {
images.removeClass("active");
$(images[indexSelected]).addClass('active').attr('data-active', "true");;
$('.sketchfab-iframe').removeClass('active');
}
});
function generateThumbnails(images, container) {
var ul = $("<ul>");
images.each(function(index, element){
var currentThumb = $("<img>");
var li = $("<li>");
var src = $(this).attr("src");
currentThumb.attr("src", src);
currentThumb.attr("class", "thumb");
currentThumb.data("img-index", index);
var iframe = $(this).data('iframe');
if (iframe) {
currentThumb.data("iframe", iframe);
}
li.append(currentThumb);
ul.append(li);
});
container.append(ul);
}
}); * {
margin: 0;
padding: 0;
}
body{
margin: 0;
padding:0;
font-size: 100%;
}
/* #green-room {
background: #333 !important;
} */
.slideshow-container {
max-width: 1000px;
position: relative;
margin: auto;
}
#chair, .chair-class {
position: absolute;
width: 100%;
height: auto;
max-width: 600px;
max-height: 400px;
margin: 0 auto;
display: block;
top: 0;
left: 0;
opacity: 0;
transition: opacity .5s;
}
.chair-class.active {
position: relative;
opacity: 1;
}
#prev {
position: absolute;
color: black;
left: 0;
top: 0;
bottom: 0;
}
#next {
position: absolute;
color: black;
right: 0;
top: 0;
bottom: 0;
}
#prev p,
#next p
{
font-size: 3em;
}
#imgDetail {
position: relative;
width: 90%;
margin: 0 auto;
overflow: hidden;
}
#imgDetail a {
text-decoration: none;
display: flex;
padding: 3% ;
justify-content: center;
align-items: center;
}
#imgDetail a:hover {
background-color: #333;
color: white;
opacity: 0.5;
}
#imgDetail ul {
margin: 0 auto;
display: block;
}
#thumbnails {
max-width: 1000px;
width: 100%;
display: inline-block;
text-align: center;
}
.thumb {
width: 21%;
/* height: auto; */
height: 140px;
margin-top: 15px;
cursor: pointer;
}
#imgDetail li {
display: inline;
}
#thumbnails ul{
margin: 0 auto;
display: block;
}
#thumbnails li{
display: inline;
padding-right: 2%;
}
#thumbnails li:last-child{
padding-right: 0;
}
.sketchfab-iframe {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.sketchfab-iframe {
opacity: 0;
margin: 0 auto;
transition: opacity .5s;
display: none;
}
.sketchfab-iframe.active {
opacity: 1;
position: relative;
display: block;
}<script src = "https://f.vimeocdn.com/js/froogaloop2.min.js"></script>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- Images not Owned by Me -->
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<meta name = "viewport" content = "width=device-width,initial-scale=1.0">
<meta http-equiv = "X-UA-Compatible" content = "ie=edge">
<title>Daniel Pollack</title>
<link rel = "stylesheet" type = "text/css" href = "css/styles.css"/>
<script src = "https://unpkg.com/scrollreveal/dist/scrollreveal.min.js"> </script>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> </script>
<script src = "http://a.vimeocdn.com/js/froogaloop2.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/fitvids/1.2.0/jquery.fitvids.js">
</script>
</head>
<body id = "green-room">
<div class = "slideshow-container">
<div id = "imgDetail">
<img data-iframe = "sketchfab-iframe-1" src = "https://i.vimeocdn.com/video/682901345_640.webp" class = "chair-class" data-active = "true" />
<img data-iframe = "sketchfab-iframe-2" src = "https://i.vimeocdn.com/video/682890362_640.webp" class = "chair-class" data-active = "false" />
<img src = "http://www.davidwightman.net/_images_landscape/Behemot/Behemot_detail_3.jpg" class = "chair-class" data-active = "false" />
<div class = "aspect-ratio">
<iframe id = "sketchfab-iframe-1" class = "sketchfab-iframe active" src = "https://player.vimeo.com/video/255482396" width = "80%" height = "400" frameborder = "0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
</div>
<div class = "aspect-ratio">
<iframe id = "sketchfab-iframe-2" class = "sketchfab-iframe" src = "https://player.vimeo.com/video/255473875" width = "80%" height = "400" frameborder = "0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
</div>
<!--CONTROLS-->
<a href = "javascript:void(0)" id = "prev" class = "prev-next-button previous">
<p>❬</p>
</a>
<a href = "javascript:void(0)" id = "next" class = "prev-next-button next">
<p>❭</p>
</a>
</div>
<!--Thumbnails-->
<div id = "thumbnails">
</div>
</html>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Раньше, если я хотел поддерживать соотношение сторон изображения, которое работает повсюду, я помещал изображение в качестве фона для div, а внутри div я добавлял прозрачный png, для которого задано значение соотношение. Например, если мне всегда нужно квадратное изображение, я могу поместить в него прозрачный PNG 10px X 10px и установить его ширину 100%. Высота также будет такой же, как ширина, и растянет div, в котором он есть (при условии, что его высота автоматическая).
Для CSS я устанавливаю background-size как cover или auto, в зависимости от ваших потребностей.
Я думаю, что лучше всего использовать как "background-size" и изменить высоту ".thumb" в зависимости от Media Queries. Затем замените li.append(currentThumb); и на li.attr("class", "thumb").css('background-image', 'url(' + src + ')');
function generateThumbnails(images, container) {
var ul = $("<ul>");
images.each(function(index, element) {
var currentThumb = $("<img>");
var li = $("<li>");
var src = $(this).attr("src");
currentThumb.attr("src", src);
currentThumb.attr("class", "thumb");
currentThumb.data("img-index", index);
var iframe = $(this).data('iframe');
if (iframe) {
currentThumb.data("iframe", iframe);
}
ul.append(li);
li.attr("class", "thumb").css('background-image', 'url(' + src + ')');
});
container.append(ul);
}
и измените CSS на это
.thumb {
width: 21%;
height: 140px;
margin-top: 15px;
cursor: pointer;
background-size:cover;
}
#thumbnails li{
display:inline-block;
padding-right: 2%;
margin:10px;
}
Я бы использовал background-image вместо тегов img, а затем установил фиксированное соотношение контейнера для фона, как показано ниже:
div {
width: 300px;
height: 100px;
resize: both;
overflow: auto;
}
span {
display: inline-block;
width: 30%;
height: 0;
padding-top: calc(0.66 * 30%);
background-image: url(https://dummyimage.com/300x200/000/fff);
background-size: cover;<div>
<span></span>
<span></span>
<span></span>
</div>Padding устанавливается относительно ширины контейнера, даже padding-top и padding-bottom, что позволяет создавать элементы с фиксированным соотношением ширины и высоты.
Таким образом, ваш большой палец будет сохранять желаемую форму даже при меньшей ширине экрана.
Кроме того, я не люблю просто предлагать другие инструменты, но Slick в прошлом творил чудеса для слайд-шоу: kenwheeler.github.io/slick