Главная » Статьи » Web-кодинг » CSS

Подстройка размера изображения под разрешение экрана средствами CSS

Этот вопрос достаточно распространённый, особенно среди начинающих, давайте рассмотрим принципы и методы подстройки изображения под разрешение экрана пользователя, посредством CSS.

Все сайты, по макету вёрстки, можно разделить на три принципиальные группы: жестко фиксированные (Rigid fixed), адаптивные резиновые (Adaptable fluid) и расширяемые эластичные (Expandable elastic) макеты.

В данной заметке, рассмотрим варианты подстройки элементов дизайна шапки, а именно - картинок, под резиновые макеты сайтов.

Делается это, обычно, тремя основными способами:

  • Вёрсткой шапки, с использованием не фиксированных областей с фоном.
  • Изменение параметров позиционированного изображения - разными способами.
  • Изменение всего вида элементов методом динамического добавления/изменения стилей.

Вёрсткой шапки, с использованием не фиксированных областей с фоном


Наиболее распространённой и кроссбраузерной, является конструкция вида:

HTML-код:

Code (HTML)
<table id="headerTb" width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
<td class="hdLeft"><div class="author">Copyright <b>2005-2011</b> <a class="flink" href="http://likbezz.ru/">«likbezz.ru»</a>, Оформление: <a class="flink" href="http://likbezz.ru/index/8-1" target="_blank">Flesh</a></div></td>
<td class="hdRight"> </td>
</tr>
</table>

CSS-стили:

Code (HTML)
<style type="text/css">
/* StartStyle */
#headerTb{border-collapse:collapse;border-spacing:0;background:#1552ca url(_st/v00_h_bg.jpg) repeat-x left top;height:121px;}
td.hdLeft{background:url(_st/v00_h1.jpg) no-repeat left top;width:auto;vertical-align:top;}
td.hdRight{background:url(_st/v00_h2.jpg) no-repeat right top;width:445px;}
/* EndStyle */
</style>

В подобном исполнении, всё просто - рисуется шапка, в каком-нибудь графическом редакторе, например в фотошопе или кореле, нарезается на отдельные графические элементы (фрагменты):

картинка - слева:


картинка - справа:


и фон - по центру.


Для таблицы, в данном случае, прописывается фон, а ширина указывается в процентах - обычно 100%.

Ширина ячеек таблицы, в которых будут размещаться графические элементы, обычно прописывается в пикселях, но, как минимум, одна из ячеек таблицы должна иметь свободную ширину (auto).
То есть если ячеек две, как в данном случае, одной прописывается фиксированный размер, равный ширине картинки, второй устанавливается значение «auto» - то есть на всю оставшуюся ширину.

Сами картинки могут вставятся в предназначенные для них ячейки, как просто картинкой (тегом <img />), так и фоном.
В данном случае, картинки вставлены фоном, так как левая ячейка уже содержит текстовый блок - копирайт, а правая предполагает его наличие.

Здесь все просто - смотрим пример:

 Пример ...

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


Изменение параметров позиционированного изображения

Масштабирование относительно родительского элемента

С использованием таблицы с параметром table-layout: fixed


Сразу хочу отметить, что у браузера Internet Explorer небольшие проблемы с изменением размеров объекта - в данном случае - картинки.
Суть его в следующем:
Если у картинке реальная ширина равна, допустим 1024px, и необходимо чтобы при изменении ширины окна браузера это изображение растягивались/сужались пропорционально, то при сужении окна браузера ширина изображения в определенный момент "застревает” и не сужаются дальше. В результате чего оно выходит за пределы предполагаемого контента.
То бишь, изображения не сужаются меньше их фактического размера.

Обходится этот «баг» достаточно просто и заключается всего в одной строчке CSS-кода - в свойстве «table-layout: fixed», которое нужно применить к таблице, в которую заключено изображение.

Следовательно, если у вас картинка шапки заведомо больше, минимальной ширины сайта, нужно задать таблице этот параметр.
Задаётся он через стили (CSS) и имеет всего два аргумента: «auto» и «fixed».

Кроме того:
Если у изображения не указана высота, или указано значение «auto» - изображение масштабируется пропорционально (сохраняя соотношение сторон).
Если же высота указана конкретно (в любых положительных единицах измерения), то соотношение сторон нарушается и изображение масштабируется только в ширину, сохраняя заданную в высоту.

HTML-код:

Code (HTML)
<table id="headerTb" width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
<td class="hdImg"><img class="topImg" src="/_content/_tpl/v00/_st/v00_h_1200.jpg" border="0" alt="" /></td>
</tr></table>

CSS-стили (изображение масштабируется пропорционально)

Code (HTML)
<style type="text/css">
/* StartStyle */
#header{ height:auto;}
#headerTb{border-collapse:collapse;border-spacing:0;table-layout:fixed;background-color:#1552ca;height:121px;}
#headerTb img.topImg{width:100%!important;height:125px!important;height:auto!important;-ms-interpolation-mode:bicubic;}
td.hdImg{vertical-align:top;}
/* EndStyle */
</style>

CSS-стили (изображение масштабируется линейно - в ширину)

Code (HTML)
<style type="text/css">
/* StartStyle */
#header{height:auto;}
#headerTb{border-collapse:collapse;border-spacing:0;table-layout:fixed;background-color:#1552ca;height:121px;}
#headerTb img.topImg{width:100%!important;height:125px!important;-ms-interpolation-mode:bicubic;}
/* EndStyle */
</style>

Примеры:

 Пропорционально-масштабируемая картинка ...

 Линейно-масштабируемая картинка ...


И ещё, для кучи

Не все браузеры умеют правильно масштабировать изображения.
Opera, Safari и Google Chrome отобразят их почти без искажений.
А в Internet Explorer и Firefox (опаньки!) картинка исказится.

В MSIE искажения будет наиболее заметными.

Дело в том, что для ресемплинга (изменения размеров изображения) браузеры используют свой собственный, метод.

Например, если фактическая ширина изображения 200x200 px, но вы указываете, что его размеры должна быть 400x400 px (увеличиваете), то изображение будет растянуто, используя «nearest-neighbor» алгоритм масштабирования - по соседним пикселям - то бишь замыливание, если не указано иное.

Если же наоборот, вы уменьшаете изображение, то будет использоваться «bicubic» - бикубический режим сглаживания.

В Internet Explorer «nearest-neighbor» является значением по-умолчанию, но есть возможность принудительно задать необходимый режим, в зависимости от начальных размеров и качества вашей картинки.

Делается это через CSS, свойством «-ms-interpolation-mode».

Оно может принимать два значения:

Code (Info)
-ms-interpolation-mode:nearest-neighbor; /*- Всегда используется интерполяция по соседним пикселям */
-ms-interpolation-mode:bicubic; /*- Всегда используется высококачественный бикубический режиме интерполяции */

Internet Explorer v6 - не поддерживает данную функцию.

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


Масштабирование относительно родительского элемента

При с использованием блока-обёртки, позиционированному относительно его исходного положения (position:relative)


Суть его сводится к следующему - создается дополнительный блок-обертка, для которого устанавливается position:relative и в него помещается картинка (<img />), используемая в качестве фона.

Для того, чтобы картинка не висела на первом плане, загораживая собой возможный внутренний контент шапки - текст, другие картинки, прочее - блоку-обёртке назначают z-index:1, а картинке, что будет выступать в роли фона, тоже задают позиционирование (так как только позиционированным элементам можно задать атрибут - z-index - кроме position:static;) и атрибут z-index:-1, смещая тем самым её (по z-оси) на задний план.

Чтобы управлять положением блока с контентом внутри блока с картинкой, применяется абсолютное позиционирование и/или поля/отступы.
Блоки вне обёртки, позиционируются как и обычно.

HTML-код:

Code (HTML)
<div id="wrapBox">
<div id="selfBox"><div class="author">Copyright 2005-2011 <a class="flink" href="http://likbezz.ru/">«likbezz.ru»</a>, Оформление: <a class="flink" href="http://likbezz.ru/index/8-1" target="_blank">Flesh</a></div></div>
<img class="topImg" src="/_content/_tpl/v00/_st/v00_h_1200.jpg" alt="" />
</div>

Где:

<div id="selfBox"> ... </div> - дополнительный контент - в данном случае - копирайт.
<img class="topImg" /> - картинка.


CSS-стили:

Code (CSS)
<style type="text/css">
/* StartStyle */
#header{height:auto;}
#wrapBox{position:relative;width:100%;height:auto;z-index:0;}
#selfBox{width:100%;position:absolute;}
#wrapBox img.topImg{display:block;position:relative;top:0;left:0;width:100%;height:100%;z-index:-1;}
/* EndStyle */
</style>

 Пример - пропорционально-масштабируемая картинка ...

Кроме того:
Так же как и в примере выше, если у изображения не указана высота, или указано значение «100%» - изображение масштабируется пропорционально.
Если же высота указана конкретно, в любых положительных единицах измерения, то не пропорционально, а только в ширину, сохраняя заданную в высоту.

 Пример - высота зафиксирована размером в 125px ...


Изменение всего вида элементов методом динамического добавления/изменения стилей


Изменение стиля блока посредством CSS3 свойства «background-size»


Кроме того, Web 2.0 давно пришел, и современные браузеры стремятся соответствовать стандарту W3C.
И многие уже поддерживают CSS3-свойство «background-size», непосредственно отвечающее за масштабирование фона.

К ним относится: Opera 9.5 и выше, Firefox 4 и выше,Safari 3 и выше, Chrome 4 и выше, Konqueror 3.5.4, и, как ни странно, лидер неподдержки стандартов - Internet Explorer 9.

Все они уже поддерживают CSS3 свойство «background-size», но, как и обычно, коряво, и для разных браузеров, по своему: через -moz-background-size для Мозиллы; -o-background-size для Opera; -webkit-background-size для Safari, Chrome, и -khtml-background-size для Konqueror (WebKit-браузеров), соответственно. ヅ ...

Следовательно, если использовать данный способ, и код будет другим - без блоков-обёрток, таблиц и прочих вспомогательных элементов.

HTML-код:

Code (HTML)
<h1 id="headLogo">Уголок аццкого кодера. Резиновые изображения, подстройка картинок под монитор</h1>

CSS-код:

Code (CSS)
<style type="text/css">
/* StartStyle */
#headLogo{width:100%;height:125px;overflow:hidden;text-indent:-999em;background:url(_st/v00_h.jpg) no-repeat center top;
-moz-background-size:100% 100%; /* для Firefox 4+ */
-o-background-size:100% 100%; /* для Opera 9.5+ */
-webkit-background-size:100% 100%; /* для Safari 5+ и Chrome 4+ */
-khtml-background-size:100% 100%; /* для Konqueror (WebKit-браузеров) */
background-size:100% 100%; /* CSS3 свойство */
}
/* EndStyle */
</style>

 Пример ...


К сожалению в Firefox 3.5 не работает «background-size», но для него можно повесить заведомо бОльшую картинку или фон:

Code (CSS)
@-moz-document url-prefix(){
#headLogo{background:url(_st/v00_h_some_big_img.jpg) no-repeat center top;} /* Заведомо большая/другая картинка/фон */
}

Примечание:
Высота шапки, в данном случае, определяется высотой блока для фона, следовательно чем выше шапка - тем выше фоновая картинка.
Так как параметр background-size:100% 100%; - то есть 100% - в ширину и 100% - в высоту блока.
Есть возможность указать фиксированную высоту фона, на зависимо от высоты блока.

Например:
background-size:100% 200px; - картинка растянется на 100% от ширины блока, и на высоту 200px, лишнее скроется.

 Пример ...


Изменение стиля блока посредством CSS3 свойства Media Queries

С приходом CSS3 появилось такое свойство, как Media Queries. Благодаря ему, в будущем, будет гораздо проще оформлять страницы под разные разрешения монитора.

На данный момент свойства Media Queries поддерживаются Webkit-браузерами (Safari 4+), Opera, Firefox начиная с версии 3.5, Chrome 4 и выше, и, как ни странно, Internet Explorer (Second Preview) 9-ой версии. И Safari iPad.

Почти то же самое, что и в предыдущем примере.

HTML-код:

Code (HTML)
<h1 id="headLogo">Уголок аццкого кодера. Резиновые изображения, подстройка картинок под монитор</h1>

CSS-стили:

Code (CSS)
<style type="text/css">
/* StartStyle */
#header{height:auto;}
#headLogo{width:100%;height:121px;overflow:hidden;text-indent:-999em;background:no-repeat center top;}/* Основные параметры блока*/
#headLogo{background-image:url(_st/v01_h_800x133.jpg);}/* Фон по умолчанию */
/* 800x600 | 1024x768 | 1152x864 | 1280x1024 | 1400x1050 */
@media screen and (max-width:800px) {#headLogo{background-image:url(_st/v01_h_800x133.jpg);height:133px;}}
@media screen and (max-width:1024px) and (min-width:800px) {#headLogo{background-image:url(_st/v01_h_1024x170.jpg);height:170px;}}
@media screen and (max-width:1152px) and (min-width:1024px) {#headLogo{background-image:url(_st/v01_h_1152x191.jpg);height:191px;}}
@media screen and (max-width:1280px) and (min-width:1152px) {#headLogo{background-image:url(_st/v01_h_1280x213.jpg);height:213px;}}
@media screen and (min-width:1280px) {#headLogo{background-image:url(_st/v01_h_1400x233.jpg);height:233px;}}
/* EndStyle */
</style>

Где:

@media screen and (max-width:1024px) and (min-width:800px){} - указываем диапазон разрешений, при котором эти стили должны работать.

#headLogo{background-image:url(_st/v01_h_800x133.jpg);} - картинка для шапки (фон) - по умолчанию.

#headLogo{width:100%;} - основные, неизменяемые параметры шапки.

... "Основные параметры блока” и "фон по умолчанию” - разбит для наглядности...

 Пример ...

Примечание:

Диапазон разрешений, как и количество блоков включений, не ограничено.

Вы можете определять стили не только под разрешение, но и для устройств вывода- для цветных и монохромных устройств (принтеры, читалки и т.п.), ориентации экрана (вертикальной или горизонтальной), и пр.

Блоки @media могут содержать любые стили.

Вдобавок к созданию блоков правил @media в CSS-файлах, можно использовать Media Queries в атрибуте media тэгов link и style и внутри блока @import.


Примеры использования:

Подключаются стили:

Code (HTML)
<link rel="stylesheet" media="screen and (max-width:800px)" href="/_content/_ext/img-bg/_st/800.css" />
<link rel="stylesheet" media="screen and (max-width:1024px) and (min-width:800px)" href="/_content/_ext/img-bg/_st/1024.css" />

В документе (для вывода на печать и монохромных устройств вертикальной ориентации):

Code (HTML)
<style type="text/css" media="print and (orientation:portrait)">
#headLogo{background:none;}
</style>

Импорт файла (в основную таблицу стилей или в документ):

Code (CSS)
@import "1024.css" screen and (max-width:1152px) and (min-width:1024px);

Поиграться, растягивая окно браузера и наблюдая, как меняются циферки, можно вот на этом примере:

 Пример - шаг разрешения = 100px (выводится диапазон текщего разрешения.) ...


Кроме средств на чистом CSS (с небольшими хаками) можно изменять картинку, фон, прочее, при помощи JavaScript.

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

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


P.S.

Обсудить тему и задать  вопросы можно на форуме «Вопрос по теме ...» 
в одноимённой теме:
«Подстройка размера изображения под разрешение экрана средствами CSS».


Автор: Likbezz aka Flesh




Источник: css, для, html, background, width, как, height, size, style, картинка, media, изображения, code, headlogo
Категория: CSS | Добавил: likbezz (15.03.2011) E
Просмотров: 101603 | Теги: CSS, разрешение, размера, обозревателя, изображение, монитора, Подстройка, экрана, средствами, браузер
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]