Выполнить лучше, меню, горизонтальное
let ls = y = st = 0,
m = [];
document.onscroll = e => {
y = window.scrollY;
if (m[0] != 'up' && ls > y)
m = ['up', y, st];
else if (m[0] != 'down' && ls < y)
m = ['down', y, st];
st = Math.min(Math.max(m[1] + m[2] - y, document.querySelector('header').clientHeight * -1), 0);
document.querySelector('header').setAttribute('style', "--hm:" + st + "px");
ls = y;
};
* {
padding: 0;
margin: 0;
box-sizing: border-box;
scrollbar-width: none;
-webkit-tap-highlight-color: transparent
}
header {
position: sticky;
top: var(--hm);
height: 55px;
background: red;
}
div {
padding: 30px;
}
<body>
<header> Menu </header>
<div>text1</div>
<div>text2</div>
<div>text3</div>
<div>text4</div>
<div>text5</div>
<div>text6</div>
<div>text7</div>
<div>text8</div>
<div>text9</div>
<div>text1</div>
<div>text2</div>
<div>text3</div>
<div>text3</div>
<div>text3</div>
<div>text3</div>
<div>text3</div>
<div>text3</div>
<div>text3</div>
<div>text3</div>
<div>text3</div>
</body>
Сделала, меню. Работает, но на код не взглянуть без слез. Пыталась разобраться в том, возможно ли выполнить данную возможность всплытия меню на стилях. Ничего толком не поняла.
Подскажите, как можно улучшить, выполнить проще. А если на стилях возможно, то вообще супер будет...
Ответы (1 шт):
Автор решения: ksa
→ Ссылка
Работает, но на код не взглянуть без слез.
Например так будет поприятнее... ;)
let ls = st = 0,
m = [];
const o = document.querySelector('header')
document.onscroll = e => {
const y = window.scrollY;
if (m[0] != 'up' && ls > y)
m = ['up', y + st];
else if (m[0] != 'down' && ls < y)
m = ['down', y + st];
st = Math.min(Math.max(m[1] - y, -o.clientHeight), 0);
o.style = `--hm: ${st}px`;
ls = y;
};
* {
padding: 0;
margin: 0;
box-sizing: border-box;
scrollbar-width: none;
-webkit-tap-highlight-color: transparent
}
header {
position: sticky;
top: var(--hm);
height: 55px;
background: red;
}
div {
padding: 30px;
}
<body>
<header> Menu </header>
<div>text1</div>
<div>text2</div>
<div>text3</div>
<div>text4</div>
<div>text5</div>
<div>text6</div>
<div>text7</div>
<div>text8</div>
<div>text9</div>
<div>text1</div>
<div>text2</div>
<div>text3</div>
<div>text3</div>
<div>text3</div>
<div>text3</div>
<div>text3</div>
<div>text3</div>
<div>text3</div>
<div>text3</div>
<div>text3</div>
</body>