这么炫酷的 3D Menu 效果,真的不来看看?

我正在参加「码上挑战赛」概略请看:码上挑战赛来了!

最近在研究 CSS3 中关于 3D 方面的特色,越发的觉得 CSS3 是真的好玩,尽管目前首要的作业是 2B 的事务,可是却并不妨碍我有一颗 2C 的心,刚好最近学到了一个比较炫酷的 3D 菜单事例,今天咱们就一起来好好把玩一下,废话不多说,咱们开整!

CSS3 – 3D Menu

首要咱们先来看一下一般的 Menu 是什么样的,然后再来对比一下咱们即将要盘的 3D Menu 是什么样的,先来看两张图,如下:

这么炫酷的 3D Menu 效果,真的不来看看?

就拿来举例,图中画出来的就是 Menu ,也就是网站的菜单,大部分网站的菜单跟都是差不多的,下面咱们在一起来看一下 3D 的菜单是什么样的,如图:

通过两张图片可以明显的看出,3D Menu 与一般 Menu 的展示和交互彻底不同,下面咱们就来一步步解刨一下这个效果。

基础树立

要完结上述的 3D 效果,咱们需求先来树立一下相关的 HTML,其实也很简略,代码如下:

<ul>
    <li><a href="#">Home</a></li>
    <li><a href="#">About</a></li>
    <li><a href="#">Services</a></li>
    <li><a href="#">Price</a></li>
    <li><a href="#">Our Team</a></li>
    <li><a href="#">Contact</a></li>
</ul>

页面中只需求通过 ullia 等标签即可树立基础的架子,有了基础的标签,咱们需求先来初始化一下相关的样式,因为每个浏览器在不同的标签上都会添加一些默许的样式,因此咱们需求将这些默许的样式都去掉,这儿我运用的是 less,通过编译后,毕竟仍是会转换为 css。咱们先来看一下初始化的样式,如下:

* {
    margin: 0; 
    padding: 0;
    box-sizing: border-box;
    font-size: sans-serif;
}

在初始化的时分,通过 * 这个通配符找到页面中全部的标签,但实践上这样是不太好的方法,这儿仅仅图个简洁,所以运用通配符来挑选全部标签,实践开发中咱们会将需求的标签选取出来,然后再去除它们的默许样式。

在上述默许样式中,通过通配符挑选全部的标签后,将这些标签的 marginpadding 都设置为 0,因为浏览器默许有一个 8px 的边距会影响到咱们,因此这儿将默许的样式去除,然后设置全部标签的 盒模型古怪盒模型,关于盒模型不了解的童靴可以到中查找一下,有许多文章进行解说,这儿就不做过多的介绍。

设置完初始样式后,咱们需求给 body 添加相关的样式,因为这儿是做这个 3D Menu 的效果,因此才需求在 body 上设置相关的样式,实践开发中就需求依据相关的需求来了,具体的代码如下:

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

咱们在 body 中设置 display 的特色为 flex ,将 body 设置为一个盒子,然后将 body 中全部的元素都设置为上下左右居中目标,并给 body 一个最小的高度,也就是浏览器的高度,毕竟添加一个背景色。

基础的内容都准备好后,咱们要真实开始编写这个 3D Menu 相关的样式了,因为这个效果是纯 CSS 完结的,因此不规划任何的 JavaScript 代码,咱们可以放心食用。

Menu 效果

通过上面的图片咱们可以看出,这个 Menu 像一个立体的效果,其实也就解说了 3D 效果简略来说就是一个视觉差,让咱们的大脑误以为一个平面的效果是立体的。因此咱们可以通过如下代码让咱们的 Menu 先“立”起来,代码如下:

ul {
    position: relative;
    transform: skewY(-15deg);
    li {
        position: relative;
        list-style: none;
        width: 200px;
        background: #3e3f46;
        padding: 15px;
        transition: .5s;
        a {
            text-decoration: none;
            color: #ccc;
            display: block;
            text-transform: uppercase;
            letter-spacing: .05em;
            transition: .5s;
        }
    }
}

上述代码选用 less 编写,因此可以直接进行嵌套编写,假设对 less 不了解的童鞋,也可以直接运用 css 进行编写,效果是相同的,通过上述的代码,咱们可以得到如下的效果:

这么炫酷的 3D Menu 效果,真的不来看看?

咱们在 ul 标签上设置了一个 transform: skewY(-15deg),这样就让整个 ul 沿着纵坐标倾斜了 15 度,这样看起来还不像一个 3D 的效果,让咱们继续来完善一下,代码如下:

ul {
    position: relative;
    transform: skewY(-15deg);
    li {
        // ... other code
        &::before {
            content: '';
            position: absolute;
            top: 0;
            left: -40px;
            width: 40px;
            height: 100%;
            background: #35383e;
            transform-origin: right;
            transform: skewY(45deg);
            transition: .5s;
        }
        &::after {
            content: '';
            position: absolute;
            top: -40px;
            left: 0;
            width: 100%;
            height: 40px;
            background: #35383e;
            transform-origin: bottom;
            transform: skewX(45deg);
            transition: .5s;
        }
        // ... other code
    }
}

在上述代码中,咱们通过给 li 标签的 beforeafter 伪类添加相关的特色,其间最首要的是需求设置伪类元素的旋转点,也就是上述代码中的 transform-origin,在 before 伪类中,咱们设置其时伪类的旋转点是右边,因此这个伪类元素会向左面倾斜负 45 度;而在 after 伪类中,设置的旋转点是底部,因此这个伪类的就是向上倾斜 45 度,毕竟的效果如下图所示:

这么炫酷的 3D Menu 效果,真的不来看看?

这儿还有一个点需求注意一下,因为咱们给每个 li 设置了一个背景色,而 beforeafter 伪类中也添加了相关的背景色,而且通过定位来将它们的方位指定到 li 的左面和顶部,然后让咱们看到这个 Menu “立”起来了。咱们都知道定位的元素是有层级的,也就是 z-index,因此咱们需求设置每一个 liz-index,那么咱们该怎么设置呢?

最蠢的方法莫过于给每个 li 都添加一个 z-index,可是这种方法关于代码的保护和整齐度都极点不友好,因此咱们有一种更简略的方法,咱们可以给每个 li 标签添加一个 style 特色,里边的值也很简略,咱们先来改造一下 html,代码如下:

<ul>
    <li style="--i:6;"><a href="#">Home</a></li>
    <li style="--i:5;"><a href="#">About</a></li>
    <li style="--i:4;"><a href="#">Services</a></li>
    <li style="--i:3;"><a href="#">Price</a></li>
    <li style="--i:2;"><a href="#">Our Team</a></li>
    <li style="--i:1;"><a href="#">Contact</a></li>
</ul>

咱们给每个 listyle 中都添加一个 --i:n 这样的特色,然后合作相关的样式就能自动的设置 li 的层级了,具体的样式批改如下:

li {
    position: relative;
    list-style: none;
    width: 200px;
    background: #3e3f46;
    padding: 15px;
    z-index: var(--i);
    transition: .5s;
}

只需求在 li 的样式中添加一行 z-index: var(--i);,整个 li 的层级就会自动依据 style 中设置的 –i:n; 来进行改动,那么这个 var() 到底是个什么东西呢?咱们可以看一下 MDN 的介绍:

var() 函数可以代替元素中任何特色中的值的任何部分。var() 函数不能作为特色名、挑选器或许其他除了特色值之外的值。(这样做通常会产生无效的语法或许一个没有相关到变量的值。)

具体的概略可以点击这儿进行检查。

简略来说,var() 可以代替咱们设置的任何值,将咱们设置的特色转换为咱们需求的值。

现在 3D 的姿态现已有了,可是鼠标移入 li 还不能动起来,咱们还需求添加相关的 hover 效果,代码如下:

ul {
    position: relative;
    transform: skewY(-15deg);
    li {
        // ... other code
        &:hover {
            background: #33a3ee;
            transform: translateX(50px);
            &::before {
                background: #2982b9;
            }
            &::after {
                background: #1f5378;
            }
        }
        a {
            text-decoration: none;
            color: #ccc;
            display: block;
            text-transform: uppercase;
            letter-spacing: .05em;
            transition: .5s;
            &:hover {
                    color: #fff;
            }
        }
        &:last-child {
            &::after {
                box-shadow: -100px 100px 20px rgba(0, 0, 0, .25);
            }
        }
    }
}

通过给 li 添加 hover 效果,改动 li 的位移,让整个 Menu 看起来像一个立体的 3D 效果,毕竟的代码完结可以在这儿进行检查:

毕竟

CSS3 中的特色还有许多,通过对 CSS3 的学习和摸索,咱们还能完结更多有意思的效果。看到这儿,是否现已勾起你对 CSS3 学习的欲望呢?假设你也喜欢这些炫酷的效果,那就快来跟我一起学习吧!

毕竟,假设这篇文章有协助到你,❤️重视+点赞❤️鼓动一下作者,谢谢咱们

往期回想

『 CSS实战』CSS3 完结一些好玩的效果(6)

『 CSS实战』CSS3 完结一些好玩的效果(5)

『 CSS实战』CSS3 完结一些好玩的效果(4)

『 CSS实战』CSS3 完结一些好玩的效果(3)

『 CSS实战』CSS3 完结一些好玩的效果(2)

『 CSS实战』CSS3 完结一些好玩的效果(1)