Масштабируемый фон web страницы
Масштабируемый фон web страницы, на данном этапе развития html и css, не возможен без использования javascript. Обусловлено это тем, что html и css являются статичными и параметры указаные в них не изменны, в тот момент когда это было бы весьма кстати.
Итак к сути данной проблемы - проблема масштабируемости фонового изображения может появится у верстальщика если креативный дизайнер решил использовать в качестве фона для веб страницы, в своем Psd макете, какое-то изображение определенного размера и не дублирующегося не по вертикали не по горизонтали. Тоесть картинка с каким-то изображением.
Но как же быть если эта картинка имеет размеры большие или меньшие чем разрешение монитора пользователя? Тоесть при условии, что картинка должна занимать все фоновое пространство веб страницы. Выход один - масштабировать (растягивать), фоновое изображение в зависимости от окна браузера (тоесть разрешения монитора).
Если хотите бесплатно позвонить через интернет, вам нужно скайп скачать бесплатно на русском, и быть на связи!
Чтобы реализовать данное решение, следует фоновое изображение не прописывать через CSS свойством background родительского элемента body или #wrapper, а использовать обычный дескриптор изображения IMG. Которому будут динамически присваиватся свойства height и weight.
И так пример HTML кода и CSS стилей с их описанием.
Код HTML:
- <html>
- <body>
- <div id="fon-size"><img alt="" src="img/bg.jpg"/></div>
- <div id="wrapper" style="margin:0 0 60px 0;">
- <!-- Content -->
- <div class="content">
- <h1>Масштабируемый фон web страницы</h1>
- <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry.</p>
- <p>...</p>
- </div>
- <!-- X Content -->
- </div>
- </body>
- </html>
Код CSS:
- html, body {
- width:100%;
- height:100%;
- padding:0;
- margin:0;
- font:12px Arial, Helvetica, sans-serif;
- color:#333;
- background:#00334e;
- position:relative;
- text-align:center;
- }
- #wrapper{
- width:900px;
- text-align:left;
- z-index:1000;
- position:absolute;
- top:30px;
- left:50%;
- margin-left:-450px !important;
- background:#FFFFFF;
- }
- .content{padding:30px;}
- /* Fon */
- #fon-size{
- overflow:hidden !important;
- width:100%;
- height:100%;
- text-align:center;
- }
- #fon-size img{
- height:1600px;
- width:1579px;
- }
Как видите дескриптор IMG помещен в контейнер #fon-size, который имеет следующие свойства CSS:
- overflow:hidden - позволяет обрезать слишком большое изображене для меньшего разрешения;
- width:100% - растягивает блок на всю ширину окна;
- height:100% - растягивает блок на всю высоту окна;
- text-align:center - выравнивает картинку по центру блока;
К самому же дескриптору IMG изначально выставлены реальные размеры изображения.
А теперь контейнер с содержимым веб страницы, в которой содержится текст и тп. Это контейнер с id #wrapper, для того чтобы фоновое изображение в дескрипторе IMG находилось под контейнером #wrapper (основным содержимым страницы), приходится позицианировать его абсолютно, а также выставить наивысшее положение слоя через z-index, но при этом мы сталкнемся с проблемой отцентровки этого блока на веб странице.
Но для этого есть специальный трюк CSS - и состоит он в том что к абсолютно позицонированному блоку, который у нас #wrapper, устанавливается положение left равное 50% и отрицательный margin, равный половыине ширины #wrapper. Еще раз приведу правила CSS для #wrapper:
- #wrapper{
- width:900px;
- text-align:left;
- z-index:1000;
- position:absolute;
- top:30px;
- left:50%;
- margin-left:-450px !important;
- background:#FFFFFF;
- }
При этом body должен иметь position:relative; так как #wrapper абсолютно позицонируется в body.
Разабравшись с HTML и CSS переходим к Javascript коду который и выполняет все манипуляции по масштабированию фонового изображения, этот яваскрипт код не использует фреймворков javascript таких как jQuery или Mootools, сделано это с целью легкого адаптирования скрипта в проект с любым используемым в нем JS фреймверком.
И так javascript код:
- function Size(){
- var cont = document.getElementById('fon-size');
- if(cont){
- var wrapper = document.getElementById('wrapper');
- var wrapperH = parseFloat(wrapper.clientHeight);
- var margin = parseFloat(wrapper.style.marginBottom);
- var body = document.getElementsByTagName('body')[0];
- var bodyH = body.clientHeight;
- var bodyW = body.clientWidth;
- var img = cont.getElementsByTagName('img')[0];
- if(wrapperH+margin >= bodyH){
- body.style.height = wrapperH+margin+'px';
- }
- cont.style.height = wrapperH+margin+'px';
- if(img.offsetWidth<bodyW){
- img.style.width = bodyW+'px';
- }
- if(img.offsetHeight<wrapperH+margin){
- img.style.height = wrapperH+margin+'px';
- }
- if(bodyH > wrapperH+margin){
- cont.style.height = bodyH+'px';
- }
- }
- }
- window.onload=Size;
- var ie=!!window.attachEvent;
- window[ ie ? 'attachEvent' : 'addEventListener' ]( ie ? 'onresize' : 'resize', Size, false );
Описание принципа работы javascript кода. При событии браузера onload, вызывается функция Size(), которая выполняет масштабирование фонового изображения, динамически присваивая высоту и ширину. Также используется событие resize для окна браузера, на тот случай если пользователь будет стягивать или растягивать окно браузера - следует пересчитать размеры окна и динамически присвоить новую высоту и ширину масштабируемуму фоновому изображению.
И так при старте функции сначало проверяем существует ли обрамляющий контейнер для масштабируемого изображения, с id #fon-size, и если он есть то выполняем код функции дальше. А дальше выполняем такое: определяем размеры #wrapper и body, после чего сравниваем их в условии, и если высота #wrapper превышает или равна высоте body, то устанавливаем высоту для body равную высоте #wrapper + значение нижней внешней рамки margin-bottom от #wrapper.
После этого для #fon-size выставляем высоту равную высоте #wrapper:
- cont.style.height = wrapperH+margin+'px';
Далее выполняем непосредственно масштабирование фонового изображения:
- if(img.offsetWidth<bodyW){
- img.style.width = bodyW+'px';
- }
- if(img.offsetHeight<wrapperH+margin){
- img.style.height = wrapperH+margin+'px';
- }
Затем для обрамляющего контейнера #fon-size, в который помещено масштабируемое фоновое изображение устанавливаем высоту, в том случае если высота body привышает высоту #wrapper+margin:
- if(bodyH > wrapperH+margin){
- cont.style.height = bodyH+'px';
- }
Тем кто знаком с синтаксисом и принципами javascript, будет несложно разобратся в 36 строках, и при необходимости модифицировать данный скрипт. К тому же обращаю ваше внимание на то что этот скрипт растягивает картинку на весь размер окна, поэтому возможны искажения, учтите это.
Посмотреть пример: Масштабируемый фон web страницы.
Скачать пример: resize-fon-webpage.zip.
PS. Читайте последние записи RSS Подписка на RSS
Похожие статьи:
| < Предыдущая | Следующая > |
|---|

Комментарии
body{background: #292929 url(../img/bg.jpg) top no-repeat;
background-size: 100% auto;
}
А за предложение спасибо!
Мне понравилась ваша статься, потому что у меня проблема с IE8 в плане масштабирования страницы и я впринципе понял выход из проблемы используя js.
Но почему-то при использовании вашего скрипта браузер указывает на ошибку в строчке.
cont.style.height = wrapperH+margin +'px';
Посмотрите в чём кроется проблема)
Попробуйте вевести алертом, перед этой строчкой, переменные wrapperH и margin, и посмотреть что в них.
2. масштабируемост ь работает только в случае увеличения окна, при уменьшении width/height не меняются (косяк однако)
3. руки оторвать такому дизайнеру нужно.
По третьему пункту не достаточно руки оторвать, иногда мне кажется что думают жопой, а ресуют ногами :))