Sticky main header

This commit is contained in:
kvakazyambra 2022-09-15 22:41:05 +03:00
parent 38ba5be728
commit 83be97e3c6
3 changed files with 103 additions and 44 deletions

View File

@ -1,7 +1,9 @@
header { header {
background: #fff;
margin-bottom: 2.2rem; margin-bottom: 2.2rem;
position: sticky; position: fixed;
top: 0; top: 0;
width: 100%;
z-index: 10; z-index: 10;
.wide-container { .wide-container {
@ -13,6 +15,17 @@ header {
} }
} }
.header--scrolled-bottom,
.header--scrolled-top {
.main-logo {
height: 56px;
img {
height: 20px;
}
}
}
.header__inner { .header__inner {
background: #fff; background: #fff;
border-bottom: 4px solid #000; border-bottom: 4px solid #000;
@ -40,8 +53,9 @@ header {
display: inline-flex; display: inline-flex;
height: 70px; height: 70px;
padding: 0 $container-padding-x 0 0; padding: 0 $container-padding-x 0 0;
text-align: center;
position: relative; position: relative;
transition: height 0.2s;
text-align: center;
z-index: 9; z-index: 9;
@include media-breakpoint-up(lg) { @include media-breakpoint-up(lg) {
@ -49,6 +63,10 @@ header {
} }
img { img {
height: 32px;
object-fit: contain;
object-position: left;
transition: height 0.2s;
vertical-align: middle; vertical-align: middle;
width: 100px; width: 100px;
@ -84,12 +102,16 @@ nav {
} }
.main-navigation { .main-navigation {
display: inline-flex; position: relative;
@include font-size(1.7rem); @include font-size(1.7rem);
ul {
display: inline-flex;
list-style: none; list-style: none;
margin: 0; margin: 0;
opacity: 1;
padding: 0; padding: 0;
transition: opacity 0.3s;
@include media-breakpoint-down(md) { @include media-breakpoint-down(md) {
background: #fff; background: #fff;
@ -113,13 +135,20 @@ nav {
padding: divide($container-padding-x, 2); padding: divide($container-padding-x, 2);
} }
.header--scrolled-bottom & {
opacity: 0;
}
}
&.fixed { &.fixed {
ul {
display: inline-flex; display: inline-flex;
@include media-breakpoint-down(lg) { @include media-breakpoint-down(lg) {
display: block !important; display: block !important;
} }
} }
}
li { li {
margin-right: 2.4rem; margin-right: 2.4rem;
@ -132,8 +161,8 @@ nav {
.selected a { .selected a {
border-bottom: 2px solid; border-bottom: 2px solid;
color: #000; color: #000;
pointer-events: none;
cursor: default; cursor: default;
pointer-events: none;
} }
} }
@ -213,3 +242,24 @@ nav {
} }
} }
} }
.article-header {
@include font-size(1.4rem);
left: 0;
margin: 0.2em;
opacity: 0;
overflow: hidden;
position: absolute;
text-overflow: ellipsis;
transition: opacity 0.3s, z-index 0s 0.3s;
white-space: nowrap;
width: 100%;
z-index: -1;
.header--scrolled-bottom & {
transition: opacity 0.3s;
opacity: 1;
z-index: 1;
}
}

View File

@ -10,6 +10,7 @@ import { useStore } from '@nanostores/solid'
import { session as ssession } from '../../stores/auth' import { session as ssession } from '../../stores/auth'
import { route, router } from '../../stores/router' import { route, router } from '../../stores/router'
import './Header.scss' import './Header.scss'
import { Shout } from '../../graphql/types.gen'
const resources = [ const resources = [
{ name: t('zine'), href: '/' }, { name: t('zine'), href: '/' },
@ -18,9 +19,10 @@ const resources = [
//{ name: t('community'), href: '/community' } //{ name: t('community'), href: '/community' }
] ]
export const Header = () => { export const Header = (props: Shout) => {
// signals // signals
const [getIsScrollingBottom, setIsScrollingBottom] = createSignal(false) const [getIsScrollingBottom, setIsScrollingBottom] = createSignal(false)
const [getIsScrolled, setIsScrolled] = createSignal(false)
const [fixed, setFixed] = createSignal(false) const [fixed, setFixed] = createSignal(false)
const [visibleWarnings, setVisibleWarnings] = createSignal(false) const [visibleWarnings, setVisibleWarnings] = createSignal(false)
// stores // stores
@ -46,13 +48,12 @@ export const Header = () => {
const enterClick = route(() => showModal('auth')) const enterClick = route(() => showModal('auth'))
const bellClick = createMemo(() => (authorized() ? route(toggleWarnings) : enterClick)) const bellClick = createMemo(() => (authorized() ? route(toggleWarnings) : enterClick))
const root = null
onMount(() => { onMount(() => {
let scrollTop = window.scrollY let scrollTop = window.scrollY
const handleScroll = () => { const handleScroll = () => {
setIsScrollingBottom(window.scrollY > scrollTop) setIsScrollingBottom(window.scrollY > scrollTop)
setIsScrolled(window.scrollY > 0)
scrollTop = window.scrollY scrollTop = window.scrollY
} }
@ -65,8 +66,8 @@ export const Header = () => {
return ( return (
<header <header
classList={{ classList={{
['header--scrolled-top']: !getIsScrollingBottom(), ['header--scrolled-top']: !getIsScrollingBottom() && getIsScrolled(),
['header--scrolled-bottom']: getIsScrollingBottom() ['header--scrolled-bottom']: getIsScrollingBottom() && getIsScrolled()
}} }}
> >
<Modal name="auth"> <Modal name="auth">
@ -79,7 +80,13 @@ export const Header = () => {
<img src="/logo.svg" alt={t('Discours')} /> <img src="/logo.svg" alt={t('Discours')} />
</a> </a>
</div> </div>
<ul class="col main-navigation text-xl inline-flex" classList={{ fixed: fixed() }}> <div class="col main-navigation">
<div class="article-header">
Дискурс независимый художественно-аналитический журнал с горизонтальной редакцией,
основанный на принципах свободы слова, прямой демократии и совместного редактирования.
</div>
<ul class="text-xl inline-flex" classList={{ fixed: fixed() }}>
<For each={resources}> <For each={resources}>
{(r: { href: string; name: string }) => ( {(r: { href: string; name: string }) => (
<li classList={{ selected: r.href === subpath() }}> <li classList={{ selected: r.href === subpath() }}>
@ -90,6 +97,7 @@ export const Header = () => {
)} )}
</For> </For>
</ul> </ul>
</div>
<div class="usernav"> <div class="usernav">
<div class="usercontrol col"> <div class="usercontrol col">
<div class="usercontrol__item"> <div class="usercontrol__item">

View File

@ -533,6 +533,7 @@ figcaption {
.main-content { .main-content {
flex: 1 100%; flex: 1 100%;
padding-top: 100px;
transition: all 1s ease; transition: all 1s ease;
} }