Учебник о том, чтобы создать полноэкранный макет с гладкой прокруткой на CSS. Использование навигационной кнопки радио и одноуровневый элемент combinators вызовет переход к соответствующей панели контента, создавая эффект «плавной прокрутки». Эта идея может быть полезна для веб-страницы или веб-приложения, где содержание должно быть строгого размера.
HTML разметка
Структура будет состоять из основного контейнера с классом st-container, который будет содержать радио-кнопки и ссылки, wrapper с классом st-scroll для панелей. Каждая панель будет иметь некоторые элементы контента:
<div class="st-container">
<input type="radio" name="radio-set" checked="checked" id="st-control-1"/>
<a href="#st-panel-1">Serendipity</a>
<input type="radio" name="radio-set" id="st-control-2"/>
<a href="#st-panel-2">Happiness</a>
<input type="radio" name="radio-set" id="st-control-3"/>
<a href="#st-panel-3">Tranquillity</a>
<input type="radio" name="radio-set" id="st-control-4"/>
<a href="#st-panel-4">Positivity</a>
<input type="radio" name="radio-set" id="st-control-5"/>
<a href="#st-panel-5">Passion</a>
<div class="st-scroll">
<section class="st-panel" id="st-panel-1">
<div class="st-deco" data-icon="H"></div>
<h2>Serendipity</h2>
<p>Banksy adipisicing eiusmod banh mi sed...</p>
</section>
<section class="st-panel st-color" id="st-panel-2">
<!-- ... -->
</section>
<!-- ... st-panel-3, st-panel-4, st-panel-5 -->
</div><!-- // st-scroll -->
</div><!-- // st-container -->
В основном, мы хотим переместить панель в оболочку, изменяя ее верхнее значение и добавления соответствующих панелей в окне просмотра. Это можно сделать, выбрав одноуровневый элемент проверенного переключателя, div с классом st-scroll предназначен для внутренней панели. Поэтому мы должны сохранить переключатели на том же уровне как st-scroll и поверх ссылок (они будут невидимы, так как мы дадим им 0 непрозрачность).
Причина, почему мы используем ссылки а не метки, потому что нужно создать некоторую «нейтрализацию» для не поддерживающих браузеров (одноуровневый элемент combinators не работает в старых браузерах).
CSS
Теперь, как нам сделать нашу страничку адаптивной и её панели точно по размеру экрана? Зададим контейнерам абсолютную ширину и высоту в 100% при установке панелей, чтобы расположить относительно. Но у них также будет ширина и высота в 100%. Это сделает каждую панель точно по размеру экрана.
Так как мы сделаем навигацию контента, анимируя wrapper панели, мы установим свойство overflow со значением hidden:
body {
overflow: hidden;
}
Давайте посмотрим на стиль основного контейнера:
.st-container {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
font-family: 'Josefin Slab', 'Myriad Pro', Arial, sans-serif;
}
Мы поместим «навигацию» внизу страницы, давая ей фиксированную позицию. Обратите внимание на то, что мы устанавливаем ту же ширину и высоту для обоих блоков ввода и ссылок. Идея состоит в том, чтобы наложить переключатель на ссылках так, чтобы они активировались по щелчку. Также важно, чтобы мы установили z-index для переключателей:
.st-container > input,
.st-container > a {
position: fixed;
bottom: 0px;
width: 20%;
cursor: pointer;
font-size: 16px;
height: 34px;
line-height: 34px;
}
.st-container > input {
opacity: 0;
z-index: 1000;
}
.st-container > a {
z-index: 10;
font-weight: 700;
background: #e23a6e;
color: #fff;
text-align: center;
text-shadow: 1px 1px 1px rgba(151,24,64,0.2);
}
Так как мы используем проценты, чтобы расположить ссылки и вводы по ширине экрана, у нас могла бы возникнуть проблема, которая заставит появится некоторым разрывам. Чтобы скрыть их, используйте псевдо элемент, который будет находиться под ссылками. У него будет тот же цвет фона, как и у ссылок:
.st-container:before {
content: '';
position: fixed;
width: 100%;
height: 34px;
background: #e23a6e;
z-index: 9;
bottom: 0;
}
Наши ссылки и материалы по-прежнему не расположены, так что давайте дадим им соответствующее левое соотношение:
#st-control-1, #st-control-1 + a {
left: 0;
}
#st-control-2, #st-control-2 + a {
left: 20%;
}
#st-control-3, #st-control-3 + a {
left: 40%;
}
#st-control-4, #st-control-4 + a {
left: 60%;
}
#st-control-5, #st-control-5 + a {
left: 80%;
}
Как видите, мы используем селектор смежных одноуровневых элементов "reach", который является элементом, связанным с ссылкой.
Используя тот же принцип, мы определим «избранные» части для связи элементов. Когда мы нажимаем на переключатель, мы зададим одноуровневому элементу другой цвет фона:
.st-container > input:checked + a,
.st-container > input:checked:hover + a{
background: #821134;
}
Давайте также добавим маленький треугольник при помощи псевдо-класса :after:
.st-container > input:checked + a:after,
.st-container > input:checked:hover + a:after{
bottom: 100%;
border: solid transparent;
content: '';
height: 0;
width: 0;
position: absolute;
pointer-events: none;
border-bottom-color: #821134;
border-width: 20px;
left: 50%;
margin-left: -20px;
}
Вы можете использовать CSS Arrow, если вы хотите быстро создать эти стрелочки.
Давайте также настроим состояние элемента при наведении:
.st-container > input:hover + a{
background: #AD244F;
}
.st-container > input:hover + a:after {
border-bottom-color: #AD244F;
}
Wrapper для панелей будет иметь относительное расположение, а так же сделаем ширину и высоту 100%.
Переход будет для того, чтобы анимировать значение свойства преобразования к соответствующей позиции:
.st-scroll,
.st-panel {
position: relative;
width: 100%;
height: 100%;
}
.st-scroll {
top: 0;
left: 0;
transition: all 0.6s ease-in-out;
/* Let's enforce some hardware acceleration */
-webkit-transform: translate3d(0, 0, 0);
-webkit-backface-visibility: hidden;
}
.st-panel{
background: #fff;
overflow: hidden;
}
Несмотря на то, что я обычно не добавляю префиксы к свойствам, я добавил их, чтобы оставить Webkit, так как он поможет в создании гладкого эффекта.
Давайте определим позиции для st-scroll wrapper для каждого проверенного переключателя. Так как мы знаем, что у каждой панели высота 100%, то соответственно знаем точные позиции. Мы будем использовать свойства преобразования, чтобы перевести wrapper панели по оси Y (сверху и снизу):
#st-control-1:checked ~ .st-scroll {
transform: translateY(0%);
}
#st-control-2:checked ~ .st-scroll {
transform: translateY(-100%);
}
#st-control-3:checked ~ .st-scroll {
transform: translateY(-200%);
}
#st-control-4:checked ~ .st-scroll {
transform: translateY(-300%);
}
#st-control-5:checked ~ .st-scroll {
transform: translateY(-400%);
}
Теперь, давайте разработаем элементы контента. Для верхнего треугольника со значком мы просто повернем и переведем div с классом st-deco. Мы расположим его в верху экрана, установим вершину в 0 и слева в 50%.
.st-deco{
width: 200px;
height: 200px;
position: absolute;
top: 0px;
left: 50%;
margin-left: -100px;
background: #fa96b5;
transform: translateY(-50%) rotate(45deg);
}
Для значка мы будем использовать Raphaël, установим в значок через @font-face и data-attribute/pseudo-class метод. Контент псевдо элемента :after будет иметь значение значка данных, которое мы установили в HTML для этого элемента. Обратите внимание на то, что мы должны повернуть его в противоположное направление родительского элемента:
[data-icon]:after {
content: attr(data-icon);
font-family: 'RaphaelIcons';
color: #fff;
text-shadow: 1px 1px 1px rgba(151,24,64,0.2);
position: absolute;
width: 200px;
height: 200px;
line-height: 200px;
text-align: center;
font-size: 90px;
top: 50%;
left: 50%;
margin: -100px 0 0 -100px;
transform: rotate(-45deg) translateY(25%);
}
Заголовок будет помещен в центр экрана с отрицательным верхним полем, чтобы его «вытянуть»:
.st-panel h2 {
color: #e23a6e;
text-shadow: 1px 1px 1px rgba(151,24,64,0.2);
position: absolute;
font-size: 54px;
font-weight: 900;
width: 80%;
left: 10%;
text-align: center;
line-height: 50px;
margin: -70px 0 0 0;
padding: 0;
top: 50%;
-webkit-backface-visibility: hidden;
}
Каждый раз, когда мы щелкаем по переключателю, мы требуем, чтобы соответствующий заголовок выполнил анимацию. Чтобы выбрать корректный заголовок, мы будем использовать общий одноуровневый элемент combinator:
#st-control-1:checked ~ .st-scroll #st-panel-1 h2,
#st-control-2:checked ~ .st-scroll #st-panel-2 h2,
#st-control-3:checked ~ .st-scroll #st-panel-3 h2,
#st-control-4:checked ~ .st-scroll #st-panel-4 h2,
#st-control-5:checked ~ .st-scroll #st-panel-5 h2{
animation: moveDown 0.6s ease-in-out 0.2s backwards;
}
<hh user=keyframes> moveDown{
0% {
transform: translateY(-40px);
opacity: 0;
}
100% {
transform: translateY(0px);
opacity: 1;
}
}
У абзаца будет следующий стиль:
.st-panel p {
position: absolute;
text-align: center;
font-size: 16px;
line-height: 22px;
color: #8b8b8b;
z-index: 2;
padding: 0;
width: 50%;
left: 25%;
top: 50%;
margin: 10px 0 0 0;
-webkit-backface-visibility: hidden;
}
В то время как заголовок панели переместится вниз, абзац переместится вверх:
#st-control-1:checked ~ .st-scroll #st-panel-1 p,
#st-control-2:checked ~ .st-scroll #st-panel-2 p,
#st-control-3:checked ~ .st-scroll #st-panel-3 p,
#st-control-4:checked ~ .st-scroll #st-panel-4 p,
#st-control-5:checked ~ .st-scroll #st-panel-5 p{
animation: moveUp 0.6s ease-in-out 0.2s backwards;
}
<hh user=keyframes> moveUp{
0% {
transform: translateY(40px);
opacity: 0;
}
100% {
transform: translateY(0px);
opacity: 1;
}
}
Мы добавим класс color и «инвертируем» цвета для панелей и его элементов контента:
/* Colored sections */
.st-color,
.st-deco{
background: #fa96b5;
}
.st-color [data-icon]:after {
color: #fa96b5;
}
.st-color .st-deco {
background: #fff;
}
.st-color h2 {
color: #fff;
text-shadow: 1px 1px 1px rgba(0,0,0,0.1);
}
.st-color p {
color: rgba(255,255,255,0.8);
}
Наконец, что не менее важно, мы добавим некоторые запросы носителей, чтобы управлять позицией и размером шрифта элементов для меньших экранов:
@media screen and (max-width: 520px) {
.st-panel h2 {
font-size: 42px;
}
.st-panel p {
width: 90%;
left: 5%;
margin-top: 0;
}
.st-container > a {
font-size: 13px;
}
}
@media screen and (max-width: 360px) {
.st-container > a {
font-size: 10px;
}
.st-deco{
width: 120px;
height: 120px;
margin-left: -60px;
}
[data-icon]:after {
font-size: 60px;
transform: rotate(-45deg) translateY(15%);
}
}
Для более старых браузеров, которые не поддерживают некоторые селекторы, мы сделаем отступ к классическому “целевому переходу”. Мы можем сделать это, изменяя часть стиля (simple.css). В частности мы установим переполнение тела к «автоматическому» и скроем переключатели, делая элементы ссылки активируемыми по щелчку (как href, у них есть ID соответствующих панелей):
body {
overflow: auto;
}
.st-container > input{
display: none;
}
Автор: Lecaw