Позиционирование картинок для галереи

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

Решать такие вопросы проще с помощью CSS. Т. е. для разметки картинок для галереи следует использовать предназначенные для этого тэги и размечать их положение и вид с помощью CSS.

Я предлагаю не использовать тэги div с какими-то классами, а предлагаю обратить внимание на списки терминов. Пример из w3schools.com:

Coffee
Black hot drink
Milk
White cold drink

реализуется такой список таким образом:

Coffee
Black hot drink
Milk
White cold drink

Где dl — список терминов, dt — термин, dd — описание термина.

В случае с картинками для галереи предлагаю рассматривать картинку как термин, а описание картинки, как описание термина. Правильней всего было бы разметить так:

myimage1
Image 1
myimage2
Image 2
myimage3
Image 3

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

myimage1
Image 1
myimage2
Image 2
myimage3
Image 3

Теперь каждая картинка и её описание в своём контейнере. Здесь семантику можно оправдать: картинку и её описание, можем назвать списком не зависящим от других списков. Высосанное из пальца оправдание, ну да ладно…

CSS

Теперь, необходимо написать CSS. Причём задача следующая:

  1. Картинки должны быть центрированы в блоке фиксированного размера, причём картинки могут быть как портретные, так и ландшафтные;
  2. Размер внешнего блока для картинки и её описания, тоже должен быть фиксированный, поскольку описания могут быть многострочными;
  3. Высота внешнего блока должна быть фиксирована, чтобы в зависимости от количества строк в описании, не возникал разнобой в высоте блоков;
  4. Valid XHTML 1.0 Strict, valid CSS2, no JavaScript

Прокомментирую первую и самую главную задачу.

Центрирование по горизонтали и вертикали в таблицах в HTML4 решается просто: align=”center” valign=”absmiddle”. В CSS вёрстке это больной воспрос. Если с горизонтальным позиционированием всё понятно, то с вертикальным — проблемы, и проблемы конечно же только в IE. Если в нормальных браузерах, всего-то надо содержащему блоку добавить свойство display: table-cell и vertical-align: middle, то в IE такой способ не работает. Я предлагаю необычно «тупое», но эффективное решение — установить размер шрифта в блоке с картинкой равным 89% от высоты блока (например, если высота блока 150px, то размер шрифта должен быть 133.5px), а картинке задать vertical-align: middle;, т. е. позиционируем картинку по центру относительно высоты шрифта. Данный способ работает только для картинок, для блоков с контентом он не работает (для этого есть другие способы).

Привожу код с комментариями:

.imagelist * {
	margin: 0; padding: 0; /* если не применяется обнуление дефолных настроек браузера */
}
.imagelist dl{
	float: left; /* чтобы картинки шли друг за другом вряд */
	/* красота, размеры, отступы */
	border: 1px solid #CCC;
	background-color: #EEE;
	width: 210px;
	height: 250px;
	padding-left: 9px; /* из-за использования границ (borders) — 9, а не 10 */
	padding-top: 9px;
	margin-right: 20px;
	margin-bottom: 20px;
}
.imagelist dl dt{
	text-align: center; /* поскольку тэг img является строчным,
					то позиционируем его по центру таким способом */
	display: table-cell; /* вертикальное позиционирование */
	vertical-align: middle; /* для нормальных браузеров */
	font-size: 178px; /* 178px = 200 * 89%, то о чём я говорил выше (для IE) */
	line-height: 0px; /* чтобы не было лишних отступов, потому как line-height
				пропорционально увеличивается относительно размера шрифта */
	/* красота, размеры, отступы */
	background-color: white;
	border: 1px solid #DDD;
	width: 200px;
	height: 200px;
}
.imagelist dl dt img{
	vertical-align: middle; /* позиционирование картинки по вертикали  (для IE) */
}
.imagelist dl dd{
	text-align: center;
}

И ещё добавим небольшой код исправления для IE6 и ниже, которые ширину блока считают внешней а не внутренней, поэтому ширина блока не складывается с внутренним отступом (padding).


Вот что в итоге должно получиться:

Смотрите, качайте, пользуйтесь!

P.S. Число 89% получено опытным путём.

Дата: 30.01.2008
»
Категории: CSS | xhtml/xml
Google     

]]> Danaki ]]>

Никита, в чем это принципиально лучше div’ов кроме сомнительного семантического смысла?

»

]]> Никита ]]>

Не нужно дифференцировать элементы с помощью классов.

»

]]> FX Poster ]]>

Ничем не лучше :)

А вот за замечание про font-size – огромное спасибо. Кстати, а почему именно 89%?

»

]]> Никита ]]>

FX Poster, ну кому как, а мне удобней, меньше писанины и для меня логично.

> А вот за замечание про font-size – огромное спасибо. Кстати, а почему именно 89%?
А вот это ты спроси у MS :) Я дошёл до этого опытным путём.

»

]]> FX Poster ]]>

Да я такие списки скорее с помощью ul>li делаю. Парится с классами – эмм. С ними практически везде парится нужно. :(

»

]]> Никита ]]>

FX Poster, а в моём примере не нужно. Тем более если делать с помощью ul>li то опять же классы прописывать придётся. Здесь всё прозрачно.

»

]]> Danaki ]]>

Ну да-а-а, в селекторах нет классов, а есть тэги. Ладно, на вкус.

»

]]> Никита ]]>

Danaki, главное в html нет классов.

»

]]> rmaksim ]]>

это вовсе не – “необычно «тупое», но эффективное решение”

а первое упоминание на этот способ будет наверное вот это –
http://mrclay.org/web_design/centered_image/

там правда немного другое число, но это уж каждый пусть поэкспериментирует сам… :)

»

]]> valodka ]]>

Можно попробовать вместо размера шрифта указывать высоту строки равную высоте блока, а обертку, вероятно, влево отрицательными маргинами вытягивать или есть другой способ?

»

]]> mikolka ]]>

надо будет к себе прикрутить, красивое решение.

»

]]> Никита ]]>

valodka, у IE как раз-таки проблема с этим. Уже пробовал.

»

]]> Sanekton ]]>

Спасибо, нтересное узнал для себя

»

]]> Delchyve ]]>

Хм, забавно. Спасибо за решение, Никита. Я раньше div’ами делал.

»

]]> valodka ]]>

Никита, проблема с отрицательными маргинами?

»

]]> Никита ]]>

valodka, С высотой строки. Устанавливая высоту строки равной высоте блока, картинка не становится вертикально по центру. Может поэкспериментируешь?

»

]]> Got ]]>

Хорошее решение, спасибо

»

]]> 7days ]]>

Неплохое решение, пожалуй возьму на вооружение. 89% рулят :)
Сапасибо.

»

]]> Алексей ]]>

оригинально,

»

]]> Тут Хумора.NET ]]>

[...] #344 Позиционирование картинок для галереи. Изящный способ избавиться от табличной верстки при [...]

»

]]> Стас ]]>

dt-dd – хороший вариант.

Вот похожий пример с ul-li:
http://www.kosivart.com/index......pers.main/

»

]]> Nikita ]]>

Спасибо за статью!

»

]]> Олег ]]>

Спасибо за статью.

Применил.

И всё таки, тупо не догоняю:
————————————————————————–
….то в IE такой способ не работает. Я предлагаю необычно «тупое», но эффективное решение — установить размер шрифта в блоке с картинкой равным 89% от высоты блока …..

font-size: 178px; /* 178px = 200 * 89%, то о чём я говорил выше (для IE) */

————————————————————————-

При загрузке страницы в фаирфоксе , буквы вылезают в слове myimage1 Точно – 178px. ( проверено на разных компьютерах )

Поменял на 12px, во всех браузерах загружается и смотрится нормально .

И в IE – тоже.

???

»

]]> Никита ]]>

Непонял.

Какие буквы где вылезают? Здесь же вроде картинки позиционируются. Можно слегка конструктивнее и с примером?

»

]]> Олег ]]>

Может я чего то я не то слепил? :)

Но у меня получалось так:

В Опере,

1 – http://foto.delfi.lv/ru/my_picture/103763/

2 – http://foto.delfi.lv/ru/my_picture/103765/

http://www.vereks.lv/galereja/

? :/ ?

»

]]> Никита ]]>

Поставьте для img font-size: 12px;

Последняя ссылка не наглядкая, потому что нет портретных картинок.

»

]]> Олег ]]>

Благодарю! :)

»

]]> npFly ]]>

а что написано в DTD про dl? Помоему то что dt не может содержать элементы блок уровня… От чего выше указанный пример становится очень негибким в использовании.

»

]]> Никита ]]>

npFly, а где вы в примере видите блочные элементы в dt?

»

]]> npFly ]]>

Слава богу не вижу :) просто этот маленький нюанс явно не в пользу Defination List как способа отобразить галерею. Кстати в IE высота меньше чем должна быть…

»

]]> Никита ]]>

Поэтому я и выбрал dl для отображении галереи, потому-что тэги img — строчные. Да, верно, меньше. Нужно дописать height: 220px; в CC.

»

]]> Влад ]]>

А вы уверены, что такой способ оптимален для любого браузера?

»

]]> Никита ]]>

Влад, информация устарела и нуждается в корректировке. Этот способ я использую, но для IE нужно ловить размер шрифта.

»

]]> Seleckis.lv :: журнал Никиты Селецкого » » Выхлоп: HTML должен быть… ]]>

[...] Именно из-за отсутствия такой возможности в статье о позиционировании картинок в галерее приходилось в качестве группирующего элемента [...]

»

Напишите комментарий