Разметка:
<nav class="circle-menu"> <div class="center"></div> <ul> <li><a href="#">1</a></li> <li><a href="#">2</a></li> <li><a href="#">3</a></li> <li><a href="#">4</a></li> <li><a href="#">4</a></li> <li><a href="#">6</a></li> </ul> </nav>
Стили:
.circle-menu { position: relative; width: 400px; height: 400px; margin: 50px auto; background-color: white; box-shadow: 0 0 3px #cccccc; } .circle-menu ul { position: absolute; width: 300px; height: 300px; margin: 50px; padding: 0; list-style: none; border-radius: 50%; overflow: hidden; } .circle-menu .center { position: absolute; top: 195px; left: 195px; z-index: 1000; border: 5px solid #34495e; border-radius: 50%; box-shadow: 0 0 3px #cccccc; } .circle-menu li { position: absolute; top: -10px; left: -10px; width: 160px; height: 160px; transform-origin: 100% 100%; overflow: hidden; } .circle-menu li:nth-child(1) { transform: rotate(0deg) skew(30deg); } .circle-menu li:nth-child(2) { transform: rotate(60deg) skew(30deg); } .circle-menu li:nth-child(3) { transform: rotate(120deg) skew(30deg); } .circle-menu li:nth-child(3) { transform: rotate(120deg) skew(30deg); } .circle-menu li:nth-child(4) { transform: rotate(180deg) skew(30deg); } .circle-menu li:nth-child(5) { transform: rotate(240deg) skew(30deg); } .circle-menu li:nth-child(6) { transform: rotate(300deg) skew(30deg); } .circle-menu li a { display: block; width: 160px; height: 160px; margin-top: 40px; margin-left: 40px; font-size: 0; background: rgba(241, 196, 15, 0.5) url("icons/monitor-4x.png") no-repeat 50% 40%; transition: background-color 0.5s; transform: skew(-30deg) rotate(-60deg); } .circle-menu li:nth-child(even) a { background-color: rgba(241, 196, 15, 0.75); } .circle-menu li a:hover { background-color: rgba(241, 196, 15, 1); } /* Иконки */ .circle-menu li:nth-child(2) a { background-image: url("icons/aperture-4x.png"); } .circle-menu li:nth-child(3) a { background-image: url("icons/audio-4x.png"); } .circle-menu li:nth-child(4) a { background-image: url("icons/battery-empty-4x.png"); } .circle-menu li:nth-child(5) a { background-image: url("icons/bluetooth-4x.png"); } .circle-menu li:nth-child(6) a { background-image: url("icons/browser-4x.png"); }
Техника для создания круглого меню:
- Переносим ось вращения пунктов в угол с помощью
transform-origin
и совмещаем этот угол с центром меню. - Наклоняем и поворачиваем пункты меню, используя формулы:
[угол сектора] = 360° / [количество пунктов меню] [поворот пункта n] = (n - 1) * [угол сектора] [угол наклона] = 90° - [угол сектора]
- «Разнаклоняем» и разворачиваем содержимое пунктов меню:
[угол наклона содержимого] = -1 * [угол наклона пункта] [угол разворота] = -1 * (90° – ([угол сектора] / 2))
- Смещаем содержимое пунктов к центру круга.
- Закругляем контейнер меню с помощью
border-radius
и обрезаем всё лишнее с помощьюoverflow: hidden
.
А после этих шагов можно применять дополнительное оформление. Например, задавать разные фоны пунктов, рамку для контейнера меню и так далее.
Давайте напоследок добавим третий пункт меню, чтобы у нас получился полукруг. Угол поворота третьего пункта будет равен 120°
:
Серия заданий сделана по мотивам этой статьи Building a Circular Navigation with CSS Transforms. Примеры были адаптированы и упрощены для курса.
Результат: