Position: fixed; - фиксируем блок на странице



От начала и до конца. В этой заметке я объясню как кроссбраузерно сделать position:fixed с помощью CSS и избавится от подергивания блока при прокрутке в ИЕ.

Сразу скажу - за все время, проведенное в сети, я заметил, что блоки с фиксированным положением на странице (не зависящим от скролла), довольно мало используются. Нет, разумное использование таких элементов на сайте не осуждается общественностью. Скорее дело в другом - фиксированные блоки неизбежно привлекают внимание посетителя при прокрутке страницы. Он отвлекается от своей цели - и, как правило, немного раздражается.

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

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

Сначала сделаем себе простецкий html-документ:

<html>
<head>
   <style type="text/css">
      #container {
         height: 2000px;
         position: relative;
      }
      #fixed-div {
         width: 100px;
         height: 100px;
         border: 1px solid red;
         position: fixed;
         top: 200px;
         left: 200px;
      }
   </style>
</head>
<body>
   <div id="container">
      <div id="fixed-div">
         Fixed Div
      </div>
   </div>
</body>
</html>

Блок fixed-div мы будем фиксировать. Для наглядности я указал ему ширину и высоту по 100 пикселей и границу красного цвета. Здесь же указан нужный нам тип позиционирования и положение относительно родителя (top и left). Блок container - содержащий контейнер (родитель) для нашего блока (для этого указано объявление position:relative;). Высота 2000 пикселей указана, чтобы появился скролл у body.

В мозилле и опере все работает, можете проверить. Если указать доктайп для документа, например такой:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

то заработает и в ИЕ7. Осталось заставить ИЕ6 отображать то, что нам нужно. Этого можно добиться, указав для него абсолютный тип позиционирования + вычисление значения свойства top через expression. Используя conditional comments, напишем стили только для эксплореров:

<!--[if IE]>
   <style type="text/css">
      #fixed-div {
         position: absolute;
         left: 200px;
         top: expression(eval(document.body.scrollTop + 200) + "px");
      }
   </style>
<![endif]-->

Здесь используется метод expression (к слову работающий только в ИЕ), который с помощью javascript и dom вычисляет сдвиг нашего абсолютно позиционированного блока относительно скролла окна.

Теперь работает и в ИЕ6. И все было бы хорошо, если бы блок не дергался при прокрутке в ИЕ. Но и это решаемая задача - достаточно просто зафиксировать фон body. Можно в качестве фона поставить классический однопиксельный gif. А можно и не ставить - удивительно, но и без картинки будет работать. Просто добавьте стили:

<style type="text/css">
   body {
      background: url('/n.gif') no-repeat;
      background-attachment: fixed;
   }
</style>

Копирайт этого решения, судя по всему, указывает на студию Лебедева.

В прикрепленных файлах находится собранный в кучу код странички - разбирайте, модифицируйте, используйте!

Прикрепленный файлРазмер
fixed-div.html693 байта

Комментарии

Респект за статью! Я тут горы сайтов перерыл, но либо через JS реализовано, либо настолько заморочено!
А тут всё просто и толково!

Увы, это тоже через JS, следовательно, не работает у тех, кто его отключил :(

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Разрешаю теги: <a> <em> <strong> <pre> <ul> <ol> <li>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.

Подробнее о форматировании

Image CAPTCHA
Регистр символов учитывается.