Фіксований банер, що зникає під час прокручування сторінки

20

Від автора: нещодавно я побачив дуже цікавий візуальний ефект, який можна описати тільки поруч антонімів: фіксований, прокручуємо, зникаючий банер. У цій статті я розповім, як я відтворював цей ефект.

Малюємо лінію

В принципі, досягти такого ефекту можна шляхом створення PNG зображення з альфа маскою в 32 біта. Тут виникає дві проблеми: PNG розмір файлу повноекранного банера буде величезним, і нам потрібна була б копія зображення для фону. Я вирішив цю проблему, вирізати частину зображення. Я залишив ту частину зображення, яку буде йти текст. Вийшов прозорий файл PNG.

Текст банера розміщується перед PNG в тезі header:

Land of the Lost

Текст сторінки (з твору Анабасис Ксенофонта) розміщений перед header в тезі main:

From this point he marched two stages…

Повна версія зображення збережено у форматі JPG і застосовується в якості фону через CSS. Так як фонове зображення не підходить за розміром під контейнер, а PNG зображення повинно бути адаптивним, ми змінимо розмір header з допомогою властивості padding-top. Щоб обчислити точне значення, необхідно поділити висоту зображення на його ширину: 926 / 1500 = 0.6193333333

CSS для header став таким:

header {
background: url(mountain-range.jpg) no-repeat;
padding-top: 61.73333333%;
background-size: cover;
}

PNG версія становить 45.8% ширини від повної версії зображення. Вона притискається до правої межі header і стилізується:

header img {
position: absolute;
top: 0;
right: 0;
width: 45.8%;
}

Заголовок позиціонується фіксоване і стилізований за допомогою одиниць виміру vw. Так текст завжди однієї ширини з PNG:

header h1 {
position: fixed;
top: 2rem;
right: 2rem;
font-size: 12vw;
line-height: .8;
margin-top: 0;
text-align: center;
}
header h1 span {
display: block;
font-size: 8.75 vw;
}

Безмежний обрій

З фіксованим позиціонуванням є одна проблема: той елемент, на який застосовано дане властивість, буде правильно працювати з автоматичним нашаруванням і ковзати під гірську ланцюг PNG на зображенні. Однак якщо продовжити прокручувати сторінку вниз, текст з’явиться під тегом header, закриваючи собою текст сторінки. Фіксовані елементи навіть ігнорують overflow: hidden, присвоєне змінній.

Найпростіше рішення – розмістити відносне позиціонування тега main під тегом header. У такому разі основний текст буде нашаровуватися зверху. Далі нам потрібно додати білий фон і рамку, щоб переконатися, що область охоплює всі аж до нижньої межі тега header:

main {
background: #fff;
position: relative;
border: 1px solid #fff;
padding: 2rem 25%;
}

Багато мобільні браузери досі не підтримують фіксоване позиціонування по ряду причин. Тобто на iOS заголовок не буде рухатися окремо. Але нам все ж потрібно підлаштовувати макет на маленьких екранах:

@all media and (max-width: 400px) {
main { padding: 2rem; }
}

Висновок

Кінцевий результат добре підходить для дизайнів повноекранних сторінок. Розмір файлів можна зменшити, використавши формат WebP та/або srcset і image-set(), як показано в демо на CodePen.