Чистые эскизы изображений CSS

Я хочу отобразить коллекцию миниатюр изображений в сетке. Изображения будут иметь разные размеры, но я бы хотел ограничить эскизы определенным размером (скажем, 200px wide и 150px tall).

То, что я хотел бы найти, - это волшебная HTML-разметка и правила CSS, которые будут

  • Разрешить включение изображений в обычные элементы <img>
  • Убедитесь, что миниатюры помещаются в их квадрат размером 200x150 пикселей, сохраняют их пропорции и центрируются в зависимости от того, какой размер они переполняют.
  • Не требуется JavaScript или конкретные знания о фактических размерах каждого изображения.

Я не уверен, что это возможно. Я могу сделать (плохое) приближение того, что хочу, со следующей разметкой:

<div class="thumb">
    <img src="360x450.jpeg">
</div>

и CSS:

.thumb {
    width: 200px;
    height: 150px;
    overflow: hidden;
}
.thumb img {
    min-width: 200px;
    min-height: 150px;
    width: 200px;
}

Эта попытка ломается различными способами:

  • Изображения, которые находятся в портретной ориентации, будут правильно отсортированы, но будут переполняться через нижнюю часть контейнера, что приведет к обрезке по вертикали и по центру.

  • Изображения, которые являются широкими и короткими, будут искажены в горизонтальном измерении из-за жестко закодированных правил width и min-height.

  • Но без этого жестко закодированного width изображения, размер которых больше минимальной высоты и ширины, не будут вообще изменены.

Если это вообще полезно, я приведу пример, который (надеюсь) иллюстрирует то, что я пытаюсь сделать, здесь:

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

Спасибо за любую помощь или указатели, которые вы можете предоставить!

Изменить: Я полагаю, что идеальное решение будет работать в IE 6+ и современных браузерах, но любое решение, которое работает в IE 9+ и других современных браузерах (последние WebKit, Gecko, и т.д.) будут с радостью приняты.

Ответы

Ответ 1

Возможно, возможно.

Кроме того, возможно, не самая лучшая идея. Ваша главная проблема для преодоления здесь - это ориентация эскизов. Что, если вы имеете дело с панорамой? Конечно, сокращение его приведет к созданию очень неприглядного "скрюченного" изображения, а также очень высокого изображения. Это редкость, что все участвуют в 4X3 или 16X9 в 100% случаев. Итак, вам понадобится механизм для вычеркивания изображения. Даже если соотношение правильное, оно не будет изменяться так же качественно, как вы могли бы с помощью программы, такой как Photoshop или Gimp.

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

Существует множество способов обойти это, но ни один из них не является чистым CSS. Я занимался этим несколько раз, каждый по-своему основан на клиенте. Для одного клиента, который хотел полностью настраивать, это был пользовательский загрузчик, изменяющий размер через iMagick (часть магии изображения) и пользовательский CSS/Javascript для альбома с большой интерактивностью. В другом случае я использую Gallery в качестве бэкэнд - обработку создания, выгрузки, титрования, обрезки и организации эскизов, а затем просто вытащил переформатированные ссылки изображения из БД, чтобы отобразить их более привлекательным образом. Вы могли бы сэкономить еще больше неприятностей и просто использовать что-то вроде Flickr api, чтобы вытаскивать изображения для вашего использования.

Здесь используется с помощью ImageMagick для создания миниатюр.

Ответ 2

Вы можете (вроде) добиться этого с помощью добавлений CSS3 background-size: contain и cover.

Live Demo

  • contain (верхнее изображение) подходит для всего изображения, сохраняя соотношение сторон. Ничего не обрезано.

  • cover (нижнее изображение) заполняет содержащий элемент вертикально или горизонтально (в зависимости от изображения) и обрезает остальное.

x6jf1.png

Ответ 3

.thumb img {
    max-width: 200px;
    max-height: 150px;
    min-width: 200px;
    min-height: 150px;
}

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

Ответ 4

попробуйте установить max-width и height, а не min, потому что если изображение не соответствует точному размеру, оно будет переполняться:)