У меня есть 3 элемента: 1 панель инструментов, 1 карта, другая панель инструментов. элементы расположены один под другим
Я хочу, чтобы вторая панель инструментов оставалась под элементом карты (на 400 пикселей вверху), но когда я прокручиваю вниз, моя вторая панель инструментов останавливается на 50 пикселей вверху и фиксируется под первой.
Спасибо за вашу помощь
//Component.html
<mat-toolbar color = "primary" [ngStyle] = "{'height':'50px'}" class = "fixed-header" >
</mat-toolbar>
<div class = "custom-popup" id = "frugalmap" ></div>
<mat-toolbar color = "warn" class = "mat-elevation-z5">
</mat-toolbar>
//Component.css
.fixed-header {
position: fixed;
z-index:999;
}
#frugalmap {
height: 300px;
width: 100%;
margin-top:50px;
}
.mat-elevation-z5 {
position: relative;
z-index: 2;
}





Прежде чем я отвечу на ваш вопрос, вы мая примите во внимание:
z-index: 100000000.!important только тогда, когда нет другого выбора.Поскольку мы не можем писать код Angular через фрагменты StackOverflow, я написал код с помощью Stackblitz - https://stackblitz.com/edit/angular-ii5tnn
Чтобы сделать позицию «липкой», вы просто используете position: sticky с дополнительным правилом top или bottom (в данном случае - верхним). Например:
mat-toolbar {
position: sticky;
top: 50px
}
Таким образом, mat-toolbar останется на своей позиции, пока мы его не проедем.
В моем примере я сделал:
mat-toolbar с [color = "primary"] и установлен исправлен через CSS.#frugelmap с нестандартной высотой, чтобы показать это.mat-toolbar с [color = "warn"] и установлены липкие правила (смотрите ниже)#add-spacing с большим количеством lorem ipsum просто демонстрирует липкий эффект.Следующие правила CSS:
mat-toolbar {
--default-height: 50px;
}
mat-toolbar[color = "primary"] {
top: 0;
position: fixed;
height: var(--default-height);
}
mat-toolbar[color = "warn"] {
position: sticky;
top: var(--default-height);
}
#frugalmap {
height: 300px;
background-color: #EEE;
}
Большое спасибо за ваш ответ :) но я действительно не понимаю решения. Я хочу, чтобы вторая панель инструментов оставалась под элементом карты (на 400 пикселей вверху), но когда я прокручиваю вниз, моя вторая панель инструментов останавливается на 50 пикселей вверху и фиксируется под первой. вы понимаете мой вопрос
Обратите внимание на поддержку закрепленной позиции браузером, caniuse.com/#search=sticky
Поддержка браузера выглядит неплохо. Само обновление Chrome для всех. Но если вы настаиваете, вы можете просто добавить полифилл.
Прикрепленный всегда соответствует ближайшему предшественнику прокрутки. Например, если у вас есть прокручиваемая таблица типа div или что-нибудь с переполнением, то позиция липкого элемента будет соответствовать ему, а не прокручиванию тела.
Я не мог использовать код вашего вопроса, потому что у меня не было всего вашего кода. Итак, я написал вам пример того, что вы хотите сделать со второй панелью инструментов.
Мой код не в angular, но он имеет тот же стиль css и обработчик событий Javascript для добавления / удаления класса, чтобы закрепить вторую панель инструментов вверху. Просто замените элементы своими собственными элементами, именами классов.
Notice
First of all, Take a look at this quesion CSS Sticky buttons div not working in IE 11.
In some use cases, your element might have a dynamic position and height and you have to get
element.clientHeightto get the position of fixing your element. In this case, you have to use JS.
что вы можете использовать t
document.addEventListener("scroll", function(){
var secondToolbar = document.querySelector('.toolbar-2');
var map = document.querySelector('.map');
if ((window.pageYOffset + 50) > (map.offsetTop + map.clientHeight))
secondToolbar.classList.add('fixed');
else
secondToolbar.classList.remove('fixed');
});body {
margin: 0;
}
*{
box-sizing: border-box;
}
.container {
width: 300px;
height: 1000px;
padding-top: 50px;
}
.toolbar-1,
.toolbar-2,
.map {
display: block;
width: 300px;
color: #aaa;
text-align: center;
padding: 15px;
border: 1px solid #242424;
}
.toolbar-1 {
position: fixed;
height: 50px;
top: 0;
left: 0;
background-color: #f8f8f8;
}
.toolbar-2 {
height: 50px;
}
.toolbar-2.fixed{
position: fixed;
top: 50px;
left: 0;
}
.map {
height: 250px;
background-color: #f8f8f8;
}<div class = "container">
<div class = "toolbar-1">First Toolbar</div>
<div class = "map">Map</div>
<div class = "toolbar-2">Second Toolbar</div>
</div>Пожалуйста, посмотрите position: sticky - developer.mozilla.org/en-US/docs/Web/CSS/position. Таким образом, вам не нужно использовать JS для достижения эффекта липкости.
Вы видели поддержку браузера? caniuse.com/#search=sticky Да, это новая функция, она очень удобна и проста в использовании. но только несколько версий Chrome поддерживают это !!!
Чтобы избежать проблем с поддержкой position: sticky браузером, вы можете легко добиться этого, используя ngClass для переключения липкого поведения, как:
component.html
<mat-toolbar color = "primary" class = "fixed-header" >
</mat-toolbar>
<div class = "custom-popup" id = "frugalmap" ></div>
<mat-toolbar
id = "secondToolbar" color = "warn"
[ngClass] = "{'mat-elevation-z5' : true, 'sticky' : isSticky}">
</mat-toolbar>
используйте HostListener для отслеживания позиции прокрутки, поскольку вам не следует использовать обработчик событий JS непосредственно в Angular:
component.ts
isSticky: boolean = false;
@HostListener('window:scroll', ['$event'])
checkScroll() {
this.isSticky = window.pageYOffset >= 250;
}
наконец, добавляем стиль для нашего пользовательского класса sticky.
component.css
.fixed-header {
position: fixed;
z-index:999;
height: 50px;
}
#frugalmap {
height: 300px;
width: 100%;
top: 50px;
position: relative;
}
.mat-elevation-z5 {
position: relative;
}
.sticky {
position: fixed;
top: 50px;
}
Поскольку другой ответ в основном полагается на CSS, который доступен не во всех браузерах, я позволю себе рекламировать свою библиотеку угловатые липкие вещи.
У него есть функция, которая называется «граничный элемент», и вы можете увидеть ее в действии по приведенной выше ссылке. То, что вы делаете, - это в основном вы нарезаете свою страницу на разделы (что обычно у вас уже есть), а затем указываете элементу быть закрепленным в границах родительского элемента.
Здесь вы можете увидеть это в действии:
<div #boundary style = "height:1000px;">
<div #spacer></div>
<div stickyThing [spacer] = "spacer" [boundary] = "boundary">
I am sticky but only inside #boundary!
</div>
</div>
Просто установите библиотеку, добавьте мой код и замените div на stickyThing с панелью инструментов mat. Вот в основном это.
npm install @w11k/angular-sticky-things
Я бы порекомендовал этот метод. Спасибо @Can K.
Разделитель не работает, потому что его высота всегда 0 пикселей: github.com/w11k/angular-sticky-things/issues/3
Я бы не рекомендовал, так как в моем случае липкая вещь работает не плавно, пользовательское решение js работает нормально
Я хочу, чтобы моя карта находилась между двумя моими панелями инструментов, и я просто хочу, чтобы при прокрутке вниз вторая панель инструментов исправлялась под первой. Тебе известно ? Спасибо за вашу помощь