手把手教你用CSS实现一个VR 3D游戏菜单栏效果,前端开发框架

@media (–dark) {

–theme: hsl(255 53% 50%);

–theme-bg: hsl(255 53% 71% / 25%);

–theme-bg-hover: hsl(255 53% 50% / 40%);

–theme-shadow: hsl(255 53% 10% / 25%);

}

@media (–HDcolor) {

@supports (color: color(display-p3 0 0 0)) {

–theme: color(display-p3 .4 0 .9);

}

}

}

浅色和深色主题圆锥形背景

===============================================================================

浅色主题有一个鲜艳的青色到粉红色的圆锥渐变,而深色主题有一个暗色的微妙圆锥渐变。

html {

background: conic-gradient(at -10% 50%, deeppink, cyan);

@media (–dark) {

background: conic-gradient(at -10% 50%, #212529, 50%, #495057, #212529);

}

}

2021-12-26 15.01.58

启用3D透视功能

===========================================================================

为了让元素存在于网页的三维空间中,需要初始化一个带透视的视口。我选择把透视放在主体元素上,并使用视口单元来创建我喜欢的风格。

body {

perspective: 40vw;

}

2021-12-26 15.01.01

这就是视角所能产生的影响。

<ul>按钮列表设计样式

==================================================================================

这个元素负责整个按钮列表的宏观布局,同时也是一个互动的、3D的浮动卡片。这里有一个实现的方法。

钮扣组布局


Flexbox可以管理容器的布局。通过flex-direction将flex的默认方向从行改为列,并通过align-itemsstretch改为start来确保每个项目都是其内容的大小。

.threeD-button-set {

/* remove

  • margins */

margin: 0;

/* vertical rag-right layout */

display: flex;

flex-direction: column;

align-items: flex-start;

gap: 2.5vh;

}

2021-12-26 14.59.57

接下来,将容器建立为一个三维空间背景,并设置CSS clamp()函数,以确保卡片的旋转不会超过可识别的旋转。注意,夹子的中间值是一个自定义属性,这些--x--y值将在以后的鼠标交互时从JavaScript中设置。

.threeD-button-set {

transform-style: preserve-3d;

transform:

rotateY(

clamp(

calc(var(–_max-rotateY) * -1),

var(–y),

var(–_max-rotateY)

)

)

rotateX(

clamp(

calc(var(–_max-rotateX) * -1),

var(–x),

var(–_max-rotateX)

)

)

;

}

接下来,如果运动对访问用户来说是可以的,就向浏览器添加一个提示,说明这个项目的变换会随着will-change不断变化。此外,通过在变换上设置一个过渡来实现插值。这个过渡将在鼠标与卡片互动时发生,使旋转变化的过渡平稳。该动画是一个持续运行的动画,即使鼠标不能或没有与该组件互动,也能展示出该卡所处的三维空间。

@media (–motionOK) {

.threeD-button-set {

will-change: transform;

transition: transform .1s ease;

animation: rotate-y 5s ease-in-out infinite;

}

}

旋转-y动画只将中间的关键帧设置为50%,因为浏览器会将0%100%默认为该元素的默认样式。这是对交替出现的动画的简称,需要在同一位置开始和结束。这是一种阐述无限交替动画的好方法。

@keyframes rotate-y {

50% {

transform: rotateY(15deg) rotateX(-6deg);

}

}

2021-12-26 14.59.09

<li>元素定型

==============================================================================

每个列表项(<li>)都包含按钮和它的边框元素。显示样式被改变了,所以该项目不显示::标记。位置样式被设置为相对的,所以即将到来的按钮伪元素可以将自己定位在按钮所消耗的全部区域内。

.threeD-button-set > li {

display: inline-flex;

position: relative;

transform-style: preserve-3d;

}

Styling the <button>elements

=================================================================================================

为按钮设计造型是一项艰难的工作,有很多状态和交互类型需要考虑。由于要平衡伪元素、动画和交互,这些按钮很快就会变得复杂。

初始<button>样式


以下是将支持其他状态的基础风格。

.threeD-button-set button {

appearance: none;

outline: none;

border: none;

background-color: var(–_btn-bg);

color: var(–_btn-text);

text-shadow: 0 1px 1px var(–_btn-text-shadow);

font-size: 5vmin;

font-family: Audiowide;

padding-block: .75ch;

padding-inline: 2ch;

border-radius: 5px 20px;

}

按钮的伪元素


按钮的边框不是传统的边框,它们是有边框的绝对位置的伪元素。

这些元素对于展示已经建立的3D视角至关重要。这些伪元素中的一个会被推离按钮,另一个会被拉近到用户身边。这种效果在顶部和底部的按钮中最为明显。

.threeD-button button {

&::after,

&::before {

/* 创建空元素 */

content: ‘’;

opacity: .8;

/* 掩盖父体 (button) */

position: absolute;

inset: 0;

/* 样式元素的边框强调 */

border: 1px solid var(–theme);

border-radius: 5px 20px;

}

/* 其中一个伪元素的例外情况 */

/* 这将被推后(3倍),并有一个更厚的边界 */

&::before {

border-width: 3px;

/* 在黑暗模式下,它会发亮! */

@media (–dark) {

box-shadow:

0 0 25px var(–theme),

inset 0 0 25px var(–theme);

}

}

}

3D transform styles


下面的transform-style被设置为preserve-3d,这样就可以在Z轴上拉开空间。变换被设置为–距离的自定义属性,它将在悬停和聚焦时被增加。

.threeD-button-set button {

transform: translateZ(var(–distance));

transform-style: preserve-3d;

&::after {

/* 以3倍的倍数在Z空间向前拉动 */

transform: translateZ(calc(var(–distance) / 3));

}

&::before {

/* 在Z空间以3倍的倍数推回 */

transform: translateZ(calc(var(–distance) / 3 * -1));

}

}

2021-12-26 14.56.45

条件性动画样式


如果用户对运动没有意见,按钮就会向浏览器提示变换属性,并为变换和背景颜色属性设置了一个过渡。注意这里因为持续时间的不同,所以会有一个漂亮的微妙的交错效果。

.threeD-button-set button {

@media (–motionOK) {

will-change: transform;

transition:

transform .2s ease,

background-color .5s ease

;

&::before,

&::after {

transition: transform .1s ease-out;

}

&::after { transition-duration: .5s }

&::before { transition-duration: .3s }

}

}

悬停和聚焦的交互样式


交互动画的目标是将构成平面出现的按钮的各层展开。通过设置–距离变量来实现这一目标,最初是1px。下面代码示例中的选择器会检查按钮是否被一个应该看到焦点指示器的设备悬停或聚焦,而不是被激活。如果是这样,它就应用CSS来做以下事情。

  • 应用悬停的背景颜色。

  • 增加距离。

  • 添加一个弹跳缓解效果。

  • 错开伪元素的转换

不同的过渡时间值只在悬停时才会出现,只为悬停而交错的动画。当悬停或焦点移开时,每个层都会一致地过渡到静止的地方。

.threeD-button-set button {

&:is(:hover, :focus-visible):not(:active) {

/* 悬停/聚焦时微妙的距离和bg颜色变化 */

–distance: 15px;

background-color: var(–_btn-bg-hover);

/* 如果运动没有问题,设置过渡,增加距离 */

@media (–motionOK) {

–distance: 3vmax;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

文章到这里就结束了,如果觉得对你有帮助可以点个赞哦,如果有需要前端校招面试题PDF完整版的朋友可以点击这里即可免费获取,包括答案解析。

**

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-pPnMADnN-1712365229239)]

[外链图片转存中…(img-eA8LSibI-1712365229240)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

[外链图片转存中…(img-m5qokRpz-1712365229240)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

文章到这里就结束了,如果觉得对你有帮助可以点个赞哦,如果有需要前端校招面试题PDF完整版的朋友可以点击这里即可免费获取,包括答案解析。

[外链图片转存中…(img-30o291ys-1712365229240)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值