Впервые я столкнулся с этим, когда делал на своем сайте выплывающую панель «Поделиться в соц сетях» при скролле поста вниз (попробуйте).
При использовании ссылок-якорей на сайте, после перехода по ссылке, панель соц сетей закрывала верхнюю часть контента (как правило заголовок) и в итоге пользователю просто было непонятно, куда он в итоге попал. Вы можете опробовать это сами, кликнув по ссылке «A» ниже.
А так как сейчас очень популярно делать фиксированные шапки и меню position:fixed
, прилепленные к верхней части экрана, то думаю что этот пост будет интересен многим. В нём я рассмотрю несколько вариантов якорей с отступами от верхней границы экрана при переходе по ним.
Для более ясного понимания на все h2
-заголовки я добавил заливку.
Пример того, как работает стандартная ссылка-якорь. Если вы попали сюда, кликнув по ссылке, а не просто проскроллили страницу, то скорее всего заголовок у вас оказался полностью скрыт под панелью соц сетей.
Возможно было бы правильнее назвать пост не «5 методов…», а «4 метода…». Потому что это и не метод вовсе, а показательный пример того, как быть не должно, ну да ладно.
Используем псевдоэлемент для добавления отступа перед элементом — :before
или :after
.
Поддержка браузерами: Chrome конечно же, IE8+, Firefox 3+, Opera 9.25+, Safari 3+.
padding-top
или border-top
.#link-B:before { display: block; content: ""; height: 55px; margin: -55px 0 0; }
Используем padding
для создания отступа и отрицательный margin
, чтобы этот же отступ убрать, а точнее — сделать его незаметным для пользователей.
Обратите внимание, что внутренные отступы padding
тоже попадают под заливку, то есть, если у вашего элемента будет фон, то он скорее всего наедет на контент перед ним. Для того, чтобы игнорировать padding
при добавлении фона на элемент, используйте CSS-свойство background-clip:content-box
.
Поддержка браузерами: Chrome конечно же, Firefox 4.0+, Opera 10.6+, Safari 3+.
background-clip:content-box
, но это только в том случае, если вы хотите добавить фон элементу.margin
(в том числе при margin-collapse — это когда из нижнего отступа первого элемента и верхнего отступа второго определяется наибольший, который и становится величиной отступа между этими элементами).padding-top
.#link-C { padding-top: 55px; margin-top: -55px; -webkit-background-clip: content-box; background-clip: content-box; }
По сути то же самое, что и предыдущий метод, но вместо padding
используем border
. Что это нам даёт?
padding
.border
— это тот же padding
, но только с заливкой и эффектами. Поэтому при использовании фона или заливки элемента нам нужно учесть, чтобы она распростаранялась на сам элемент и на padding
, но не на border
(ведь он то у нас прозрачный), здесь поможет background-clip:padding-box
.border-top
, которое однако легко решаемо — смотрите ниже.Поддержка браузерами: Chrome конечно же, Firefox 1.0+, Opera 10.5+, Safari 3+.
#link-D { border-top: 55px solid transparent; margin-top: -55px; padding: 15px; /* паддинги - без проблем */ -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; }
Дополнение к предыдущему методу, которое позволит добавить на элемент верхний border
. Поддержка браузерами псевдоэлементов и background-clip
(только при наличии фона или заливки) обязательна.
Поддержка браузерами: Chrome конечно же, Firefox 3.5+, Opera 10.5+, Safari 3+.
#link-E { position: relative; /* важно - для того, чтобы псевдоэлемент позиционировался относительно этого элемента */ border-top: 55px solid transparent; margin-top: -55px; -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; } #link-E:before { content: ""; position: absolute; top: -2px; /* равен по модулю толщине border */ left: 0; right: 0; border-top: 2px solid #ccc; /* собственно то, ради чего всё затевалось */ }
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Золотой ты человек!)
Это всё прикольно, но интересней твой фокус в древ.комментариях, где линк вынесен отдельно:
Все прекрасно, но нихрена не ясно. где должны в ХТМЛ применяться эти псевдоэлементы? вместо якорей?
Здравствуй, Миша. Я просто якорь делаю немного выше того места, на которое нужно направить посетителя. У меня менюшка сверху Bootstrap фиксированная. Кстати, очень удобно пользователям. Можно переходить по ссылкам с верхней навигации из любого места сайта при прокрутке.
Когда я закрепил менюху свеху, стали больше переходить на те страницы, которые в ней, ну там услуги и прочее. Проверял статистику. И просто больше обращений стало.
Добрый день!
Это же прекрасно, что больше обращений стало :)
Привет! Я таким способом делаю:
Привет!
Это всё круто, просто вся фишка в том, что у меня в статье без js сделано :)
Спасибо)
Здравствуйте. Вот гибкий вариант, при котором на каждый якорь можно устанавливать свои отступы от верхнего края экрана и не только. На каждую ссылку можно ставить скорость и различные эффекты анимации отдельно. Естественно он потяжелее, чем функции выше. Ставьте в footer и тормозить сайт он не будет.
Хороший плагин jQuery plugins.compzets.com/animatescroll/ (без http). Он
Здравствуйте!
Спасибо за ссылку. Ещё scrollTo неплохой jQuery плагин тоже.
спс
Огонь, второй вариант сработал на "ура"
Огнище!
Можно сделать проще:
обернуть якорь в блок div и сделать позиционирование якоря чуточку выше
Стили:
Благодарю!
Очень помог ваш вариант.
Благодарю!
#link-B - где в теле ХТМЛ должен быть размещен этот псевдоэлемент?
если вы питеше об этих решениях - пишите полностью. Потому, как тем, кто знает как и где можно использовать псевдоэлементы в якорях ваши эти тексты не нужны, а тем кто не знает - эта страница ничего не дает.
Согласен с вами полностью!
Миша, СПАСИБО огромное за информацию! Я сам впервые создал сайт на WordPress в 2012 году. Но с тех пор навыки растерял. А по якорям так вообще не знал как корректировку отступа делать... Спасибо :-)
Пожалуйста! Очень рад помочь 🙂
Второй вариант с before отлично подошел, спасибо!
Миша, привет! НЕ совсем понял эту тему, так как у меня якоря называются в каждой статье по-разному, невозможно подставить одни и те же стили.
Что делать в моём случае? Пример Вики-содержания на проекте заказчика
https://первоисток.рф/01-patent-na-sajt
Скролл работает так, что уезжает ниже, чем нужно, попробовал некоторые советы и не помогло
https://первоисток.рф/01-patent-na-sajt#domen
Если пройти по ссылке, то читателю не будет виден заголовок. Что необходимо сделать? Заранее спасибо за ответ!