Вращающееся меню на CSS
В данном уроке мы рассмотрим экспериментальную версию меню, реализованную с помощью трансформаций и переходов. Идея заключается в организации круглой кнопки, при нажатии на которую выводится дополнительное кольцо, разбитое на сегменты с с иконками действий. Каждый такой сегмент и является пунктом меню.
В проекте используется достаточно много правил CSS3, но, что удивительно, он хорошо работает во многих браузерах. Opera при попытке запуска кода выдает ряд ошибок (из-за плохой поддержки ) трансформаций. Также переходы не поддерживаются в Internet Explorer 9, а остальные браузеры успешно справляются с задачей.
Разметка HTML
Для реализации эффекта нам нужно использовать несколько особенностей CSS. Но сначала определим разметку HTML. Будем использовать несколько чекбоксов и радио кнопок, которые в тандеме с CSS будут проверяться на нажатие. We can then have a label anywhere else in the code that links up to those corresponding radio buttons, and use the labels as block elements to design normally. Then it’s just a small step to use .checkbox:checked to alter the CSS of other elements on click.
Для демонстрации меню использовался шрифт с иконками Symbolset.
Разметка HTML для меню:
<div id="menu">
<input type="checkbox" id="on-check" name="on-check" />
<label id="on-button" for="on-check">
<span><span class="ss-plus"><!-- Разместите иконку плюса здесь, если вы не используете специальный шрифт --></span></span>
<span><span class="ss-hyphen"><!-- Разместите иконку минуса здесь, если вы не используете специальный шрифт --></span></span>
</label>
<input type="radio" id="info-home" name="radio-check" />
<input type="radio" id="info-compass" name="radio-check" checked />
<input type="radio" id="info-heart" name="radio-check" />
<input type="radio" id="info-rss" name="radio-check" />
<input type="radio" id="info-refresh" name="radio-check" />
<input type="radio" id="info-star" name="radio-check" />
<div id="menu-items">
<div class="middle">
<div class="top">
<span class="bg-piece"> </span>
<label class="ss-home" for="info-home"><!-- Разместите иконку главной страницы здесь, если вы не используете специальный шрифт --></label>
<span class="bg-piece"> </span>
<label class="ss-compass" for="info-compass"><!-- Разместите иконку компаса здесь, если вы не используете специальный шрифт --></label>
<span class="bg-piece"> </span>
<label class="ss-heart" for="info-heart"><!-- Разместите иконку сердца здесь, если вы не используете специальный шрифт --></label>
</div>
<div class="bottom">
<span class="bg-piece"> </span>
<label class="ss-rss" for="info-rss"><!-- Разместите иконку RSS, если вы не используете специальный шрифт --></label>
<span class="bg-piece"> </span>
<label class="ss-refresh" for="info-refresh"><!-- Разместите иконку обновления здесь, если вы не используете специальный шрифт --></label>
<span class="bg-piece"> </span>
<label class="ss-star" for="info-star"><!-- Разместите иконку звезды здесь, если вы не используете специальный шрифт --></label>
</div>
</div>
</div>
<div class="info home-info">Вернуться домой</div>
<div class="info compass-info">Куда двигаемся?</div>
<div class="info heart-info">Любимое</div>
<div class="info rss-info">RSS</div>
<div class="info star-info">Доминирование в вселенной</div>
<div class="info refresh-info">Обновление</div>
<div class="faux-shadow"> </div>
</div>
CSS
Для того, чтобы обеспечить реакцию на нажатие кнопки мыши, будем комбинировать для основных свойства CSS, селектор родственников и псевдо класс :checked. Также будут применяться 3D трансформации, чтобы кнопка переворачивалась при включении. Основные стили просто изменяют внешний вид меню.
/* Для правильного позиционирования меню */
#menu {
position: relative;
width: 230px;
margin: 0px auto;
top: 100px;
left: 37px;
}
/* Используем свойство overflow: hidden;, поэтому надо создать имитацию тени */
.faux-shadow {
position: absolute;
content: " ";
width: 150px;
height: 150px;
top: 0px;
left: 0px;
box-shadow: 0 0 50px rgba(0,0,0,0.3);
border-radius: 300px;
-webkit-transition: all 0.4s linear;
-moz-transition: all 0.4s linear;
-ms-transition: all 0.4s linear;
-o-transition: all 0.4s linear;
transition: all 0.4s linear;
z-index: -9999;
}
/* Кнопка в центре меню служит для активации меню */
#on-button {
border-radius: 100px;
width: 150px;
height: 150px;
color: #fff;
float: left;
box-sizing: border-box;
-moz-box-sizing: border-box;
cursor: pointer;
background-color: #313b3d;
pointer-events: none;
font-size: 5em;
text-shadow: 0 1px 1px rgba(0,0,0,0.3);
box-shadow: inset 0 -125px 100px -100px rgba(0, 0, 0, 0.5), 0 0 20px rgba(0,0,0,0.2);
}
/* При наведении курсора мыши */
#on-button:hover {
box-shadow: inset 0 125px 100px -100px rgba(0, 0, 0, 0.5), 0 0 20px rgba(0,0,0,0.2);
}
/* При нажатии кнопки мыши*/
#on-button:active {
box-shadow: inset 0 125px 100px -100px rgba(0, 0, 0, 0.5), 0 0 20px rgba(0,0,0,0.2),
inset 0 0 30px rgba(0,0,0,0.3);
}
/* Элемент spans внутри кнопки будет вращаться */
#on-button > span {
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
-o-backface-visibility: hidden;
-webkit-transition: -webkit-transform 0.2s linear;
-moz-transition: -moz-transform 0.2s linear;
-ms-transition: -moz-transform 0.2s linear;
-o-transition: -moz-transform 0.2s linear;
transition: -moz-transform 0.2s linear;
display: block;
width: 122px;
height: 122px;
background: #313b3d;
border-radius: 120px;
pointer-events: auto;
position: absolute;
z-index: 3;
top: 0;
left: 0;
box-sizing: border-box;
-moz-box-sizing: border-box;
padding: 34px;
margin: 14px;
box-shadow: inset 0 -112px 100px -100px rgba(0, 0, 0, 0.5);
}
/* Изменение тени при наведении курсора мыши, что бы она соответствовала тени контейнера */
#on-button:hover > span {
box-shadow: inset 0 112px 100px -100px rgba(0, 0, 0, 0.5);
}
/* Вращение последнего элемента span, чтобы он был перевернутым */
#on-button > span:last-of-type {
-webkit-transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
-o-transform: rotateY(180deg);
-ms-transform: rotateY(180deg);
transform: rotateY(180deg);
}
/* Добавляем псевдо элемент с белым фоном, который будет создавать
иллюзию, что кнопка имеет отверстие */
#on-button:after {
position: absolute;
content: " ";
top: 0;
left: 0;
width: 120px;
height: 120px;
margin: 15px;
border-radius: 120px;
background: #fff;
z-index: 2;
}
Затем мы проверяем отмечен ли чекбокс. Используется селектор родственников, чтобы получить нужный элемент div.
/* Когда элемент ввода отмечен, поворачиваем элементы span вокруг на 180 градусов */
#on-check:checked + #on-button > span:first-of-type {
-webkit-transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
-o-transform: rotateY(180deg);
-ms-transform: rotateY(180deg);
transform: rotateY(180deg);
}
#on-check:checked + #on-button > span:last-of-type {
-webkit-transform: rotateY(0deg);
-moz-transform: rotateY(0deg);
-ms-transform: rotateY(0deg);
-o-transform: rotateY(0deg);
transform: rotateY(0deg);
}
/* Также изменяем ширину и высоту тени */
#on-check:checked ~ .faux-shadow {
width: 300px;
height: 300px;
top: -75px;
left: -75px;
}
/* Элементы div с информацией не выводятся для неотмеченных кнопок */
#menu #on-check:not(:checked) ~ .info {
opacity: 0;
}
/* Выводим дополнительную информацию с задержкой 0.4s, чтобы пункты меню закончили анимацию растягивания */
#menu #on-check:checked ~ .info {
-webkit-transition: all 0.2s linear 0.4s;
-moz-transition: all 0.2s linear 0.4s;
-ms-transition: all 0.2s linear 0.4s;
-o-transition: all 0.2s linear 0.4s;
transition: all 0.2s linear 0.4s;
}
/* Растягиваем пункты меню, когда кнопка нажата */
#on-check:checked ~ #menu-items {
width: 300px;
height: 300px;
left: -75px;
top: -75px;
}
Далее изменяется текущий контейнер меню. Он растягивается из-за кнопки, когда кнопка нажата. Элемент div в сочетании с 3D трансформацией работает только в Chrome, поэтому эффект реализуется старым трюком с рамкой.
/* Стили для контейнера пунктов меню */
#menu-items {
width: 150px;
height: 150px;
border-radius: 250px;
background: #aaa;
position: absolute;
top: 0;
left: 0;
z-index: -99;
overflow: hidden;
-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);
box-shadow: 0 0 15px rgba(0,0,0,0.3);
-webkit-transition: all 0.4s linear;
-moz-transition: all 0.4s linear;
-ms-transition: all 0.4s linear;
-o-transition: all 0.4s linear;
transition: all 0.4s linear;
}
/* Меню разделено на две части: верх и низ. */
#menu-items .top, #menu-items .bottom {
width: 100%;
float: left;
z-index: 1;
height: 50%;
}
#menu-items .bottom {
top: 50%;
}
/* Средняя часть увеличивается для фиксации ошибки, выражающейся в
выходе содержания за рамки при установленном свойстве overflow: hidden; */
#menu-items .middle {
height: 100%;
white-space: nowrap;
}
/* Стили для фонового элемента. Данный контейнер ничего не делает. */
#menu-items .middle .bg-piece {
width: 33.3%;
height: 100%;
text-align: center;
display: inline-block !important;
background: #eee;
font-size: 2.5em;
position: absolute;
display: block;
}
/* Очень важно, чтобы все части фона находились в правильном положении.
Ниже привденный код служит для указанной цели. */
#menu-items .middle > div .bg-piece:nth-of-type(2) {
position: absolute;
width: 0;
height: 0;
}
#menu-items .middle .bottom .bg-piece:nth-of-type(2):after, #menu-items .middle .top .bg-piece:nth-of-type(2):after {
content: " ";
position: absolute;
border-color: transparent transparent #eee transparent;
border-width: 148px;
border-style: solid;
top: -142px;
left: 0px;
z-index: 999;
}
#menu-items .middle .top .bg-piece:nth-of-type(2):after {
border-color: #eee transparent transparent transparent;
top: -5px;
left: 0;
}
#menu-items .middle .top .bg-piece:nth-of-type(1) {
box-shadow: inset -125px 0 36px -35px rgba(0, 0, 0, 0.1), inset -7px -161px 72px rgba(0, 0, 0, 0.1);
}
#menu-items .middle .top .bg-piece:nth-of-type(3) {
box-shadow: inset 125px 0 36px -35px rgba(0, 0, 0, 0.1), inset -7px -161px 72px rgba(0, 0, 0, 0.1);
}
#menu-items .middle > div .bg-piece:nth-of-type(1) {
width: 50%;
box-shadow: inset -125px 0 36px -35px rgba(0, 0, 0, 0.1);
}
#menu-items .middle > div .bg-piece:nth-of-type(3) {
width: 50%;
right: 0;
box-shadow: inset 125px 0 36px -35px rgba(0, 0, 0, 0.1);
}
Теперь определим стили для информационных блоков и меток. Нужно разместить все на свои места, что достаточно трудно и требует точной настройки значений.
/* Метки, которые содержат иконки. */
#menu-items label {
position: absolute;
z-index: 9999999;
font-size: 2em;
border-radius: 5px;
cursor: pointer;
text-shadow: 1px 1px 0 rgba(255,255,255,0.1);
}
/* при наведении курсора они подсвечиваются синим. */
#menu-items label:hover {
text-shadow: 0 0 15px #a6d8f4;
}
/* Блок информации, который появляется при выборе меню. */
#menu .info {
opacity: 0;
position: absolute;
left: 55px;
top: -136px;
display: inline-block;
background-color: #d2d2d2;
padding: 10px;
color: #343434;
z-index: 9999999;
font: normal normal 1.5em Arial, sans-serif;
background: #eee;
border: 1px solid #ddd;
font-weight: bold;
border-radius: 8px;
box-shadow: inset 0px 40px 200px -30px rgba(255, 255, 255, 1), 0px 0px 20px rgba(0, 0, 0, 0.1);
}
/* маленькая стрелка для блока меню. */
#menu .info:after {
position: absolute;
content: " ";
top: 37px;
left: 8px;
border-color: #f3f3f3 transparent transparent transparent;
border-width: 10px;
border-style: solid;
}
/* Рамка для стрелки. */
#menu .info:before {
position: absolute;
content: " ";
top: 38px;
left: 8px;
border-color: #ddd transparent transparent transparent;
border-width: 10px;
border-style: solid;
}
/* Скрываем ради кнопки и чекбоксы. */
#menu input[type='checkbox'], input[type='radio'] { display: none; }
/* Позиционируем иконки. */
#menu-items .top .ss-home { top: 90px; left: 34px; }
#menu-items .top .ss-heart { top: 90px; left: 241px; }
#menu-items .top .ss-compass { top: 21px; left: 137px; }
#menu-items .bottom .ss-rss { top: 181px; left: 35px; }
#menu-items .bottom .ss-star { top: 181px; left: 243px; }
#menu-items .bottom .ss-refresh { top: 249px; left: 139px; }
И в завершение остается только повернуть иконки в нужное положение, а также убедиться, что при активировании пункта меню иконка становится правильно. Снова используется селектор родственников и псевдо-класс :checked.
/* Вращаем пункты меню в нужное полжение, когда нажата кнопка мыши. */
#info-home:checked ~ #menu-items, #menu-items .top .ss-heart {
-webkit-transform: rotateZ(66deg);
-moz-transform: rotateZ(66deg);
-ms-transform: rotateZ(66deg);
-o-transform: rotateZ(66deg);
transform: rotateZ(66deg);
}
#info-heart:checked ~ #menu-items, #menu-items .top .ss-home {
-webkit-transform: rotateZ(-66deg);
-moz-transform: rotateZ(-66deg);
-ms-transform: rotateZ(-66deg);
-o-transform: rotateZ(-66deg);
transform: rotateZ(-66deg);
}
#info-rss:checked ~ #menu-items, #menu-items .bottom .ss-star {
-webkit-transform: rotateZ(114deg);
-moz-transform: rotateZ(114deg);
-ms-transform: rotateZ(114deg);
-o-transform: rotateZ(114deg);
transform: rotateZ(114deg);
}
#info-star:checked ~ #menu-items, #menu-items .bottom .ss-rss {
-webkit-transform: rotateZ(-114deg);
-moz-transform: rotateZ(-114deg);
-ms-transform: rotateZ(-114deg);
-o-transform: rotateZ(-114deg);
transform: rotateZ(-114deg);
}
#info-refresh:checked ~ #menu-items, #menu-items .bottom .ss-refresh {
-webkit-transform: rotateZ(180deg);
-moz-transform: rotateZ(180deg);
-ms-transform: rotateZ(180deg);
-o-transform: rotateZ(180deg);
transform: rotateZ(180deg);
}
/* --------------------------------------------------------------- */
/* Выделяем выбранный пункт. */
#info-home:checked ~ #menu-items .ss-home,
#info-heart:checked ~ #menu-items .ss-heart,
#info-rss:checked ~ #menu-items .ss-rss,
#info-star:checked ~ #menu-items .ss-star,
#info-refresh:checked ~ #menu-items .ss-refresh,
#info-compass:checked ~ #menu-items .ss-compass {
text-shadow: 0 0 15px #3facf2;
color: #24434f;
}
/* Делаем видимым блок информации по нажатию кнопки мыши. */
#info-home:checked ~ .home-info,
#info-heart:checked ~ .heart-info,
#info-rss:checked ~ .rss-info,
#info-star:checked ~ .star-info,
#info-refresh:checked ~ .refresh-info,
#info-compass:checked ~ .compass-info {
opacity: 1;
}
Готово!
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/yUtjK9BmgZo/lessons.php
|
В данном уроке мы рассмотрим экспериментальную версию меню, реализованную с помощью трансформаций и переходов. Идея заключается в организации круглой кнопки, при нажатии на которую выводится |
РэдЛайн, создание сайта, заказать сайт, разработка сайтов, реклама в Интернете, продвижение, маркетинговые исследования, дизайн студия, веб дизайн, раскрутка сайта, создать сайт компании, сделать сайт, создание сайтов, изготовление сайта, обслуживание сайтов, изготовление сайтов, заказать интернет сайт, создать сайт, изготовить сайт, разработка сайта, web студия, создание веб сайта, поддержка сайта, сайт на заказ, сопровождение сайта, дизайн сайта, сайт под ключ, заказ сайта, реклама сайта, хостинг, регистрация доменов, хабаровск, краснодар, москва, комсомольск |
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2026-03-04 » Скорость, ИИ и человекоцентричность: каким должен быть сайт в 2026 году
- 2026-03-03 » Как искусственный интеллект меняет таргетированную рекламу
- 2026-03-03 » Основные киберугрозы для бизнеса: 5 способов потерять (и сохранить) данные компании
- 2026-03-03 » Главные тренды веб-дизайна 2026 года: от гиперминимализма до кибербрутализма
- 2026-03-03 » Искусственный интеллект в маркетинге: помощник, а не замена человеку
- 2026-02-26 » Нулевая позиция в поиске: как на нее попасть и зачем это нужно
- 2026-02-26 » Как выбрать подрядчика для сайта и не попасть на мошенников
- 2026-02-26 » Инклюзивный клиентский опыт: как сделать бизнес доступным для всех и повысить конверсию
- 2026-02-26 » ESG-принципы: что это такое и как бизнесу внедрять их в свою работу
- 2026-02-26 » Почему в 2026 году маркетологу не стоит бояться искусственного интеллекта
- 2026-02-22 » No-code vs Профессиональная разработка: выстрелит ли Tilda в 2026 году?
- 2026-02-22 » Почему малый бизнес проигрывает в контекстной рекламе и при чем тут структура сайта
- 2026-02-22 » Куда уходит скорость: как мы теряем посетителей из-за одного "тяжелого" шрифта
- 2026-02-22 » Дарк-паттерны (Dark Patterns) в интерфейсах: когда манипуляция клиентом выходит боком
- 2026-02-22 » Голосовой поиск и веб: готов ли ваш сайт к разговору с Алисой и Марусей?
- 2026-02-22 » Микроанимация и UX/UI: как движение элементов влияет на конверсию
- 2026-02-22 » ИИ в веб-аналитике: как нейросети предсказывают отток клиентов до того, как они уйдут
- 2026-02-22 » Темная сторона шаблонов: почему сайт на готовом решении может угробить ваш бизнес
- 2026-02-22 » Зеленый хостинг и экология в IT: тренд или необходимость?
- 2026-02-22 » Веб-доступность (Accessibility): почему ваш сайт теряет до 20% клиентов и штрафует сам себя
- 2026-02-12 » Экономика фриланса vs веб-студии: скрытые издержки и риски при заказе сайта «у знакомого разработчика»
- 2026-02-12 » Инструменты аналитики помимо Google Analytics
- 2026-02-12 » Юридические аспекты владения сайтом
- 2026-02-12 » Сравниваем популярные CRM-системы для интеграции с сайтом
- 2026-02-12 » Эволюция интерфейсов: от CLI к GUI, к VUI и далее
- 2026-02-12 » Контент-стратегия после обновления Google Helpful Content
- 2026-02-12 » Headless-архитектура: модный тренд или необходимость для вашего бизнеса?
- 2026-02-12 » Мифы о кибербезопасности для малого и среднего бизнеса
- 2026-02-12 » Как Core Web Vitals влияют не только на SEO, но и на конверсию?
- 2026-02-12 » PWA vs Нативное приложение: что выбрать малому бизнесу в 2026?
Дураки ставят вопросы чаще, чем пытливые люди Горький Максим - (1868-1936) - русский писатель, литературный критик и публицист, общественный деятель |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.

Мы создаем практически любые сайты от продающих страниц до сложных, высоконагруженных и нестандартных веб приложений! Наши сайты это надежные маркетинговые инструменты для успеха Вашего бизнеса и увеличения вашей прибыли! Мы делаем красивые и максимально эффектные сайты по доступным ценам уже много лет!
Комплексный подход это не просто продвижение сайта, это целый комплекс мероприятий, который определяется целями и задачами поставленными перед сайтом и организацией, которая за этим стоит. Время однобоких методов в продвижении сайтов уже прошло, конкуренция слишком высока, чтобы была возможность расслабиться и получать \ удерживать клиентов из Интернета, просто сделав сайт и не занимаясь им...
Мы оказываем полный комплекс услуг по сопровождению сайта: информационному и техническому обслуживанию и развитию Интернет сайтов.
Контекстная реклама - это эффективный инструмент в интернет маркетинге, целью которого является увеличение продаж. Главный плюс контекстной рекламы заключается в том, что она работает избирательно.