前端开发组件分享:呼出按钮动画

呼出按钮动画

对于按钮列表的设计有多种方案,这里为大家分享一种带有动画和控制效果的按钮呼出方式。先看效果:http://pages.mlxgc.top/。


“呼出按钮动画的功能实现较为复杂,需要提前了解的相关知识如下:

js DOM操作:DOMToKenList.toggle();

css transform;

css flex布局;

css position;

建议学习网站:https://developer.mozilla.org/zh-CN/


好的,我们学完以上预知识后,就可以开始今天的内容啦;

首先我们将项目中需要使用到的图标的库引入页面:

<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>    
<!--这里选择的是unpkg,还有很多的开源图标库可以选择,可以自行更改,该图标库内容是基于自定义ion-icon标签的引入形式-->

下面,我们开始写页面的主体内容,并且在该过程中完成对应的样式和定位书写:

<body>
    <ul class="menu">
        <div class="toggle">
            <ion-icon name="add-outline"></ion-icon>
        </div>
        <li style="--i: 0; --clr: #ff2972">
            <a href="#"><ion-icon name="home-outline"></ion-icon></a>
        </li>
        <li style="--i: 1; --clr: #fee800">
            <a href="#"><ion-icon name="person-outline"></ion-icon></a>
        </li>
        <li style="--i: 2; --clr: #04fc43">
            <a href="#"><ion-icon name="settings-outline"></ion-icon></a>
        </li>
        <li style="--i: 3; --clr: #fe00f1">
            <a href="#"><ion-icon name="mail-outline"></ion-icon></a>
        </li>
        <li style="--i: 4; --clr: #00b0fe">
            <a href="#"><ion-icon name="key-outline"></ion-icon></a>
        </li>
        <li style="--i: 5; --clr: #fea600">
            <a href="#"><ion-icon name="videocam-outline"></ion-icon></a>
        </li>
        <li style="--i: 6; --clr: #a529ff">
            <a href="#"><ion-icon name="camera-outline"></ion-icon></a>
        </li>
        <li style="--i: 7; --clr: #01bdab">
            <a href="#"><ion-icon name="game-controller-outline"></ion-icon></a>
        </li>
    </ul>
</body>
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 100vh;
    background: #2f263e;
}

.menu {
    position: relative;
    width: 280px;
    height: 280px;
    display: flex;
    justify-content: center;
    align-items: center;
}

.menu li{
    position: absolute;
    left: 0;
    list-style: none;
    transition: 0.5s;
    transition-delay: calc(0.1s * var(--i));
    transform-origin: 140px;
    transform: rotate(0deg) translateX(110px);
}

.menu li a {
    display: flex;
    justify-content: center;
    align-items: center;
    width: 60px;
    height: 60px;
    color: var(--clr);
    border: 2px solid var(--clr);
    border-radius: 50%;
    font-size: 1.5em;
    transform: rotate(calc(360deg / -8 * var(--i)));
    transition: 1s;
}

.menu li a:hover {
    transition: 0s;
    background: var(--clr);
    color: #333;
    box-shadow: 0 0 10px var(--clr),
                0 0 30px var(--clr),
                0 0 50px var(--clr);
}

.menu .toggle {
    position: absolute;
    width: 60px;
    height: 60px;
    background: #2f363e;
    border: 2px solid #fff;
    border-radius: 50%;
    color: #fff;
    display: flex;
    justify-content: center;
    align-items: center;
    cursor: pointer;
    /* z-index: 数值越大,优先级越高,就可以叠在一些z-index值比它小的元素上 */
    z-index: 10000;
    font-size: 2em;
    /* transition 是延期属性,填上XX属性  */
    transition: transform 1.25s;
}

注意:此处css仅是样式,部分transition是为动画做准备;

下面,我们定义一个层次选择器,选择class为 menu且为active的元素(目前没有元素的clss为active),并未其添加动画效果;

.menu.active .toggle {
    transform: rotate(315deg);
}
.menu.active li {
    transform: rotate(calc(360deg / 8 * var(--i))) translateX(0px);
}

现在,虽然我们定义好了动画该如何播放,但是我们并没有为其触发做准备,下一步就是关键步骤,当我们的启动按钮被点击时,我们为menu类添加(或者删除)一个名为active的clss属性,这样就可以满足以上选择器的要求实现动画效果了,代码如下:

let toggle = document.querySelector('.toggle');
let menu = document.querySelector('.menu');
toggle.onclick = function () {
    console.log()
    // xxx.classList  // 返回一个元素 class 属性的动态 DOMTokenList 集合
    // xxx.classList.toggle() // toggle是转化的意思, 如果active 类值已存在,则移除它,否则添加它
    menu.classList.toggle('active');
}

到此,呼出按钮动画就完成了,但是该组件用了较多定位才能有效实现,正常开发需要耗费较多精力才能调试完成,更重要的是希望大家懂得原理,才能合理调试该组件,下面是本次的展示界面:

http://pages.mlxgc.top/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值