当前位置: 首页 > Web前端 > CSS

2分钟教你实现环形-扇形菜单基础版

时间:2023-03-31 13:34:20 CSS

前言项目需要用到环形菜单。一开始在网上搜了一下,没找到合适的,自己写了一个很简单的,后面再优化。这个组件是基于react的,但是原理是一样的。展开效果如下:实际css(less)@centerIconSize:30px;.flex(@justify:flex-start,@align:center){justify-content:@justify;对齐项目:@align;显示:flex;}.sector-menu-wrapper{位置:相对;宽度:@centerIconSize;保证金:自动;.center-icon{.flex(center);宽度:@centerIconSize;高度:@centerIconSize;边界半径:50%;背景:rgba(0,0,0,0.3);白颜色;游标:指针;}.sector-item{位置:绝对;.flex(中心);宽度:@centerIconSize;高度:@centerIconSize;边界半径:50%;背景:rgba(0,0,0,0.3);游标:指针;白颜色;顶部:0;左:0;过渡:全部线性0.5s;转换:翻译(0,0);//显示:无;可见性:隐藏;}.sector-list{&.sector-list-active{transition:alllinear0.5s;.sector-item{.flex(center);过渡:全部线性0.5s;转换:翻译(0,0);能见度:可见;&:first-child{transform:translate(0,-@centerIconSize*1.5);}&:nth-child(2){transform:translate(-@centerIconSize*1.5,0);}&:nth-child(3){transform:translate(0,@centerIconSize*1.5);}}}}}SectorMenu.jsimportReactfrom'react';exportdefaultclassSectorMenuextendsReact.Component{state={direction:'left',sectorMenuVisible:false,centerIconSize:30,sectorItemSize:30,}/***显示环形菜单*/showSectorMenu=()=>{const{sectorMenuVisible}=this.state;this.setState({sectorMenuVisible:!sectorMenuVisible,})}onClickSectorMenuItem=(index)=>{const{sectorMenuItemFunctions}=this.props;如果(!sectorMenuItemFunctions||typeof(sectorMenuItemFunctions[索引])!=='函数'){返回;}sectorMenuItemFunctions[索引]();}getSectorJsx=()=>{const{sectorMenuItems}=this.props;如果(!sectorMenuItems||!Array.isArray(sectorMenuItems)||sectorMenuItems.length===0){return;}常量样式={};const{sectorMenuVisible}=this.state;returnsectorMenuItems.map((item,i)=>{//conststyles={//transform:translate(0,-centerIconSize*2);//};return(this.onClickSectorMenuItem(i)}key={i}>{item}

)});}render(){const{sectorMenuVisible}=this.state;返回(className={`sector-list${sectorMenuVisible&&'sector-list-active'}`}>{this.getSectorJsx()}
)}}调用本来期望写成灵活分布的,在Howtocalcutetheposition我有点卡在这里,项目时间紧,抽空优化一下灵活布局sectorMenuItem灵活显示的位置SectorMenu(左、右、上,bottom...)坑转场动画已经没用了。后来发现我在sector-item类中使用了display:none。它是由使用可见性属性引起的。最后,欢迎关注我的微信公众号:匿名节目元不定期分享优质原创,谢谢