#html #css #thumbnails
#HTML #css #эскизы
Вопрос:
Я хочу отобразить коллекцию эскизов изображений в виде сетки. Изображения будут разных размеров, но я бы хотел ограничить эскизы определенным размером (скажем, 200px
шириной и 150px
высотой).
Что я хотел бы найти, так это некоторые волшебные правила HTML-разметки и CSS, которые будут
- Разрешить включение изображений в обычные
<img>
элементы - Убедитесь, что эскизы помещаются в поле размером 200×150 пикселей, сохраняют свои пропорции и центрируются в том измерении, которое они превышают.
- Не требует 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. С указанными вами правилами я не верю, что это возможно. Вам понадобится javascript для запроса размера загруженного изображения для выполнения вычислений, иначе вы потеряете соотношение сторон в 50% случаев. На самом деле я делаю это с помощью службы кэширования PHP… что, хотя технически и не нарушает ваших правил, вероятно, противоречит их духу. : )
2. Да, это то, чего я боялся. Я решил, что все равно спрошу, на всякий случай.
3. Разве вы не можете просто использовать сгенерированные эскизы?
4. @Midas Я уже использую сгенерированные эскизы, которые сохраняют соотношение сторон исходного изображения и не обрезаются. Я надеялся избежать необходимости обрезать их на сервере, но, похоже, мне придется.
Ответ №1:
Вы можете (вроде как) достичь этого с помощью background-size
дополнений CSS3: contain
и cover
.
-
contain
(верхний рисунок) подходит ко всему изображению с сохранением соотношения сторон. Ничего не обрезано. -
cover
(изображение внизу) заполняет содержащий элемент либо вертикально, либо горизонтально (в зависимости от изображения) и обрезает остальное.
Комментарии:
1. Да, но я бы предпочел использовать реальные
<img>
элементы вместо CSS-фонов.2. Тогда вы не найдете чисто CSS-решение, поддерживающее соотношение сторон.
Ответ №2:
Возможно, вероятно.
Также, вероятно, не лучшая идея. Ваша большая проблема, которую нужно преодолеть здесь, — это ориентация эскизов. Что, если вы имеете дело с панорамой? Конечно, уменьшение размера приведет к созданию очень неприглядного «сплющенного» изображения, как если бы оно было очень высоким. Редко бывает, чтобы все имели дело с 4X3 или 16X9 в 100% случаев. Итак, вам понадобится механизм для заполнения изображения. Даже если соотношение правильное, размер не будет таким чистым, как вы могли бы с помощью таких программ, как Photoshop или Gimp.
Другая серьезная проблема в этом процессе мышления заключается в том, что вы собираетесь отправлять огромное количество ненужных данных на сервер через изображения большего размера. Загрузка займет больше времени, излишне заполнит DOM и в целом просто затруднит работу пользовательского интерфейса.
Существует несколько способов обойти это, ни один из них не является чистым CSS. Я решал это несколько раз, каждый уникальным способом в зависимости от клиента. Для одного клиента, который хотел, чтобы все было полностью пользовательским, это был пользовательский загрузчик, изменяющий размер с помощью iMagick (часть image magic) и настраиваемый CSS / Javascript для альбома с максимальной интерактивностью. В другом случае я использую Gallery в качестве серверной части — обрабатываю создание эскизов, загрузку, титрование, обрезку и упорядочивание — а затем просто извлекаю переформатированные ссылки на изображения из базы данных, чтобы отобразить их в более привлекательном виде. Вы могли бы избавить себя от еще больших проблем и просто использовать что-то вроде Flickr api для извлечения изображений для вашего использования.
Вот инструкция по использованию ImageMagick для создания эскизов.
Комментарии:
1. Я уже создаю эскизы на сервере, но способ, которым я это делаю, сохраняет соотношение сторон и не обрезает. Я надеялся избежать необходимости обрезать изображения на сервере, но, похоже, мне придется это сделать. Спасибо!
Ответ №3:
.thumb img {
max-width: 200px;
max-height: 150px;
min-width: 200px;
min-height: 150px;
}
Ну, я знаю, что для больших пальцев вы бы хотели, чтобы они были максимальными и минимальными, если вы хотите, чтобы изображение меньшего размера делало его больше, а изображение большего размера делало его меньше.
Комментарии:
1. Это приведет к искажению эскизов для любых изображений, которые не имеют соотношения сторон 4×3.
Ответ №4:
попробуйте установить максимальную ширину и высоту, а не минимальную, потому что, если изображение не совсем такого размера, оно переполнится 🙂
Комментарии:
1. Но тогда слишком маленькие изображения не будут увеличены. Я думаю, что существует слишком много угловых вариантов, чтобы мое «идеальное» решение было возможным.