效果演示
实现了一个具有3D旋转效果的登录框,背景为太空图片,登录框位于太空中心,可以通过输入用户名和密码进行登录。登录框使用了CSS3的3D变换和动画效果,使其具有立体感和动态效果。同时,登录框的样式也经过精心设计,使用了半透明的背景、模糊效果、阴影等元素,使其看起来更加美观和现代化。
Code
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
<title>3D旋转登录表单</title>
<link rel="stylesheet" href="./24-3D旋转登录表单.css">
</head>
<body>
<div class="container">
<div class="wrap">
<div class="wall wall-top"></div>
<div class="wall wall-bottom"></div>
<div class="wall wall-left"></div>
<div class="wall wall-right"></div>
<div class="wall wall-back"></div>
</div>
<div class="form-box">
<div class="tit">login</div>
<input type="text" placeholder="账号">
<input type="password" placeholder="密码">
<button>登录</button>
<span>没有账号?<a href="#">去注册</a></span>
</div>
</div>
</body>
</html>
CSS
* {
margin: 0;
padding: 0;
}
body {
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background-color: #000;
overflow: hidden;
}
.container {
perspective: 5px;
perspective-origin: 50% 50%;
}
.wrap {
position: absolute;
width: 1000px;
height: 1000px;
left: -500px;
top: -500px;
transform-style: preserve-3d;
animation: move 20s linear infinite;
}
.wall {
position: absolute;
width: 100%;
height: 100%;
background: url("./images/space1.jpg") no-repeat;
background-size: cover;
}
.wall-top {
transform: rotateX(90deg) translateZ(500px);
}
.wall-bottom {
transform: rotateX(-90deg) translateZ(500px);
}
.wall-left {
transform: rotateY(-90deg) translateZ(500px);
}
.wall-right {
transform: rotateY(90deg) translateZ(500px);
}
.wall-back {
transform: rotateX(180deg) translateZ(500px);
}
.form-box {
position: relative;
background-color: rgba(255, 255, 255, 0.1);
width: 400px;
height: 550px;
border-radius: 15px;
border-top: 1px solid rgba(255, 255, 255, 0.5);
border-left: 1px solid rgba(255, 255, 255, 0.5);
display: flex;
align-items: center;
flex-direction: column;
backdrop-filter: blur(20px);
box-shadow: 0 20px 50px rgba(0, 0, 0, 0.5);
}
.form-box .tit {
color: #fff;
font-size: 40px;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 10px;
text-indent: 10px;
margin: 95px auto 50px auto;
}
.form-box input {
width: 300px;
height: 30px;
background: transparent;
text-indent: 8px;
border: none;
outline: none;
border-bottom: 1px solid rgba(255, 255, 255, 0.8);
color: #fff;
margin: 15px auto;
}
.form-box input::placeholder {
color: rgba(255, 255, 255, 0.8);
}
.form-box button {
width: 300px;
height: 40px;
margin: 35px auto 40px auto;
border: none;
background: #00addd;
color: #fff;
border-radius: 8px;
letter-spacing: 20px;
text-indent: 20px;
font-weight: bold;
cursor: pointer;
}
.form-box button:hover {
background: #0098d4;
}
.form-box span {
font-size: 14px;
color: #fff;
}
.form-box a {
color: #00addd;
text-decoration: none;
}
@keyframes move {
0% {
transform: rotate(0deg) translateZ(-500px);
}
100% {
transform: rotate(90deg) translateZ(500px);
}
}
实现思路拆分
* {
margin: 0;
padding: 0;
}
这段代码是将所有元素的外边距和内边距都设置为0,以便更好地控制页面布局。
body {
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background-color: #000;
overflow: hidden;
}
这段代码设置了body元素的样式,将其高度设置为100vh,即占据整个视口的高度。使用flex布局,将其子元素水平和垂直居中。设置背景颜色为黑色,同时隐藏溢出部分。
.container {
perspective: 5px;
perspective-origin: 50% 50%;
}
这段代码设置了一个容器元素,使用perspective属性设置了透视距离为5px,使得其子元素具有3D效果。perspective-origin属性设置了透视点的位置,这里设置为容器中心。
.wrap {
position: absolute;
width: 1000px;
height: 1000px;
left: -500px;
top: -500px;
transform-style: preserve-3d;
animation: move 20s linear infinite;
}
这段代码设置了一个包裹元素,使用绝对定位,将其左上角定位到容器中心。设置了宽度和高度为1000px,使其能够完全覆盖整个容器。使用transform-style属性设置了子元素的变换方式为保留3D效果。使用animation属性设置了动画效果,调用了名为move的动画,持续时间为20秒,线性运动,无限循环。
.wall {
position: absolute;
width: 100%;
height: 100%;
background: url("../images/space1.jpg") no-repeat;
background-size: cover;
}
这段代码设置了一个墙体元素,使用绝对定位,宽度和高度都为100%,使其完全覆盖包裹元素。使用background属性设置了背景图片为space1.jpg,使用no-repeat属性使其不重复,使用background-size属性设置了背景图片的大小为cover,使其完全覆盖墙体元素。
.wall-top {
transform: rotateX(90deg) translateZ(500px);
}
.wall-bottom {
transform: rotateX(-90deg) translateZ(500px);
}
.wall-left {
transform: rotateY(-90deg) translateZ(500px);
}
.wall-right {
transform: rotateY(90deg) translateZ(500px);
}
.wall-back {
transform: rotateX(180deg) translateZ(500px);
}
这段代码设置了墙体元素的不同面,使用transform属性设置了旋转和平移变换,使其具有3D效果。其中,rotateX表示绕X轴旋转,rotateY表示绕Y轴旋转,translateZ表示沿Z轴平移。这些变换的参数可以根据需要进行调整,以达到最佳效果。
.form-box {
position: relative;
background-color: rgba(255, 255, 255, 0.1);
width: 400px;
height: 550px;
border-radius: 15px;
border-top: 1px solid rgba(255, 255, 255, 0.5);
border-left: 1px solid rgba(255, 255, 255, 0.5);
display: flex;
align-items: center;
flex-direction: column;
backdrop-filter: blur(20px);
box-shadow: 0 20px 50px rgba(0, 0, 0, 0.5);
}
这段代码设置了一个登录框元素,使用相对定位,使其相对于包裹元素进行定位。设置了背景颜色为半透明白色,宽度和高度分别为400px和550px,设置了圆角边框和边框阴影。使用flex布局,将其子元素垂直居中,并设置了主轴方向为垂直方向。使用backdrop-filter属性设置了模糊效果,使其看起来更加美观。
.form-box .tit {
color: #fff;
font-size: 40px;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 10px;
text-indent: 10px;
margin: 95px auto 50px auto;
}
这段代码设置了登录框中的标题元素,使用了选择器来选择.form-box元素下的.tit元素。设置了字体颜色为白色,字体大小为40px,字体加粗,文本转换为大写,字母间距为10px,首行缩进为10px,上下左右的外边距分别为95px、auto、50px、auto,使其居中并与其他元素有一定的间距。
.form-box input {
width: 300px;
height: 30px;
background: transparent;
text-indent: 8px;
border: none;
outline: none;
border-bottom: 1px solid rgba(255, 255, 255, 0.8);
color: #fff;
margin: 15px auto;
}
这段代码设置了登录框中的输入框元素,设置了宽度和高度分别为300px和30px,背景为透明,文本缩进为8px,去掉了边框和外边距,设置了底部边框为白色半透明,字体颜色为白色,上下外边距为15px,左右外边距为auto,使其居中并与其他元素有一定的间距。
.form-box input::placeholder {
color: rgba(255, 255, 255, 0.8);
}
这段代码设置了输入框的占位符文本的样式,设置了字体颜色为白色半透明,使其与输入框的背景颜色相似。
.form-box button {
width: 300px;
height: 40px;
margin: 35px auto 40px auto;
border: none;
background: #00addd;
color: #fff;
border-radius: 8px;
letter-spacing: 20px;
text-indent: 20px;
font-weight: bold;
cursor: pointer;
}
这段代码设置了登录框中的提交按钮元素,设置了宽度和高度分别为300px和40px,上下外边距为35px和40px,左右外边距为auto,使其居中并与其他元素有一定的间距。去掉了边框,设置了背景颜色为蓝色,字体颜色为白色,设置了圆角边框和字母间距,使其看起来更加美观。设置了鼠标指针为手型,表示该元素可以被点击。
.form-box button:hover {
background: #0098d4;
}
这段代码设置了按钮元素在鼠标悬停时的样式,将背景颜色改为深蓝色,使其看起来更加醒目。
.form-box span {
font-size: 14px;
color: #fff;
}
这段代码设置了登录框中的提示文本元素的样式,设置了字体大小为14px,字体颜色为白色。
.form-box a {
color: #00addd;
text-decoration: none;
}
这段代码设置了登录框中的链接元素的样式,设置了字体颜色为蓝色,去掉了下划线。
@keyframes move {
0% {
transform: rotate(0deg) translateZ(-500px);
}
100% {
transform: rotate(90deg) translateZ(500px);
}
}
这段代码定义了一个名为move的动画,使用了@keyframes规则。在0%时刻,设置了旋转角度为0度,沿Z轴平移-500px,使其位于包裹元素的后面。在100%时刻,设置了旋转角度为90度,沿Z轴平移500px,使其位于包裹元素的前面。这样就实现了一个不断旋转的3D效果。