html实现响应式3D个人作品集网站

效果:

前言:介绍一个开源图标库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;
  }
}

效果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值