.container> .wrapper> img: максимизировать img, но не больше .container (прародителя) - как? - PullRequest
0 голосов
/ 11 мая 2018

у меня .container > .wrapper > img.Вот задача:

  1. img должен иметь максимально возможную ширину / высоту, сохраняя соотношение сторон, быть видимым на 100% и не превышать размер .container.
  2. Изображение не должно превышать свой естественный размер.
  3. Ширина / высота изображения неизвестна.
  4. .container, как известно, имеет фиксированную (в пикселях) ширину / высоту, ноточные размеры не известны.
  5. .wrapper должен плотно прилегать к img (должен иметь ту же ширину и высоту, что и изображение).Обертка - это специальный элемент для размещения контента над изображением, например, значки.Я добавил примеры ярлыков во фрагмент, чтобы продемонстрировать это.Это как-то должно быть возможно.

Разметка:

<div class="container">
  <div class="wrapper">
    <div class="label">new!</div>
    <img src="https://via.placeholder.com/150x300">
  </div>
</div>

Я думал, что могу использовать display: block; max-height: 100% для img, но это делает не работа, потому что .wrapper (родительская высота изображения) не фиксирована и не может быть исправлена ​​- см. Пункт 5.

Что еще я могу сделать, чтобы выполнить описанную задачу с чистымCSS?Я бы предпочел решение, которое работает в IE11, но другие также будут оценены.

РЕДАКТИРОВАТЬ: Очень важно , что контейнер и изображение могут быть любого размера.Я добавил настройки во фрагмент для тестов различных размеров.

Если изображение больше контейнера, оно должно отображаться не больше контейнера.

Если изображение меньше контейнера, оно должнорендеринг не больше натурального размера.

Должен работать с горизонтальным контейнером / вертикальным изображением И вертикальным контейнером / горизонтальным изображением.

РЕДАКТИРОВАТЬ 2: Это также очень важно что .wrapper - это , а не - просто "неприятный мешающий" элемент.Он функционален: обертка используется для размещения абсолютно позиционированного контента над изображением внутри него (например, надписи, значки), она должна поддерживать преобразования (зеркало, перевод), фильтры CSS и т. Д., Вообще говоря - все, что мы обычно делаем с элементами блока.

Детская площадка:

$(function() {
  $('input[name=container-width]').on('change', function() {
    $('.container').css('width', $(this).val() + 'px')
  })

  $('input[name=container-height]').on('change', function() {
    $('.container').css('height', $(this).val() + 'px')
  })

  $('input[name=image-width]').on('change', function() {
    var width = $(this).val()
    var height = $('input[name=image-height]').val()
    $('img')[0].src = 'http://via.placeholder.com/' + width + 'x' + height
  })
  
  $('input[name=image-height]').on('change', function() {
    var height = $(this).val()
    var width = $('input[name=image-width]').val()
    $('img')[0].src = 'http://via.placeholder.com/' + width + 'x' + height
  })

})
.container {
  width: 200px; /* can have any value in pixels */
  height: 200px; /* can have any value in pixels */
  background-color: green;
}

.wrapper {
  outline: 1px solid yellow;
  position: relative; /* for label */
}

.label {
  position: absolute;
  background-color: blue;
  color: white;
}

.label.-top-left {
  top: 10px;
  left: 10px;
}

.label.-bottom-right {
  bottom: 10px;
  right: 10px;
}
<h2>Settings</h2>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Container: width <input type="number" step="10" name="container-width" value="200"> height <input type="number" step="10" name="container-height" value="200">
<br>
Image: width <input type="number" step="10" name="image-width" value="150"> height <input type="number" step="10" name="image-height" value="300">
<br>
<br>

<h2>Demo</h2> 

<div class="container">
  <div class="wrapper">
    <div class="label -top-left">new!</div>
    <div class="label -bottom-right">good!</div>
    <img src="http://via.placeholder.com/150x300">
  </div>
</div>

<br>
<br>
<br>
<br>
<br>
<br>
<br>

<h2>How it should look like</h2>

<p>This is not the solution, because is has many hardcoded dimensions. It's just a visual demo of what I want to achieve.</p>

<div style="width: 200px; height: 200px;background-color: green">
  <div style="width: 100px; height: 200px; position: relative;outline: 1px solid yellow">
    <div style="position: absolute;
  top: 10px;
  left: 10px;
  background-color: blue;
  color: white;">new!</div>
      <div style="position: absolute;
  bottom: 10px;
  right: 10px;
  background-color: blue;
  color: white;">good!</div>
    <img style="max-width: 100%; max-height: 100%;" src="http://via.placeholder.com/150x300">
  </div>
</div>

Ответы [ 6 ]

0 голосов
/ 11 мая 2018

Используйте display:flex на контейнере, который увеличит высоту оболочки, и вы можете использовать max-height:100% с изображением:

$(function() {
  $('input[name=container-width]').on('change', function() {
    $('.container').css('width', $(this).val() + 'px')
  })

  $('input[name=container-height]').on('change', function() {
    $('.container').css('height', $(this).val() + 'px')
  })

  $('input[name=image-width]').on('change', function() {
    var width = $(this).val()
    var height = $('input[name=image-height]').val()
    $('img')[0].src = 'http://via.placeholder.com/' + width + 'x' + height
  })
  
  $('input[name=image-height]').on('change', function() {
    var height = $(this).val()
    var width = $('input[name=image-width]').val()
    $('img')[0].src = 'http://via.placeholder.com/' + width + 'x' + height
  })

})
.container {
  width: 200px; /* can have any value in pixels */
  height: 200px; /* can have any value in pixels */
  background-color: green;
  display:flex;
}

.wrapper {
  outline: 1px solid yellow;
  position: relative; /* for label */
}

img {
 max-height:100%;
 max-width:100%;
}
<h2>Settings</h2>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Container: width <input type="number" step="10" name="container-width" value="200"> height <input type="number" step="10" name="container-height" value="200">
<br>
Image: width <input type="number" step="10" name="image-width" value="150"> height <input type="number" step="10" name="image-height" value="300">
<br>
<br>

<h2>Demo</h2> 

<div class="container">
  <div class="wrapper">
    <img src="http://via.placeholder.com/150x300">
  </div>
</div>
0 голосов
/ 11 мая 2018

$(function() {
  $('input[name=container-width]').on('change', function() {
    $('.container').css('width', $(this).val() + 'px')
  })

  $('input[name=container-height]').on('change', function() {
    $('.container').css('height', $(this).val() + 'px')
  })

  $('input[name=image-width]').on('change', function() {
    var width = $(this).val()
    var height = $('input[name=image-height]').val()
    $('img')[0].src = 'http://via.placeholder.com/' + width + 'x' + height
  })
  
  $('input[name=image-height]').on('change', function() {
    var height = $(this).val()
    var width = $('input[name=image-width]').val()
    $('img')[0].src = 'http://via.placeholder.com/' + width + 'x' + height
  })

})
.container {
  width: auto; /* can have any value in pixels */
  height: auto; /* can have any value in pixels */
  background-color: green;
}

.wrapper {
  width: 100%;
  height: 100%;
  outline: 1px solid yellow;
  
}

.container > .wrapper > img {
  width: 100%;
  height: 100%;
  opacity: .8;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h2>Settings</h2>
Container: width <input type="number" step="10" name="container-width" value="200"> height <input type="number" step="10" name="container-height" value="200">
<br>
Image: width <input type="number" step="10" name="image-width" value="150"> height <input type="number" step="10" name="image-height" value="300">
<br>
<br>

<h2>Demo</h2> 

<div class="container">
  <div class="wrapper">
    <img src="http://via.placeholder.com/150x300">
  </div>
</div>

А как насчет этого?

0 голосов
/ 11 мая 2018
.container{
  width: 200px;     
  height: 200px;    
  background-color: green;
}
.wrapper {
  outline: 1px solid yellow;
  height:100%;
}
img{
  height: 100%;
}
0 голосов
/ 11 мая 2018

проверьте ниже код, это должно работать для вас, вам нужно применить max-width: 100% и max-height:100% к вашим img и display: inline; к вашему img родительскому div

.container {
  width: 200px; /* can have any value in pixels */
  height: 200px; /* can have any value in pixels */
  background-color: green;
}

.wrapper {
  outline: 1px solid yellow;
  display: inline;
}
.wrapper img{
  max-width: 100%;
  max-height: 100%;
  height: auto;
  vertical-align: top;
}
<div class="container">
  <div class="wrapper">
    <img src="http://placehold.it/150x300">
  </div>
</div>

<hr/>

<div class="container">
  <div class="wrapper">
    <img src="http://placehold.it/1500x800">
  </div>
</div>

Обновление Добавлен vertical-align: top; к изображению для исправления дополнительного зазора внизу, как указано @ TemaniAfif

0 голосов
/ 11 мая 2018

Добавить изображение, используя background-image для элемента оболочки

.wrapper {
    outline: 1px solid yellow;
    background: url(http://via.placeholder.com/150x300);
    background-size: cover;
    width: 100%;
    height: 100%;
    background-repeat: no-repeat;
}
0 голосов
/ 11 мая 2018

Это у вас работает?

.container {
  width: 200px;
  /* can have any value in pixels */
  height: 200px;
  /* can have any value in pixels */
  background-color: green;
}

.container-2 {
  width: 300px;
  height: 300px;
}

.wrapper {
  outline: 1px solid yellow;
  display: inline;
  height: inherit;
}

img {
  width: auto;
  max-height: 100%;
  display: inline-block;
  vertical-align: bottom;
}
<div class="container">
  <div class="wrapper">
    <img src="http://via.placeholder.com/150x300">
  </div>
</div>
<br>
<div class="container container-2">
  <div class="wrapper">
    <img src="http://via.placeholder.com/30">
  </div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...