"Позиция: липкая"; не работает CSS и HTML
Я хочу, чтобы панель навигации переместилась вверх, как только я перейду к ней, но она не работает, и я не знаю, почему. Если вы можете помочь, вот мой код HTML и CSS:
.nav-selections {
text-transform: uppercase;
letter-spacing: 5px;
font: 18px "lato",sans-serif;
display: inline-block;
text-decoration: none;
color: white;
padding: 18px;
float: right;
margin-left: 50px;
transition: 1.5s;
}
.nav-selections:hover{
transition: 1.5s;
color: black;
}
ul {
background-color: #B79b58;
overflow: auto;
}
li {
list-style-type: none;
}
<nav style="position: sticky; position: -webkit-sticky;">
<ul align="left">
<li><a href="#/contact" class="nav-selections" style="margin-right:35px;">Contact</a></li>
<li><a href="#/about" class="nav-selections">About</a></li>
<li><a href="#/products" class="nav-selections">Products</a></li>
<li><a href="#" class="nav-selections">Home</a></li>
</ul>
</nav>
Ответы
Ответ 1
Липкое позиционирование - это гибрид относительного и фиксированного позиционирования. Элемент обрабатывается как относительный, пока он не пересечет указанный порог, после чего он рассматривается как фиксированный.
...
Вы должны указать порог с по крайней мере одним из top
, right
, bottom
или left
для того, чтобы липкое позиционирование могло вести себя так, как ожидалось. В противном случае он будет неотличим от относительного позиционирования. [ источник: MDN ]
Таким образом, в вашем примере вам нужно определить позицию, в которой он должен вставляться в конце, используя top
свойство.
html, body {
height: 200%;
}
nav {
position: sticky;
position: -webkit-sticky;
top: 0; /* required */
}
.nav-selections {
text-transform: uppercase;
letter-spacing: 5px;
font: 18px "lato", sans-serif;
display: inline-block;
text-decoration: none;
color: white;
padding: 18px;
float: right;
margin-left: 50px;
transition: 1.5s;
}
.nav-selections:hover {
transition: 1.5s;
color: black;
}
ul {
background-color: #B79b58;
overflow: auto;
}
li {
list-style-type: none;
}
<nav>
<ul align="left">
<li><a href="#/contact" class="nav-selections" style="margin-right:35px;">Contact</a></li>
<li><a href="#/about" class="nav-selections">About</a></li>
<li><a href="#/products" class="nav-selections">Products</a></li>
<li><a href="#" class="nav-selections">Home</a></li>
</ul>
</nav>
Ответ 2
Проверьте, установлен ли переполнение для элемента-предка (например, overflow:hidden
); попробуйте переключить это. Возможно, вам придется подняться на дерево DOM выше, чем вы ожидаете =).
Это может повлиять на вашу position:sticky
на элемент-потомок.
Ответ 3
У меня такая же проблема, и я нашел ответ здесь.
Если ваш элемент не прилипает, как ожидается, первое, что нужно проверить, это правила, применяемые к контейнеру.
В частности, найдите любое свойство переполнения, заданное родительским. Вы не можете использовать: overflow: hidden
, overflow: scroll
или overflow: auto
на родительском элементе position: sticky
элемент.
Ответ 4
Еще несколько вещей, с которыми я столкнулся:
Когда ваш липкий элемент является компонентом (угловой и т.д.)
-
Если сам "липкий" элемент является компонентом с пользовательским селектором элементов, таким как угловой компонент с именем <app-menu-bar>
вам необходимо добавить следующее к компоненту css:
:host { display: block; }
или же
app-menu-bar { display: block; } // (in the containing component css)
В частности, для Safari на iOS, по-видимому, требуется display:block
даже корневой элемент app-root
углового приложения, иначе он не будет прикреплен.
-
Если вы создаете компонент и определяете CSS внутри компонента (теневой DOM/инкапсулированные стили), убедитесь, что position: sticky
применяется к "внешнему" селектору (например, app-menu-bar
в devtools должен показывать sticky положение), а не div
верхнего уровня внутри компонента. С помощью Angular этого можно достичь с помощью селектора :host
в css для вашего компонента.
:host
{
position: sticky;
display: block; // this is the same as shown above
top: 0;
background: red;
}
Другой
-
Если элемент, следующий за вашим липким элементом, имеет сплошной фон, вы должны добавить следующее, чтобы он не скользил внизу:
.sticky-element { z-index: 100; }
.parent-of-sticky-element { position: relative; }
-
Ваш липкий элемент должен быть первым (перед вашим контентом), если используется top
и после него, если используется bottom
.
-
При использовании overflow: hidden
возникают сложности overflow: hidden
в вашем элементе-обертке - в общем, это убьет липкий элемент внутри. Лучше объяснил в этом вопросе
-
Мобильные браузеры могут отключать элементы с фиксированным или фиксированным расположением, когда отображается экранная клавиатура. Я не уверен в точных правилах (кто-нибудь когда-либо знает), но когда клавиатура видна, вы смотрите на своего рода "окно" в окно, и вы не сможете легко заставить вещи придерживаться фактическая видимая верхняя часть экрана.
-
Убедитесь, что у вас есть:
position: sticky;
и не
display: sticky;
Проблемы с юзабилити
- Будьте осторожны, если ваш дизайн требует приклеивать вещи к нижней части экрана на мобильных устройствах. На iPhone X, например, они отображают узкую линию, чтобы указать область прокрутки (чтобы вернуться на домашнюю страницу) - и элементы внутри этой области не кликабельны. Поэтому, если вы что-то вставите, обязательно протестируйте на iPhone X, чтобы пользователи могли его активировать. Большая кнопка "Купить сейчас" бесполезна, если люди не могут нажать на нее!
- Если вы размещаете рекламу на Facebook, веб-страница отображается в элементе управления "просмотр веб-страниц" в мобильных приложениях Facebook. Особенно при отображении видео (где ваш контент начинается только в нижней половине экрана) - они часто полностью портят липкие элементы, помещая вашу страницу в прокручиваемое окно просмотра, которое фактически позволяет вашим липким элементам исчезать с верхней части страницы. Обязательно протестируйте в контексте реальной рекламы, а не только в браузере телефона или даже в браузере Facebook, которые могут вести себя по-разному.
Ответ 5
Это продолжение ответов от MarsAndBack и Miftah Mizwar.
Их ответы верны. Тем не менее, трудно определить проблему предка (ей).
Чтобы сделать это очень просто, просто запустите этот скрипт jQuery в консоли браузера, и он сообщит вам значение свойства переполнения для каждого предка.
$('.your-sticky-element').parents().filter(function() {
console.log($(this));
console.log($(this).css('overflow'));
return $(this).css('overflow') === 'hidden';
});
Там, где у предка нет overflow: visible
меняет свой CSS так, что он делает!
Также, как указано в другом месте, убедитесь, что ваш липкий элемент имеет это в CSS:
.your-sticky-element {
position: sticky;
top: 0;
}
Ответ 6
Мне пришлось использовать следующий CSS, чтобы заставить его работать:
.parent {
display: flex;
justify-content: space-around;
align-items: flex-start;
overflow: visible;
}
.sticky {
position: sticky;
position: -webkit-sticky;
top: 0;
}
Если выше не работает, то...
Пройдите через всех предков и убедитесь, что ни один из этих элементов не overflow: hidden
. Вы должны изменить это на overflow: visible
Ответ 7
из моего комментария:
position:sticky
нужна координата, чтобы указывать, где можно придерживаться
nav {
position: sticky;
top: 0;
}
.nav-selections {
text-transform: uppercase;
letter-spacing: 5px;
font: 18px "lato", sans-serif;
display: inline-block;
text-decoration: none;
color: white;
padding: 18px;
float: right;
margin-left: 50px;
transition: 1.5s;
}
.nav-selections:hover {
transition: 1.5s;
color: black;
}
ul {
background-color: #B79b58;
overflow: auto;
}
li {
list-style-type: none;
}
body {
height: 200vh;
}
<nav>
<ul align="left">
<li><a href="#/contact" class="nav-selections" style="margin-right:35px;">Contact</a></li>
<li><a href="#/about" class="nav-selections">About</a></li>
<li><a href="#/products" class="nav-selections">Products</a></li>
<li><a href="#" class="nav-selections">Home</a></li>
</ul>
</nav>
Ответ 8
Кажется, что наклеиваемая панель не должна быть внутри какого-либо раздела или раздела с другим содержимым. Ни одно из решений не работало на меня, пока я не вынул панель навигации из div, который панель навигации разделяла с другой верхней панелью. У меня ранее были панель сверху и навигационная панель, обернутые общим div.
Ответ 9
Я знаю, что это старый пост. Но если есть кто-то вроде меня, который только недавно начал возиться с позицией: липкий, это может быть полезно.
В моем случае я использовал position: sticky как элемент сетки. Это не работало, и проблема была в переполнении x: скрыто в элементе html
. Как только я удалил это свойство, оно работало нормально. Было похоже, что наличие overflow-x: скрыто на элементе body
работает, но пока не знаю, почему.
Ответ 10
два ответа здесь:
-
удалить свойство overflow
из тега body
-
установить height: 100%
к body
чтобы исправить проблему с overflow-y: auto
min-height: 100%
не работает вместо height: 100%
Ответ 11
Забавный момент, который не был очевиден для меня: по крайней мере, в position: sticky
Chrome 70 position: sticky
закрепление не применяется, если вы установили его с помощью DevTools.
Ответ 12
Я считаю, что эта статья много говорит о том, как работает sticky
Как CSS Position Sticky действительно работает! CSS-позиция sticky состоит из двух основных частей: sticky item & липкий контейнер.
Sticky Item - это элемент, который мы определили с помощью позиции: липкие стили. Элемент будет плавать, когда позиция области просмотра соответствует определению позиции, например: top: 0px
.
Sticky Container - это элемент HTML, который оборачивает липкий элемент. Это максимальная площадь, в которой может плавать липкий предмет.
Когда вы определяете элемент с позицией: вы прикреплены автоматически определяя родительский элемент как липкий контейнер!
Ответ 13
ВЕРНО, что overflow
необходимо удалить или установить в initial
чтобы сделать position: sticky
работает с дочерним элементом. Я использовал Material Design в своем приложении Angular и обнаружил, что некоторые компоненты Material изменили значение overflow
. Исправление для моего сценария
mat-sidenav-container, mat-sidenav-content {
overflow: initial;
}
Ответ 14
Если исправление danday74 не работает, проверьте, что родительский элемент имеет высоту.
В моем случае у меня было два ребенка, один плавающий влево и один плавающий вправо. Я хотел, чтобы правый плавающий объект стал липким, но мне пришлось добавить <div style="clear: both;"></div>
в конце родительского элемента, чтобы придать ему высоту.