Скроллинг к элементу страницы с помощью jQuery
За последние несколько лет серьезно возросла популярность одностраничных (скроллинговых) сайтов. Хотя данный вид сайтов и не для всех, все же полезно знать, как они работают. Сегодня я покажу, как создать простой одностраничный (скроллинговый) сайт с помощью jQuery.
Прежде чем мы начнем, можете посмотреть Demo.
Что ж, приступим…
Создавать будем следующее:

HTML
Разметка (HTML) страницы будет предельно проста.
Сперва создадим навигацию.
HTML
<nav>
<ul>
<li>
<a href="#paragraph1">Paragraph 1</a>
</li>
<li>
<a href="#paragraph2">Paragraph 2</a>
</li>
<li>
<a href="#paragraph3">Paragraph 3</a>
</li>
<li>
<a href="#paragraph4">Paragraph 4</a>
</li>
<li>
<a href="#paragraph5">Paragraph 5</a>
</li>
</ul>
</nav>
Что мы сделали: элемент nav имеет ширину 100%, то есть его ширина будет равна ширине родительского элемента. Для nav свойство position имеет значение fixed, поэтому при скроллинге страницы элемент nav будет всегда перед глазами пользователя. Чтобы создать навигацию мы в тег nav поместили тег ul.
Взгляните на ссылки – они все ведут к одному конкретному параграфу.
Преимущества:
- Если у пользователя выключен javascript, ссылки все равно работают.
- При помощи jQuery мы будем считывать атрибут
hrefс каждой ссылки.
Теперь, когда мы создали простую навигационную панель, можем заняться главным контентом страницы.
HTML
<div id="content">
<p id="paragraph1">
Lorem ipsum dolor sit amet,
consectetur adipiscing elit...
</p>
<p id="paragraph2">
In ut sapien sem, a convallis odio.
Aenean consequat ornare egestas...
</p>
<p id="paragraph3">
Donec sodales diam et libero ultrices ornare...
</p>
<p id="paragraph4">
Phasellus dolor sem, pharetra nec scelerisque
sit amet, consequat quis dolor...
</p>
<p id="paragraph5">
Proin varius pellentesque velit,
at consequat risus hendrerit quis...
</p>
</div>
Как видите, разметка предельно проста. Она состоит из блока content, который вмещает параграфы (p). Каждый параграф имеет свой id, связанный со ссылкой в нашей навигации.
CSS
Прежде чем приступить к CSS, не забудьте подключить сброс стилей от Eric Meyer's. Он нивелирует проблемы, связанные с межбраузерной несовместимостью, и позволяет работать не задумываясь, будет ли сайт выглядеть одинаково во всех современных браузерах.
Начнем со стилей главного контента страницы, что очень просто.
CSS
body {
font-family: arial;
font-size: 15px;
line-height: 25px;
color: #515151;
background: #fdfdfd;
}
#content {
width: 500px;
margin: 0 auto;
padding-top: 40px;
height: 2000px;
}
#content p {
margin-bottom: 25px;
}
В body определяем текст и цвета фона; блок content имеет ширину 500px и центрирован. Значение для padding-top у блока content равно 40рх – это сделано для того, чтобы навигация не блокировала верхние 40px контента. Высота равна 2000px, чтобы уместить контент и показать скроллинг. Хотя, как правило, в этом нет необходимости. Каждый параграф имеет свойство margin-bottom, равное 25px, чтобы можно было понять, где один параграф заканчивается и начинается другой.
Теперь перейдем к навигации:
CSS
nav {
width: 100%;
position: fixed;
height: 40px;
background: white;
border: 1px solid #CACACA;
border-top: none;
-webkit-box-shadow: 0px 0px 3px 1px #ebebeb;
-moz-box-shadow: 0px 0px 3px 1px #ebebeb;
box-shadow: 0px 0px 3px 1px #ebebeb;
}
nav ul {
width: 750px;
margin: 0 auto;
}
nav ul li{
float: left;
width: 150px;
text-align: center;
}
nav ul li a {
line-height: 40px;
font-size: 16px;
text-decoration: none;
color: #515151;
border-bottom: 1px dotted #515151;
}
nav ul li a:hover{
color: #000;
}
Чтобы nav занимал всю ширину браузера, значение его ширины равно 100%. Чтобы nav оставался на экране монитора при скроллинге, он имеет объявление position:fixed. Высота равна 40рх, что вполне нормально для горизонтального верхнего меню. Для придания симпатичного вида был использован простой стиль. ul центрировано и имеет ширину 750рх, чтобы у каждой ссылке было достаточно места. Каждая li создана плавающей, поэтому все ссылки находятся на одной линии. Наконец, для ссылок также назначен простой стиль.
jQuery
Вот, как это будет работать: при клике (click) по навигационной ссылке произойдет скроллинг к тому параграфу, на который указывает ссылка.
Как всегда, начнем с функции document.ready
JQuery
$(document).ready(function(){
});
Теперь, прежде чем перейти к функцию click, напишем функцию scrollToDiv, которая будет осуществлять скроллинг к выбранному нами блоку. Параметров будет 2 – элемент, к котрому ведется скроллирование и высота навигацинной панели в верхней части страницы.
JQuery
function scrollToDiv(element,navheight){
}
Теперь мы описываем три переменные, они нам понадобятся для аккуратного скроллинга.
JQuery
function scrollToDiv(element,navheight){
var offset = element.offset();
var offsetTop = offset.top;
var totalScroll = offsetTop-navheight;
}
Переменная offset это смещение элемента. Ее использует переменная offsetTop, чтобы вытащить значение top. В результате чего получаем расстояние от верха страницы до элемента. Переменная totalScroll отвечает за расстояние, на которое браузеру необходимо прокрутить страницу. Без верхней панели навигации величина скроллирования будет равна величине offsetTop. Однако при вычислении переменной totalScroll нужно помнить, что наша навигационная панель блокирует верхние 40рх контента. Здесь нам поможет параметр navheight.
Наконец, скроллируем страницу:
$('body,html').animate({
scrollTop: totalScroll
}, 500);
Функция jQuery animate позволит нам реализовать плавный скроллинг к нужному нам месту страницы. В данном случае на анимацию уходит 500 миллисекунд.
Свойство scrollTop позволяет задать величину, на которую необходимо прокрутить страницу (по вертикали).
Вот полная функция scrollToDiv:
function scrollToDiv(element,navheight){
var offset = element.offset();
var offsetTop = offset.top;
var totalScroll = offsetTop-navheight;
$('body,html').animate({
scrollTop: totalScroll
}, 500);
}
Перейдем к функции click.
$('nav ul li a').click(function(){
return false;
});
Это только каркас функции click. Объявлением return false на конце, предотвратит переход браузера по ссылке.
Прежде чем передать элемент функции, для него нужно найти имя.
var el = $(this).attr('href');
var elWrapped = $(el);
Переменная el содержит значение атрибута href. Чтобы jQuery могла использовать переменную el, ее необходимо завернуть в elWrapped. Следующий код jQuery исполнить не может:
#paragraph1.offset();
Но может исполнить это:
$('#paragraph1').offset();
Вот, почему необходима переменная elWrapped.
Полная функция click:
$('nav ul li a').click(function(){
var el = $(this).attr('href');
var elWrapped = $(el);
scrollToDiv(elWrapped,40);
return false;
});
Вот и все – теперь у нас есть простая страница с ссылками, при клике по которым происходит скроллинг к нужной части страницы.
По материалам сайта

Комментарии к статье
Здравствуйте, а расскажите пожалуйста про хэш ссылки, как повесить на такую конструкцию, чтоб при загрузке страницы проходил .click на ссылку? Как раз возник такой вопрос..
а что значит число 40 в scrollToDiv(elWrapped,40);
Большое спасибо, это самое простое и удобное решение =)
Поддерживаю. Легко, просто, работоспособно)))))