Круговое меню из курса HTML-академии

Рубрики CSS, HTML, Skills up

Разметка:

<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");
}

Техника для создания круглого меню:

  1. Переносим ось вращения пунктов в угол с помощью transform-origin и совмещаем этот угол с центром меню.
  2. Наклоняем и поворачиваем пункты меню, используя формулы:
    [угол сектора] = 360° / [количество пунктов меню]
    [поворот пункта n] = (n - 1) * [угол сектора]
    [угол наклона] = 90° - [угол сектора]
  3. «Разнаклоняем» и разворачиваем содержимое пунктов меню:
    [угол наклона содержимого] = -1 * [угол наклона пункта]
    [угол разворота] = -1 * (90° – ([угол сектора] / 2))
  4. Смещаем содержимое пунктов к центру круга.
  5. Закругляем контейнер меню с помощью border-radius и обрезаем всё лишнее с помощью overflow: hidden.

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

Давайте напоследок добавим третий пункт меню, чтобы у нас получился полукруг. Угол поворота третьего пункта будет равен 120°:

Серия заданий сделана по мотивам этой статьи Building a Circular Navigation with CSS Transforms. Примеры были адаптированы и упрощены для курса.

Результат: