有趣的css - 滑块动效导航栏

[复制链接]
七夏(UID:1) 发表于 2025-1-14 20:54:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

整体效果

图片

💎知识点:
1️⃣ <span leaf="">:hover</span><span leaf="">:checked</span> 选择器
2️⃣ <span leaf="">transition</span> 过渡属性
3️⃣ <span leaf="">input</span> 单选按钮

🔑思路:
创建三个单选按钮并隐藏,然后绘制三个导航栏按钮,再利用单选按钮选中状态来移动底层的背景。

三个 tab 项滑块导航菜单,适用于多种设备界面。



核心代码部分,简要说明了写法思路;完整代码在最后,可直接复制到本地运行。

核心代码

html 代码

<nav class="nav93">
    <input type="radio" name="radio93" id="radio93-1" checked="" />
    <label for="radio93-1" class="nav-tab93">首页</label>
    <input type="radio" name="radio93" id="radio93-2" />
    <label for="radio93-2" class="nav-tab93">设计</label>
    <input type="radio" name="radio93" id="radio93-3" />
    <label for="radio93-3" class="nav-tab93">前端</label>
    <span class="slide93"></span>
</nav>

导航栏主体代码

注意: 这里的 <span leaf="">input</span> 单选按钮以及 <span leaf="">label</span> 标签,按序写下来,这样才能在css中利用 <span leaf="">:checked</span> 选择器来改变成需要的样式效果。

css 部分代码

.nav93{
    height: 32px;
    padding: 12px;
    position: relative;
    overflow: hidden;
    display: flex;
    background-color: #fff;
    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.2);
    border-radius: 28px;
}
.nav93 input[name='radio93']{
    display: none;
}
.nav-tab93{
    width: 68px;
    height: 32px;
    line-height: 32px;
    border-radius: 16px;
    text-align: center;
    font-size: 14px;
    font-weight: bold;
    color: #3d3d3d;
    background-color: transparent;
    transition: all 0.3s linear;
    cursor: pointer;
    z-index: 2;
}
.nav-tab93:hover{
    transform: translateY(-1px);
}
.nav93 input[name='radio93']:checked + .nav-tab93{
    color: #45873c;
}
.slide93{
    width: 68px;
    height: 32px;
    line-height: 32px;
    border-radius: 16px;
    background-color: rgba(0, 129, 12, 0.1);
    position: absolute;
    transition: all 0.3s linear;
}
#radio93-1:checked ~ .slide93{
    transform: translateX(0);
}
#radio93-2:checked ~ .slide93{
    transform: translateX(68px);
}
#radio93-3:checked ~ .slide93{
    transform: translateX(136px);
}

1、绘制出三个 <span leaf="">tab</span> 项以及三个单选按钮,并且隐藏掉单选按钮 <span leaf="">display: none;</span> ,然后导航栏外观的基本样式。

2、给 <span leaf="">label</span> 标签添加基本样式以及字体样式,添加透明背景,然后加上 <span leaf="">transition</span> 过渡属性,并且设置层级 <span leaf="">z-index</span> ,让其内容层级更高,在最上方。

3、利用 <span leaf="">:checked</span> 选择器,当某个按钮选中时,改变按钮同级的下一个元素的文字颜色。

4、再定义最后面的 <span leaf="">span</span> 标签,让其基本尺寸同 <span leaf="">label</span> 标签大小相同,定义 <span leaf="">span</span> 的背景颜色,并且加上 <span leaf="">transition</span> 过渡属性。

5、最后再利用 <span leaf="">:checked</span> 选择器,来判断当按钮选中时,根据选中的按钮来让 <span leaf="">span</span> 元素移动到对应的按钮下方。

注意 <span leaf="">:checked + [classname]</span> 是表示选中按钮的下一个同级 <span leaf="">[classname]</span> 元素;<span leaf="">:checked ~ [classname]</span> 是表示选中按钮的后面同级的 <span leaf="">[classname]</span> 元素。

完整代码如下

html 页面

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="utf-8">
        <link rel="stylesheet" href="style.css">
        <title>滑块动效导航栏</title>
    </head>
    <body>
        <div class="app">
            <nav class="nav93">
                <input type="radio" name="radio93" id="radio93-1" checked="" />
                <label for="radio93-1" class="nav-tab93">首页</label>
                <input type="radio" name="radio93" id="radio93-2" />
                <label for="radio93-2" class="nav-tab93">设计</label>
                <input type="radio" name="radio93" id="radio93-3" />
                <label for="radio93-3" class="nav-tab93">前端</label>
                <span class="slide93"></span>
            </nav>
        </div>
    </body>
</html>

css 样式

.app{
    width: 100%;
    height: 100vh;
    background-color: #fff;
    position: relative;
    display: flex;
    justify-content: center;
    align-items: center;
}
.nav93{
    height: 32px;
    padding: 12px;
    position: relative;
    overflow: hidden;
    display: flex;
    background-color: #fff;
    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.2);
    border-radius: 28px;
}
.nav93 input[name='radio93']{
    display: none;
}
.nav-tab93{
    width: 68px;
    height: 32px;
    line-height: 32px;
    border-radius: 16px;
    text-align: center;
    font-size: 14px;
    font-weight: bold;
    color: #3d3d3d;
    background-color: transparent;
    transition: all 0.3s linear;
    cursor: pointer;
    z-index: 2;
}
.nav-tab93:hover{
    transform: translateY(-1px);
}
.nav93 input[name='radio93']:checked + .nav-tab93{
    color: #45873c;
}
.slide93{
    width: 68px;
    height: 32px;
    line-height: 32px;
    border-radius: 16px;
    background-color: rgba(0, 129, 12, 0.1);
    position: absolute;
    transition: all 0.3s linear;
}
#radio93-1:checked ~ .slide93{
    transform: translateX(0);
}
#radio93-2:checked ~ .slide93{
    transform: translateX(68px);
}
#radio93-3:checked ~ .slide93{
    transform: translateX(136px);
}

页面渲染效果

图片

以上就是所有代码,以及简单的思路,希望对你有一些帮助或者启发。

小时候,看腻了农村的牛和马,长大后,来到了城里,才知道原来到处都是牛马!
全部回复0 显示全部楼层
暂无回复,精彩从你开始!

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于楼主

管理员
  • 主题

    1061
  • 回答

    434
  • 积分

    2913
虚位以待,此位置招租

商务推广

    此位置招租 此位置招租 此位置招租 此位置招租 此位置招租 此位置招租 此位置招租 此位置招租 此位置招租 此位置招租
最新热评 加载中...