从零开始学前端:形变(小游戏:3D翻滚盒子) --- 今天你学习了吗?(CSS:Day21)

从零开始学前端:程序猿小白也可以完全掌握!—今天你学习了吗?(CSS)

复习:从零开始学前端:过渡和动画 — 今天你学习了吗?(CSS:Day20)

前言

快赶上进度了,不过每天除了作业还有别的事情,,之前的学的不扎实,练习也没有独立思考着做。发愁,继续追赶吧。

第二十一节课:形变

一、什么是形变

属于2D/3D上的转换、变形效果。他不是一个动画,他就是变形。比如正方形变平行四边形,再变圆形。都是形状变成另一个形状。但是如果配合上transition/animation,他就会从一个形状变成另一形状。只要有一段时间内的过渡效果,就形成了动画。变形就是通过CSS来改变元素的形状。
使用transform属性来设置元素的变形效果,里面的属性都可以为负数。
其中transform-origin属性确定形变的原点。【transform-origin:0px 0px;】------下面缩放实例有用到
CSS转换(transform)允许您移动、旋转、缩放和倾斜元素。(我们在这里主要给大家介绍这三种)

  • 位置:位移translate(X,Y);
  • 大小:缩放scale(XX);
  • 旋转 router(xx deg);

二、形变的位移属性

  1. transform:translateX()【沿着X轴方向平移】
  2. transform:translateY()【沿着Y轴方向平移】
  3. transform:translateZ()【沿着Z轴方向平移】

注意点:

  • 当我们使用形变位移的时候,如果需要朝两个不同的方向移动,那么这两个方向不能分开写,只能合并写(transform:translateX() translateY())。或者transform:translate(X,Y)。
  • 我们形变位移只能位移块元素或者行内块元素。
  • 当translate的值为百分数的时候,它的百分比是根据自身。
  • 并且位移之后,元素还是占着原来的位置的。(有点像相对定位,原本位置在,但是看似走了。形象比喻:本体还在,魂飞了,但是只能看到魂魄)
  • 通常使用在页面中鼠标移动上去的效果。

transform:translate(Z)【沿着Z轴方向平移】
Z轴平移,调整Z轴的位置,正常情况下,就调整元素和人眼的距离。【距离越大,元素离人越近,元素就看着越大,实际上元素的实际大小不变】
Z轴平移属于立体效果(近大远小),默认情况下网页是不支持透视,如果需要看的见效果,必须给网页body设置视距(perspective),视距单位使用的是px像素。(需要3d效果的展示,就需要视距)

实例:
原图:
在这里插入图片描述

X轴:
在这里插入图片描述

Y轴:
在这里插入图片描述

Z轴(注意加perspective,不然看不到效果):
在这里插入图片描述

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            perspective: 800px;
        }
        .box{
            width: 200px;
            height: 200px;
            background-color: pink;
            border: 5px solid skyblue;
            margin: 50px auto;
            overflow: hidden;
            transition: .5s;
        }
        .box:hover {
            transform: translateX(20px);
            transform: translateY(20px);
            transform: translateZ(100px);
        }
    </style>
</head>
<body>
    <div class="box">
    </div>
</body>
</html>

三、形变的缩放属性

scaleX(2):【水平方向缩放】
scaleY(2):【垂直方向缩放】
scale(2,2):双向缩放

注意点:

  • scale缩放都是成倍数缩放的,所以里面的属性值不能加上单位。
  • 当属性值小于1的时候,就是缩小。

实例:
原图:
在这里插入图片描述
缩放:
在这里插入图片描述
代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box{
            width: 200px;
            height: 200px;
            background-color: pink;
            border: 5px solid skyblue;
            margin: 50px auto;
            overflow: hidden;
        }
        .box:hover img{
            /* transform: scaleX(.5); */
            /* transform: scaleY(.5); */
            transform: scale(1.2);
        }
        img{
            width: 200px;
            transition: 1s;
            transform-origin: 0 0;
        }
    </style>
</head>
<body>
    <div class="box">
        <img src="../../img素材/回眸.jpg" alt="">
    </div>
</body>
</html>

四、形变的旋转属性

rotateX:【X轴方向旋转】
rotateY:【Y轴方向旋转】
rotateZ:【Z轴方向旋转】
rotate() 旋转 元素顺时针旋转给定的角度。允许负值,元素将逆时针旋转,单位是deg。(1turn表示一圈)

实例1:
原图:
在这里插入图片描述
X轴旋转:
在这里插入图片描述

Y轴旋转:
在这里插入图片描述

Z轴旋转:
在这里插入图片描述

代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            perspective: 800px;
        }
        .box {
            width: 200px;
            height: 200px;
            background-color: pink;
            border: 5px solid skyblue;
            margin: 50px auto;
            overflow: hidden;
            transition: 1s;
        }

        .box:hover {
            transform: rotateX(45deg);
            transform: rotateY(45deg);
            transform: rotateZ(45deg);
        }
    </style>
</head>

<body>
    <div class="box">
    </div>
</body>

</html>

实例2:
原图:
在这里插入图片描述
旋转:
https://www.bilibili.com/video/BV1o34y1r72Z/
代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            perspective: 800px;
        }

        .box {
            width: 200px;
            height: 200px;
            background-color: pink;
            border: 5px solid skyblue;
            margin: 100px auto;
            overflow: hidden;
            /* linear:匀速运动 */
            /* infinite:一直不停的转动 */
            animation: run 2s linear infinite;
        }

        @keyframes run {
            /* 
            0% {
                transform: rotateY(0);
            }

            100% {
                transform: rotateZ(360deg);
            } */

            from {
                transform: rotateX(0) rotateY(0) rotateZ(0);
            }

            to {
                transform: rotateX(1turn) rotateY(1turn) rotateZ(1turn);
            }

        }
    </style>
</head>

<body>
    <div class="box">
    </div>
</body>

</html>

五、练习

双层3d盒子旋转:
请添加图片描述
提示:
一层盒子旋转:
效果:
https://www.bilibili.com/video/BV1qq4y1x7AN/

代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>3D盒子旋转</title>
    <style>
        .contain {
            /* perspective: 800px; */
            height: 200px;
            width: 200px;
            margin: 200px auto;
            position: relative;
            animation: girl 5s linear infinite;
            transform-style: preserve-3d;
        }

        .contain .box {
            width: 200px;
            height: 200px;
            position: absolute;
            overflow: hidden;
        }

        .contain .box>img {
            width: 200px;
            /* opacity: .6; */
        }

        .box1 {
            transform: rotateY(90deg) translateZ(100px);
        }

        .box2 {
            transform: rotateY(-90deg) translateZ(100px);
        }

        .box3 {
            transform: rotateX(90deg) translateZ(100px);
        }

        .box4 {
            transform: rotateX(-90deg) translateZ(100px);
        }

        .box5 {
            transform: rotateY(180deg) translateZ(100px);
        }

        .box6 {
            transform: translateZ(100px);
        }

        @keyframes girl {
            from {
                transform: rotateX(0) rotateY(0) rotateZ(0);
            }

            to {
                transform: rotateX(180deg) rotateY(180deg) rotateZ(180deg);
            }
        }
    </style>
</head>

<body>
    <div class="contain">
        <div class="box box1">
            <img src="./girl/1.jpg" alt="">
        </div>
        <div class="box box2">
            <img src="./girl/2.jpg" alt="">
        </div>
        <div class="box box3">
            <img src="./girl/3.jpg" alt="">
        </div>
        <div class="box box4">
            <img src="./girl/4.jpg" alt="">
        </div>
        <div class="box box5">
            <img src="./girl/5.png" alt="">
        </div>
        <div class="box box6">
            <img src="./girl/6.jpg" alt="">
        </div>
    </div>
</body>

</html>

请仿照此例子做出双层3d模型:
效果:https://www.bilibili.com/video/BV1aT4y1i7KF/

html:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>3D盒子旋转</title>
    <style>
        .contain {
            /* perspective: 800px; */
            height: 300px;
            width: 300px;
            margin: 150px auto;
            position: relative;
            /* background-color: pink; */
            animation: girl 5s linear infinite;
            /* 3D结构 */
            transform-style: preserve-3d;
        }

        .contain1 {
            height: 150px;
            width: 150px;
            position: absolute;
            animation: cutegirl 5s linear infinite;
            /* 3D结构 */
            transform-style: preserve-3d;
            top: 75px;
            left: 75px;
        }

        .contain1 .box {
            margin: 0;
            width: 150px;
            height: 150px;
            position: absolute;
            overflow: hidden;
        }

        .contain1 .box>img {
            width: 150px;
            /* opacity: .6; */
        }

        .contain .boxg {
            margin: 0;
            width: 300px;
            height: 300px;
            position: absolute;
            overflow: hidden;
        }

        .contain .boxg>img {
            width: 300px;
            /* opacity: .6; */
        }

        .box1 {
            transform: rotateY(90deg) translateZ(75px);
        }

        .box2 {
            transform: rotateY(-90deg) translateZ(75px);
        }

        .box3 {
            transform: rotateX(90deg) translateZ(75px);
        }

        .box4 {
            transform: rotateX(-90deg) translateZ(75px);
        }

        .box5 {
            transform: rotateY(180deg) translateZ(75px);
        }

        .box6 {
            transform: translateZ(75px);
        }

        .boxg1 {
            transform: rotateY(90deg) translateZ(150px);
        }

        .boxg2 {
            transform: rotateY(-90deg) translateZ(150px);
        }

        .boxg3 {
            transform: rotateX(90deg) translateZ(150px);
        }

        .boxg4 {
            transform: rotateX(-90deg) translateZ(150px);
        }

        .boxg5 {
            transform: rotateY(180deg) translateZ(150px);
        }

        .boxg6 {
            transform: translateZ(150px);
        }

        @keyframes cutegirl {
            from {
                transform: rotateX(0) rotateY(0) rotateZ(0);
            }

            to {
                transform: rotateX(-180deg) rotateY(-180deg) rotateZ(-180deg);
            }
        }

        @keyframes girl {
            from {
                transform: rotateX(0) rotateY(0) rotateZ(0);
            }

            to {
                transform: rotateX(180deg) rotateY(180deg) rotateZ(180deg);
            }
        }

        .contain:hover .boxg1 {
            transform: rotateY(90deg) translateZ(300px);
        }

        .contain:hover .boxg2 {
            transform: rotateY(-90deg) translateZ(300px);
        }

        .contain:hover .boxg3 {
            transform: rotateX(90deg) translateZ(300px);
        }

        .contain:hover .boxg4 {
            transform: rotateX(-90deg) translateZ(300px);
        }

        .contain:hover .boxg5 {
            transform: rotateY(180deg) translateZ(300px);
        }

        .contain:hover .boxg6 {
            transform: translateZ(300px);
        }
    </style>
</head>

<body>
    <div class="contain">
        <div class="contain1">
            <div class="box box1">
                <img src="./cutegirl/c1.jpg" alt="">
            </div>
            <div class="box box2">
                <img src="./cutegirl/c2.jpg" alt="">
            </div>
            <div class="box box3">
                <img src="./cutegirl/c3.jpg" alt="">
            </div>
            <div class="box box4">
                <img src="./cutegirl/c4.jpg" alt="">
            </div>
            <div class="box box5">
                <img src="./cutegirl/c5.jpg" alt="">
            </div>
            <div class="box box6">
                <img src="./cutegirl/c6.jpg" alt="">
            </div>
        </div>
        <div class="boxg boxg1">
            <img src="./girl/1.jpg" alt="">
        </div>
        <div class="boxg boxg2">
            <img src="./girl/2.jpg" alt="">
        </div>
        <div class="boxg boxg3">
            <img src="./girl/3.jpg" alt="">
        </div>
        <div class="boxg boxg4">
            <img src="./girl/4.jpg" alt="">
        </div>
        <div class="boxg boxg5">
            <img src="./girl/5.png" alt="">
        </div>
        <div class="boxg boxg6">
            <img src="./girl/6.jpg" alt="">
        </div>
    </div>
</body>

</html>

预习:从零开始学前端:css3新属性scss和less — 今天你学习了吗?(CSS:Day22)

------岁去弦吐箭

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Coisini_甜柚か

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

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

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

打赏作者

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

抵扣说明:

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

余额充值