栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > Web开发 > Html/CSS > CSS教程

2分钟教你实现环形/扇形菜单(基础版)

CSS教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

前言
 

项目需要用到环形菜单,初略在网上找了一下,没有找到合适的,于是自己写了一个很简单的,后续再优化。

这个组件是基于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 ( this.onClickSectorMenuItem(i)}
  key={i}
     >
  {item}
     )
 });
    }
    render() {
 const { sectorMenuVisible } = this.state;
 return (
     
  
      {
   sectorMenuVisible ? 'x' : '···'
      }
  
  
      {this.getSectorJsx()}
  
     
 )
    }
}

调用
 


期望
 

本来是想写成灵活分布,在怎么计算位置这里稍稍卡了一下,项目时间紧,改天抽空优化一下

  1. 灵活布局sectorMenuItem
  2. 灵活展示SectorMenu的位置(left,right, top, bottom...)

踩坑

过渡动画一直没有用,后来才知道是我在sector-item这个类里使用了display:none导致的,改用visibility属性就可以了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/214932.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号