效果:
前言:介绍一个开源图标库Usage
本案例会用到此组件库,使用<link href='https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css' rel='stylesheet'>引入
使用如下:1.点击Boxicons;2.查找要引入的图标;3.点击Font,直接复制粘贴使用
一、全局样式
设置全局样式
1. :root 定义一个全局的css变量,可以自定义属性,适用于多个被重复使用时,通过更改一个属性值,可替换所有引用该属性的值;
2. ::selection 选择器,当前元素被用户选中或处于高亮状态时被匹配;
3. ::placeholder 选择器用于选取带有占位符文本的表单元素,并设置占位符文本的样式
*{
margin: 0;
padding: 0;
box-sizing: border-box;
text-decoration: none;
list-style: none;
border: none;
outline: none;
font-family: Arial, sans-serif;
}
:root{
--nav-bg-color: rgba(255,255,255,.1);
--bg-color: #171f2b;
--second-bg-color: #1f2733;
--third-bg-color: #2d3542;
--main-color: #0ef;
--white-color: #fff;
--tab-list-color: #7c8594;
}
::selection{
background: var(--main-color);
color: var(--bg-color);
}
/* 设置滚动条样式 整个滚动条*/
::-webkit-scrollbar{
width: .5rem;
}
/* 滚动条上的滚动滑块 */
::-webkit-scrollbar-thumb{
background: var(--main-color);
border-radius: 1rem;
}
::placeholder{
color: var(--white-color);
}
二、创建导航栏
1. 实现底部导航栏,鼠标划入变颜色,默认选中第一个
html代码
<nav class="nav">
<ul class="nav-list">
<li class="active">
<i class='bx bx-home-alt'></i>
</li>
<li>
<i class='bx bx-user'></i>
</li>
<li>
<i class='bx bx-detail'></i>
</li>
<li>
<i class='bx bx-briefcase'></i>
</li>
<li>
<i class='bx bx-envelope' ></i>
</li>
</ul>
</nav>
css样式设置
html{
font-size: 62.5%;
}
body{
color: var(--white-color);
overflow: hidden;
background-color: seagreen;
}
p{
font-size: 1.6rem;
}
.nav{
position: fixed;
bottom: 2rem;
left: 50%;
transform: translateX(-50%);
width: 40rem;
padding: 2rem 0;
background: var(--nav-bg-color);
border-radius: 5rem;
z-index: 100;
}
.nav .nav-list{
display: flex;
justify-content: space-evenly;
}
.nav-list li{
position: relative;
display: flex;
font-size: 3rem;
cursor: pointer;
transition: .3s;
}
.nav-list li:hover,.nav-list li.active{
color: var(--main-color);
}
效果如下:
2. 实现鼠标划入,显示相关导航提示
html代码,加入要提示的内容
<nav class="nav">
<ul class="nav-list">
<li class="active">
<i class='bx bx-home-alt'></i>
<span class="tooltip">首页</span>
</li>
<li>
<i class='bx bx-user'></i>
<span class="tooltip">关于</span>
</li>
<li>
<i class='bx bx-detail'></i>
<span class="tooltip">简历</span>
</li>
<li>
<i class='bx bx-briefcase'></i>
<span class="tooltip">职责</span>
</li>
<li>
<i class='bx bx-envelope' ></i>
<span class="tooltip">联系</span>
</li>
</ul>
</nav>
css设置如下:
.tooltip{
position: absolute;
top: -4rem;
left: 50%;
transform: translateX(-50%);
padding: .3rem 1rem;
background: var(--main-color);
border-radius: .4rem;
font-size: 1.6rem;
color: var(--bg-color);
font-weight: 500;
white-space: nowrap;
visibility: hidden;
opacity: 0;
transition: .3s;
}
.nav-list li:hover .tooltip{
visibility: visible;
opacity: 1;
}
效果图如下
三、创建首页
首页显示内容:
<div class="container">
<div class="box">
<section class="section home">
<div class="home-info">
<h3>个人介绍 </h3>
<h1>郭麒麟</h1>
<h3>前端工程师</h3>
<p class="desc">总的来说,前端工程师是连接设计与技术的桥梁,负责将设计转化为用户可直接交互的网页或应用程序,同时关注性能、兼容性、用户体验等方面的问题,
并确保产品的质量与安全性。
</p>
<div class="btn-sci">
<a href="#" class="btn">下载简历</a>
<div class="sci">
<a href="#">
<i class='bx bxl-github' ></i>
<span class="tooltip">GitHub</span>
</a>
<a href="#">
<i class='bx bxl-gitlab' ></i>
<span class="tooltip">GitLab</span>
</a>
<a href="#">
<i class='bx bxl-youtube'></i>
<span class="tooltip">YouTube</span>
</a>
<a href="#">
<i class='bx bxl-tiktok'></i>
<span class="tooltip">tiktok</span>
</a>
</div>
</div>
</div>
<div class="img-wrapper">
<div class="img-box home-img">
<img src="images/gql.png" alt="">
</div>
</div>
</section>
</div>
</div>
添加样式:为实现3D翻转效果,在container盒上设置对应的操作
.container{
width: 100vw;
height: 100vh;
/* 定义3D元素距视图的距离,以像素为单位 */
perspective: 1500px;
perspective-origin: 50%;
}
.box{
position: relative;
width: 100%;
height: 100%;
/* 子元素保留其3D位置,允许父元素和子元素在三个维度上进行不同的3D变换操作 */
transform-style: preserve-3d;
transform-origin: 50% 50% -50vw;
transform: rotateY(0deg);
}
.section{
position: absolute;
width: 100%;
height: 100%;
background-color: var(--bg-color);
padding: 0 10%;
/* 它用于控制元素在3D空间中翻转时是否可见。当设置为 hidden 时,元素翻转面将不可见 */
backface-visibility: hidden;
}
.home{
display: flex;
align-items: center;
gap: 5rem;
}
.home-info h1{
font-size: 5.5rem;
color: var(--main-color);
line-height: 1.5;
}
.home-info h3{
font-size: 3rem;
}
.desc{
margin: 1rem 0 2rem;
line-height: 2;
}
.home-info .btn-sci{
display: flex;
align-items: center;
}
.btn{
display: inline-block;
padding: 1.2rem 3rem;
background: var(--main-color);
border-radius: 5rem;
box-shadow: 0 0 1ren var(--main-color);
font-size: 1.6rem;
color: var(--bg-color);
font-weight: 600;
transition: .3s;
}
.btn:hover{
box-shadow: none;
}
.home-info .btn-sci .sci{
margin-left: 2rem;
}
.home-info .btn-sci .sci a{
position: relative;
display: inline-flex;
padding: .8rem;
border: .2rem solid var(--main-color);
border-radius: 50%;
font-size: 2rem;
color: var(--main-color);
margin: 0 0.8rem;
transition: .3s;
}
.home-info .btn-sci .sci a:hover{
background-color: var(--main-color);
color: var(--bg-color);
}
.img-box{
position: relative;
width: 32vw;
height: 32vw;
background: linear-gradient(var(--bg-color),var(--main-color));
border-radius: 50%;
border: .5rem solid var(--main-color);
box-shadow: 0 0 2rem var(--main-color);
display: flex;
justify-content: center;
overflow: hidden;
transition: 1s;
}
.img-box.home-img:hover{
box-shadow: 0 0 8rem var(--main-color);
}
.img-box img{
position: absolute;
display: block;
width: 90%;
object-fit: cover;
}
效果如下:
响应式3D个人作品集网站 -首页
给图标链接添加提示,和底部导航栏的效果一样,添加红框内容到对应的位置
四、介绍页
html代码:
<section class="section about">
<div class="img-wrapper">
<div class="img-box about-img">
<img src="images/gql.png" alt="">
</div>
</div>
<div class="about-info">
<h2 class="title">关于我</h2>
<h3>青年演员</h3>
<p class="desc">
郭麒麟,本名郭奇林,1996年2月8日出生于天津市,中国内地相声、影视男演员。
</p>
<p class="desc">
出现的影视剧有《庆余年》、《赘婿》、《平凡之路》、《边水往事》等。
</p>
<p class="desc">
话剧《牛天赐》,获“壹戏剧大赏”年度最佳新人奖。
</p>
<p class="desc">
个人歌曲《行人啊》,翻唱歌曲《霓虹甜心》、《红豆》等。
</p>
<p class="desc">
常驻综艺有《漫游记》、《奔跑吧第四季》、《密室逃脱第五季》、《做家务的男人第二季》、《我们仨》、《开始推理吧第一季》、《五十公里桃花坞第一季》等。
</p>
<p class="desc">
配音作品有《比得兔2:逃跑计划》、《1/2的魔法》、《摇滚藏獒》。
</p>
<a href="#" class="btn">更多</a>
</div>
</section>
添加样式:
设置旋转的角度
.section:nth-child(even){
background-color: var(--second-bg-color);
}
.section.about{
transform: translateX(50vw) translateZ(-50vw) rotateY(90deg);
}
和首页的布局设置一致,添加如下内容:
.img-box.about-img{
/* 背景透明 */
background: transparent;
box-shadow: 0 0 2rem var(--main-color), inset 0 0 1rem var(--main-color);
}
.img-box.about-img img{
z-index: -1;
}
.title{
font-size: 4rem;
text-align: center;
}
.about-info .title{
text-align: left;
line-height: 1.5;
margin-bottom: 1rem;
}
.about-info h3{
font-size: 2.5rem;
color: var(--main-color);
margin-bottom: 1rem;
}
.about-info .desc{
margin: 0;
}
.about-info .btn{
margin-top: 1rem;
padding: 1.2rem 6rem;
}
效果如下:
五、简历
搭建页面框架
<section class="section resume">
<h2 class="title">简历</h2>
<div class="tab-box">
<div class="tab-list resume-list active">
<h3>作品</h3>
</div>
<div class="tab-list resume-list">
<h3>获奖</h3>
</div>
<div class="tab-list resume-list">
<h3>成就</h3>
</div>
</div>
<div class="tab-wrapper">
<div class="tab-grid resume-box experience active">
<div class="tab-item resume-item">
<p>作品描述</p>
</div>
</div>
<div class="tab-grid resume-box skills">
<div class="tab-item resume-item">
<p>获奖描述</p>
</div>
</div>
<div class="tab-grid resume-box education">
<div class="tab-item resume-item">
<p>成就描述</p>
</div>
</div>
</div>
</section>
css代码:旋转方式设置
.section.resume{
transform: translateZ(-100vw) rotateY(-180deg);
/* 设置围绕那个点进行变化 */
transform-origin: 50%;
}
整体结构,默认打开第一项tab栏
.resume{
padding-top: 2rem;
padding-bottom: 28rem;
}
.tab-box{
display: flex;
width: 100%;
height: 5rem;
margin-top: 1rem;
margin-bottom: 2rem;
}
.tab-list{
display: flex;
align-items: center;
width: 100%;
cursor: pointer;
border-bottom: .3rem solid var(--tab-list-color);
color: var(--tab-list-color);
transition: .5s;
}
.tab-list.resume-list.active{
border-color: var(--main-color);
color: var(--main-color);
}
.resume-list:nth-child(2){
justify-content: center;
}
.resume-list:nth-child(3){
justify-content: flex-end;
}
.tab-list h3{
font-size: 2.5rem;
}
.tab-wrapper{
position: relative;
width: 100%;
height: 100%;
}
.tab-grid{
position: absolute;
width: 100%;
height: 100%;
visibility: hidden;
opacity: 0;
transform: scale(.8);
}
.tab-grid.resume-box.active{
visibility: visible;
opacity: 1;
transform: scale(1);
transition: .5s;
}
效果如下
使用js控制点击不同的tab栏,lab栏高亮
新建script文件,html中引入:<script src="script.js"></script>
const resumeList = document.querySelectorAll('.resume-list');
resumeList.forEach((list,index)=>{
list.addEventListener('click',()=>{
document.querySelector('.resume-list.active').classList.remove('active')
list.classList.add('active')
})
})
继续监听点击事件,当前tab栏被点击时,对应的内容也相应改变
const resumeBoxs = document.querySelectorAll('.resume-box');
resumeList.forEach((list,index)=>{
list.addEventListener('click',()=>{
document.querySelector('.resume-box.active').classList.remove('active')
resumeBoxs[index].classList.add('active')
})
})
合并后代码如下
tab-wrapper中替换为自己想要的内容,这里略过;其他两个导航页面这里也不在重复写,重点实现以下如何用css控制页面实现3D翻转效果
六、实现3D旋转
1. 思路:我们根据css样式,样首页、介绍页等分别设置在box盒子的前后左右四面,共五页,先将第五页我们进行隐藏
获取所有的导航标签,监听点击事件,每次点击时我们将对应的页面旋转到最前面
const navs = document.querySelectorAll('.nav-list li');
const cube = document.querySelector('.box');
navs.forEach((nav,index)=>{
nav.addEventListener('click',()=>{
document.querySelector('.nav-list li.active').classList.remove('active')
nav.classList.add('active')
cube.style.transform = `rotateY(${index * -90}deg)`
})
})
效果如下:
发现没有旋转的效果,我们给box添加过渡动画时间
点击前四页效果都能实现,我们调整第五页实现的效果,点击导航时添加一个active类
const sections = document.querySelectorAll('.section');
navs.forEach((nav,index)=>{
nav.addEventListener('click',()=>{
document.querySelector('.nav-list li.active').classList.remove('active')
nav.classList.add('active')
cube.style.transform = `rotateY(${index * -90}deg)`
document.querySelector('.section.active').classList.remove('active')
sections[index].classList.add('active')
})
})
css中设置,判断最后一页中有active类时,显示。这样最后一页会和第一页显示在同一个位置,但是后面的会覆盖掉前面的,页面只能看到最后一页的内容。
.section.contact{
visibility: hidden;
transition-delay: .5s;
}
.section.contact.active{
visibility: visible;
}
效果已经实现,但是当第四页翻转到第五页时会发现,第一页的内容会闪现一下,修改代码:
当点击导航不为第一个和最后一个时,给最后一个添加active-contact类;当进入第一个导航时去掉最后一个导航的active-contact类,用来控制进入最后一个导航栏的动画效果和前面保持一致
navs.forEach((nav,index)=>{
nav.addEventListener('click',()=>{
document.querySelector('.nav-list li.active').classList.remove('active')
nav.classList.add('active')
cube.style.transform = `rotateY(${index * -90}deg)`
document.querySelector('.section.active').classList.remove('active')
sections[index].classList.add('active')
const array = Array.from(sections)
const arrSecs = array.slice(1,-1) //去掉第一个和最后一个元素
arrSecs.forEach((sec)=>{
if(sec.classList.contains('active')){ //判断是否存在active类
sections[4].classList.add('active-contact')
}
})
if(sections[0].classList.contains('active')){
sections[4].classList.remove('active-contact')
}
})
})
用css样式控制,当别的页面进入最后一个页面时,延迟动画设置1.5s;最后一个页面进入别的页面时,去掉延时
.section.contact.active-contact{
transition-delay: 1.5s;
}
.section.contact.active-contact.active{
transition-delay: 0s;
}
最终效果如上面所示。
当前网站的响应式还存在问题,当我们将页面缩小到手机屏大小时,样式就会出现问题。将响应式完善~
这里采用的是媒体查询的方法,我们对常见的屏幕宽度进行单独的设置
/* 媒体查询 */
@media screen and (max-width: 1200px){
html{
font-size: 55%;
}
}
@media screen and (max-width: 992px){
.section{
padding: 0 4%;
}
.resume,.portfolio{
padding-top: 1.5rem;
padding-bottom: 27rem;
}
.contact{
padding-top: 1.5rem;
padding-bottom: 18rem;
}
}
@media screen and (max-width: 768px){
html{
font-size: 50%;
}
.nav{
bottom: 0;
}
.home,.about{
flex-direction: column-reverse;
justify-content: center;
gap: 2rem;
padding: 6rem;
}
.about{
flex-direction: column;
}
.img-box{
width: 35rem;
height: 35rem;
}
.resume,.portfolio{
padding-bottom: 25rem;
}
.contact{
padding-bottom: 16rem;
}
}
@media screen and (max-width: 576px){
.resume,.portfolio{
padding-top: 1rem;
padding-bottom: 22rem;
}
.tab-box{
margin-top: 0;
}
.contact{
padding-top: 1rem;
}
}
效果如下