- Fixed против Sticky: Как определить элементы в CSS
- Структура
- Элемент Fixed
- Элемент Sticky
- Окончательный код
- Difference between position fixed vs sticky in CSS
- Position fixed
- Position sticky
- Issues with position sticky
- Browser support
- Position fixed vs sticky Demo
- position
- Кратко
- Пример
- Как понять
- Как пишется
- static
- relative
- absolute
- fixed
- sticky
- Подсказки
- На практике
- Алексей Руденко советует
Fixed против Sticky: Как определить элементы в CSS
Изучая CSS, вы откроете для себя множество свойств, которые помогут вам создавать отличные веб-сайты.
Хорошим примером, часто используемым в CSS, является свойство position . Это может принимать 5 различных значений: static , relative , fixed , absolute и sticky . Сегодня мы рассмотрим создание fixed и sticky элементов и то, как они ведут себя на странице.
Чтобы лучше понять этот урок, вы должны быть в состоянии определить, что такое CSS и как вы можете добавить CSS в свой HTML.
Также хорошо иметь базовый опыт работы с редактором исходного кода, таким как Visual Studio Code, но это зависит только от вас.
Структура
Откройте нужный вам редактор и создайте HTML-файл, например structure.html. Начните набор текста с ! а затем нажмите кнопку Enter (если вы находитесь в VSC), в противном случае просто скопируйте и вставьте это в свой файл.
После тега title свяжите таблицу CSS с вашим HTML и создайте файл стиля style.css .
Далее мы собираемся создать два элемента div . В первом мы определим fixed элемент, а во втором — sticky элемент.
Имея базовую структуру страницы, давайте также добавим базовый стиль, необходимый в CSS, прежде чем перейти к следующему шагу.
Элемент Fixed
В первом div , созданном выше, мы собираемся добавить структуру, которая будет спроектирована с помощью fixed элемента.
Переключившись на таблицу CSS, добавьте следующий код:
.content < background-color: blueviolet; height: 200px; margin: 1rem; >.content-one < height: 100px; >.box < width: 300px; height: 100px; background-color: aquamarine; display: flex; align-items: center; justify-content: center; font-size: 2rem; >.fixed
Для sticky элемента вам не придется так много добавлять. Разработанные выше классы (за исключением последнего) также будут определять следующую часть проекта.
Элемент Sticky
Для второго div давайте определим код в нашем HTML-файле следующим образом:
Помните весь CSS-стиль из фиксированного элемента? Если вы взглянете на это, вы заметите, что общие классы для элементов уже определены.
Все, что осталось, это добавить определенный стиль для .sticky .
Окончательный код
This is fixed This is sticky
body < display: flex; /*using flex display for a flexible responsive layout structure; therefore, there will be no need to use float or positioning*/ background-color: grey; /*feel free to set any other color of your choice*/ >.example < width: 100%; >.content < /*these are properties for all the elements that have the class content*/ background-color: blueviolet; height: 200px; margin: 1rem; >.content-one < height: 100px; >.box < width: 300px; height: 100px; background-color: aquamarine; display: flex; align-items: center; justify-content: center; font-size: 2rem; >.fixed < position: fixed; top: 24px; left: 24px; >.sticky
Теперь вы лучше понимаете, как можно использовать fixed и sticky элементы в CSS. Поиграйте с ними, чтобы создать fixed меню или sticky нижний колонтитул — возможности безграничны.
Difference between position fixed vs sticky in CSS
It sometimes can be confusing to both beginners and even seasoned developers to understand the difference between position fixed vs sticky . Due to the fact that they behave similarly, yet each of those properties has its own purpose.
The difference between position fixed vs sticky is that fixed always positions an element relative to the viewport, while sticky behaves like a regular element until it reaches the defined offset and then becomes fixed.
Position fixed
When the element position is set to fixed it is removed from the normal document flow, which means no space is created for this element. The element is then becomes positioned relative to the viewport.
Elements’ position is determined by the top , right , bottom , and left CSS properties. So if the values of top , right , bottom , and left properties become negative the element can actually go outside the boundaries of the viewport and become invisible.
.fixed position: fixed; top: 20px; left: 20px; >
NOTE: There could be cases when a fixed element can cover other elements on the page. So make sure to test your page well, especially on different viewports, as it may produce unwanted results.
Use position fixed in case you always want to show the element. For example, it can be a site navbar or sidebar that is always visible.
Position sticky
When the element position is set to sticky it remains in the normal document flow and is positioned relative to its closest ancestor element. But once the ancestor element is scrolled and reaches the offset defined for the sticky element it becomes fixed and stays that way until the ancestor is scrolled off the viewport.
.fixed position: sticky; top: 20px; /* the offset */ >
Use position sticky in case you want to show the element fixed to a certain position conditionally. An example could be a section in the sidebar with a call to action button.
Issues with position sticky
Working with position sticky can sometimes be tricky, as it may not work for you as expected.
NOTE: Certain conditions have to be met in order for the element to become sticky!
When the element is not becoming sticky you need to check the following things:
- Check browser support
- Is offset specified (CSS top property)
- Is there an overflow property set for the parent element
- Is there a height property set for the parent element
- Is a parent element is set to display: flex
Make sure to check Daniyal Hamid’s article on How to Fix Issues With CSS Position Sticky Not Working for a more thorough explanation.
Browser support
Position fixed vs sticky Demo
See the Pen by Tippingpoint Dev (@tippingpointdev) on CodePen.
position
Нужно наложить элемент на элемент? Без позиционирования не обойтись.
Кратко
Скопировать ссылку «Кратко» Скопировано
Свойство position задаёт способ позиционирования элемента в документе. Совместно со свойствами left , right , top , bottom или inset элементу задаётся его местоположение на странице.
Пример
Скопировать ссылку «Пример» Скопировано
.box position: absolute; left: 0; top: 20px;>
.box position: absolute; left: 0; top: 20px; >
Как понять
Скопировать ссылку «Как понять» Скопировано
Иногда в процессе вёрстки требуется реализовать разные сложные идеи дизайнера про расположение элементов друг относительно друга. Например, расположить один элемент поверх другого или немного сместить отображение элемента относительно своего начального положения. Бывают и более сложные случаи, когда требуется зафиксировать элемент относительно окна браузера, а не относительно страницы. Базовым свойством, которое изменяет способ позиционирования, является свойство position .
Как пишется
Скопировать ссылку «Как пишется» Скопировано
static
Скопировать ссылку «static» Скопировано
Значение по умолчанию. Статичное позиционирование. Любой элемент, добавленный на страницу, будет иметь это значение и будет расположен в нормальном потоке документа согласно контексту форматирования родительского элемента. Свойства left , right , top , bottom и z — index игнорируются.
Элемент со значением position : static не является позиционированным элементом. Это важный момент, потому что элементы с любым другим значением свойства position создают внутри себя контекст наложения и становятся опорными. Опорным элементом будем называть такой, относительно которого позиционируются дочерние элементы.
relative
Скопировать ссылку «relative» Скопировано
Элемент позиционируется так же, как и статичный, но его отображение может быть смещено относительно своего начального положения при помощи свойств left , right , top , bottom или inset . Это смещение чисто визуальное и не затрагивает положение соседних элементов, кроме случая, когда элемент выходит за границы родителя, имеющего возможность прокрутки.
На странице элемент будет занимать столько же места, как если бы он имел статичное позиционирование.
absolute
Скопировать ссылку «absolute» Скопировано
Способ позиционирования, кажущийся наиболее понятным. Мы просто задаём абсолютное позиционирование и при помощи свойств left , right , top , bottom или inset регулируем положение элемента. Есть ряд особенностей такого позиционирования:
- Элемент убирается из основного потока документа. То есть перестаёт влиять на положение окружающих элементов и на размер родителя. Можно представить себе, что элемент уходит на слой выше и перестаёт взаимодействовать со всеми элементами, кроме своих потомков.
- Элемент позиционируется относительно ближайшего позиционированного предка. То есть браузер идёт вверх по дереву элементов и ищет ближайшего опорного родителя. И затем располагает наш элемент относительно этого родителя.
- Если элемент был частью строчного контекста форматирования, он приобретает блочный контекст форматирования. К нему становится применима блочная модель.
- Если элемент был блочным и занимал всю ширину своего родителя, то теперь его ширина будет определяться шириной контента.
- Отступы элемента с position : absolute не схлопываются с отступами соседних элементов.
fixed
Скопировать ссылку «fixed» Скопировано
Иногда требуется позиционировать элемент не относительно родителя, а относительно окна браузера вне зависимости от вложенности. Для решения подобной задачи подходит position : fixed . Свойство так же, как и предыдущее, работает с указанием смещения left , right , top , bottom или inset . У такого способа позиционирования есть ряд особенностей:
- Элемент убирается из основного потока документа. То есть перестаёт влиять на положение окружающих элементов и на размер родителя. Можно представить себе, что элемент уходит на слой выше и перестаёт взаимодействовать со всеми элементами, кроме своих потомков.
- Элемент позиционируется относительно окна браузера, за исключением случаев, если один из родителей имеет значения свойств transform , perspective или filter , отличные от none . В этом случае блок становится опорным, и позиционирование будет производиться уже относительно него, а не окна браузера.
sticky
Скопировать ссылку «sticky» Скопировано
Элемент позиционируется в нормальном потоке так же, как и статичный, а затем смещается при помощи свойств left , right , top , bottom или inset относительно ближайшего родителя, имеющего прокрутку. Это свойство применяется, когда нам нужно зафиксировать какой-либо элемент не сразу, а при прокрутке родителя до какого-то известного положения.
Например, в следующем примере элемент будет вести себя как обычно до тех пор, пока родитель не будет прокручен таким образом, что расстояние от верха родителя до верхней границы элемента не станет меньше 10 пикселей. Как только прокрутка достигнет такого значения, элемент зафиксируется в положении 10 пикселей от верха границы родителя:
.block position: sticky; top: 10px;>
.block position: sticky; top: 10px; >
У такого позиционирования есть ряд особенностей:
- Элемент ведёт себя как элемент с относительным ( relative ) позиционированием до тех пор, пока его родитель не будет прокручен до определённой границы. Как правило, эта точка совпадает с положением верхней границы нашего элемента, но может быть изменена с использованием свойства top .
- Элемент остаётся «приклеенным» во время прокрутки родителя до тех пор, пока не «встретит» противоположную границу своего родителя.
Подробнее об этом значении можно почитать в статье про липкое позиционирование.
Подсказки
Скопировать ссылку «Подсказки» Скопировано
💡 Как правило, если элементу с position : absolute или position : fixed не заданы ширина и высота, то значение этих величин высчитывается по количеству контента. Однако можно неявно заставить блок тянуться на всю ширину или высоту родителя, задав одновременно противоположные свойства ( left и right , или top и bottom ). Это будет работать, только если width и height будут иметь значение auto . Аналогичного эффекта можно добиться, использовав логическое свойство inset со значением 0 .
💡 Если ширина задана явно (не auto ), а также заданы left и right , то для direction ltr приоритет отдаётся свойству left . Для rtl — свойству right .
💡 Если высота задана явно (не auto ), а также заданы top и bottom , то приоритет отдаётся свойству top .
💡 Если для абсолютно позиционированного элемента ( absolute или fixed ) задано смещение только по одной из осей (например, только top или только left ), то смещение по второй из осей высчитывается, исходя из расположения элемента, если бы он был позиционирован статично. В примере ниже блоку не задано положение по вертикали, поэтому его верхний край помещается в ту же точку, где находился бы при статичном позиционировании:
На практике
Скопировать ссылку «На практике» Скопировано
Алексей Руденко советует
Скопировать ссылку «Алексей Руденко советует» Скопировано
Очень часто можно встретить анимацию за счёт изменения свойств left / right / top / bottom у элементов с position : absolute Однако такие анимации достаточно «дорогие» с точки зрения производительности браузера. Изменение position или связанных с ним свойств заставляет браузер полностью пересчитать, а затем перерисовать макет страницы.
Лучше использовать transform : translate ( ) для таких случаев, оно таких спецэффектов не вызывает. Браузер выполнит меньше расчётов и перфоманс страницы не пострадает.
Подробнее про порядок отрисовки страницы и её оптимизацию можно почитать в этой статье «Как браузер рисует страницы».
Алексей Руденко — наставник на курсе «Мидл фронтенд-разработчик» в Яндекс Практикуме.