这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

1、效果图

用手机录屏再用小程序转换的gif,可能精度上有点欠缺。

2、实现过程

1、观察及思考

开始编码前我们首先观察展开后的结构:两个四分之一的圆加三个圆形菜单项。 文章名为用css画扇形,如上图所示没有任何Javascript辅助却实现收缩展开的效果,如何实现的呢?

2、巧用标签

图文内容很简单,两个四分之一圆我们可以用<div>标签实现。但是正如标题所示没有JavaScript却能实现实现交互,如何巧妙的使用标签呢?我想到了label+input及借助它们的伪类来实现。

<input checked="checked" type="checkbox">
<label for="menubtn">
<i>开</i>
<i>收</i>
</label>

需要注意的是:

  1. label标签内的for属性应当与相关元素的id属性相同, 意思就是label标签配合input标签使用时,label标签中的for属性和input标签内的id属性值要一样,否则就不会将选中这个input选项。,比如:label标签中的for属性是menubtn,那么input中的id属性就必须是menubtn,否则label和input就不会关联。
  2. inputtype属性设置为checkbox。这里我们必须将type属性设置为checkbox复选框类型,这是很重要的一个步骤。

3、实现深紫色小圆

通过观察不难发现不管菜单展开还是收缩,紫色校园的状态一直没有改变,所以它的样式就简单多了。直接上样式。

//把label转换成块级元素并定位
label{display: block;transition: transform 0.5s, top 0.5s;position: absolute;bottom: 0;right: 0;margin: auto;z-index:99;cursor:pointer;}
//使用伪类实现深紫色背景
label::after{content:"";width:240px;height:240px;background-color:#8a2be1;position: absolute;bottom:-120px;right:-120px;border-radius: 50%;z-index: 9;}

4、实现淡紫色大圆

菜单展开的时候淡紫色背景和菜单一起显示,收缩的时候和菜单一起隐藏。因此我们先来加菜单。

//菜单
<ul class="menu-list">
<li><a>你</a></li>
<li><a>好</a></li>
<li><a>啊</a></li>
</ul>

菜单结构简洁明了无需多说,现在我们来实现淡紫色大圆。 可以直接给menu-list加背景色,更可以使用伪类。为了后续交互的实现我们这里需要使用伪类。

//使用伪类实现淡紫色背景
.menu-list::after{content:"";width:560px;height:560px;background-color: #ebddf8;position: absolute;bottom:-280px;right:-280px;border-radius: 50%;z-index: 9;opacity: 1;transition: opacity .5s;}

5、完成交互

页面基本上画完,我们来实现交互效果。聪明的我们布局的时候借助了label+input组合,input复选框标签具有checked属性,通过此属性可以设置复选框的选中状态。于是便有了input{} input:checked{}

还有一个知识点,元素的兄弟元素

element1~element2 {// CSS 属性}element1 和 element2 是要选择的两个元素,~ 符号表示选择 element1 后面的所有 element2 元素。
element1 + element2 {// CSS 属性}+ 符号表示选择 element1 后面的第一个 element2 元素。

CSS 元素的兄弟元素很重要,可以方便地选择相邻的元素并进行样式设置。
重要的知识点就这么多,剩下的修修补补,画画圆定定位,这里不做过多赘述。

6、收工

上代码~

html:

 <div class="menu mvcenter">
<input checked="checked" class="menu-btn mvcenter" id="menubtn" type="checkbox">
<label for="menubtn">
<i class="iconfont icon-caidan">开</i>
<i class="iconfont icon-quxiaoguanbi1">收</i>
</label>
<ul class="menu-list">
<li class="mvcenter menu-item"><a class="iconfont icon-lianxi">你</a></li>
<li class="mvcenter menu-item"><a class="iconfont icon-dizhi">好</a></li>
<li class="mvcenter menu-item"><a class="iconfont icon-fankui">啊</a></li>
<li class="mvcenter menu-item"><a class="iconfont icon-fankui">啊</a></li>
</ul>
</div>
css:
 body,ul,li,input,div{padding:0;margin:0;}
body{overflow: hidden;}
i{font-style: normal;}
.mvcenter{position: absolute;bottom:20px;right:20px;}
.menu-btn.mvcenter{margin-top: -20px;margin-left:-20px;}
.menu-btn{width:40px;height:40px;cursor: pointer;background-color: red;border-radius: 20px;display: block;z-index: 99;opacity: 0;}
.menu-btn + label{display: block;transition: transform 0.5s, top 0.5s;position: absolute;bottom: 0;right: 0;margin: auto;z-index:99;cursor:pointer;}
.menu-btn + label i{color:#fff; font-size:40px;position: absolute;bottom:5px;right:0;z-index: 12;}
.menu-btn + label i.icon-caidan,.menu-btn:checked + label i.icon-quxiaoguanbi1{opacity: 1;}
.menu-btn + label i.icon-quxiaoguanbi1,.menu-btn:checked + label i.icon-caidan{opacity: 0;}
.menu-btn:checked + label + .menu-list::after{opacity: 1;}
.menu-btn + label::after{content:"";width:240px;height:240px;background-color:#8a2be1;position: absolute;bottom:-120px;right:-120px;border-radius: 50%;z-index: 9;} .menu-list::after{content:"";width:560px;height:560px;background-color: #ebddf8;position: absolute;bottom:-280px;right:-280px;border-radius: 50%;z-index: 9;opacity: 0;transition: opacity .5s;}
.menu-list > li.mvcenter{margin-top: -40px;margin-left:-40px;}
.menu-list > li{width:70px;height:70px;border-radius:80px;border:3px solid #b880eb;color:#8a2be1;display: flex;align-items: center;justify-content: center; opacity: 0;transition: all .5s;transform-origin: center center;z-index: 12;}
.menu-list > li:nth-child(1){transform:rotate(0)}
.menu-list > li:nth-child(2){transform:rotate(-45deg)}
.menu-list > li:nth-child(3){transform:rotate(-90deg)} .menu-list > li a{font-size:30px;font-weight: bold;}
.menu-list > li:nth-child(1) a{transform:rotate(10deg)}
.menu-list > li:nth-child(2) a{transform:rotate(-45deg)}
.menu-list > li:nth-child(3) a{transform:rotate(-90deg)} .menu-btn:checked ~ ul .menu-item {opacity: 1;}
.menu-btn:checked ~ ul .menu-item:nth-child(1) {transform: rotate(0) translateX(-120px);}
.menu-btn:checked ~ ul .menu-item:nth-child(2) {transform: rotate(45deg) translateX(-120px);}
.menu-btn:checked ~ ul .menu-item:nth-child(3) {transform: rotate(90deg) translateX(-120px);}

本文转载于:

https://juejin.cn/post/7265624177775624252

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

记录--用css画扇形菜单的更多相关文章

  1. css画扇形按钮

    最近项目中需要制作一个扇形按钮,效果是这样的: 周围四个扇形,和中间的小圆,全是能点击的.这就需要画扇形.百度了一下,有很多文章讲了如何生成扇形,最后我借鉴了一个最简单的实现方式,使用css的clip ...

  2. 用css画图标

    css3的属性 transform(转换) 用途很广泛,功能也很强大,为了熟悉它的各种转换方式(平移 translate,旋转 rotate,扭曲 skew,放缩 scale),我做了一些平常常用的一 ...

  3. CSS学习笔记二:css 画立体图形

    继上一次学了如何去运用css画平面图形,这一次学如何去画正方体,从2D向着3D学习,虽然有点满,但总是一个过程,一点一点积累,然后记录起来. Transfrom3D 在这一次中运用到了一下几种属性: ...

  4. css3制作扇形菜单

    工作中网页中有一个扇形的导航菜单,以前没有接触过,参考了http://www.w3cplus.com/css3/building-a-circular-navigation-with-css-tran ...

  5. 【前端切图】用css画一个卡通形象-小猪佩奇

    最近在腾讯云技术社区遇到了一位奇才,用css画出了一个社会人小猪佩奇,不得不服.研究了一下他的文章https://segmentfault.com/a/1190000014909658,感觉甚是有趣, ...

  6. 一步一步教你用CSS画爱心

    今天小颖给大家分享一个用CSS画的爱心,底下有代码和制作过程,希望对大家有所帮助. 第一步: 先画一个正方形.如图: <!DOCTYPE html> <html> <he ...

  7. 参考bootstrap中的popover.js的css画消息弹框

    前段时间小颖的大学同学给小颖发了一张截图,图片类似下面这张图: 小颖当时大概的给她说了下,其实小颖也不知道上面那个三角形怎么画嘻嘻,给她说了DOM结构,具体的css让她自己百度,今天小颖自己参考boo ...

  8. Effective前端3:用CSS画一个三角形

    p { text-indent: 2em } .triangle-container p { text-indent: 0 } img { margin: 15px 0 } 三角形的场景很常见,打开一 ...

  9. 用css画出三角形

    看到有面试题里会有问到如何用css画出三角形 众所周知好多图形都可以拆分成三角形,所以说会了画三角形就可以画出很多有意思的形状 画出三角形的原理是调整border(边框)的四个方向的宽度,线条样式以及 ...

  10. 超简洁的CSS下拉菜单

    效果体验:http://hovertree.com/texiao/css/3.htm HTML文件代码: <!DOCTYPE html> <html xmlns="http ...

随机推荐

  1. 使用VNC在Windows上远程访问Ubuntu服务器

    Step 0:事前准备 一台安装了ghome桌面的Ubuntu服务器(用作server) 一台Windows机器(用作client) Step 1:Linux服务器 在Ubuntu上安装一个VNC服务 ...

  2. NC204871 求和

    题目链接 题目 题目描述 已知有 \(n\) 个节点,有 \(n-1\) 条边,形成一个树的结构. 给定一个根节点 \(k\) ,每个节点都有一个权值,节点i的权值为 \(v_i\) . 给 \(m\ ...

  3. 旁门左道:借助 HttpClientHandler 拦截请求,体验 Semantic Kernel 插件

    前天尝试通过 one-api + dashscope(阿里云灵积) + qwen(通义千问)运行 Semantic Kernel 插件(Plugin) ,结果尝试失败,详见前天的博文. 今天换一种方式 ...

  4. 【OpenGL ES】正方形图片贴到圆形上

    1 前言 ​ 纹理贴图 中介绍了将矩形图片贴到矩形模型上,本文将介绍:在不裁剪图片的情况下,将正方形的图片贴到圆形模型上. ​ 思考:实数区间 [0, 1] 与 [0, 2] 的元素可以建立一一映射关 ...

  5. KQL笔记

    KQL: {'query': {'bool': {'must': [{'match': {'Sql': 'insert'}}, {'match': {'PolicyName.keyword': 'd8 ...

  6. ORA-39087: Directory Name Is Invalid

    说明 有时我们在Oracle数据库服务器执行expdp/impdp过程中会碰到这个错误:ORA-39087: Directory Name Is Invalid,意思是我们指定的directory参数 ...

  7. 如何在 libevent 中读取超过 4096 字节的数据

    如何在 libevent 中读取超过 4096 字节的数据 bufferevent 是 libevent 中相对高层的封装,较 event 使用起来方便很多. 之前有一个需求,需要从服务端读取数据进行 ...

  8. 开源开发者的狂欢,STRK开了一个好头!附领取价值800元的web3空投教程

    这两天在Github和推特上最热闹的事情便是知名ETH(以太坊)二层公链项目STRK给所有gtihub上排名前5000的开源项目的项目贡献者提供了价值800元的代币空投,其中不乏前端程序员.大学生等w ...

  9. cronet 的简单学习

    官方的解释 "Cronet is the networking stack of Chromium put into a library for use on mobile. This is ...

  10. C++ 多线程的错误和如何避免(1)

    在终止程序之前没有使用 join() 等待后台线程 前提分析:线程分为 joinable  状态和 detached 状态 添加 .join() 这句代码的时候,就表示主线程需要等待子线程运行结束回收 ...