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

这篇具有很好参考价值的文章主要介绍了分享一个菜单标签页动画,切换丝滑无比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先上效果图:
分享一个菜单标签页动画,切换丝滑无比
代码如下,复制粘贴大法拿走即可使用:文章来源地址https://www.toymoban.com/news/detail-426232.html

<!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>

到了这里,关于分享一个菜单标签页动画,切换丝滑无比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 卡通动画项目 —— 写代码 —— 睡觉 —— 丝滑如德芙

      目录 本次实现效果  目录结构  index static/css/style.css static/js/script.js 结语:   前期回顾       【 css动画 】—— 把你喜欢css动画嵌入到浏览器中_0.活在风浪里的博客-CSDN博客 常用酷炫动画999+合集,代码直接复制可用,总用你想找的,快来抱走吧,三连,停!听鹅说,下

    2024年02月09日
    浏览(33)
  • Stable Diffusion 丝滑无闪烁AI动画 Temporalkit+Ebsynth+Controlnet

    早期的EbSynth制作的AI视频闪烁能闪瞎人的双眼,可以通过【temporalkit+ebsynth+controlnet】让视频变得丝滑不闪烁。 下载安装 EbSynth官网,这里需要输入email地址。 下载压缩包解压缩到任意位置,这里我放到了 ebsynth_utility 下。 透明背景工具下载地址: https://pypi.org/project/transparen

    2024年02月16日
    浏览(39)
  • 分分钟搞定MAC丝滑切换node版本,升级node

    在日常工作中,我们经常会遇到不同项目的依赖需要不同的node版本来运行,这个时候就需要切换node版本啦~~ 用node.js的多版本管理器 n 来解决问题 查看node所有版本 查看当前node版本 安装n模块: 升级到稳定版本 切换或者升级到某个版本 清除node.js的cache 升级到最新版本 安装

    2024年04月23日
    浏览(36)
  • uniapp h5 竖向的swiper内嵌视频实现抖音短视频垂直切换,丝滑切换视频效果,无限数据加载不卡顿

    一、项目背景 :实现仿抖音短视频全屏视频播放、点赞、评论、上下切换视频、视频播放暂停、分页加载、上拉加载下一页、下拉加载上一页等功能。。。 二、前言 :博主一开始一直想实现类似抖音进入页面自动播放当前视频,上下滑动切换之后播放当前视频,但最后在

    2024年02月11日
    浏览(44)
  • 微信小程序 - 签到打卡旋转 3D 动画功能,仿钉钉打卡签到时 “容器“ 动画翻转效果(超详细完整示例源码教程,代码简洁、丝滑流畅、示例复制即用)

    由于微信小程序的动画与普通 CSS 动画稍有不同,所以网上基本没有这方面的功能源码。 本文 实现了微信小程序开发中,类似钉钉签到打卡时的动画效果,圆形硬币形状的翻转功能, 您可以直接复制示例源码,功能都做好了只需要把你的内容放进入即可。 如下图所示,当点

    2024年02月11日
    浏览(100)
  • 若依前端,菜单栏切换时刷新问题[页面菜单切换时,页面总是重新刷新,导致页面输入的查询参数重载清空]...

    前端页面菜单切换时,页面总是重新刷新,导致页面输入的查询参数重载清空 这样切换时,页面就刷新了,解决方法在这里 1,页面代码,这里指定name name: \\\"Item\\\", 注意 name的首字母必须大写 2,页面代码,这里指定id id=\\\"item\\\" 注意,id的首字母必须小写 3,页面配置,这里的路由

    2024年02月12日
    浏览(79)
  • 如何获得一个丝滑的麦轮底盘(原理+代码详解)

            本文将用最直白的方式讲述麦轮底盘的控制原理,并且将附上全套stm32代码。 目录 一、准备工作 1. 麦轮简介 2. 安装底盘 二、原理分析 1. 先从一个轮子开始 2. 再到整个底盘 三、运动学逆解 1. 继续从整体分析 2. 最后回到一个轮子 四、离散化和PID 1. 数据离散化 2. 增

    2024年02月05日
    浏览(70)
  • Axure教程—菜单滚动切换交互

    本文接受的是用Axure中的动态面板和热区制作菜单滚动切换交互 效果 预览地址:https://u5ircj.axshare.com 功能 页面滚动到某一内容部分,显示其相应的菜单。 制作 一、所需元件 矩形、动态面板、热区 二、制作过程 拖入一个矩形元件,其大小设置为1000×92,命名为”导航“ 在导

    2024年02月12日
    浏览(85)
  • 安卓11菜单实现hdmi-4K动态切换

    客户要求系统实现动态hdmi-4K与普通分辨率直接热切换,先在菜单中做个试验,设置中加个切换开关,点击开关就可以直接切到hdmi-4K,这个功能实现后可以通过插拔hdmi那个状态(sys/class/drm/card0-HDMI-A-1/status)直接实现切换,测试代码也很简单,方法如下:

    2024年01月22日
    浏览(52)
  • 通过css动画来驱动显示菜单面板的收缩-原理-不占位

    菜单进入的方向可以用绝对定位来控制。设置小菜单显示宽度,就可以实现不占位的菜单收缩栏

    2023年04月17日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包