Миниатюры адаптивных изображений

У меня есть карусель изображений / видео с эскизами. Я пытаюсь сделать миниатюры отзывчивыми, но могу указать только ширину в процентах, а не высоту. Каждый раз, когда я изменяю размер окна, они теряют желаемую прямоугольную форму.

Я пробовал использовать 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>&#10092;</p>
            </a>
            <a href = "javascript:void(0)" id = "next" class = "prev-next-button next">
                <p>&#10093;</p>
            </a>
        </div>

        <!--Thumbnails-->
        <div id = "thumbnails">
        </div>


</html>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
1 069
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Раньше, если я хотел поддерживать соотношение сторон изображения, которое работает повсюду, я помещал изображение в качестве фона для div, а внутри div я добавлял прозрачный png, для которого задано значение соотношение. Например, если мне всегда нужно квадратное изображение, я могу поместить в него прозрачный PNG 10px X 10px и установить его ширину 100%. Высота также будет такой же, как ширина, и растянет div, в котором он есть (при условии, что его высота автоматическая).

Для CSS я устанавливаю background-size как cover или auto, в зависимости от ваших потребностей.

Кроме того, я не люблю просто предлагать другие инструменты, но Slick в прошлом творил чудеса для слайд-шоу: kenwheeler.github.io/slick

cngodles 30.04.2018 19:57

Я думаю, что лучше всего использовать как "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, что позволяет создавать элементы с фиксированным соотношением ширины и высоты.

Таким образом, ваш большой палец будет сохранять желаемую форму даже при меньшей ширине экрана.

Другие вопросы по теме