首页 > 其他分享 >记录--用css画扇形菜单

记录--用css画扇形菜单

时间:2023-08-11 18:34:02浏览次数:39  
标签:菜单 -- menu list transform label input btn css

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

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

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

 

标签:菜单,--,menu,list,transform,label,input,btn,css
From: https://www.cnblogs.com/smileZAZ/p/17623713.html

相关文章

  • linux设置北京时间
    在Linux中设置北京时间,需要先设置系统的时区为Asia/Shanghai,然后将系统时钟设置为当前时间。以下是具体的步骤:首先,查看当前系统的时区设置:$timedatectl如果时区设置不正确,可以使用timedatectl命令来修改。例如,将时区设置为Asia/Shanghai:$sudotimedatectlset-timezone......
  • ffmpeg使用avformat_close_input()函数释放结构体时崩溃的问题
    先看一下我调试时,发现程序崩溃的代码位置  //这是我的程序释放流上下文时的操作 if(m_pAvFormatContext) { //释放视频解码器上下文 if(m_iVideoStreamIndex>=0) avcodec_free_context(&m_pVideoDecodeContext);//此处是发生崩溃......
  • 使用nginx进行负载均衡
    目录1、nginx负载均衡介绍2、nginx负载均衡策略我使用了三台VPS服务器,同一网段的,用来搭建网站,推荐你们也可以使用3A服务器1、nginx负载均衡介绍nginx应用场景之一就是负载均衡。在访问量较多的时候,可以通过负载均衡,将多个请求分摊到多台服务器上,相当于把一台服务器需要承担的负......
  • XSS基础学习
    XSS基础学习一、xss漏洞简介XSS攻击全称跨站脚本攻击,是利用网页开发时留下的漏洞,构造恶意代码植入web网站,当用户访问时,就会产生xss攻击二、xss攻击分类以及区别类型简介攻击方法区别反射型非持久化、需要用户自己点击才会触发构造钓鱼邮件主要是get类型、不和数......
  • 智胜未来——即刻开始为您的S/4HANA迁移做准备
    SAP即将结束对ECC的维护SAP即将结束对ECC的维护,早在2019年,SAP就宣布将在2025年之前结束对其ECC的维护,随后又延长至2027年。尽管距离2027年似乎还有很长的路要走,但对于许多企业来说,这个截止日期的到来将比预期的要快得多。出于这个原因,以及企业对构建智慧企业架构,实现现......
  • android_HAL框架源码分析
    ANDROIDHALAlbertLuoandroidHAL是什么?为什么有它?硬件抽象层是介于android内核kernel和上层之间的抽象出来的一层结构。他是对linux驱动的一个封装,对上层提供统一接口,上层应用不必知道下层硬件具体怎么实现工作的,它屏蔽了底层的实现细节。它在整个android架构中的位置如下图所......
  • 站长公益主机,免费主机➕免费域名➕博客申请➕论坛申请
    站长公益主机在出教程之前准备好久,测试搭建轻量论坛无压力站长公益主机,免费主机➕免费域名➕博客申请➕论坛申请参考地址:fourm.bolgk.eu.org......
  • JVM垃圾收集器
    一、垃圾回收器总览垃圾收集可以划分为几个阶段。。第一阶段:单线程收集时代(Serial和SerialOld)第二阶段:多线程收集时代(ParallelScanvenge和ParallelOld)第三阶段:并发收集时代(ParNew和CMS)第四阶段:智能并发收集时代(G1)下面的图一方面介绍了有哪些垃圾收集器,另外一方面也描述了每个垃......
  • 谷歌2023年4月19日最新更新规则及算法
    多年来,谷歌的的核心排名系统一直致力于奖励能够提供良好网页体验的内容,正如谷歌在 2011年提供的2019年更新,并于去年加入创建实用、可靠、以用户为中心的内容帮助页面的指南中所述。该帮助页面是谷歌的搜索要素的关键资源。会定期推荐希望使用Google搜索取得理想成效的用户,仔......
  • 2022 上海静安高三一模英语订正
    I卷除听力订正语法填空subtle:【adj.,不易察觉的】fallshortof:【未达到……预期】initself:【本质上,本身】第24题,thepractice作主语,creates作谓语,句子【成分完整】。空前面是【介词】,所以只能是代词。这里不知道initself的意思,所以没填出来。第30题,空后跟着一句......