分享一个菜单标签页动画,切换丝滑无比

先上效果图:
在这里插入图片描述
代码如下,复制粘贴大法拿走即可使用:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>

        html {
            box-sizing: border-box;
            --bgColorMenu : #1d1d27;
            --duration: .7s;
        }

        html *,
        html *::before,
        html *::after {
            box-sizing: inherit;
        }

        body{
            margin: 0;
            display: flex;
            height: 100vh;
            overflow: hidden;
            align-items: center;
            justify-content: center;
            background-color: #ffb457;
            -webkit-tap-highlight-color: transparent;
            transition: background-color var(--duration);
        }

        .menu{
            margin: 0;
            display: flex;
            /* Works well with 100% width  */
            width: 32.05em;
            font-size: 1.5em;
            padding: 0 2.85em;
            position: relative;
            align-items: center;
            justify-content: center;
            background-color: var(--bgColorMenu);
        }

        .menu__item{
            all: unset;
            flex-grow: 1;
            z-index: 100;
            display: flex;
            cursor: pointer;
            position: relative;
            border-radius: 50%;
            align-items: center;
            will-change: transform;
            justify-content: center;
            padding: 0.55em 0 0.85em;
            transition: transform var(--timeOut , var(--duration));
        }

        .menu__item::before{
            content: "";
            z-index: -1;
            width: 4.2em;
            height: 4.2em;
            border-radius: 50%;
            position: absolute;
            transform: scale(0);
            transition: background-color var(--duration), transform var(--duration);
        }

        .menu__item.active {transform: translate3d(0, -.8em , 0);

        }

        .menu__item.active::before{
            transform: scale(1);
            background-color: var(--bgColorItem);
        }

        .icon{
            width: 2.6em;
            height: 2.6em;
            stroke: white;
            fill: transparent;
            stroke-width: 1pt;
            stroke-miterlimit: 10;
            stroke-linecap: round;
            stroke-linejoin: round;
            stroke-dasharray: 400;
        }

        .menu__item.active .icon {
            animation: strok 1.5s reverse;
        }

        @keyframes strok {
            100% {
                stroke-dashoffset: 400;
            }
        }

        .menu__border{
            left: 0;
            bottom: 99%;
            width: 10.9em;
            height: 2.4em;
            position: absolute;
            clip-path: url(#menu);
            will-change: transform;
            background-color: var(--bgColorMenu);
            transition: transform var(--timeOut , var(--duration));
        }

        .svg-container {
            width: 0;
            height: 0;
        }

        @media screen and (max-width: 50em) {
            .menu{
                font-size: .8em;
            }
        }
    </style>
</head>

<body>
<menu class="menu">
    <button class="menu__item active" style="--bgColorItem: #ff8c00;" >
        <svg class="icon" viewBox="0 0 24 24">
            <path d="M3.8,6.6h16.4"/>
            <path d="M20.2,12.1H3.8"/>
            <path d="M3.8,17.5h16.4"/>
        </svg>
    </button>
    <button class="menu__item" style="--bgColorItem: #f54888;">
        <svg class="icon" viewBox="0 0 24 24">
            <path  d="M6.7,4.8h10.7c0.3,0,0.6,0.2,0.7,0.5l2.8,7.3c0,0.1,0,0.2,0,0.3v5.6c0,0.4-0.4,0.8-0.8,0.8H3.8
        C3.4,19.3,3,19,3,18.5v-5.6c0-0.1,0-0.2,0.1-0.3L6,5.3C6.1,5,6.4,4.8,6.7,4.8z"/>
            <path  d="M3.4,12.9H8l1.6,2.8h4.9l1.5-2.8h4.6"/>
        </svg>
    </button>
    <button class="menu__item" style="--bgColorItem: #4343f5;" >
        <svg class="icon" viewBox="0 0 24 24">
            <path  d="M3.4,11.9l8.8,4.4l8.4-4.4"/>
            <path  d="M3.4,16.2l8.8,4.5l8.4-4.5"/>
            <path  d="M3.7,7.8l8.6-4.5l8,4.5l-8,4.3L3.7,7.8z"/>
        </svg>
    </button>
    <button class="menu__item" style="--bgColorItem: #e0b115;" >
        <svg class="icon" viewBox="0 0 24 24" >
            <path  d="M5.1,3.9h13.9c0.6,0,1.2,0.5,1.2,1.2v13.9c0,0.6-0.5,1.2-1.2,1.2H5.1c-0.6,0-1.2-0.5-1.2-1.2V5.1
          C3.9,4.4,4.4,3.9,5.1,3.9z"/>
            <path  d="M4.2,9.3h15.6"/>
            <path  d="M9.1,9.5v10.3"/>
        </svg>
    </button>
    <button class="menu__item" style="--bgColorItem:#65ddb7;">
        <svg class="icon" viewBox="0 0 24 24" >
            <path  d="M5.1,3.9h13.9c0.6,0,1.2,0.5,1.2,1.2v13.9c0,0.6-0.5,1.2-1.2,1.2H5.1c-0.6,0-1.2-0.5-1.2-1.2V5.1
          C3.9,4.4,4.4,3.9,5.1,3.9z"/>
            <path  d="M5.5,20l9.9-9.9l4.7,4.7"/>
            <path  d="M10.4,8.8c0,0.9-0.7,1.6-1.6,1.6c-0.9,0-1.6-0.7-1.6-1.6C7.3,8,8,7.3,8.9,7.3C9.7,7.3,10.4,8,10.4,8.8z"/>
        </svg>
    </button>
    <div class="menu__border"></div>
</menu>
<div class="svg-container">
    <svg viewBox="0 0 202.9 45.5" >
        <clipPath id="menu" clipPathUnits="objectBoundingBox" transform="scale(0.0049285362247413 0.021978021978022)">
            <path  d="M6.7,45.5c5.7,0.1,14.1-0.4,23.3-4c5.7-2.3,9.9-5,18.1-10.5c10.7-7.1,11.8-9.2,20.6-14.3c5-2.9,9.2-5.2,15.2-7
          c7.1-2.1,13.3-2.3,17.6-2.1c4.2-0.2,10.5,0.1,17.6,2.1c6.1,1.8,10.2,4.1,15.2,7c8.8,5,9.9,7.1,20.6,14.3c8.3,5.5,12.4,8.2,18.1,10.5
          c9.2,3.6,17.6,4.2,23.3,4H6.7z"/>
        </clipPath>
    </svg>
</div>
</body>
<script>
    "use strict";
    const body = document.body;
    const bgColorsBody = ["#ffb457", "#ff96bd", "#9999fb", "#ffe797", "#cffff1"];
    const menu = body.querySelector(".menu");
    const menuItems = menu.querySelectorAll(".menu__item");
    const menuBorder = menu.querySelector(".menu__border");
    let activeItem = menu.querySelector(".active");

    function clickItem(item, index) {
        menu.style.removeProperty("--timeOut");
        if (activeItem === item) return;
        if (activeItem) {
            activeItem.classList.remove("active");
        }
        item.classList.add("active");
        body.style.backgroundColor = bgColorsBody[index];
        activeItem = item;
        offsetMenuBorder(activeItem, menuBorder);
    }

    function offsetMenuBorder(element, menuBorder) {
        const offsetActiveItem = element.getBoundingClientRect();
        const left = Math.floor(offsetActiveItem.left - menu.offsetLeft - (menuBorder.offsetWidth  - offsetActiveItem.width) / 2) +  "px";
        menuBorder.style.transform = `translate3d(${left}, 0 , 0)`;
    }

    offsetMenuBorder(activeItem, menuBorder);
    menuItems.forEach((item, index) => {
        item.addEventListener("click", () => clickItem(item, index));
    })

    window.addEventListener("resize", () => {
        offsetMenuBorder(activeItem, menuBorder);
        menu.style.setProperty("--timeOut", "none");
    });
</script>
</html>
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
elementui标签切换过渡动画可以使用Vue的transition组件来实现。具体步骤如下: 1. 在el-tabs标签中添加name属性,用于指定transition组件的name值。 2. 在el-tabs标签中添加v-model属性,用于绑定当前选中的标签。 3. 在el-tabs标签中添加@tab-click事件,用于在标签切换时触发动画效果。 4. 在el-tabs-pane标签中添加name属性,用于指定当前标签的name值。 5. 在el-tabs-pane标签中添加v-if属性,用于控制当前标签的显示与隐藏。 6. 在el-tabs-pane标签中添加transition组件,用于实现过渡动画效果。 以下是一个示例代码: ```html <template> <el-tabs v-model="activeName" name="tab-demo" @tab-click="handleTabClick"> <el-tab-pane label="标签1" name="tab1"> <transition name="tab-fade"> <div v-if="activeName === 'tab1'"> <!-- 标签1的内容 --> </div> </transition> </el-tab-pane> <el-tab-pane label="标签2" name="tab2"> <transition name="tab-fade"> <div v-if="activeName === 'tab2'"> <!-- 标签2的内容 --> </div> </transition> </el-tab-pane> </el-tabs> </template> <script> export default { data() { return { activeName: 'tab1' } }, methods: { handleTabClick(tab) { // 标签切换时触发 } } } </script> <style> .tab-fade-enter-active, .tab-fade-leave-active { transition: opacity 0.5s; } .tab-fade-enter, .tab-fade-leave-to { opacity: 0; } </style> ``` 在上面的代码中,我们使用了Vue的transition组件来实现标签切换的过渡动画效果。其中,我们通过给el-tabs标签添加name属性来指定transition组件的name值,通过给el-tabs-pane标签添加name属性来指定当前标签的name值,通过给el-tabs-pane标签添加v-if属性来控制当前标签的显示与隐藏。同时,我们还通过在style标签中添加CSS样式来定义了过渡动画的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

timi先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值