2分钟教你实现环形/扇形菜单(基础版)
发布时间:2020-01-15 16:55:47 作者:Rhinoceros
我要评论
这篇文章主要介绍了2分钟教你实现环形/扇形菜单(基础版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
前言
项目需要用到环形菜单,初略在网上找了一下,没有找到合适的,于是自己写了一个很简单的,后续再优化。
这个组件是基于react,但是原理都一样。
展开效果如下:

实现
css(less)
@centerIconSize: 30px;
.flex(@justify: flex-start, @align: center) {
justify-content: @justify;
align-items: @align;
display: flex;
}
.sector-menu-wrapper {
position: relative;
width: @centerIconSize;
margin: auto;
.center-icon {
.flex(center);
width: @centerIconSize;
height: @centerIconSize;
border-radius: 50%;
background: rgba(0, 0, 0, 0.3);
color: white;
cursor: pointer;
}
.sector-item {
position: absolute;
.flex(center);
width: @centerIconSize;
height: @centerIconSize;
border-radius: 50%;
background: rgba(0, 0, 0, 0.3);
cursor: pointer;
color: white;
top: 0;
left: 0;
transition: all linear 0.5s;
transform: translate(0, 0);
// display: none;
visibility: hidden;
}
.sector-list {
&.sector-list-active {
transition: all linear 0.5s;
.sector-item {
.flex(center);
transition: all linear 0.5s;
transform: translate(0, 0);
visibility: visible;
&: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.js
import React from 'react';
export default class SectorMenu extends React.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;
if (!sectorMenuItemFunctions || typeof(sectorMenuItemFunctions[index]) !== 'function') {
return;
}
sectorMenuItemFunctions[index]();
}
getSectorJsx = () => {
const { sectorMenuItems } = this.props;
if (!sectorMenuItems || !Array.isArray(sectorMenuItems) || sectorMenuItems.length === 0) {
return;
}
const styles = {};
const { sectorMenuVisible } = this.state;
return sectorMenuItems.map((item, i) => {
// const styles = {
// transform: translate(0, -centerIconSize * 2);
// };
return (<div
className={`sector-item ${sectorMenuVisible && 'sector-item-active'}`}
style={styles}
onClick={() => this.onClickSectorMenuItem(i)}
key={i}
>
{item}
</div>)
});
}
render() {
const { sectorMenuVisible } = this.state;
return (
<div className="sector-menu-wrapper">
<div className="center-icon" onClick={this.showSectorMenu}>
{
sectorMenuVisible ? 'x' : '···'
}
</div>
<div className={`sector-list ${sectorMenuVisible && 'sector-list-active'}`}>
{this.getSectorJsx()}
</div>
</div>
)
}
}
调用
<SectorMenu
sectorMenuItems={['A1', 'A2', 'A3']}
sectorMenuItemFunctions={[function () {console.log(0)}, function () {console.log(1)}, function () {console.log(2)}]}
/>
期望
本来是想写成灵活分布,在怎么计算位置这里稍稍卡了一下,项目时间紧,改天抽空优化一下
- 灵活布局sectorMenuItem
- 灵活展示SectorMenu的位置(left,right, top, bottom...)
踩坑
过渡动画一直没有用,后来才知道是我在sector-item这个类里使用了display:none导致的,改用visibility属性就可以了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
这篇文章主要介绍了CSS3 分类菜单效果,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2019-05-27
这篇文章主要介绍了CSS实现菜单按钮动画,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下2019-04-12
这篇文章主要介绍了CSS导航条菜单之带小三角形的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-11-22- 这篇文章主要介绍了CSS多级菜单的实现代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-11-08
css利用transform skewX制作平行四边形导航菜单
这篇文章主要介绍了css利用transform skewX制作平行四边形导航菜单的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-10-10
这篇文章主要介绍了CSS设置列表样式和创建导航菜单实现代码,需要的朋友可以参考下2018-07-24
这篇文章主要介绍了CSS中的导航栏和下拉菜单的实现的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-07-18
这篇文章主要介绍了HTML+CSS实现下拉菜单的实现的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-07-18- 下拉菜单在很多网页中都能应用到,这篇文章主要介绍了纯CSS实现的大型下拉菜单的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编2018-05-03
- 这篇文章主要介绍了纯CSS实现可折叠树状菜单,不用js让你体会到css的强大,需要的朋友可以参考下2018-04-17








最新评论