gpt4 book ai didi

Css3 donut 菜单

转载 作者:行者123 更新时间:2023-12-04 16:23:01 26 4
gpt4 key购买 nike

您好,我想实现一个像这样的 donut 菜单 http://dribbble.com/shots/610433-Wheel-Nav我知道有一种在 css3 中制作 donut 的简单方法。

.doughnut { 
border: 50px solid #f00;
border-radius: 100px;
height:100px;
width:100px;
}

但是当然,这只会制作里面没有任何元素的 donut 。我想知道是否只用 css3 来做,有什么关于如何开始的想法吗?如果仅使用 css 是不可能的,我将跳转到 javascript 区域...

最佳答案

我尝试用 CSS 重现该图像:

live demo

结果:

result

HTML:

<ul class='menu circ-menu'>
<li class='menu-item'>
<a href='#'>☊</a>
</li>
<li class='menu-item selected'>
<a href='#'>☁☀</a>
<ul class='menu submenu'>
<li><a href='#'>☂</a></li><!--
--><li><a href='#'>☁</a></li><!--
--><li><a href='#'>☃</a></li>
</ul>
</li>
<li class='menu-item'>
<a href='#'>✦</a>
</li>
</ul>

CSS:

.menu { padding: 0; list-style: none; }
.menu a {
display: block;
color: #666561;
font: 900 2em/3.2 monospace;
text-decoration: none;
text-shadow: 0 1px white;
}
.circ-menu {
overflow: hidden;
position: relative;
margin: 1em auto;
padding: 5em 0 0;
width: 20em; height: 10em;
box-shadow: 0 .5em .5em -.5em;
}
.menu-item {
overflow: hidden;
position: absolute;
z-index: 0;
left: -50%; bottom: 0;
width: 20em; height: 20em;
transform-origin: 100% 100%;
}

/* === style the menu items (slices) === */

/* three slices making up half a circle mean that a slice is going to have a central_angle = 60deg */
.menu-item:first-child {
transform: skewX(30deg) /* 90deg - central_angle */;
}
.menu-item:nth-child(2) {
/* rotate by the value of the central angle multiplied with how many slices are before */
transform:
rotate(60deg) /* 60deg = 1*central angle */
skewX(30deg) /* 90deg - central_angle */;
}
.menu-item:last-child {
transform:
rotate(120deg) /* 120deg = 2*central angle */
skewX(30deg) /* 90deg - central_angle */;
}

/* === contents of the menu items === */
.menu-item > * {
position: absolute;
top: 55%; left: 55%;
width: 90%; height: 90%;
text-align: center;
}
.menu-item > a {
border-radius: 50%;
box-shadow: 0 0 0 .2em #aaa497,
0 0 .5em .2em black;
transform:
skewX(-30deg) /* unskew */
rotate(-60deg);
background: #f8f4ef;
background:
radial-gradient(transparent 39%, #f7f3ee 40%);
}
.selected > a { z-index: 1; }
.selected > a, .menu a:hover {
color: #e96429;
}
.selected > a, .menu-item > a:hover {
box-shadow: 0 0 0 .2em #e96429,
0 0 .5em .2em black;
background:
linear-gradient(60deg, #e96429 31%, rgba(247, 243, 238, 0) 33%),
linear-gradient(-60deg, #e96429 31%, rgba(247, 243, 238, 0) 33%),
radial-gradient(transparent 39%, #f7f3ee 40%);
background-size: 100% 26%, 100% 26%, 100% 100%;
}

.submenu {
z-index: 0;
transform:
skewX(-30deg) /* unskew */
rotate(-60deg)
translateY(-5.25em);
}
.submenu li {
display: inline-block;
position: relative;
border-top: solid 1px #666561;
border-bottom: solid 1px #666561;
width: 3.2em; height: 3.2em;
background: #f7f3ee;
}
.submenu li:before {
position: absolute;
bottom: 0;
width: 100%; height: .2em;
background: #666561;
content: '';
}
.submenu a {
line-height: 2
}
.submenu li:first-child {
border-radius: .3em 0 0 .3em;
border-left: solid 1px #666561;
}
.submenu:after {
position: absolute;
z-index: -1;
top: 2.5em; left: 50%;
margin: 0 -.6em;
width: 1.2em; height: 1.2em;
transform: rotate(-30deg) skewX(30deg);
background: #666561;
content: '';
}
.submenu li:last-child {
border-radius: 0 .3em .3em 0;
border-right: solid 1px #666561;
}

.circ-menu:before, .circ-menu:after {
position: absolute;
z-index: 1;
bottom: -7.071em; left: 14.645%;
width: 14.142em; height: 14.142em;
border-radius: 50%;
content: '';
}
.circ-menu:before {
bottom: -5em; left: 5em;
width: 10em; height: 10em;
box-shadow: inset 0 0 .75em black,
0 0 .5em .2em #f7f3ee;
}
.circ-menu:after {
bottom: -1em; left: 9em;
width: 2em; height: 2em;
box-shadow: 0 0 .4em dimgrey,
0 0 0 .75em #e27447,
0 0 .4em .75em dimgrey,
0 0 0 2em #f7f3ee,
0 0 .4em 2em dimgrey;
background: #f7a480;
}

这个想法很简单。您从列表结构开始,就像您对每个菜单所做的那样。

<ul class='menu-circ'>
<li class='menu-item'><a href='#'>boo</a></li>
<!-- the other list items -->
</ul>

解释基本思想

您给容器 .menu-circ position: relative 并且绝对定位它的子项(菜单项),使它们的一个 Angular 位于中心( .menu-circ)。然后将 .menu-item 的 transform-origin 设置在那个 Angular 落。

在这种情况下,我选择右下角作为中心(transform-origin: right bottom 等同于 transform-origin: 100% 100%), 但这并不重要,你可以选择你想要放在中心的 Angular 并在那里设置 transform-origin

然后您需要决定 central angle 的值对于菜单项形成的每个切片。在这种情况下,这很容易 - 半个圆有三个切片,半个圆意味着 180deg,所以假设我想要 3 个相等的切片,每个切片的中心 Angular 是 180deg/3 = 60 度

做出决定后,您现在需要使在父对象中心相交的边(在本例中为右侧和底部)形成 60 度 的 Angular 。您可以通过应用倾斜变换来做到这一点,倾斜 Angular 为 90deg-60deg = 30deg:

transform: skewX(30deg);

但这仍然将所有菜单项保留在第一个的位置。因此,对于除第一个菜单项之外的所有菜单项,您还需要旋转圆心 Angular 乘以之前的项数的值。这意味着您将拥有:

.menu-item:first-child { transform: skewX(30deg); } /* no items before */
.menu-item:nth-child(2) { transform: rotate(60deg) /* 1*60deg */ skewX(30deg); }
.menu-item:nth-child(3) { transform: rotate(120deg) /* 2*60deg */ skewX(30deg); }

这会将所有菜单项定位在它们应该在的位置,但现在它们的内容是倾斜的。所以你需要“歪斜”它们。也就是说,我的意思是您应用了具有相反 Angular 倾斜变换。在这种情况下,不倾斜意味着应用 skewX(-30deg)

仍然,内容的 Angular 不对。在这种情况下,您需要将它旋转中心 Angular 的一半减去 90 度。这意味着 60deg/2 - 90deg = 30deg - 90deg = -60deg

内容(在本例中为链接)也应该绝对定位,使其中心位于您为其父级(.menu- item) 你可以给它任何你想要的大小,但是如果你想让它是圆形的,那么你必须给它相等的宽度和高度,并确保它们不超过它的两倍父项(.menu-item)。

最后,您在 .menu-item 上设置了 overflow: hidden 并且您有一个饼状菜单。如果要覆盖中心部分,则在菜单上使用伪元素(.menu-circ)。

关于Css3 donut 菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15208190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com