Веб-разработка

индекс
236,88

Масштабируемая картинка на фоне сайта

Задача:
Дизайнер нарисовал макет страницы, на заднем фоне которой была картинка. Я сначала было решил, что это фон который увеличивается по ширине в зависимости о разрешения монитора.
Но не тут то было. Дизайнер настаивал на то, что это масштабируемая картинка, которая сужается / растягивается при изменение окна приложения и по ширине и по высоте.
Заранее предупредив заказчика – что картинка будет грузиться 1 и в максимальном разрешении – его определили как 1600, приступил к работе.


Теория:
Для реализации данной функциональности, нам необходимо будет поиграться с абсолютным позиционированием. Так как фон масштабировать мы не можем – придется положить на нижний слой изображение которое будет пропорционально масштабироваться, а сверху нее уже положиться сетку сайта.

Схематическое представление приведено на рисунке.


Практика

HTML:
<div id="page">
  <div id="left">
    Меню
    
  </div>
  <div id="right">
    Контент
  </div>
</div>

<div id="main">
  <div class="foot">
    <ul>
      <li><a href="#" title="О компании">О компании</a></li>
      <li><a href="#" title="Контакты">Контакты</a></li>
    </ul>
    <div class="contacts">
      <span class="copy">Copyright; © 2009</span>
    </div>
  </div>
<!--Растягивающаяся картинка-->
  <div class="img"><img src="img/back_001.jpg" width="100%" alt="" title="" /></div>
</div>

* This source code was highlighted with Source Code Highlighter.

CSS:
  1. html {
  2. height:100%;
  3. }
  4.  
  5. body {
  6. margin: 0; padding: 0;
  7. height: 100%;
  8. }
  9.  
  10. {
  11. outline:none;
  12. }
  13.  
  14. /*Обертка картинки*/
  15. #main {
  16. position: relative;
  17. z-index: 1;
  18. height:100%;
  19. }
  20. /*Сам слой с картиной*/
  21. #main div.img {
  22. display: block;
  23. position: absolute;
  24. bottom:0; /*картинка всегда будет находиться внизу страницы*/
  25. z-index: 10;
  26. min-width: 1000px;
  27. width: 100%;
  28.    _width: expression((documentElement.clientWidth||document.body.clientWidth)<1004?'1004px':'100%');
  29. }
  30.  
  31.  

  1. /*Слой с копирайтами и нижнее меню*/
  2. #main div.foot {
  3. position: absolute;
  4. bottom: 80px;
  5. z-index: 20;
  6. width:100%;
  7. height: 30px;
  8. min-width: 1000px;
  9. _width: expression((documentElement.clientWidth||document.body.clientWidth)<1004?'1004px':'100%');
  10. }
  11.  
  12. #main div.foot ul {
  13. list-style:none;
  14. font: normal 12px Verdana;
  15. margin: 14px 0 0 75px;
  16. padding: 0;
  17. }
  18. #main div.foot ul li {
  19. display: inline;
  20. margin: 0 120px 0 0;
  21. }
  22.  
  23. #main div.foot ul li a, #main div.foot ul li a:visited {color: #faffcd;}
  24. #main div.foot ul li a:hover {color:#163133;}
  25.  
  26. #main div.contacts {
  27. position:absolute;
  28. right: 44pxtop: 14px;
  29. width: 360px;
  30. font: normal 11px Verdana;
  31. color: #faffcf;
  32. }
  33. /*Cам сайт*/
  34.  
  35. #page {
  36. position: absolute;
  37. top: 0; left: 0;
  38. z-index: 30;
  39. width: 100%;
  40. overflow: hidden;
  41. margin: 0 0 300px 0;
  42. min-width: 1000px;
  43. _width: expression((documentElement.clientWidth||document.body.clientWidth)<1004?'1004px':'100%');
  44. }
  45.  
  46. #left {
  47. width:290px;
  48. float: left;
  49. }
  50.  
  51.  
  52. #right {
  53. margin:48px 0 370px;
  54. position: relative;
  55. color: #4c4f51;
  56. font: normal 12px/18px Verdana;
  57. }
  58.  

Использовать либо xaк для ie6 "_", либо conditional comments — это дело вкуса.
Просьба не устраивать холиваров :)

Все вроде бы хорошо, но нам установить высоту блока обертки картинки (div id=«main») равной = высоты слоя с данными div id=«page» + 400px — высота отсупа от картинки, в противном случае у нас контент сайта и картинка будут жить отдельными жизнями. Для данной цели мы задействуем JS, который мы повесим на onload
JS
  1. <script language="javascript">
  2. function test(){
  3. var h = 400 + document.getElementById('page').offsetHeight;
  4. if (> 600) { 
  5. document.getElementById('main').style.height = h + 'px';
  6. }
  7. }
  8. </script>


Пример
Из за баннера хостинга в FF белая полоса :) в IE все путем

Bug Fix
Забыл про большие мониторы для этого вычисляем высоту окна
    function test(){
      var client = document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientHeight:document.body.clientHeight; ;
      var h = 270 + document.getElementById('page').offsetHeight;
      if (h > client) {
        document.getElementById('main').style.height = h + 'px';
      }
    }


* This source code was highlighted with Source Code Highlighter.


Изменение в CSS
#main {
  position: absolute;
  top:0; left:0; right:0; bottom:0;
  z-index: 1;
  height:100%;
}


* This source code was highlighted with Source Code Highlighter.


Буду рад, если кому-то пригодится.
+37
16 марта 2009, 23:23
153

комментарии (47)

+1
jabber #
забавно =)
+34
AztEK #
Как идея прикольно, конечно, но вообще, дизайнерам за такие макеты надо по рукам давать.
+1
KrH_EF #
Хотелось бы, чтобы, хоть иногда, дизайнеры читали, что тут написано. Пункт №1, как я понимаю самый важный.
Но с другой стороны, скучать не приходится :)
0
Ogra #
Больше сайтов, хороших и разных!
Паутина и современные браузеры дают такие огромные возможности, что их грех не использовать.
Макет на удивление вменяемый — логично, что чем меньше размер окна, тем меньше должны быть элементы, в особенности бэкграунд. Почему, то, что на большом разрешении показывается как подвал/шапка на другом разрешении должно быть половиной экрана?
НЛО прилетело и опубликовало эту надпись здесь
+1
l2k #
Дизайнер осёл ещё потому, что это Ужастно тормозит при скроллинге. (по крайнер мере в Opera).
Вообще, об этом уже писалось на сайте, о котором обычно не упоминают.
+2
kibizoidus #
У самого первым делом родилось желание пристрелить горе-дизайнера, который фотографии на фон бросает из-за собственной… Хм… Даже не знаю, из-за чего такое можно делать.
И даже после прочтения всех мытарств желание только укрепилось.
–2
marazm #
Пожалуй даже вырывать ногти и вбивать в пальцы гвозди
0
woworks #
Полезно. Спасибо.
+1
do1banek #
Похожее уже было kolyuchii.habrahabr.ru/blog/52548/
+1
Tvarb #
слишком обобщенно в приведенной вами статье…
+1
kolyuchii #
Потому что у меня первоисточник)
Ваша статья — хороший и полный пример реализации метода!
+1
WilliamKidd #
Что вы думаете про эту статью — www.cssplay.co.uk/layouts/background?
+1
Tvarb #
Нарушаются пропорции изображения :)
0
flaresun #
Зато на ней сразу видно, что фон меняет размеры ))
0
zerobrain #
А что будет, когда текста по высоте будет больше, чем высота картинки? Да и с пропорциями на экране явный глюк ;)
–2
MAGIKru #
Зато есть и плюс ))) Зашёл на сайт, увидел красивую картинку — вот те и пополнение в клипарте с неплохим разрешением, а не вебовская мелочь пузатая )))
0
NervousSnake #
«bottom:0; /*картинка всегда будет находиться внизу страницы*/» — что-то картинка не всегда находится внизу страницы… А было бы неплохо — т.к. небо светлое, было бы лучше, чтобы оно переходило в белый, если уж экран повыше, чем картинка.
0
kartoha #
Мне как раз понадобиться сейчас. Спасибо. :)
0
kartoha #
только внизу и в IE у меня большой белый промежуток.
0
NervousSnake #
Вот у меня тоже… Только такое чувство, что она там специально получился :)
Только что сделала по-своему, вроде даже попроще. Но картинка полностью внизу. Теперь не могу понять — какая задача стояла…
0
NervousSnake #
А еще вот думаю, что не для любой картинки такой способ подойдет. Более «гладкие» картинки, скорее всего в «любимом» ИЕ будут некрасиво масштабироваться. Эта вся в травке, зазубринках — поэтому, может, нормально смотрится.
0
kartoha #
у меня задача стоит с разными фонами… При каждой загрузке разный фон. Но почти на всех есть травка :)))))
0
kolyuchii #
По крайней мере для ие есть img {-ms-interpolation-mode: bicubic}
0
0range #
Эт свойство на производительность ие влияет прилично вроде как
0
bebopkid #
Я бы учел возможность ресайза окна, и сделал вот так:

  1. <script language="javascript">
  2. function test(){
  3.  var h = 400 + document.getElementById('page').offsetHeight;
  4.  if (h > 600) {
  5.   document.getElementById('main').style.height = h + 'px';
  6.  }
  7. }
  8. var ie=!!window.attachEvent;
  9. window[ ie ? 'attachEvent' : 'addEventListener' ]( ie ? 'onresize' : 'resize', test );
  10. </script>
+2
bebopkid #
Поправочка:

Copy Source | Copy HTML
  1. <script language="javascript">
  2. function test(){
  3.  var h = 400 + document.getElementById('page').offsetHeight;
  4.  if (h > 600) {
  5.   document.getElementById('main').style.height = h + 'px';
  6.  }
  7. }
  8. var ie=!!window.attachEvent;
  9. window[ ie ? 'attachEvent' : 'addEventListener' ]( ie ? 'onresize' : 'resize', test, false );
  10. </script>
0
Tvarb #
полезно — спасибо…
0
webmasters_by #
есть еще такой вариант в jQuery — buildinternet.com/live/supersized/
0
qizz #
отличная «рыба»!
+3
TiGR #
Конечно вариант, но я бы дал дизайнеру понять, что пусть он меняет макет и думает головой, т.к. делает он для веба а не для цирка шапито.

Это плохо хотя бы потому, что правый клик на этом «фоне» не будет работать как того ожидает пользователь.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
0
dinich #
Спасибо дизайнеру за приятную картинку.
5 минут отдохнул на работе.
0
Chikiro #
при большом разрешении после перезагрузки страницы фон уползает вверх FF 3.0.6, Linux, 1920x1200
0
Tvarb #
cейчас посмотрите — добавил bugfix, с работы не могу — закрыт доступ :)
0
Apostol #
Пару лет назад заглушку себе на сайт набросал. Небо — вертикальный и горизонтальный полупрозрачный градиент, наложенные один на другой. Сверху слой с травой, а ещё выше контент.
apostolstudio.com

Просьба к коду не придираться. Там всё было на скорую руку набросано, но так и не было доделано по причине отсутствия надобности в сайте.
0
Tvarb #
:) таки таким дизайнерам как Вы вообще слово «придраться» не подходит — а верстка это уже второе :)
+2
Trogo #
Дима — это не тот Апостол :) тот Николай… да и вряд ли он на Хабре появиться :)
0
Apostol #
Да, Николай в первую очередь дизайнер. А я — веб-разработчик. По поводу «к коду попридираться» — это ко мне. :)
0
nicothin #
>>нам необходимо будет поиграться с абсолютным позиционирование.

пропущена последняя «м».

>>Буду рад если кому то пригодиться

ужас! две ошибки в таком коротком предложении! (хрен с ней, с точкой, это без нее две ошибки).
0
Tvarb #
всю школу по литературе было пять, по русскому — 3 :) Мысли вперед рук бегут :)
0
zorba_buddha #
ппц, надо было столько городить.
делаешь картинку квадратной, указываешь только ширину — высота автоматически подстраивается под ширину, следовательно 100% и она будет тянуться как надо.
всеми вами нелюбимая студия применила это ещё в 2005-ом: www.queengroup.ru/
0
kolen #
Насколько знаю, браузеры масштабируют картинки методом nearest pixel, выглядит ужасно.
0
cinic #
При маленьком размере окна — футер подкладывается под контент :(
0
Red_Lemur #
Это не футер! Это все одна картинка!
0
cinic #
Да вижу я что там картинкой, а что нет.
Футер -> Копирайт, вот он подкладывается под контент. Так яснее!?

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