Lecaw

Учимся создавать Web-сайты

Адаптивный макет страницы с гладкими переходами на CSS

June 13, 2012
CSS
2914hits

Учебник о том, чтобы создать полноэкранный макет с гладкой прокруткой на 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="#">Serendipity</a>

<input type="radio" name="radio-set" id="st-control-2"/>
<a href="#">Happiness</a>

<input type="radio" name="radio-set" id="st-control-3"/>
<a href="#">Tranquillity</a>

<input type="radio" name="radio-set" id="st-control-4"/>
<a href="#">Positivity</a>

<input type="radio" name="radio-set" id="st-control-5"/>
<a href="#">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;
}
 
@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;
}
 
@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.

Эл. почта
RATTING:
(5 голосов)

3 Responses

Оставить комментарий