教你用 CSS 实现超真实的 3D 相册,让你的照片立体感 UPUP

前言

现如今网页越来越趋近于动画,相信大家平时浏览网页或多或少都能看到一些动画效果,今天我们来做一个有意思的动画效果,通过 css3 实现 3d 效果的立方体相册,下面一起看看吧。


实现思路

  • 首先我们要确定好 html 的结构以及要使用的标签;
  • 当我们搭建好 html 的结构后,就要想到怎么去实现立体的效果;
  • 最后就是如何实现旋转以及鼠标触摸时变换的效果。

html 布局

<div class="parentBox">
  <div class="contantBox">
    <div class="outerBox">
      <!--======================= 外部正方体 =======================-->
      <!-- 外前图 -->
      <div class="frontImgBox"><img src="../assets/tu1.jpg" /></div>
      <!-- 外后图 -->
      <div class="queenImgBox"><img src="../assets/tu2.jpg" /></div>
      <!-- 外左图 -->
      <div class="liftImgBox"><img src="../assets/tu3.jpg" /></div>
      <!-- 外右图 -->
      <div class="rightImgBox"><img src="../assets/tu4.jpg" /></div>
      <!-- 外上图 -->
      <div class="topImgBox"><img src="../assets/tu5.jpg" /></div>
      <!-- 外下图 -->
      <div class="bottomImgBox"><img src="../assets/tu6.jpg" /></div>
      <!--======================= 内部正方体 =======================-->
      <!-- 内前图 -->
      <p class="inFrontImgBox"><img src="../assets/tu7.jpg" /></p>
      <!-- 内后图 -->
      <p class="inqueenImgBox"><img src="../assets/tu8.jpg" /></p>
      <!-- 内左图 -->
      <p class="inLeftImgBox"><img src="../assets/tu9.jpg" /></p>
      <!-- 内右图 -->
      <p class="inRightImgBox"><img src="../assets/tu10.jpg" /></p>
      <!-- 内上图 -->
      <p class="inTopImgBox"><img src="../assets/tu11.jpg" /></p>
      <!-- 内下图 -->
      <p class="inBottomImgBox"><img src="../assets/tu12.jpg" /></p>
    </div>
  </div>
</div>

立体的效果

立体效果的核心就是运用 css3 中的 transform-style 属性。

transform-style 属性

transform-style 属性用来指定嵌套元素是怎样在三维空间中呈现。当值为 flat 时,表示所有子元素在 2D 平面呈现;值为 preserve-3d 时,表示所有子元素在 3D 空间中呈现。

属性值描述
flat(默认值)将设置元素的子元素位于该元素的平面中
preserve-3d将指示元素的子元素应位于 3D 空间中

注意:

  • 该属性必须与 transform 属性一同使用,否则没效果;
  • 该属性不能被子元素继承;
  • 该属性的效果作用于子元素,不作用于自身。

旋转和变换的效果

旋转及变换的效果我们则需要通过 animation 属性和 hover 伪类属性的配合来实现。

旋转核心代码

	.outerBox{
		-webkit-animation: rotate 10s infinite;
	}
	
	@-webkit-keyframes rotate {
	  from {
	    transform: rotateX(0deg) rotateY(0deg);
	  }
	  to {
	    transform: rotateX(360deg) rotateY(360deg);
	  }
	}

变换核心代码

.outerBox:hover .frontImgBox {
  transform: rotateY(0deg) translateZ(200px);
}
.outerBox:hover .queenImgBox {
  transform: translateZ(-200px) rotateY(180deg);
}
.outerBox:hover .liftImgBox {
  transform: rotateY(90deg) translateZ(200px);
}
.outerBox:hover .rightImgBox {
  transform: rotateY(-90deg) translateZ(200px);
}
.outerBox:hover .topImgBox {
  transform: rotateX(90deg) translateZ(200px);
}
.outerBox:hover .bottomImgBox {
  transform: rotateX(-90deg) translateZ(200px);
}

到这里为止,我们已经将整个功能的核心要点分析完毕,话不多说,下面一起来看完整的源码⤵。


完整源码

<template>
  <div class="parentBox">
    <div class="contantBox">
      <div class="outerBox">
        <!--======================= 外部正方体 =======================-->
        <!-- 外前图 -->
        <div class="frontImgBox"><img src="../assets/tu1.jpg" /></div>
        <!-- 外后图 -->
        <div class="queenImgBox"><img src="../assets/tu2.jpg" /></div>
        <!-- 外左图 -->
        <div class="liftImgBox"><img src="../assets/tu3.jpg" /></div>
        <!-- 外右图 -->
        <div class="rightImgBox"><img src="../assets/tu4.jpg" /></div>
        <!-- 外上图 -->
        <div class="topImgBox"><img src="../assets/tu5.jpg" /></div>
        <!-- 外下图 -->
        <div class="bottomImgBox"><img src="../assets/tu6.jpg" /></div>
        <!--======================= 内部正方体 =======================-->
        <!-- 内前图 -->
        <p class="inFrontImgBox"><img src="../assets/tu7.jpg" /></p>
        <!-- 内后图 -->
        <p class="inqueenImgBox"><img src="../assets/tu8.jpg" /></p>
        <!-- 内左图 -->
        <p class="inLeftImgBox"><img src="../assets/tu9.jpg" /></p>
        <!-- 内右图 -->
        <p class="inRightImgBox"><img src="../assets/tu10.jpg" /></p>
        <!-- 内上图 -->
        <p class="inTopImgBox"><img src="../assets/tu11.jpg" /></p>
        <!-- 内下图 -->
        <p class="inBottomImgBox"><img src="../assets/tu12.jpg" /></p>
      </div>
    </div>
  </div>
</template>
<style lang="less" scoped>
.parentBox {
  height: 100%;
  background: rgb(31, 31, 31);
  padding: 200px;
  .contantBox {
    width: 200px;
    height: 200px;
    margin: 0px auto;
    position: relative;
    .outerBox {
      width: 200px;
      height: 200px;
      margin: 0 auto;
      transform-style: preserve-3d;
      transform: rotateX(-30deg) rotateY(-80deg);
      -webkit-animation: rotate 10s infinite;
      animation-timing-function: linear; //匀速
      // 外部正反体样式
      div {
        position: absolute;
        width: 200px;
        height: 200px;
        opacity: 0.75;
        transition: all 0.4s;
        img {
          width: 100%;
          height: 100%;
        }
      }
      .frontImgBox {
        transform: rotateY(0deg) translateZ(100px);
      }
      .queenImgBox {
        transform: translateZ(-100px) rotateY(180deg);
      }
      .liftImgBox {
        transform: rotateY(90deg) translateZ(100px);
      }
      .rightImgBox {
        transform: rotateY(-90deg) translateZ(100px);
      }
      .topImgBox {
        transform: rotateX(90deg) translateZ(100px);
      }
      .bottomImgBox {
        transform: rotateX(-90deg) translateZ(100px);
      }
      @-webkit-keyframes rotate {
        from {
          transform: rotateX(0deg) rotateY(0deg);
        }
        to {
          transform: rotateX(360deg) rotateY(360deg);
        }
      }
      // 内部正方体样式
      p {
        display: bloack;
        width: 100px;
        height: 100px;
        position: absolute;
        top: 50px;
        left: 50px;
        img {
          width: 100%;
          height: 100%;
        }
      }
      .inFrontImgBox {
        transform: rotateY(0deg) translateZ(50px);
      }
      .inqueenImgBox {
        transform: translateZ(-50px) rotateY(180deg);
      }
      .inLeftImgBox {
        transform: rotateY(90deg) translateZ(50px);
      }
      .inRightImgBox {
        transform: rotateY(-90deg) translateZ(50px);
      }
      .inTopImgBox {
        transform: rotateX(90deg) translateZ(50px);
      }
      .inBottomImgBox {
        transform: rotateX(-90deg) translateZ(50px);
      }
    }
    // 鼠标触摸后样式
    .outerBox:hover {
      cursor: pointer;
    }
    .outerBox:hover .frontImgBox {
      transform: rotateY(0deg) translateZ(200px);
    }
    .outerBox:hover .queenImgBox {
      transform: translateZ(-200px) rotateY(180deg);
    }
    .outerBox:hover .liftImgBox {
      transform: rotateY(90deg) translateZ(200px);
    }
    .outerBox:hover .rightImgBox {
      transform: rotateY(-90deg) translateZ(200px);
    }
    .outerBox:hover .topImgBox {
      transform: rotateX(90deg) translateZ(200px);
    }
    .outerBox:hover .bottomImgBox {
      transform: rotateX(-90deg) translateZ(200px);
    }
  }
}
</style>

实现效果

在这里插入图片描述


拓展

旋转视差效果

<template>
  <div class="box">
    <div class="item">
      <img src="../../img/fj1.png" alt="">
    </div>
    <div class="item">
      <img src="../../img/fj2.png" alt="">
    </div>
    <div class="item">
      <img src="../../img/fj3.png" alt="">
    </div>
    <div class="item">
      <img src="../../img/fj4.png" alt="">
    </div>
    <div class="item">
      <img src="../../img/fj5.png" alt="">
    </div>
  </div>
</template>

<style scoped>
.box {
  width: 300px;
  height: 300px;
  margin: 0 auto;
  margin-top: 100px;
  /* 网格布局 */
  display: grid;
  grid-template-columns: repeat(3, 1fr); /* 3列 */
  grid-template-rows: repeat(3, 1fr); /* 3行 */
  grid-template:
    "A A B"
    "C D B"
    "C E E";
  gap: 5px; /* 间隙 */
  animation: rotation 10s linear infinite;
}
.item {
  overflow: hidden;
  border: 2px solid;
  display: flex;
  justify-content: center;
  align-items: center;
}
.item img {
  width: 260%;
  height: 260%;
  object-fit: cover;
  animation: rotation2 10s linear infinite;
}
/* 布局到那个区域 */
.item:nth-child(1) {
  grid-area: A;
}
.item:nth-child(2) {
  grid-area: B;
}
.item:nth-child(3) {
  grid-area: C;
}
.item:nth-child(4) {
  grid-area: D;
}

.item:nth-child(5) {
  grid-area: E;
}
/* 外层顺时针旋转 */
@keyframes rotation {
  to {
    transform: rotate(360deg);
  }
}
/* 外层逆时针旋转 */
@keyframes rotation2 {
  to {
    transform: rotate(-360deg);
  }
}
</style>

实现效果

在这里插入图片描述

  • 9
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
CSS实现鼠标经过3D立体动态展示图片特效代码 @charset "utf-8"; *{ margin:0; padding:0; } body{ max-width: 100%; min-width: 100%; height: 100%; background-size: cover; background-repeat: no-repeat; background-attachment: fixed; background-size:100% 100%; position: absolute; margin-left: auto; margin-right: auto; } li{ list-style: none; } .box{ width:200px; height:200px; background-size: cover; background-repeat: no-repeat; background-attachment: fixed; background-size:100% 100%; position: absolute; margin-left: 42%; margin-top: 22%; -webkit-transform-style:preserve-3d; -webkit-transform:rotateX(13deg); -webkit-animation:move 5s linear infinite; } .minbox{ width:100px; height:100px; position: absolute; left:50px; top:30px; -webkit-transform-style:preserve-3d; } .minbox li{ width:100px; height:100px; position: absolute; left:0; top:0; } .minbox li:nth-child(1){ background: url(img/01.png) no-repeat 0 0; -webkit-transform:translateZ(50px); } .minbox li:nth-child(2){ background: url(img/02.png) no-repeat 0 0; -webkit-transform:rotateX(180deg) translateZ(50px); } .minbox li:nth-child(3){ background: url(img/03.png) no-repeat 0 0; -webkit-transform:rotateX(-90deg) translateZ(50px); } .minbox li:nth-child(4){ background: url(img/04.png) no-repeat 0 0; -webkit-transform:rotateX(90deg) translateZ(50px); } .minbox li:nth-child(5){ background: url(img/05.png) no-repeat 0 0; -webkit-transform:rotateY(-90deg) translateZ(50px); } .minbox li:nth-child(6){ background: url(img/06.png) no-repeat 0 0; -webkit-transform:rotateY(90deg) translateZ(50px); } .maxbox li:nth-child(1){ background: url(img/1.png) no-repeat 0 0; -webkit-transform:translateZ(50px); } .maxbox li:nth-child(2){ background: url(img/2.png) no-repeat 0 0; -webkit-transform:translateZ(50px); } .maxbox li:nth-child(3){ background: url(img/3.png) no-repeat 0 0; -webkit-transform:rotateX(-90deg) translateZ(50px); } .maxbox li:nth-child(4){ background: url(img/4.png) no-repeat 0 0; -webkit-transform:rotateX(90deg) translateZ(50px); } .maxbox li:nth-child(5){ background: url(img/5.png) no-repeat 0 0; -webkit-transform:rotateY(-90deg) translateZ(50px); } .maxbox li:nth-child(6){ background: url(img/6.png) no-repeat 0 0; -webkit-transform:rotateY(90deg) translateZ(50px); } .maxbox{ width: 800px; height: 400px; position: absolute; left: 0; top: -20px; -webkit-transform-style: preserve-3d; } .maxbox li{ width: 200px; height: 200px; background: #fff; border:1px solid #ccc; position: absolute; left: 0; top: 0; opacity: 0.2; -webkit-transition:all 1s ease; } .maxbox li:nth-child(1){ -webkit-transform:translateZ(100px); } .maxbox li:nth-child(2){ -webkit-transform:rotateX(180deg) translateZ(100px); } .maxbox li:nth-child(3){ -webkit-transform:rotateX(-90deg) translateZ(100px); } .maxbox li:nth-child(4){ -webkit-transform:rotateX(90deg) translateZ(100px); } .maxbox li:nth-child(5){ -webkit-transform:rotateY(-90deg) translateZ(100px); } .maxbox li:nth-child(6){ -webkit-transform:rotateY(90deg) translateZ(100px); } .box:hover ol li:nth-child(1){ -webkit-transform:translateZ(300px); width: 400px; height: 400px; opacity: 0.8; left: -100px; top: -100px; } .box:hover ol li:nth-child(2){ -webkit-transform:rotateX(180deg) translateZ(300px); width: 400px; height: 400px; opacity: 0.8; left: -100px; top: -100px; } .box:hover ol li:nth-child(3){ -webkit-transform:rotateX(-90deg) translateZ(300px); width: 400px; height: 400px; opacity: 0.8; left: -100px; top: -100px; } .box:hover ol li:nth-child(4){ -webkit-transform:rotateX(90deg) translateZ(300px); width: 400px; height: 400px; opacity: 0.8; left: -100px; top: -100px; } .box:hover ol li:nth-child(5){ -webkit-transform:rotateY(-90deg) translateZ(300px); width: 400px; height: 400px; opacity: 0
好的,这是一个比较复杂的问题,需要一定的HTML5和CSS3技能,我会尽可能地为您解答。首先,我们需要一个包含所有图片的容器,然后通过CSS3的transform属性来实现3D旋转效果。 以下是一个基本的HTML结构: ``` <div class="container"> <figure class="card"> <img src="image1.jpg"> </figure> <figure class="card"> <img src="image2.jpg"> </figure> <figure class="card"> <img src="image3.jpg"> </figure> <figure class="card"> <img src="image4.jpg"> </figure> <figure class="card"> <img src="image5.jpg"> </figure> </div> ``` 然后,我们需要为容器和每个图片分别设置样式: ``` .container { perspective: 1000px; /* 设置透视距离 */ width: 500px; margin: 0 auto; } .card { display: inline-block; width: 200px; height: 150px; margin: 20px; transform-style: preserve-3d; /* 启用3D变换 */ transition: transform 1s; /* 设置过渡效果 */ } .card:hover { transform: rotateY(180deg); /* 鼠标悬停时旋转180度 */ } .card img { position: absolute; top: 0; left: 0; width: 100%; height: 100%; backface-visibility: hidden; /* 隐藏反面 */ } ``` 这里我们使用了perspective属性来设置透视距离,使得图片在旋转时可以呈现出3D效果。同时,我们使用transform-style属性启用了3D变换,并且设置了过渡效果,使得旋转时更加平滑。当鼠标悬停在图片上时,我们通过transform属性旋转图片180度,实现立体旋转的效果。 最后,我们需要通过CSS3的动画效果来使得相册自动旋转。以下是示例代码: ``` .container { animation: spin 10s infinite linear; } @keyframes spin { from { transform: rotateY(0deg); } to { transform: rotateY(360deg); } } ``` 这里我们设置了一个名为spin的动画,使得容器在10秒内无限循环旋转360度。通过这个动画,我们就可以实现一个自动旋转的3D相册。 希望这个简单的示例能够帮助您理解如何使用HTML5和CSS3实现3D立体旋转相册。如果您还有其他问题,请随时提出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水星记_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值