Как сделать пункты меню с выгнутостью наружу?
Подскажите как добиться вот такого эффекта у активного элемента меню
У меня, к сожалению, получается только вот так
Ответы (2 шт):
Автор решения: ipipka
→ Ссылка
Можно использовать псевдо-элементы ::before
и ::after
. И задать им фон через radial-gradient
. Примерно так:
.nav-item__active {
position: relative;
}
.nav-item__active::after {
content: '';
display: block;
position: absolute;
right: 0;
top: 100%;
width: 32px;
height: 32px;
background: radial-gradient(circle at left bottom, transparent 70%, red 70%);
}
Автор решения: Qwertiy
→ Ссылка
https://www.youtube.com/watch?v=SkML640BcoA
https://www.youtube.com/watch?v=2zJkV0DIXeY
https://codepen.io/Qwertiy/pen/NWJRZXm?editors=1100
:root {
--body-bg: #123;
--nav-bg: #234;
font-size: 10px;
}
* {
box-sizing: border-box;
}
html {
font-family: system-ui;
}
body {
margin: 0;
font-size: 1.25rem;
background: var(--body-bg);
padding-inline-start: 20rem;
color: white;
}
a {
color: sandybrown;
}
a:hover {
color: lightcoral;
}
nav {
background: linear-gradient(to bottom, silver, var(--nav-bg));
position: fixed;
top: 0;
bottom: 0;
left: 0;
padding-block: 2rem;
overflow: auto;
scrollbar-width: none;
}
.nav-list {
margin: 0;
padding: 0;
list-style: none;
display: grid;
gap: 1rem;
}
.nav-list a {
color: white;
display: block;
text-decoration: none;
padding-block: 1rem;
padding-inline: 2rem;
border-radius: inherit;
}
.nav-list li {
margin-inline: 1rem 0;
position: relative;
border-radius: 100vw 0 0 100vw;
}
.nav-list li:is(.active, :hover, :focus-within) {
background: var(--body-bg);
}
.nav-list li:is(.active, :hover, :focus-within)::before,
.nav-list li:is(.active, :hover, :focus-within)::after {
content: "";
position: absolute;
height: 50%;
aspect-ratio: 1;
right: 0rem;
background: transparent;
border-radius: 50%;
outline: 10em solid var(--body-bg);
z-index: -1;
}
.nav-list li:is(.active, :hover, :focus-within)::before {
bottom: 100%;
clip-path: polygon(50% 50%, 100% 50%, 100% 100%, 50% 100%);
}
.nav-list li:is(.active, :hover, :focus-within)::after {
top: 100%;
clip-path: polygon(50% 50%, 100% 50%, 100% 0%, 50% 0%);
}
<nav>
<ul class="nav-list">
<li><a href="#">Home</a></li>
<li class="active"><a href="#" aria-current="page">About</a></li>
<li><a href="#">Blog</a></li>
<li><a href="#">Another</a></li>
<li><a href="#">Page</a></li>
<li><a href="#">And another</a></li>
</ul>
</nav>