3D 图片旋转效果

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title></title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      html,
      body {
        height: 100vh;
      }
      body {
        display: flex;
        perspective: 1000px;
        transform-style: preserve-3d;
        background-image: url(https://pic2.zhimg.com/v2-bb2609fa9559407eb07ae632afa0c5f9_1440w.jpg?source=172ae18b);
        height: 100%;
        width: 100%;
      }
      #box {
        position: relative;
        display: flex;
        width: 130px;
        height: 200px;
        margin: auto;
        transform-style: preserve-3d;
        transform: rotateX(-10deg);
      }
      #box > div {
        transform-style: preserve-3d;
        position: absolute;
        left: 0;
        top: 0;
        width: 100%;
        height: 100%;
        line-height: 200px;
        font-size: 50px;
        text-align: center;
        box-shadow: 0 0 10px #fff;
        -webkit-box-reflect: below 10px -webkit-linear-gradient(top, rgba(
                0,
                0,
                0,
                0
              )
              40%, rgba(0, 0, 0, 0.8) 100%);
      }
      #box p {
        position: absolute;
        left: 0;
        top: 0;
        bottom: 0;
        right: 0;
        margin: auto;
        width: 1200px;
        height: 1200px;
        background: -webkit-radial-gradient(
          center center,
          600px 600px,
          rgba(50, 50, 50, 1),
          rgba(0, 0, 0, 0)
        );
        border-radius: 50%;
        transform: rotateX(90deg) translate3d(-600px, 0, -105px);
      }
    </style>
  </head>
  <body>
    <div id="box">
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <p></p>
    </div>
    <script>
      setTimeout(init, 100);
      function init() {
        var obox = document.getElementById("box"),
          aDiv = obox.getElementsByTagName("div");

        for (var i = 0; i < aDiv.length; i++) {
          aDiv[i].style.background =
            "url(images/" + (i + 1) + ".jpg) center/cover";
          aDiv[i].style.transform =
            "rotateY(" + i * 36 + "deg) translate3d(0,0,350px)";
          aDiv[i].style.transition =
            "transform 1s " + (aDiv.length - i) * 0.2 + "s";
        }
        var sX,
          sY,
          nX,
          nY,
          desX = 0,
          desY = 0,
          tX = 0,
          tY = 10,
          index = 0; //滚轮初始值
        document.onmousedown = function (e) {
          clearInterval(obox.timer);
          e = e || window.event;
          var sX = e.clientX,
            sY = e.clientY;
          this.onmousemove = function (e) {
            e = e || window.event;
            var nX = e.clientX,
              nY = e.clientY;
            // 当前点的坐标和前一点的坐标差值
            desX = nX - sX;
            desY = nY - sY;
            tX += desX * 0.1;
            tY += desY * 0.1;

            obox.style.transform =
              "rotateX(" + -tY + "deg) rotateY(" + tX + "deg)";
            sX = nX;
            sY = nY;
          };
          this.onmouseup = function () {
            this.onmousemove = this.onmouseup = null;
            obox.timer = setInterval(function () {
              desX *= 0.95;
              desY *= 0.95;
              tX += desX * 0.1;
              tY += desY * 0.1;
              obox.style.transform =
                "rotateX(" + -tY + "deg) rotateY(" + tX + "deg)";
              if (Math.abs(desX) < 0.5 && Math.abs(desY) < 0.5) {
                clearInterval(obox.timer);
              }
            }, 13);
          };
          return false;
        };
        //滚轮放大缩小
        mousewheel(document, function (e) {
          e = e || window.event;
          var d = e.wheelDelta / 120 || -e.detail / 3;
          if (d > 0) {
            index -= 20;
          } else {
            index += 30;
          }
          index < -1050 && (index = -1050);
          document.body.style.perspective = 1000 + index + "px";
        });
        function mousewheel(obj, fn) {
          document.onmousewheel === null
            ? (obj.onmousewheel = fn)
            : addEvent(obj, "DOMMouseScroll", fn);
        }
        function addEvent(obj, eName, fn) {
          obj.attachEvent
            ? obj.attachEvent("on" + eName, fn)
            : obj.addEventListener(eName, fn);
        }
        //自动旋转
        var rotationSpeed = 0.1;
        var rotation = tX;
        var isRotating = true;

        function rotatebox() {
          if (isRotating) {
            rotation += rotationSpeed;
            obox.style.transform = `rotateX(${-tY}deg) rotateY(${
              tX + rotation
            }deg)`;
          }
          requestAnimationFrame(rotatebox);
        }

        obox.addEventListener("mouseenter", function () {
          isRotating = false;
        });

        obox.addEventListener("mouseleave", function () {
          isRotating = true;
        });
        rotatebox();
      }
    </script>
  </body>
</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值