Day11:空间转换、动画

目标:使用 3d 空间转换、动画丰富网页元素的呈现方式。


一、空间转换

1、空间转换简介
  • 空间:是从坐标轴角度定义的 X 、Y 和 Z 三条坐标轴构成了一个立体空间,Z 轴位置与视线方向相同
  • 空间转换也叫 3D 转换
  • 属性:transform

在这里插入图片描述

2、平移
/* 使用 translate3d,小括号里面必须逗号隔开三个数 */
/* 如果只写 1 个或 2 个,不起作用  */
transform: translate3d(x, y, z);
/* 沿 X 轴方向  */
transform: translateX();
/* 沿 Y 轴方向  */
transform: translateY();
/* 沿 Z 轴方向  */
transform: translateZ();

(1)取值与平面转换相同,像素值、百分比。
(2)使用 translate3d,三个参数都必须写,且用逗号隔开。
(3)默认情况下,Z 轴平移没有效果,原因:电脑屏幕默认是平面,无法显示 Z 轴平移效果,需要配合视距才能看到效果。

3、视距

作用:指定了观察者与 Z = 0 平面的距离,为元素添加透视效果,父级元素添加了视距,子级元素的 Z 轴平移(translateZ())就能看到效果。

透视效果:近大远小、近实远虚。

属性:添加给父级,取值范围 800-1200。

perspective: 视距;

在这里插入图片描述

<head>
  <title>透视效果</title>
  <style>
    /* 视距属性必须添加给 直接父级 */
    .father {
      perspective: 1000px;
      /* perspective: 10000px; */
      /* perspective: 100px; */
    }

    .son {
      width: 200px;
      height: 200px;
      margin: 100px auto;
      background-color: pink;
      transition: all 0.5s;
    }

    .son:hover {
      /* transform: translateZ(-300px); */
      transform: translateZ(300px);
    }
  </style>
</head>

<body>
  <div class="father">
    <div class="son"></div>
  </div>
</body>

在这里插入图片描述

4、旋转
  • Z 轴:rotateZ()

沿 Z 轴旋转,Z 轴和平面旋转的中心点重叠,所以旋转效果和平面相同。

  • X 轴:rotateX()

沿 X 轴旋转。

  • Y 轴:rotateY()

沿 Y 轴旋转。

注意:平面旋转只有一个 rotate(),沿中心点旋转,默认情况,Z 轴经过平面的中心点,所以旋转效果相同。但是平面可以通过 transform-origin 修改中心点。

5、左手法则

作用:根据旋转方向确定取值正负。

使用:左手握住旋转轴, 拇指指向正值方向, 其他四个手指弯曲方向为旋转正值方向。

在这里插入图片描述

6、rotate3d(了解)
  • rotate3d(x, y, z, 角度度数) :用来设置自定义旋转轴的位置及旋转的角度
  • x,y,z 取值为0-1之间的数字
7、立体呈现

作用:设置元素的子元素是位于 3D 空间中还是平面中。

属性名:transform-style

属性值:

  • flat:子级处于平面中,默认值
  • preserve-3d:子级处于 3D 空间

通过一个案例什么是子级处于 3D 空间中,先看效果图:

在这里插入图片描述

<head>
  <title>立体呈现</title>
  <style>
    .cube {
      /* background-color: pink; */
      position: relative;
      width: 200px;
      height: 200px;
      margin: 100px auto;
      transition: all 2s;

      /* 设置子级位于 3D 空间中 */
      transform-style: preserve-3d;

      /* 添加视距, 还能看到近大远小的效果 */
      /* perspective: 1000px; */
    }

    .cube div {
      position: absolute;
      left: 0;
      top: 0;
      width: 200px;
      height: 200px;
    }

    .front {
      background-color: orange;
      /* 设置向 Z 轴正方向平移 100px, 不旋转, 看不到效果 */
      transform: translateZ(100px);
    }

    .back {
      background-color: green;
      /* 设置向 Z 轴负方向平移 100px, 不旋转, 看不到效果 */
      transform: translateZ(-100px);
    }

    /* 鼠标悬停, 沿 Y 轴旋转, 能清楚的看到 front 和 back 元素 */
    .cube:hover {
      transform: rotateY(90deg);
    }
  </style>
</head>

<body>
  <div class="cube">
    <div class="front">前面</div>
    <div class="back">后面</div>
  </div>
</body>
8、小案例-3d导航

在这里插入图片描述

案例步骤

  1. 搭建立方体
    1. 绿色是立方体的前面
    2. 橙色是立方体的上面
  2. 鼠标悬停,立方体旋转

在这里插入图片描述

具体代码如下:

<head>
  <title>3D导航</title>
  <style>
    ul {
      margin: 0;
      padding: 0;
      list-style: none;
    }

    .nav {
      width: 300px;
      height: 40px;
      margin: 50px auto;
    }

    .nav ul {
      display: flex;
    }

    /* li 是立方体, 所以 transform-style: perserve-3d 属性添加给 li */
    .nav li {
      position: relative;
      width: 100px;
      height: 40px;
      line-height: 40px;
      transition: all 0.5s;

      transform-style: preserve-3d;
    }

    .nav li a {
      position: absolute;
      left: 0;
      top: 0;
      display: block;
      width: 100%;
      height: 100%;
      color: #fff;
      text-align: center;
      /* 去掉下划线 */
      text-decoration: none;
    }

    /* 立方体每个面都有独立的坐标轴,互不影响 */
    .nav li a:first-child {
      background-color: green;
      /* 绿色的面要当立方体前面, 向 Z 轴正方向平移高度的一半,即20px */
      transform: translateZ(20px);
    }

    .nav li a:last-child {
      background-color: orange;
      /* 先沿 X 轴旋转 90 度, 将橙色的面放平, 再往上平移 20px */
      /* 注意: 因为旋转会改变坐标轴, 此时的竖直轴是 Z 轴, 所以设置 translateZ(20px), 而不是 translateY(20px) */
      transform: rotateX(90deg) translateZ(20px);
    }

    .nav li:hover {
      transform: rotateX(-90deg);
    }
  </style>
</head>

<body>
  <div class="nav">
    <ul>
      <li>
        <a href="#">首页</a>
        <a href="#">Index</a>
      </li>
      <li>
        <a href="#">登录</a>
        <a href="#">Login</a>
      </li>
      <li>
        <a href="#">注册</a>
        <a href="#">Register</a>
      </li>
    </ul>
  </div>
</body>

(1)立方体每个面都有独立的坐标轴,互不影响。
(2)旋转 rotate 会改变坐标轴,如果使用多重转换,先旋转,再平移的时候,要注意旋转后的坐标轴。比如:此案例中,橘色面先旋转 90deg,此时竖直方向变成了 Z 轴,不再是 Y 轴了,向上平移 20px 就是 translateZ(20px)。

9、缩放
transform: scale3d(x, y, z);
transform: scaleX();
transform: scaleY();
transform: scaleZ();

(1)如果使用 scale3d 进行缩放,三个参数都必须填写,如果只填写 1个 或 2个 都不起作用。
(2)参数值, 大于 1 表示放大,小于 1 表示缩小。


二、动画

  • 过渡:实现两个状态间的变化过程
  • 动画:实现多个状态间的变化过程,动画过程可控(重复播放、最终画面、是否暂停)
1、动画实现步骤

(1)定义动画

/* 方式一:动画只有 2 个节点, 可以使用 from 和 to 表示开始和结束 */
@keyframes 动画名称 {
  from {}
  to {}
}

/* 方式二:动画很多个节点时,使用此方法 */
@keyframes 动画名称 {
  0% {}
  10% {}
  ......
  100% {}
}

(2)使用动画

对需要使用动画效果的元素添加:animation: 动画名称 动画花费时长 ... 属性。

animation: 动画名称 动画花费时长 ...;
2、animation复合属性

在这里插入图片描述

提示:

  • 动画名称和动画时长必须赋值
  • 取值不分先后顺序
  • 如果有两个时间值,第一个时间表示动画时长,第二个时间表示延迟时间

animation 拆分写法

在这里插入图片描述

小案例-走马灯效果

在这里插入图片描述

<head>
  <title>走马灯</title>
  <style>
    * {
      padding: 0;
      margin: 0;
    }

    li {
      list-style: none;
    }

    img {
      display: block;
      width: 200px;
    }

    .box {
      margin: 100px auto;
      width: 600px;
      height: 112px;
      border: 5px solid #000;
      overflow: hidden;
    }

    .box ul {
      display: flex;
      animation: move 6s infinite linear;
    }

    /* 定义位移动画,ul使用动画,鼠标悬停暂停动画 */
    @keyframes move {
      0% {
        transform: translate(0);
      }

      100% {
        transform: translate(-1400px);
      }
    }

    /* 鼠标悬停到 box, 但是动画是在 ul 上, 所以是 .box:hover ul {} */
    .box:hover ul {
      animation-play-state: paused;
    }
  </style>
</head>

<body>
  <div class="box">
    <ul>
      <li><img src="./images/1.jpg" alt="" /></li>
      <li><img src="./images/2.jpg" alt="" /></li>
      <li><img src="./images/3.jpg" alt="" /></li>
      <li><img src="./images/4.jpg" alt="" /></li>
      <li><img src="./images/5.jpg" alt="" /></li>
      <li><img src="./images/6.jpg" alt="" /></li>
      <li><img src="./images/7.jpg" alt="" /></li>
      <!-- 替身:填补显示区域的露白, 最后一帧和第一帧一样, 当动画播放完, 第一帧瞬间替换最后一帧, 实现无限循环效果 -->
      <!-- 具体宽度和张数, 根据实际情况 -->
      <li><img src="./images/1.jpg" alt="" /></li>
      <li><img src="./images/2.jpg" alt="" /></li>
      <li><img src="./images/3.jpg" alt="" /></li>
    </ul>
  </div>
</body>

无缝东海原理果:需要填补显示区域的露白,具体填补的宽度和张数,根据实际情况。

3、精灵动画

精灵动画也叫逐帧动画,动画的核心使用 animation-timing-function: step(数字) 属性。

在这里插入图片描述

使用精灵图和动画,实现如下效果:

在这里插入图片描述

制作步骤

  1. 准备显示区域

盒子尺寸与一张精灵小图尺寸相同。

  1. 定义动画

移动背景图,移动距离 = 精灵图宽度。

  1. 使用动画

steps(N),N 与精灵小图个数相同 (steps(数字) 是速度曲线的逐帧动画)。

<head>
  <title>精灵动画</title>
  <style>
    div {
      margin: 200px;
      width: 140px;
      height: 140px;
      border: 1px solid #000;
      background-image: url(./images/bg.png);
      /* 精灵图是 12 张小图, 这里分 12 帧, 每一帧通过移动背景图位置, 展示一张精灵图, 实现跑步的效果 */
      animation: run 1s steps(12) infinite;
    }

    @keyframes run {
      from {
        background-position: 0 0;
      }

      /* 动画结束, 移动背景图位置 */
      to {
        background-position: -1680px 0;
      }
    }
  </style>
</head>

<body>
  <div></div>
</body>
4、多组动画
animation: 
  动画一,
  动画二,
  ... ...
;

每一组动画都是一套完整的动画,动画名称、动画时长、重复次数、动画执行方向等。

在这里插入图片描述

<head>
  <title>多组动画</title>
  <style>
    body {
      background-color: #eee;
    }

    div {
      margin: 200px;
      width: 140px;
      height: 140px;
      /* border: 1px solid #000; */
      background-image: url(./images/bg.png);
      animation:
        run 1s steps(12) infinite,
        move 3s forwards linear infinite;

    }

    /* 当动画的开始状态样式 跟 盒子默认样式相同,可以省略动画开始状态的代码 */
    @keyframes run {
      /* from {
        background-position: 0 0;
      } */

      to {
        background-position: -1680px 0;
      }
    }

    @keyframes move {
      /* 0% {
        transform: translate(0);
      } */

      100% {
        transform: translate(500px);
      }
    }
  </style>
</head>

<body>
  <div></div>
</body>

当动画的开始状态样式 跟 盒子默认样式相同,可以省略动画开始状态的代码


三、综合案例-全民出游

通过今日所学,完成如下页面动画效果:

在这里插入图片描述

想要完整代码的,点击这里获取Day11综合案例完整代码。完全免费,仅供学习参考使用。



在这里插入图片描述

乾坤未定,你我皆是黑马


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/674915.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

maybaits-plus新增拦截器动态修改sql与pageHelper结合的问题

需求&#xff1a; 对每个sql进行权限控制&#xff0c;判断用户是查询出来的数据 由于涉及到几十个sql的改造&#xff0c;都要增加这个条件&#xff0c;一个个改很麻烦&#xff0c;所以通过增加sql拦截器&#xff0c;给每个sql追加权限条件 以flowMapper.queryOverFlowPage为例&…

node版本的升级和降级

一、问题描述 在开发过程中&#xff0c;我们可能会遇到在A项目中用 node14 版本&#xff0c;而在B项目中要用 node16 版本&#xff0c;从而需要切换不同的 node 版本来开发项目。 二、安装 gnvm 1、在已经安装好 nodejs 的前提下&#xff0c;我们来安装 gnvm &#xf…

Linux[高级管理]——使用源码包编译安装Apache网站

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月31日14点20分 &#x1f004;️文章质量&#xff1a;96分 在Linux系统上编译和安装Apache HTTP Server是…

基于Vue3的Uniapp实训项目|一家鲜花店

基于Vue的Uniapp实训指导项目 项目预览&#xff1a; 在这里插入图片描述 pages.json {"pages": [ //pages数组中第一项表示应用启动页&#xff0c;参考&#xff1a;https://uniapp.dcloud.io/collocation/pages{"path": "pages/index/index",&…

微信小程序蓝牙连接部分Android14调用wx.setBLEMTU协商低功耗最大传输单元失败解决方案(部分安卓14设置超过23就会报错)

1.解决方案的核心内容&#xff1a;第一次设置失败不要管&#xff0c;在complate函数里面继续往下连接&#xff0c;然后设置一个定时器每1秒钟在重新设置一次&#xff0c;肯定会成功的&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&am…

PS系统教程09

修复照片 修饰工具 污点修复画笔工具&#xff08;J&#xff09; 主要作用&#xff1a;去除一些污点或者不需要的 【&#xff1a;缩小】&#xff1a;放大 目标&#xff1a;去掉这两个点 修复画笔工具 也就是说我们要有取样点 选择修复画笔工具按住Alt键吸取周边相近颜色松开单机…

手把手教你使用O2OA(翱途v9)开发应用平台(1)-平台初始化

今天我们就来搭建O2OA服务&#xff0c;并初始化基础数据。 服务器安装启动 获取O2OA O2OA平台以及其所有源码&#xff0c;都是可以免费获取的&#xff0c;要获取可运行的O2OA平台&#xff0c;有三种方式&#xff1a; 1、容器化部署 2、从官网下载可运行版本 3、下载源码&…

YOLOv5改进 | 主干网络 | 将主干网络替换为轻量化的ShuffleNetv2【原理 + 完整代码】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 目标检测是计算机视觉中一个重要的下游任务。对于边缘盒子的计算平台来说&#xff0c;一个大型模型很难实现实时检测的要求。基于一系列消融…

直流电机工作原理与控制电路解析

工作原理&#xff1a; 洛伦兹力原理&#xff1a; 直流电机中&#xff0c;定子上通电产生磁场&#xff0c;而转子内导体通电后在磁场中受到洛伦兹力的作用&#xff0c;使其产生转动力矩。 转子内的导体通电后会在磁场中受到力的作用&#xff0c;根据洛伦兹力的方向规则&#…

【metricbeat】通过metricbeat采集prometheus指标

通过metricbeat采集prometheus指标 通过beat采集prometheus内的单个指标。 低版本beat只能全量 环境 # 低版本metricbeat只能全量采集 软件版本&#xff1a;metricbeat8.11.1 解压 tar zxvf metricbeat-8.11.1-linux-x86_64.tar.gz -C /usr/local配置 首先&#xff0c;修改…

数据库索引的理解

目录 1.索引是什么&#xff0c;解决了什么问题 2.索引付出了什么代价 3.如何使用sql索引&#xff0c;有何注意事项 普通索引&#xff1a; 唯一索引&#xff1a; 主键索引(Primary Key Index)&#xff1a; 删除索引: 创建主键索引的基本语法: 4.索引背后的数据结构 1.索…

Spring Boot 集成 zxing 生成条形码与二维码

前面我们知道了怎么通过 使用 zxing 生成二维码以及条形码&#xff0c; 由于我们现在都是 web 端的项目了&#xff0c;那么我们看下怎么使用 Spring Boot 集成然后返回给前端展示&#xff1a; 工程源码 对应的工程源码我放到了这里&#xff1a;github源码路径&#xff0c;点击…

80V高耐压低静态线性稳压器/LDO,Vout 1v-65v 3.3V及5V方案最佳选择

概述 PC93XX系列专为动力而设计-敏感应用程序。它包括一个精度第二个高压输入级&#xff0c;超低功率 偏置电流分支&#xff0c;并产生超低功率和低压差线性调节器。PC93XX通过输入电压工作VOUT1V至65V&#xff0c;仅消耗1.8μA的静态电流&#xff0c;并提供1%的初始精度和低…

Maven项目打包成jar项目后运行报错误: 找不到或无法加载主类 Main.Main 和 jar中没有主清单属性解决方案

已经用maven工程的package功能进行了打包 找不到或无法加载主类 Main.Main 规定主类 主要在maven的配置文件当中 这边一定要绑定自己的启动类 jar中没有主清单属性 删掉这一行就行哈 正确的插件代码 <plugin><groupId>org.springframework.boot</groupId&…

孩子出生后为什么要做听力筛查?

孩子出生后为什么要做听力筛查&#xff1f; 新生儿听力筛查&#xff0c;就是对所有新生儿在尽早的时间&#xff08;出生48小时后&#xff09;进行系统的听力筛查测试。据相关文献报道&#xff0c;在我国&#xff0c;正常分娩的新生儿听力障碍的发生率约为0.1&#xff5e;0.3%&a…

gomail发送邮件的参数如何设置?如何使用?

gomail发送邮件的认证方式有哪些&#xff1f;怎么设置邮件发信&#xff1f; Gomail是一个常用的Go语言邮件发送库&#xff0c;它提供了简单易用的接口&#xff0c;使得邮件发送变得非常方便。AokSend将详细介绍如何设置gomail发送邮件的参数&#xff0c;帮助开发者更好地理解和…

Window11开放端口

&#xff08;1&#xff09;打开控制面板&#xff0c;进入【控制面板\系统和安全\Windows Defender 防火墙】 &#xff08;2&#xff09;点击左侧菜单【高级设置】&#xff0c;进入防火墙设置页面 &#xff08;3&#xff09;根据需要选择【入站规则】或者【出站规则】&#xff…

《猎杀:对决》是适合什么样的人玩 Mac电脑怎么玩《猎杀:对决》

《猎杀&#xff1a;对决》是一款集合了生存、竞技和恐怖元素的多人在线游戏&#xff0c;自推出以来受到了广大玩家的热爱。本文将详细探讨《猎杀&#xff1a;对决》适合什么样的人玩以及Mac电脑怎么玩《猎杀&#xff1a;对决》。本文将一一解析&#xff0c;帮助你了解这款游戏是…

全球家纺热潮持续!有哪些家纺爆款类目推荐入驻沃尔玛?

在全球家纺热潮中&#xff0c;选择沃尔玛家纺爆款类目入驻是明智之举。沃尔玛作为全球零售巨头&#xff0c;拥有庞大的消费者群体和销售渠道&#xff0c;对家纺产品销售具有显著优势。 ​以下是一些推荐的家纺爆款类目&#xff0c;供您参考&#xff1a; 一、高品质床品套件 床…

迪普微震撼发布:全新Xilinx Kintex-7 XC7K325 FPGA开发板!

01 产品概述 本公司基于Xilinx Kintex-7系列的开发平台采用核心板加扩展主板的方式&#xff0c;方便用户对相关板卡的二次开发利用。 其中&#xff0c;核心板包含一片芯片XC7K325T&#xff0c;使用FFG900封装&#xff0c;外挂4片512MB的高速DDR3芯片和1片256Mb的QSPI Flash芯…