css js 简单的径向菜单学习笔记

1、首先:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>简单的径向菜单学习Project</title>
        <link rel="stylesheet" href="indexCss.css">
    </head>
    <body>
        <div class="menu">
            <div class="toggle"></div>
            <li style="--i:0;"><a href="#"></a></li>
            <li style="--i:1;"><a href="#"></a></li>
            <li style="--i:2;"><a href="#"></a></li>
            <li style="--i:3;"><a href="#"></a></li>
            <li style="--i:4;"><a href="#"></a></li>
            <li style="--i:5;"><a href="#"></a></li>
            <li style="--i:6;"><a href="#"></a></li>
            <li style="--i:7;"><a href="#"></a></li>
        </div>
    </body>
</html>

的格式
2、ionicons
**ionicons官网**点击Usage找到Installation复制一段代码:

<script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
<script nomodule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script>

之后代码就成:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>简单的径向菜单学习Project</title>
        <link rel="stylesheet" href="indexCss.css">
    </head>
    <body>
        <div class="menu">
            <div class="toggle"></div>
            <li style="--i:0;"><a href="#"></a></li>
            <li style="--i:1;"><a href="#"></a></li>
            <li style="--i:2;"><a href="#"></a></li>
            <li style="--i:3;"><a href="#"></a></li>
            <li style="--i:4;"><a href="#"></a></li>
            <li style="--i:5;"><a href="#"></a></li>
            <li style="--i:6;"><a href="#"></a></li>
            <li style="--i:7;"><a href="#"></a></li>
        </div>
    </body>
    <script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
	<script nomodule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script>
</html>

之后在html添加ionicons官网提供的代码就行了:

<div class="toggle">
	<ion-icon name="add-outline"></ion-icon>
</div>

在这里插入图片描述


搜索homeusersettingsmailkeyvideogamecamera或者ph
为了省时间,就直接打出来了:

<body>
        <div class="menu">
            <div class="toggle">
                <ion-icon name="add-outline"></ion-icon>
            </div>
            <li style="--i:0;"><a href="#">
                <ion-icon name="home-outline"></ion-icon>
            </a></li>
            <li style="--i:1;"><a href="#">
                <ion-icon name="person-outline"></ion-icon>
            </a></li>
            <li style="--i:2;"><a href="#">
                <ion-icon name="settings-outline"></ion-icon>
            </a></li>
            <li style="--i:3;"><a href="#">
                <ion-icon name="mail-outline"></ion-icon>
            </a></li>
            <li style="--i:4;"><a href="#">
                <ion-icon name="key-outline"></ion-icon>
            </a></li>
            <li style="--i:5;"><a href="#">
                <ion-icon name="videocam-outline"></ion-icon>
            </a></li>
            <li style="--i:6;"><a href="#">
                <ion-icon name="game-controller-outline"></ion-icon>
            </a></li>
            <li style="--i:7;"><a href="#">
                <ion-icon name="camera-outline"></ion-icon>
            </a></li>
            
        </div>
    </body>

效果:
在这里插入图片描述


在创建一个indexCss.css文件存放我们的布局:

*{
    margin: 0;/*设置元素的4个外边距,默认值是0*/
    padding: 0;/*设置元素的4个内边距,默认值是0*/
    box-sizing: border-box;/*规定两个并排的带边框的框 */
    /*border-box:	
    为元素设定的宽度和高度决定了元素的边框盒。

    就是说,为元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制。

    通过从已设定的宽度和高度分别减去边框和内边距才能得到内容的宽度和高度。*/
}
body{
    display: flex;/*flex布局*/
    justify-content: center;/*Flex容器*/
    align-items: center;/*Flex容器*/
    min-height: 100vh;/*设置段落的最小高度*/
    background: linear-gradient(45deg,#8460ed,#ff1252);
    /*linear-gradient() 函数用于创建一个表示两种或多种颜色线性渐变的图片*/
}

效果:
在这里插入图片描述
在这里插入图片描述


menu元素:

.menu{
    position: relative;
    width: 200px;
    height: 200px;
    background: #0f0;
    display: flex;
    justify-content: center;
    align-items: center;
}

在这里插入图片描述


.menu li{
    position: absolute;
    list-style: none;
}

在这里插入图片描述


.toggle{
    position: absolute;/*绝对定位*/
    width: 60px;
    height: 60px;
    background: #fff;
    display: flex;
    justify-content: center;
    align-items: center;
    z-index: 1000;/*数字越大越在上面*/
    border-radius: 50%;/*50%:圆形*/
    cursor: pointer;/*鼠标变手指*/
    box-shadow: 0 0 4px rgba(0,0,0,0.15);/*阴影*/
    font-size: 2em;/*组件大小*/
    transition: 1.25s;/*动画效果时长为1.25s。只有添加transform才能看出来*/
}

在这里插入图片描述


toggle写一个改变状态的js

<script>
        let toggle = document.querySelector('.toggle');//获取元素
        let menu = document.querySelector('.menu');//获取元素
        toggle.onclick = function(){//onclick是按键的意思,这里是指按下的是toggle元素就执行方法
            menu.classList.toggle('active');//使menu反转,并class为'menu active'
        };
    </script>

在这里插入图片描述
在这里插入图片描述


这时我们添加menu active状态的css:

.menu.active .toggle{
    transform: rotate(315deg);/*rotate():让容器旋转*/
}

.menu:
在这里插入图片描述
.menu.active:
在这里插入图片描述


修改.menu li的css代码和添加一个.menu.active li的css:

.menu li{
    position: absolute;
    left: 0;
    list-style: none;
    transform-origin: 100px;
    transition: 0.5s;/*过度的动画效果*/
    transition-delay: calc(0.1s * var(--i));/*每个图进行延时*/
}
.menu.active li{
    transform: rotate(calc(360deg / 8 * var(--i)));/*主要*/
}

效果为:

.menu状态的:

在这里插入图片描述
.menu.active状态的:
在这里插入图片描述
修改 .menu 把绿色背景去掉:

.menu{
    position: relative;/*浮动定位*/
    width: 200px;
    height: 200px;
    display: flex;
    justify-content: center;
    align-items: center;
}

主要:在.menu li元素里面添加:

transform: rotate(0deg) translateX(100px);/*隐藏在'+'图标后面点击并向左移动100像素*/

效果为:
在这里插入图片描述

在这里插入图片描述


添加.menu li a的时候发现:

.menu li a{
    display: flex;
    justify-content: center;
    align-items: center;
    width: 40px;
    height: 40px;
    background: #fff;
}

在这里插入图片描述

所以修改.menu li里面的:

transform: rotate(0deg) translateX(80px);/*隐藏在'+'图标后面点击并向左移动100像素*/
}

再次修改.menu li a:

.menu li a{
    display: flex;
    justify-content: center;
    align-items: center;
    width: 40px;
    height: 40px;
    background: #fff;
    border-radius: 50%;/*弧度*/
    transform: rotate(calc(360deg / -8 * var(--i)));/*图片位置*/
    box-shadow: 0 3px 4px rgba(0, 0, 0, 0.15);/*阴影*/
    color: #111;/*颜色*/
    transition: 0.5s;
}

效果为:
在这里插入图片描述

在这里插入图片描述


添加鼠标移动到突变时发生颜色变化:

.menu li a:hover{
    color:#ff1252;
}

完成


最后我放上了所有源码在下面:
html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>简单的径向菜单学习Project</title>
        <link rel="stylesheet" href="indexCss.css">
    </head>
    <body>
        <div class="menu">
            <div class="toggle">
                <ion-icon name="add-outline"></ion-icon>
            </div>
            <li style="--i:0;"><a href="#">
                <ion-icon name="home-outline"></ion-icon>
            </a></li>
            <li style="--i:1;"><a href="#">
                <ion-icon name="person-outline"></ion-icon>
            </a></li>
            <li style="--i:2;"><a href="#">
                <ion-icon name="settings-outline"></ion-icon>
            </a></li>
            <li style="--i:3;"><a href="#">
                <ion-icon name="mail-outline"></ion-icon>
            </a></li>
            <li style="--i:4;"><a href="#">
                <ion-icon name="key-outline"></ion-icon>
            </a></li>
            <li style="--i:5;"><a href="#">
                <ion-icon name="videocam-outline"></ion-icon>
            </a></li>
            <li style="--i:6;"><a href="#">
                <ion-icon name="game-controller-outline"></ion-icon>
            </a></li>
            <li style="--i:7;"><a href="#">
                <ion-icon name="camera-outline"></ion-icon>
            </a></li>
            
        </div>
    </body>
    <script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
    <script nomodule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script>
    <script>
        let toggle = document.querySelector('.toggle');//获取元素
        let menu = document.querySelector('.menu');//获取元素
        toggle.onclick = function(){//onclick是按键的意思,这里是指按下的是toggle元素就执行方法
            menu.classList.toggle('active');//使menu反转,并class为'menu active'
        };
    </script>
</html>

css

*{
    margin: 0;/*设置元素的4个外边距,默认值是0*/
    padding: 0;/*设置元素的4个内边距,默认值是0*/
    box-sizing: border-box;/*规定两个并排的带边框的框 */
    /*border-box:	
    为元素设定的宽度和高度决定了元素的边框盒。

    就是说,为元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制。

    通过从已设定的宽度和高度分别减去边框和内边距才能得到内容的宽度和高度。*/
}

body{
    display: flex;/*flex布局*/
    justify-content: center;/*Flex容器*/
    align-items: center;/*Flex容器*/
    min-height: 100vh;/*设置段落的最小高度*/
    background: linear-gradient(45deg,#8460ed,#ff1252);
    /*linear-gradient() 函数用于创建一个表示两种或多种颜色线性渐变的图片*/
}

.menu{
    position: relative;/*浮动定位*/
    width: 200px;
    height: 200px;
    display: flex;
    justify-content: center;
    align-items: center;
}
.menu li{
    position: absolute;
    left: 0;
    list-style: none;
    transform-origin: 100px;
    transition: 0.5s;/*过度的动画效果*/
    transition-delay: calc(0.1s * var(--i));/*每个图进行延时*/
    transform: rotate(0deg) translateX(80px);/*隐藏在'+'图标后面点击并向左移动100像素*/
}
.menu.active li{
    transform: rotate(calc(360deg / 8 * var(--i)));
}
.menu li a{
    display: flex;
    justify-content: center;
    align-items: center;
    width: 40px;
    height: 40px;
    background: #fff;
    border-radius: 50%;
    transform: rotate(calc(360deg / -8 * var(--i)));
    box-shadow: 0 3px 4px rgba(0, 0, 0, 0.15);
    color: #111;
    transition: 0.5s;
}
.menu li a:hover{
    color:#ff1252;
}

.toggle{
    position: absolute;/*绝对定位*/
    width: 60px;
    height: 60px;
    background: #fff;
    display: flex;
    justify-content: center;
    align-items: center;
    z-index: 1000;/*数字越大越在上面*/
    border-radius: 50%;/*50%:圆形*/
    cursor: pointer;/*鼠标变手指*/
    box-shadow: 0 0 4px rgba(0,0,0,0.15);/*阴影*/
    font-size: 2em;/*组件大小*/
    transition: 1.25s;/*动画效果时长为1.25s。只有添加transform才能看出来*/
}

.menu.active .toggle{
    transform: rotate(315deg);/*rotate():让容器旋转*/
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结城明日奈是我老婆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值