【Web前端开发基础】CSS3之空间转换和动画

CSS3之空间转换和动画

目录

  • CSS3之空间转换和动画
    • 一、空间转换
      • 1.1 概述
      • 1.2 3D转换常用的属性
      • 1.3 3D转换:translate3d(位移)
      • 1.4 3D转换:perspective(视角)
      • 1.5 3D转换:rotate3d(旋转)
      • 1.6 3D转换:transform-style: preserve-3d(立体呈现)
      • 1.7 3D转换:scale3d(缩放)
      • 1.7 3D导航案例
    • 二、动画
      • 2.1 动画介绍
      • 2.2 动画的基本使用
      • 2.3 动画的常用属性
      • 2.4 逐帧动画

一、空间转换

目标:使用transform属性实现元素在空间内的位移、旋转、缩放等效果

1.1 概述

  • 空间:是从坐标轴角度定义的。x 、y 和z三条坐标轴构成了一个立体空间,z轴位置与视线方向相同

  • 空间转换也叫3D转换

  • 属性:transform
    在这里插入图片描述

  • 2D转换能够改变元素X轴和Y轴方向特性,3D转换还能改变Z轴方向特性,并且可以通过视角设置透视关系,使元素具有透视效果

1.2 3D转换常用的属性

在这里插入图片描述

1.3 3D转换:translate3d(位移)

目标:使用translate实现元素空间位移效果

  • 语法
    • transform: translate3d(x, y, z);
    • transform: translateX(x);
    • transform: translateY(y);
    • transform: translateZ(z);
  • 取值(正负即可):① 数字+px ② 百分比
  • 注意点:x,y,z是不能够省略的,如果没有就写0

1.4 3D转换:perspective(视角)

目标:使用perspective属性实现透视效果

  • 思考:生活中,同一个物体,观察距离不同,视觉上有什么区别?
    • 答:近大远小、近清楚远模糊
  • 思考:默认情况下,为什么无法观察到Z轴位移效果?
    • 答:Z轴是视线方向,移动效果是距离的远或近, 电脑屏幕是平面,默认无法观察远近效果
  • 属性(添加给父级
    • perspective: 值;
    • 取值:像素单位数值, 数值一般在800 – 1200
  • 作用
    • 空间转换时,为元素添加近大远小、近实远虚的视觉效果
      在这里插入图片描述

1.5 3D转换:rotate3d(旋转)

目标:使用rotate实现元素空间旋转效果

  • 语法
    • transform: rotate3d(x, y, z, angle);
    • transform: rotateX(x);
    • transform: rotateY(y);
    • transform: rotateZ(z);
  • 注意点:
    • rotate3d(x, y, z, angle) :用来设置自定义旋转轴的位置及旋转的角度
    • x,y,z 取值为0-1之间的数字
  • 左手法则:判断旋转方向: 左手握住旋转轴, 拇指指向正值方向, 手指弯曲方向为旋转正值方向
    在这里插入图片描述

1.6 3D转换:transform-style: preserve-3d(立体呈现)

目标: 使用transform-style: preserve-3d呈现立体图形

  • 思考:使用perspective透视属性能否呈现立体图形?

    • 答:不能,perspective只增加近大远小、近实远虚的视觉效果
  • 实现方法

    • 添加transform-style: preserve-3d;
    • 使子元素处于真正的3d空间
      在这里插入图片描述
  • transform-style取值

    • preserve-3d :设置3D转换
    • flat :默认值
  • 呈现立体图形步骤

    1. 盒子父元素添加transform-style: preserve-3d;
    2. 按需求设置子盒子的位置(位移或旋转)
  • 注意:空间内,转换元素都有自已独立的坐标轴,互不干扰
    在这里插入图片描述

1.7 3D转换:scale3d(缩放)

目标:使用scale实现空间缩放效果

  • 语法
    • transform: scale3d(x, y, z)
    • transform: scaleX(x)
    • transform: scaleY(y)
    • transform: scaleZ(z)

1.7 3D导航案例

目标:使用立体呈现技巧实现3D导航效果

  • 实现思路:
    1. 搭建立方体:绿色盒子是立方体的前面,橙色盒子是立方体的上面
      在这里插入图片描述

      • li标签
        • 添加立体呈现属性transform-style: preserve-3d;
        • 添加旋转属性(为了便于观察效果,案例完成后删除即可)
          在这里插入图片描述
      • a标签
        • 调节a标签的位置
          • a标签定位(子绝父相)
          • 英文部分添加旋转和位移样式
          • 中文部分添加位移样式
            在这里插入图片描述
    2. 添加hover状态旋转切换效果

      • 鼠标滑过li, 添加空间旋转样式
      • li添加过渡属性
    3. 注意: 案例完成后,删除li的旋转样式

二、动画

目标:使用animation添加动画效果

2.1 动画介绍

  • 动画是CSS3中具有颠覆性的特征之一,有通过设置多个节点来精确控制一个或一组动画,常用来实现复杂的动画效果。
    相较于过渡,动画可以实现更多变化,更多控制,连续自动播放等效果

  • 动画效果:实现多个状态间的变化过程,动画过程可控(重复播放、最终画面、是否暂停)
    在这里插入图片描述

  • 动画的本质是快速切换大量图片时在人脑中形成的具有连续性的画面

  • 构成动画的最小单元:帧或动画帧
    在这里插入图片描述

2.2 动画的基本使用

  • 制作动画分为两步:

    1. 先定义动画
      在这里插入图片描述

    2. 再使用(调用)动画
      在这里插入图片描述

  • 动画的序列

    • 0%是动画的开始,100%是动画的完成。这样的规则就是动画序列
    • 在 @keyframes 中规定某项CSS样式,就能创建由当前样式逐渐改为新样式的动画效果
    • 动画是元素从一种样式逐渐变化为另外一种样式的效果。你可以改变任意多的样式任意多的次数
    • 请使用百分比来规定变化发生的时间,或者关键词 from 和 to ,等同于 0% 和 100%
  1. 使用 @keyframes 定义动画(类似定义类选择器)
/* 定义动画 */

/* ① 百分比 */
@keyframes 动画名 {
    0% {
        初始状态样式
    }
    100% {
        动画结束时样式
    }
}

/* 关键字 */
@keyframes 动画名 {
    from {
        初始状态样式
    }
    to {
        动画结束时样式
    }
}
  1. 元素使用动画
/* 使用(调用动画) */
	使用动画的元素 {
	/* 调用动画 */
	animation-name: 动画名称;
	/* 持续时间 */
	animation-duration: 持续时间;
}
  1. 快速体验
    定义并使用动画
/* 需求:我们打开页面,盒子就从左边走到右边 */
/* 第1种:百分比 */
/* 1.定义动画 */
@keyframes move {
  0% {
    transform: translate(0, 0);
  }
  100% {
    transform: translate(1000px, 0);
  }
}
/* 第2种:关键字 */
/* 1.定义动画 */
/* from 和 to 等价于 0% 和 100% */
@keyframes move {
  from {
    transform: translate(0, 0);
  }
  to {
    transform: translate(1000px, 0);
  }
}
div {
  width: 200px;
  height: 200px;
  background-color: pink;
  /* 2.调用动画 */
  /* 动画名称 */
  animation-name: move;
  /* 动画持续时间 */
  animation-duration: 2s;
}

动画序列里的百分比

<!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, initialscale=1.0">
    <title>Document</title>
    <style>
        /* 动画序列 */
        /* 1. 可以做多个状态的变化 keyframes 关键帧*/
        /* 2. 里面的百分比要是整数 */
        /* 3. 里面的百分比就是 总的时间的划分 eg: 6s * 25% = 1.25s*/
        @keyframes move {

            /* 起始状态,可以为空或者不写 */
            0% {
                transform: translate(0, 0);
            }

            25% {
                transform: translate(1000px, 0);
            }

            50% {
                transform: translate(1000px, 500px);
            }

            75% {
                transform: translate(0, 500px);
            }

            100% {
                transform: translate(0, 0);
            }
        }

        div {
            width: 200px;
            height: 200px;
            background-color: pink;
            /* 调用动画,直接使用名字调用 */
            animation-name: move;
            /* 设置动画持续时间 */
            animation-duration: 6s;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>
  1. 动画的连写
    在这里插入图片描述
    • 动画名称和动画时长必须赋值
    • 取值不分先后顺序
    • 如果有2个时间值,第一个时间表示动画时长,第二个时间表示延迟时间

2.3 动画的常用属性

在这里插入图片描述

<!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>
        @keyframes move {
            0% {
                transform: translate(0, 0);
            }

            100% {
                transform: translate(1000px, 0);
            }
        }

        div {
            width: 100px;
            height: 100px;
            background-color: pink;
            /* 动画名称(必备属性) */
            animation-name: move;
            /* 持续时间(必备属性)*/
            animation-duration: 2s;
            /* 动画运动速度曲线 */
            animation-timing-function: ease;
            /* 动画何时开始 */
            animation-delay: 1s;
            /* 重复次数 iteration 重复的 count 次数 infinite 无限 */
            animation-iteration-count: infinite;
            /* 是否反方向播放 默认是normal 若需要逆向播放,则使用alternate*/
            animation-direction: alternate;
            /* 动画结束状态 默认是backwards 回到起始状态,我们也可以让他停留在结束状态
forwards */
            animation-fill-mode: forwards;
        }

        div:hover {
            /* 动画播放状态 */
            /* 鼠标经过 div, 让这个 div 的动画停止,鼠标离开 div 就继续播放动画 */
            animation-play-state: paused;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

2.4 逐帧动画

目标:使用steps实现逐帧动画

  • 属性: animation-timing-function

  • 取值: steps(数字):逐帧动画
    在这里插入图片描述

  • 逐帧动画:帧动画。开发中,一般配合精灵图实现动画效果

  • animation-timing-function: steps(N); 将动画过程等分成N份
    在这里插入图片描述

  • 精灵动画制作步骤

    • 准备显示区域
      • 设置盒子尺寸是一张小图的尺寸,背景图为当前精灵图
    • 定义动画
      • 改变背景图的位置(移动的距离就是精灵图的宽度)
    • 使用动画
      • 添加速度曲线steps(N),N与精灵图上小图个数相同
      • 添加无限重复效果
        在这里插入图片描述
  • 多组动画

    • 思考:如果想让小人跑远一些,该如何实现?
    • 答:精灵动画的同时添加盒子位移动画
      在这里插入图片描述
/* 样式代码 */
.box {
  width: 140px;
  height: 140px;
  background: url("./images/jlbg.png") no-repeat 0 0;
  animation: run 1s steps(12) 3, move 3s linear forwards;
}
@keyframes run {
  /* 动画的开始状态和原来的默认样式相同时,可以省略开始状态的代码 */
  0% {
    background-position: 0 0;
  }
  100% {
    background-position: -1680px 0;
  }
}
@keyframes move {
  0% {
    transform: translate(0);
  }
  100% {
    transform: translate(1000px);
  }
}
<!-- 结构代码 -->
<div class="box"></div>

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

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

相关文章

使用StrictMode优化Android应用程序的ANR率

使用StrictMode优化Android应用程序的ANR率 本文将解释StrictMode是什么以及如何在Android应用程序中使用它作为ANR观察器。 什么是StrictMode以及为什么使用它&#xff1f; StrictMode是帮助开发人员防止ANR并减少在Android系统中产生ANR的机会的工具之一。 从developer.a…

抖音跳转微信公众号是怎么实现的丨数灵通

抖音是一款非常流行的社交媒体应用程序&#xff0c;用户可以在其中分享短视频和互动内容。许多用户希望通过抖音来引流到他们的微信公众号&#xff0c;以扩大影响力并吸引更多粉丝。以下是一些关于如何在抖音上跳转到微信公众号的科普信息&#xff1a; 1.信息流广告&#xff1a…

elementplus Dialog 对话框设置距离页面顶部的距离

默认为 15vh&#xff0c;当弹窗过于高的时候&#xff0c;这个距离其实是不合适的 <el-dialogv-model"dialogVisible"title"Tips"width"30%":before-close"handleClose"top"6vh"><span>This is a message</s…

leetcode:2859. 计算 K 置位下标对应元素的和(python3解法)

难度&#xff1a;简单 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 请你用整数形式返回 nums 中的特定元素之 和 &#xff0c;这些特定元素满足&#xff1a;其对应下标的二进制表示中恰存在 k 个置位。 整数的二进制表示中的 1 就是这个整数的 置位 。 例如&#xf…

如何实现激光雷达运动补偿,这篇就够了

目录 激光雷达为什么会存在运动畸变 激光雷达如何运动去畸变 C++实践激光雷达运动补偿(辅助传感器) 实践激光雷达ICP运动补偿 参考文献 激光雷达为什么会存在运动畸变 首先要理解为什么会产生运动畸变。激光雷达扫描物体形成点云的过程自身伴随着旋转运动,每次激…

嵌入式-stm32-江科大-EXTI外部中断

一&#xff1a;EXTI外部中断&#xff08;external interrupt&#xff09; 1.1 STM32 中断系统 中断是指在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前的程序&#xff0c;转而去处理中断程序&#xff0c;…

Termux结合内网穿透实现无公网ip远程SFTP传输文件

目录 前言 1. 安装openSSH 2. 安装cpolar 3. 远程SFTP连接配置 4. 远程SFTP访问 4. 配置固定远程连接地址 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Termux结合内网穿透实现无公网ip远程SFTP传输文件&#xff0c;希望大家能…

【基础算法练习】二分模板

文章目录 二分模板题二分的思想C 版本的二分整数二分模板 Golang 版本的二分整数二分模板 例题&#xff1a;在排序数组中查找元素的第一个和最后一个位置题目描述C 版本代码Golang 版本代码 二分模板题 704. 二分查找&#xff0c;这道题目是最经典的二分查找&#xff0c;使用于…

华为产业链之车载激光雷达

一、智能汽车 NOA 加快普及&#xff0c;L3 上路利好智能感知硬件 1、感知层是 ADAS 最重要的一环 先进驾驶辅助系统 &#xff08;ADAS&#xff0c; Advanced driver-assistance system&#xff09;分“感知层、决策层、执行层”三个层级&#xff0c;其中感知层是最重要的一环…

不同页面加载对爬虫的影响

目录 前言 1. 不同页面加载方式对爬虫的影响 1.1 静态页面加载 1.2 动态页面加载 2. 使用代理IP进行访问 总结 前言 在进行网络爬虫的过程中&#xff0c;不同的网页加载方式可以对爬虫的效率和稳定性产生重要影响。有些网站可能会限制对其服务器的访问频率&#xff0c;如果…

怎么把ico图片转png?图片格式转换的快捷方法

ICO是一种常用的图标文件格式&#xff0c;广泛用于软件应用的图标设计&#xff0c;然而&#xff0c;ICO格式的图片分辨率通常较低&#xff0c;因此在某些平台上无法满足上传要求&#xff0c;为了解决这个问题&#xff0c;我们通常需要将ICO格式转换为常见的PNG格式或其他常用格…

GuitarPro和Earmaster那个适合新手

许久没发文了&#xff0c;最近在网上刷到了一位音乐UP主从容Free&#xff0c;他把自己对GuitarPro和Earmaster这2款软件的使用感受进行了详细分享&#xff0c;还没看过的朋友可以戳下面的链接跳转到小破站看完整的&#xff1a; 我不允许还有人不知道这个学吉他的神器&#xff…

YOLO 自己训练一个模型

一、准备数据集 我的版本是yolov8 8.11 这个目录结构很重要 ultralytics-main | datasets|coco|train|val 二、训练 编写yaml 文件 # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..] path…

抖音VR直播:沉浸式体验一键打通360度精彩

随着5G技术的发展&#xff0c;VR直播近年来也逐步进入到大众的视野中&#xff0c;相比于传统直播&#xff0c;VR直播能够提供更加丰富的内容和多样化的互动方式&#xff0c;让观众更有沉浸感和参与感。现如今&#xff0c;抖音平台也上线了VR直播&#xff0c;凭借沉浸式体验和有…

无公网IP实现远程访问MongoDB文件数据库【内网穿透】

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2…

pytorch与tensorflow如何选择?

目录 1.动态图和静态图1.1 tensorflow是静态图1.2 pytorch动态图 2. 易用性3. 编程语言4. 性能和扩展性5. 社区支持和生态系统 1.动态图和静态图 1.1 tensorflow是静态图 如上图&#xff1a; 定义计算图&#xff08;公式&#xff0c;包括定义变量x,y ,zx*y&#xff09;给公式…

开源客户沟通平台Chatwoot账号激活问题

安装docker docker-compose 安装git clone https://github.com/chatwoot/chatwoot 下载之后根目录有一个docker-compose.production.yaml将其复制到一个目录 重命名 docker-compose.yaml 执行docker-compose up -d 构建 构建之后所有容器都安装好了 直接访问http://ip:3…

嵌入式软件工程师面试题——2025校招社招通用(C/C++)(三十八)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

【正点原子STM32】STM32基础知识(F1F4F7H7 STM32系统框架、寻址范围、存储器映射的存储器功能划分、寄存器映射)

一、STM32系统框架 1.1、Cortex M内核 & 芯片1.2、F1系统架构1.3、F4系统架构1.4、F7系统架构1.5、H7系统架构 二、STM32的寻址范围&#xff1f; 三、存储器映射 存储器功能划分&#xff08;F1为例&#xff09;STM32F1存储器映射图 四、寄存器映射 寄存器基础知识STM3…

景联文科技大模型数据集更新!教育题库新增高质量数学题、逻辑推理题及英文题

苏格拉底曾以“点燃火焰”的理念来诠释教育。随着大语言模型在教育中的不断应用&#xff0c;教育与AI的深度融合&#xff0c;让我们看到了“点燃火焰”的理念的更多可能性。 大语言模型可以通过与学生的互动&#xff0c;为他们提供个性化的学习体验&#xff0c;更好地满足学习需…