Масштабирование div как изображение

Я делаю список элементов, но у него есть некоторые проблемы:

  • Адаптивный;
  • "title" может иметь более одной строки;
  • Иногда мне нужно показывать значок с цветом в фоновом режиме вместо полного изображения.

Это образ того, что я ожидаю: Final result expected

И что у меня есть: http://codepen.io/caio/pen/ygkfm/ What I have

Как вы можете видеть, я не могу установить одинаковое масштабирование на "образ" div, когда у него есть значок. Есть ли решение для моей проблемы?

Ответ 1

Я предполагаю, что ваши изображения (кроме значков) имеют одинаковое соотношение сторон, как в вашем примере.

В этом случае вы можете использовать дно дополнения, чтобы сохранить высоту контейнера изображения. Поскольку padding-bottom вычисляется в соответствии с шириной контейнера, он будет сохранять пропорции независимо от содержимого (вам нужно будет поместить содержимое с помощью position:absolute;, чтобы он не менял размеры контейнера).

Вот демонстрация. Показываем, что вы можете сделать. Извините, я не в codePen

Я также добавил другой контейнер, чтобы центрировать значки горизонтально.

* {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}
.items {
    margin: 50px auto 0;
    width: 90%;
    *zoom: 1;
}
.items:before, .items:after {
    content:" ";
    display: table;
}
.items:after {
    clear: both;
}
.items .item {
    border: 1px solid #ddd;
    float: left;
    width: 32%;
}
.items .item:nth-child(3n+2) {
    margin: 0 2%;
}
.items .item .image {
    background: #eee;
    padding-bottom:50%;
    position:relative;
}
.items .item .image .img_in{
    position:absolute;
    width:100%;
    height:100%;
    text-align:center;
}
.items .item .image img {
    display: block;
    width: 100%;
    height:100%;
}
.items .item .image img.icon {
    height: 80%;
    margin:0 auto;
    position: relative;
    top: 10%;
    width: auto;
}
.items .item .title {
    margin: 0;
    padding: 20px;
}

Ответ 2

Легко

добавить follwing к .items .item .image

когда у вас есть "нормальная" ширина и высота 200 и 100 пикселей, тогда 50% составляет 50% ширины (200 * 50% = 100)

{
    height: 0;
    padding-bottom: 50%;
}

http://codepen.io/HerrSerker/pen/HhjKo?editors=110

изменить

Вы можете использовать функцию SCSS percentage:
padding-bottom: percentage(100px / 200px);

Ответ 3

Это не совсем то, что вы имели в виду, но это очень отзывчивый дизайн, который я ожидаю, что вам нужно: http://codepen.io/anon/pen/DwudI

Здесь суть: вы, вероятно, хотите сохранить соотношение сторон каждого основного контейнера. Затем изображение масштабируется как минимум на 80% от высоты и не более 100% как по ширине, так и по высоте. Способ создания пропорции в div - это использование этого увлекательного трюка padding-top. Когда вы изменяете размер экрана, изменяется ширина div, что приводит к изменению высоты (соотношение сторон). Поэтому, если вы измените размер меньше, а затем div станет меньше размера изображения, из-за чего 200x100 будет заполнять весь div.

Итак, если вы хотите, чтобы изображение заполнило div, оно должно быть (A) больше, чем div и (B), с тем же соотношением сторон, что и div.

Вы упомянули название может быть несколько строк: прямо сейчас новые строки идут ниже. Если вы хотите, чтобы текст "плавал вверх", это было бы не слишком сложно. Просто используйте position:absolute; bottom:0px в заголовке и убедитесь, что .item имеет position:relative.

Ответ 4

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

изменение вашего CSS на:

.icon {
    margin: 0 auto;
    padding: 5% 0;
    width: 40%;
}

и он будет больше похож на вас. Я обновил ваш CodePen

Ответ 5

Возможно, вы могли бы попробовать эту библиотеку jQuery http://brm.io/jquery-match-height/

Чтобы использовать его, вы назначаете атрибуты данных элементам, высоты которых вы хотите сопоставить, а затем вычисляли высоту каждого элемента, который они должны сделать, если они все одинаковы. Он принимает для учета отступов, полей, границ и размеров полей.

Ответ 6

В основном, я добавил максимальную высоту и минимальную высоту того же значения в .items .item .image img:

.items .item .image img {
    display: block;
    width: 100%;
    max-height:23%;
    min-height:23%;
}

Я не совсем уверен, чего вы пытаетесь достичь, но если я вас устроил, тогда это то, что вы ищете. Вот полный код:

HTML

<div class="items">
    <a href="#" class="item">
        <div class="image">
            <img src="http://placehold.it/200x100" />
        </div>
        <h4 class="title">Hi. I'm a title.</h4>
    </a>
    <a href="#" class="item">
        <div class="image">
            <img src="http://placehold.it/80x80" class="icon" />
        </div>
        <h4 class="title">Hi. I'm a title.</h4>
    </a>
    <a href="#" class="item">
        <div class="image">
            <img src="http://placehold.it/200x100" />
        </div>
        <h4 class="title">Hi. I'm a title.</h4>
    </a>
</div>

CSS

* {
    @include box-sizing(border-box);
}
.items {
    margin: 50px auto 0;
    width: 90%;
    @include clearfix;
}
.item {
    border: 1px solid #ddd;
    float: left;
    width: 30%;
}
.items .item .image {
    background: #eee;
}
.items .item .image img {
    display: block;
    width: 100%;
    max-height:23%;
    min-height:23%;
}
.items .item .title {
    margin: 0;
    padding: 20px;
}
.icon {
    height: 80%;
    margin: 0 auto;
    position: relative;
    top: 10%;
    width: auto;
}
.items .item:nth-child(3n+2) {
    margin: 0 2%;
}

И вот FIDDLE

Ответ 7

Вы можете использовать дополнительный элемент и vertical-padding, чтобы заставить ваш div сохранить то же соотношение, что у него есть изображение 2: 1 или нет.


DEMO и базовый css:

.image:before {
  content:'';
  display:inline-block;
  vertical-align:middle;
  padding-top:50%;/* equals 50% of width of parent */
  width:0;
  box-shadow:0 0 0 5px red;/* let see where it stands for demo purpose */
}

Чтобы это работало в кодексе:

img должен вернуться к своему стандарту display (inline-block), поэтому просто удалите display:block; и вернитесь по вертикали в middle к псевдоэлементу, пробел под img, который появляется, когда на baseline, больше не будет здесь.

.image требуется:

  • В CSS font-size:0;
  • В HTML код <div><img src=".. не должен быть отступом
  • В HTML-пространстве должно быть указано <div><!-- code indented --><img src="...

чтобы избежать дополнительных white-space и разбить 2 строки, когда img заполнен width.


Я сделал ссылку в демоверсии другой версии, где изображение может быть больше, чем требуемое начальное пространство, не нарушая макет (основываясь на идее о том, что элементы остаются в потоке, не задействовано позиционирование absolute): EXTRA

Ответ 8

Я делаю это то, чем вы не являетесь.

Демо

HTML  

  <a href="#" class="item">
    <div class="image">
      <div><img src="http://placehold.it/200x100"></div>
    </div>
    <h4 class="title">Hi. I'm a title.</h4>
  </a>

  <a href="#" class="item">
    <div class="image">
      <div><img src="http://placehold.it/80x80" class="icon"></div>
    </div>
    <h4 class="title">Hi. I'm a title.</h4>
  </a>

  <a href="#" class="item">
    <div class="image">
      <div><img src="http://placehold.it/200x100"></div>
    </div>
    <h4 class="title">Hi. I'm a title.</h4>
  </a>
</div>

SCSS

* { @include box-sizing(border-box); }

.items {
  margin: 50px auto 0;
  width: 90%;
  @include clearfix;

  .item {
    border: 1px solid #ddd;
    float: left;
    width: 32%;
    &:nth-child(3n+2) { margin: 0 2%; }

    .image {
      background: #eee;
      min-height:100px;
      max-height:100px;
      display:table;
      width:100%;

      &> div {

      display:table-cell;
      text-align:center;
      vertical-align:middle;
      }

      img {
        max-width:100%;
        height:100%;
        margin:0 auto;
        &.icon {
          height: 80%;
          margin: 0 auto;
          position: relative;
          top: 10%;
          width: auto;
        }
      }
    }

    .title {
      margin: 0;
      padding: 20px;
    }
  }
}

Ответ 9

Я бы предпочел пойти и использовать те служебные классы, которые я нашел, используя довольно много с тех пор, как я их нашел, в основном внедряя их на каждый написанный мной CSS. Чистый, легко читаемый и удобный для встраивания в HTML.

Этот небольшой набор классов позволяет вам иметь пропорциональные размеры ширины/высоты на элементах. Здесь демо http://siebennull.com/equal_width_height.html

Вот статья, объясняющая это: http://www.mademyday.de/css-height-equals-width-with-pure-css.html

Кредит, очевидно, идет к тому, кто нашел этот трюк:)

CSS

.box{
    position: relative;
    width: 50%;     /* desired width */
}
.box:before{
    content: "";
    display: block;
    padding-top: 100%;  /* initial ratio of 1:1*/
}

.content{
    position:  absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
}
/* Other ratios */
.ratio2_1:before{
    padding-top: 50%;
}
.ratio1_2:before{
    padding-top: 200%;
}
.ratio4_3:before{
    padding-top: 75%;
}
.ratio16_9:before{
    padding-top: 56.25%;
}

HTML

<div class='box'> 
    <div class='content'>Aspect ratio of 1:1</div> 
</div>
<div class='box ratio16_9'> 
    <div class='content'>Aspect ratio of 16:9</div> 
</div>