Примеры

Маска при наведении

В этой серии заданий мы реализуем довольно распространённый интерфейсный приём — появление текстового описания по наведению на блок с картинкой — в необычном виде.

Для начала применим к основным элементам блока с текстом базовый стиль: размер шрифта заголовков и параграфа, цвет фона и текста, общий вид кнопки-ссылки, ведущей к подробной информации. В коде пока что нет ничего необычного, кроме полупрозрачного фонового цвета у текстового блока, заданного с помощью rgba, и свойства border-radius для скруглённых углов у кнопки-ссылки.

Получившийся блок с текстовым описанием будет скрыт по умолчанию, а отображаться будет при наведении курсора на контейнер. Контейнеру мы присвоим фоновое изображение. С помощью псевдокласса :hover и свойства display будем управлять видимостью текстового блока.

На этом шаге создадим и применим к картинке маску нестандартной формы.

Для этого добавим в блок .shape ссылку, которая будет являться верхним слоем над всем контейнером и будет использоваться как маска. В качестве фона слоя-маски используем изображение в формате .svg с непрозрачными краями и прозрачным центром. Спозиционируем этот блок-маску абсолютно, чтобы он располагался поверх блока с текстовым описанием и контентной картинкой. Фоновая контентная картинка будет при этом проглядывать через прозрачную часть слоя-маски.

Также давайте немного оживим блок с маской и будем плавно изменять его форму при наведении с помощью трансформации масштабирования transform: scale.

HTML:

CSS:

Выдвигающееся описание

Суть данной техники заключается в том, чтобы не создавать в разметке дополнительные блоки для описания, а хранить тексты в пользовательских data- атрибутах элементов. В HTML5 пользовательские атрибуты, начинающиеся с data-, могут быть добавлены любому HTML-элементу для хранения текстовой информации.

Особой прелестью такого подхода является то, что мы можем обращаться к текстовому значению атрибута HTML-элемента непосредственно из CSS. Делается это с помощью свойства content, задающего генерируемое содержимое псевдоэлементов и функции attr(), которая применяется для добавления значения атрибута HTML-элемента в стилевое свойство.

Например, если у нас есть в разметке элемент <p data-text="hello">world</p>, то мы можем получить надпись «hello world», взяв «hello» из атрибута data-text в CSS и отобразив его в псевдоэлементе ::before: p::before { content: attr(data-text) " "; }

В нашем случае давайте хранить тексты в атрибутах ссылки: заголовок блока в тексте атрибута data-title, а описательную часть — в атрибуте data-description. Соответственно заголовок будем выводить в качестве контента псевдоэлемента ::before, а описание — содержимым псевдоэлемента ::after.

Теперь давайте реализуем плавное появление и сокрытие блока с текстовой информацией.

Для этого:

  1. Спрячем псевдоэлементы ::before и ::after под картинку в блоке .caption-linkотрицательным значением свойства z-index.
  2. По наведению на .caption-link будем сдвигать картинку на расстояние, равное ширине картинки, вправо, так чтобы блок с описанием становился видимым, оставаясь на прежнем месте.
  3. Ограничим область видимости за границей блока .caption-link с помощью overflow: hidden, чтобы визуально казалось, что картинка плавно уезжает и скрывается.

Для этого сдвинем трансформацией немного влево псевдоэлементы с текстом, а при наведении будем двигать их обратно в нормальное положение. Таким образом создастся эффект синхронного появления текстового блока вместе с сокрытием картинки.

HTML:

CSS:

Эффектные ссылки

В этой серии заданий мы разберём интересные эффекты, которые можно применить к простым текстовым ссылкам, используя стилизацию псевдоэлементов.

В первом примере псевдоэлемент используется как декоративное подчёркивание ссылки. Давайте скроем его по умолчанию и немного опустим, а при наведении курсора на ссылку применим трансформацию, которая приподнимет псевдоэлемент обратно, и одновременно плавно покажем его.

В этом и следующем задании помимо ::after задействуем ещё и ::before, а также будем по наведению применять к псевдоэлементам более сложные трансформации. Сначала зададим стиль исходного состояния: спозиционируем и применим к псевдоэлементам трансформацию поворота так, чтобы они стали декоративными вертикальными рамками справа и слева от ссылки. А теперь по наведению на ссылку будем плавно менять полупрозрачность псевдоэлементов и перемещать их так, чтобы они вместо левой и правой становились верхней и нижней рамкой соответственно.

В этом задании воспользуемся ранее изученным приёмом одновременного использования пользовательского data- атрибута, свойства content и функции attr(). Сначала с помощью кастомного атрибута зададим псевдоэлементу содержимое идентичное тексту ссылки. Затем спозиционируем псевдоэлемент так, чтобы он перекрыл оригинальный текст ссылки сверху. А при наведению на ссылку будем немного уменьшать и одновременно плавно скрывать её псевдоэлемент, чтобы оригинальный текст снова становился видим.

Создадим ещё одну эффектную ссылку. На этот раз псевдоэлементы будут играть роль верхней и нижней декоративной рамки. Мы будем по-прежнему управлять их позицией и прозрачностью по наведению на ссылку. Сначала установим псевдоэлементы в исходную позицию вверху и внизу ссылки. А теперь сделаем псевдоэлементы полностью прозрачными и по наведению на ссылку будем плавно их «проявлять» изменением свойства opacity, а также менять их положение трансформацией для создания эффекта плавного появления.

HTML:

CSS:

Закруглённые внутрь углы

С помощью свойства border-radius мы можем легко сглаживать края блоков и даже сделать блок визуально полностью круглым. Но, к сожалению, border-radius может сделать только выпуклые углы, а вогнутые — нет.

В этой серии заданий мы построим блок с вогнутыми углами.

Для этого, помимо ранее известных свойств, в текущей серии заданий мы воспользуемся свойством clip.

Свойство clip определяет прямоугольную область элемента, в которой будет показано его содержимое. Все, что не поместится в эту область, будет невидимым. Свойство clip работает только для абсолютно спозиционированных элементов.

Синтаксис свойства clip с функцией, вырезающей прямоугольную область:  clip: rect(верхняя-координата, правая-координата, нижняя-координата, левая-координата);

В качестве значений используется расстояние от края элемента до области вырезки, которое задается в единицах CSS — px, em… Если край области нужно оставить без изменений, устанавливается значение autoНагляднее о том, как именно применяются координаты, показано на картинке:

Для построения блока с вогнутыми краями создадим поочерёдно для каждого угла свой маскирующий блок.

Начнём с нижнего левого угла.

Продолжим маскировать углы. Аналогично левому нижнему замаскируем правый нижний угол блока.

HTML:

CSS:

Пример: Статистика браузеров

HTML:

CSS:

Слайдер на CSS

В этой серии мы будем строить полнофункциональный слайдер на HTML и CSS без применения JavaScript.

Сначала нужно собрать разметку с картинками в нужном виде:

  • картинки располагаются в ряд;
  • у общего контейнера должно быть задано свойство overflow: hidden, скрывающее всё, кроме текущей видимой картинки;
  • а ширина дочернего контейнера должна равняться суммарной ширине всех картинок внутри.

Для начала внесём кнопки и подписи к ним в HTML, немного декорируем подписи и скроем сами кнопки. Кнопки и подписи связаны между собой атрибутами id и for, поэтому клик на подписи будет выделять и соответствующий чекбокс (даже если он невидим).

Теперь нам нужно в зависимости от состояния невидимых радио-кнопок соответствующим образом стилизовать видимые подписи. Для этого воспользуемся подобным селектором: #btn-1:checked ~ .slider-controls label[for="btn-1"] { ... } Что он выбирает? Подпись в блоке .slider-controls, идущем в разметке после выделенной радио-кнопки с id="btn-1". Причём подпись с атрибутом for="btn-1", то есть связанную с этой радио-кнопкой. То что нужно!

Теперь у нас есть действующие кнопки переключения слайдов. Осталось подобным образом реализовать плавный сдвиг контейнера с картинками, чтобы в зависимости от выделенной радио-кнопки показывать соответствующую по счёту картинку. Для этого применим такой селектор: #btn-1:checked ~ .slider-inner .slider-slides { ... } И в зависимости от того, какая кнопка выделена, будем сдвигать контейнер с картинками на нужное расстояние.

HTML:

CSS:

Хлебные крошки

В этой серии заданий мы построим необычные хлебные крошки: ссылки в них будут выглядеть как стрелки.

Кстати, «хлебными крошками» называется навигационный блок, который показывает в каком разделе сайта вы находитесь, а также путь к этому разделу от главной страницы сайта. Крошки чем-то похожи на пути в файловой системе.

Этот элемент обычно верстают очень просто — последовательность ссылок внутри блока с классом. А вот вариантов оформления существует много. И мы разберём один из достаточно сложных.

Исходная заготовка включает в себя контейнер .breadcrumbs с тремя ссылками. Контейнер сделан блочно-строчным, а ссылки выстроены в ряд с помощью float. Также заданы некоторые исходные размеры, отступы и другие свойства.

Всё дополнительное оформление ссылок мы будем делать с помощью псевдоэлементов. И начнём с создания «стрелок» на концах ссылок с помощью ::after. И для этого на первом шаге зададим псевдоэлементам базовые размеры, позиционирование и фон.

помощью псевдоэлемента ::after мы создали в каждой ссылке по красному квадрату. Квадраты спозиционировали в правой части ссылок. Сейчас мы будем превращать их в стрелки.

Первым делом нужно будет добавить квадратам резкую тень со смещением в один пиксель — она будет контуром стрелок.

Затем мы сильно закруглим один из углов каждого квадрата. Свойство border-radius может работать подобно margin или padding и задавать разные радиусы скругления для каждого угла элемента. Для этого радиусы записываются через пробел:

Обратите внимание, что правый паддинг у ссылок и расположение квадратов подобраны таким образом, чтобы текст ссылок не перекрывался скруглённой стороной квадрата.

Затем с помощью трансформаций нужно повернуть квадраты на 45° и немного уменьшить их, так как диагональ квадрата больше высоты ссылки.

Перед вами практически готовые стрелки. Осталось только убрать вспомогательные фоны и рамки.

Для начала избавимся от вспомогательных outline у ссылок.

Затем, чтобы стрелки слились со ссылками, изменим цвет фона у ::after с красного на белый.

А потом изменим цвет тени псевдоэлементов, чтобы контур стрелок не был таким резким и сливался с тенью контейнера.

Напоследок зададим внешний вид ссылок и стрелок при наведении и в активном состоянии. Для этого зададим фон сразу для нескольких селекторов:

Это нужно для того, чтобы и ссылка, и её псевдоэлемент меняли фон одновременно и визуально оставались одним целым.

Теперь давайте добавим нумерацию ссылок. Для этого используем оставшийся свободным псевдоэлемент ::before.

Мы будем задавать номера ссылок автоматически с помощью CSS. Для этого используем следующие свойства:

  • counter-reset, которое позволяет создать переменную-счётчик;
  • counter-increment, которое позволяет увеличивать значение счётчика;
  • функцию counter(), которая позволяет передавать значение счётчика свойству content у псевдоэлементов.

В исходном CSS для .breadcrumbs уже добавлено свойство counter-reset: flag. То есть наш счётчик уже создан и называется flag.

Чтобы увеличивать счётчик, нужно добавить свойство counter-increment: flag к каждому элементу, который будет нумероваться. А чтобы считывать значение счётчика и передавать его в псевдоэлементы, нужно задать им свойство content: counter(flag).

Логично и изменение нумерации, и её отображение производить в самом ::before у ссылок:

Ну и конечно же добавим базовое оформление для номеров ссылок.

Давайте завершим создание хлебных крошек: дооформим нумерацию, а также немного изменим стиль первой ссылки, избавившись от слишком большого отступа слева.

Соберём резюме интересных приёмов, использованных в этой серии заданий:

  1. по полной были задействованы оба псевдоэлемента;
  2. разные размеры скругления углов в сочетании с трансформациями поворота и масштабирования — для создания стрелок;
  3. резкие тени — для имитации рамок, хотя того же эффекта можно было добиться с помощью border;
  4. использованы свойства для создания счётчиков и автоматической нумерации: counter-reset и counter-increment;
  5. использована функция counter() для отображения значения счётчиков в свойстве content.

HTML:

CSS:

Маркер на карте

В последней серии заданий мы создадим красивый маркер на карте с использованием уже знакомых приёмов.

Для начала создадим квадратную заготовку маркера и расположим его на карте.

Чтобы создать маркер в виде «капли», нужно закруглить все углы, кроме одного. Вы делали это в прошлой серии заданий.

Конечно, нужно добавить аккуратную тень.

И напоследок маркер нужно будет повернуть заострённым углом вниз.

HTML:

CSS:

Просто прикол:

HTML:

CSS:

 

 

Обсуждение закрыто.