【CSS3】CSS3 3D 转换示例 - 3D 旋转木马 ( @keyframes 规则 定义动画 | 为 盒子模型 应用动画 | 开启透视视图 | 设置 3D 呈现样式 )

news2024/11/17 18:47:43

文章目录

  • 一、3D 导航栏示例 - 核心要点
    • 1、需求分析
    • 2、HTML 结构
      • section 标签
    • 3、CSS 样式
      • @keyframes 规则 定义动画
      • 为 盒子模型 应用动画
      • 开启透视视图
      • 设置 3D 呈现样式
      • 鼠标移动到控件上方效果
      • 设置 6 个子盒子模型的效果
  • 二、完整代码示例
    • 1、代码示例
    • 2、展示效果





一、3D 导航栏示例 - 核心要点



1、需求分析


实现下图的 旋转木马 效果 :

在这里插入图片描述


2、HTML 结构


HTML 标签结构很简单 , 只是一个 section 标签 , 内部包裹着 6 个 div 标签子盒子 ;

<body>
    <section>
        <div>1</div>
        <div>2</div>
        <div>3</div>
        <div>4</div>
        <div>5</div>
        <div>6</div>
    </section>
</body>

section 标签

<section> 标签 是 HTML5 引入的 语意元素 , 表示一组独立的内容 , 这些内容 逻辑上 属于 同一个部分 或 章节 ;

使用 <section> 标签可以帮助 组织 和 划分 页面内容 , 提高文档的可读性和可维护性 , 有助于 搜索引擎 更好地理解 页面结构和内容 ;


3、CSS 样式


@keyframes 规则 定义动画

使用 @keyframes 规则 定义动画 , rotate 是动画的名称 , 该规则定义了动画的具体步骤 , 如果为 盒子模型 应用该动画 , 该 盒子模型 会 绕着 Y 轴旋转 360 度 ;

        @keyframes rotate {
            /* 定义动画 , 名称是 rotate , 该动画绕着 Y 轴旋转 360 度 */
            0% {
                transform: rotateY(0);
            }
            100% {
                transform: rotateY(360deg);
            }
        }

为 盒子模型 应用动画

CSS 中 使用 animation 属性 为 标签元素 应用动画效果 ;

        section {
            /* 添加动画效果 , 控件 匀速旋转 每 10 秒旋转一圈 无限循环 */
            animation: rotate 10s linear infinite;
        }
  • rotate : 动画的名称 , 由 @keyframes 规则 定义 ;
  • 10s : 动画的 单次周期 持续时间 , 即完成一个动画的完整周期需要 10 秒 ;
  • linear : 动画匀速运动 ;
  • infinite : 动画将无限次地重复执行 ;

开启透视视图

HTML 页面 呈现 3D 效果 , 需要 设置 3D 空间中的透视效果 属性 , 该属性的 属性值 表示 观察者眼睛 ( 视点 ) 到 3D 转换元素 ( 盒子标签模型 ) 的距离 , 单位是像素 ;

        body {
            /* 设置透视视图效果 */
            perspective: 500px;
        }

上述代码 告诉浏览器 , 观察者的眼睛 距离 投影平面 500 像素 , 在 这个距离会影响 3D 转换元素的视觉效果 , 具体效果就是 " 近小远大 " ;

如果不设置 透视视图效果 , 那么 整个 三维空间 中 , 不管多远 , 显示的 标签盒子 大小都一样 ;

设置 3D 呈现样式

盒子模型 的 父容器 和 子容器 都可以设置 3D 变换效果 , 如果要为 子容器 设置 3D 变换效果 , 则需要在 父容器 的 盒子模型 样式中 设置 transform-style: preserve-3d; 属性 ,

            /* 父盒子 和 子盒子 使用不同的 3D 变换效果 */
            transform-style: preserve-3d;

上述代码 告诉 浏览器 子容器盒子模型 保留其的 3D 变换效果 , 即 子盒子模型 的 3D 效果 是 相对于它们自己的 3D 空间 , 而不是相对于父元素的平面 ;

鼠标移动到控件上方效果

:hover 是一个 伪类选择器 , 该选择器 表示 用户与页面进行交互的一种状态 , 即 鼠标指针停留在 盒子模型 上方时的一种状态 ;

        section:hover {
            /* 鼠标 移动到 section 盒子模型上方 , 旋转动画停止 */
            animation-play-state: paused;
        }

默认状态下 , .box 类型的盒子 显示的是 .box 类型 的 样式 , 如果将 鼠标移动到 盒子模型上方时 , 会显示 .box:hover 样式 ;

该示例中 , 鼠标 移动到 section 盒子模型上方 , 旋转动画停止 ;

设置 6 个子盒子模型的效果

父容器中设置 相对定位 , 根据 子绝父相 原则 , 子盒子使用了绝对定位 , 父盒子就要使用相对定位 ;

修改下 section 的属性 , 为其设置 transform: rotateX(-20deg); 属性 , 将其绕 X 轴旋转 -20 度 , 即可看到 每个 子盒子模型的 大概 排列位置 ;

在这里插入图片描述

第 1 个盒子不需要旋转 , 向屏幕方向移动 300 像素 ;

        section div:nth-child(1) {
            /* 第 1 个盒子不需要旋转 , 向屏幕方向移动 300 像素 */
            transform: rotateY(0) translateZ(300px);
            background: blue;
        }

第 2 个盒子 先旋转 60 度 , 然后再向屏幕方向移动 300 像素 ;

        section div:nth-child(2) {
            /* 第 2 个盒子 先旋转 60 度 , 然后再向屏幕方向移动 300 像素 */
            transform: rotateY(60deg) translateZ(300px);
            background: purple;
        }

第 3 个盒子 先旋转 120 度 , 然后再向屏幕方向移动 300 像素 ;

        section div:nth-child(3) {
            /* 第 3 个盒子 先旋转 120 度 , 然后再向屏幕方向移动 300 像素 */
            transform: rotateY(120deg) translateZ(300px);
            background: green;
        }

第 4 个盒子 先旋转 180 度 , 然后再向屏幕方向移动 300 像素 ;

        section div:nth-child(4) {
            /* 第 4 个盒子 先旋转 180 度 , 然后再向屏幕方向移动 300 像素 */
            transform: rotateY(180deg) translateZ(300px);
            background: magenta;
        }

第 5 个盒子 先旋转 240 度 , 然后再向屏幕方向移动 300 像素 ;

        section div:nth-child(5) {
            /* 第 5 个盒子 先旋转 240 度 , 然后再向屏幕方向移动 300 像素 */
            transform: rotateY(240deg) translateZ(300px);
            background: pink;
        }

第 6 个盒子 先旋转 300 度 , 然后再向屏幕方向移动 300 像素 ;

        section div:nth-child(6) {
            /* 第 6 个盒子 先旋转 300 度 , 然后再向屏幕方向移动 300 像素 */
            transform: rotateY(300deg) translateZ(300px);
            background: cyan;
        }




二、完整代码示例



1、代码示例


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

<head>
    <meta charset="UTF-8">
    <!-- 设置 meta 视口标签 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>CSS3 3D 旋转木马示例</title>
    <style>
        body {
            /* 设置透视视图效果 , 近大远小 */
            perspective: 5000px;
        }
        
        section {
            /* 相对定位 */
            position: relative;
            width: 300px;
            height: 200px;
            /* 整体 上下 150 像素边距 , 水平居中对齐 */
            margin: 150px auto;
            /* 设置 3D 呈现效果 , 子盒子可设置 3D 效果 */
            transform-style: preserve-3d;
            /* 添加动画效果 , 控件 匀速旋转 每 10 秒旋转一圈 无限循环 */
            animation: rotate 10s linear infinite;
            background: red;
        }
        
        section:hover {
            /* 鼠标 移动到 section 盒子模型上方 , 旋转动画停止 */
            animation-play-state: paused;
        }
        
        @keyframes rotate {
            /* 定义动画 , 名称是 rotate , 该动画绕着 Y 轴旋转 360 度 */
            0% {
                transform: rotateY(0);
            }
            100% {
                transform: rotateY(360deg);
            }
        }
        
        section div {
            /* 绝对定位 , 子绝父相 , 其父容器必须是相对布局 */
            position: absolute;
            /* 左上角定位在父容器 0,0 位置 */
            top: 0;
            left: 0;
            /* 宽高充满父盒子 */
            width: 100%;
            height: 100%;
            /* 设置文字大小 */
            font-size: 60px;
            /* 设置文字颜色 */
            color: #fff;
            /* 设置文字在盒子中水平对齐 */
            text-align: center;
            /* 设置文字在盒子中垂直对齐 */
            line-height: 200px;
        }
        
        section div:nth-child(1) {
            /* 第 1 个盒子不需要旋转 , 向屏幕方向移动 300 像素 */
            transform: rotateY(0) translateZ(300px);
            background: blue;
        }
        
        section div:nth-child(2) {
            /* 第 2 个盒子 先旋转 60 度 , 然后再向屏幕方向移动 300 像素 */
            transform: rotateY(60deg) translateZ(300px);
            background: purple;
        }
        
        section div:nth-child(3) {
            /* 第 3 个盒子 先旋转 120 度 , 然后再向屏幕方向移动 300 像素 */
            transform: rotateY(120deg) translateZ(300px);
            background: green;
        }
        
        section div:nth-child(4) {
            /* 第 4 个盒子 先旋转 180 度 , 然后再向屏幕方向移动 300 像素 */
            transform: rotateY(180deg) translateZ(300px);
            background: magenta;
        }
        
        section div:nth-child(5) {
            /* 第 5 个盒子 先旋转 240 度 , 然后再向屏幕方向移动 300 像素 */
            transform: rotateY(240deg) translateZ(300px);
            background: pink;
        }
        
        section div:nth-child(6) {
            /* 第 3 个盒子 先旋转 300 度 , 然后再向屏幕方向移动 300 像素 */
            transform: rotateY(300deg) translateZ(300px);
            background: cyan;
        }
    </style>
</head>

<body>
    <section>
        <div>1</div>
        <div>2</div>
        <div>3</div>
        <div>4</div>
        <div>5</div>
        <div>6</div>
    </section>
</body>

</html>

2、展示效果


在浏览器中的展示效果如下 :

在这里插入图片描述

动态效果如下 :

在这里插入图片描述

鼠标移动到 section 标签盒子 上方时 , 停止转动 ;

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安全防御第七次作业

拓扑图如图所示&#xff1a; 问题&#xff1a;在FW7和FW8之间建立一条IPSEC通道保证10.0.2.0/24网段 可以正常访问到192.168.1.0/24 注&#xff1a;基础配置我在此省略了 一、NAT配置 FW4&#xff1a; FW6&#xff1a; 二、在FW4上做服务器映射 三、配置IPSEC FW5&#xff…

最大的单入口空闲区域

最大的单入口空闲区域 问题描述输入输出代码实现 问题描述 找到最大的单入口空闲区域。 空闲区域是由连通的’O’组成的区域&#xff0c;位于边界的’O’可以是入口&#xff0c; 单入口空闲区域即有且只有一个位于边界的’O’作为入口的由连通的’O’组成的区域。 如果两个元素…

SpringBoot中定时任务、corn表达式

SpringBoot中定时任务、corn表达式 corn表达式网站&#xff1a;https://cron.qqe2.com/ 方法上加上Scheduled(cron表达式) 启动类上加上EnableScheduling 示例 启动类上 启动类加上EnableScheduling开启定时任务。 SpringBootApplication EnableScheduling public class…

应用方案 | D54123B低功耗漏电保护电路

概 述 A&#xff09;、D54123B是一款高性能 CMOS 漏电保护器专用电路。芯片内部包含稳压电源、放大电路、比较器电路、延时电路、计数器电路、跳闸控制电路及跳闸驱动电路。芯片外围应用有脱扣线圈、压敏电阻、稳压二级管、二级管、电阻、电容等元器件。 B&#xff09;、内部…

Day35:安全开发-JavaEE应用原生反序列化重写方法链条分析触发类类加载

目录 Java-原生使用-序列化&反序列化 Java-安全问题-重写方法&触发方法 Java-安全问题-可控其他类重写方法 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&…

数据结构顺序表的操作,窗口界面(c语言版)

// 准备头文件 #include <stdio.h> #include <stdlib.h>#define InitSize 10 // 动态顺序表的初始默认长度// 定义C语言的bool变量 #define bool char #define true 1 #define false 0/* 定义数据元素的数据类型 */ typedef int ElemType; // 方便更改// 动态顺…

职场逆袭!如何打造‘黄金简历’

现在的职场&#xff0c;无论是哪个行业都特别卷&#xff0c;想要找到一份满意&#xff0c;不仅要求你要拥有丰富的工作经验&#xff0c;而且还要求你的简历足够精彩&#xff0c;这样才能在一众求职者中脱颖而出&#xff01; 一、希赛老师在线指导 之前&#xff0c;小赛分享了…

从0到1了解工业物联网,只需掌握这七点!

目录 1、什么是工业物联网&#xff1f; 2、为什么需要工业物联网&#xff1f; 3、工业物联网与物联网的区别&#xff1f; 4、工业物联网与工业互联网的区别&#xff1f; 5、工业物联网有哪些典型特征&#xff1f; 6、工业物联网方案架构&#xff1f; 7、工业物联网有哪些…

用了一个select框出现的问题许多问题差不多搞了一个多小时最后还是百度解决了,百度伟大

问题出现 问题描述 select 多选框里的数据问题&#xff0c;我讲获取的数据信息放入框ref(null) 中&#xff0c;将数据返回到返回框里&#xff0c;一直发现存在问题&#xff0c;不能正常显示&#xff0c;百度里一下&#xff0c;发现没有百度到其他问题&#xff0c;最后换了一种…

【网络安全】-数字证书

数字证书 数字证书是互联网通讯中用于标志通讯各方身份信息的一串数字或数据&#xff0c;它为网络应用提供了一种验证通信实体身份的方式。具体来说&#xff0c;数字证书是由权威的证书授权&#xff08;CA&#xff09;中心签发的&#xff0c;包含公开密钥拥有者信息以及公开密…

29个社媒营销经典案例!外贸人速来学习!

今天给大家分享一些比较经典的外贸社媒营销案例&#xff0c;希望对大家有帮助&#xff01; 01 创建重复的内容系列 如果你每天都在为决定要在社交媒体上发布什么内容而焦头烂额&#xff0c;那就创建一些你擅长的重复内容系列和主题。 例如&#xff0c;有人经常分享鼓舞人心的…

JAVA实战开源项目:校园失物招领管理系统(Vue+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 招领管理模块2.2 寻物管理模块2.3 系统公告模块2.4 感谢留言模块 三、界面展示3.1 登录注册3.2 招领模块3.3 寻物模块3.4 公告模块3.5 感谢留言模块3.6 系统基础模块 四、免责说明 一、摘要 1.1 项目介绍 校园失物招领…

Java实现Tron(波场)区块链的开发实践(三)波场链水龙头、WEB3测试实战

上一节我们具体讲到Java实现Tron波场链的逻辑代码实现。 这一节我们通过部署和开发好的代码&#xff0c;针对测试链进行自测开发&#xff0c;准备测试环境。 1. 创建离线地址 首先我们需要一个离线地址&#xff0c;我们不需要在线进行创建&#xff0c;直接可以通过第一节的离…

py脚本模拟json数据,StructuredStreaming接收数据存储HDFS一些小细节 ERROR:‘path‘ is not specified

很多初次接触到StructuredStreaming 应该会写一个这样的案例 - py脚本不断产生数据写入linux本地&#xff0c; 通过hdfs dfs 建目录文件来实时存储到HDFS中 1. 指定数据schema&#xff1a; 实时json数据 2. 数据源地址&#xff1a;HDFS 3. 结果落地位置&#xff1a; HDFS …

PostgreSQL索引篇 | Hash索引

PostgreSQL版本为8.4.1 &#xff08;本文为《PostgreSQL数据库内核分析》一书的总结笔记&#xff0c;需要电子版的可私信我&#xff09; 索引篇&#xff1a; PostgreSQL索引篇 | BTreePostgreSQL索引篇 | GIN索引PostgreSQL索引篇 | Gist索引PostgreSQL索引篇 | TSearch2 全文…

哪里下载短视频素材?推荐几个短视频素材下载网站

当短视频行业的迅速崛起&#xff0c;剪辑影视短片的魅力无法抗拒&#xff0c;越来越多朋友爱看短视频&#xff0c;但从哪里找到高清、无水印和无字幕的短视频素材呢&#xff1f;今天&#xff0c;我将为大家推荐几个可获取短视频素材的优秀网站&#xff0c;下面让我们一起去看看…

使用helm部署clickhouse

&#xff08;作者&#xff1a;陈玓玏&#xff09; 前置条件 已安装 Kubernetes 集群&#xff1b; 已安装 Helm 包管理工具。 部署 1 添加 RadonDB ClickHouse 的 Helm 仓库 helm repo add ck https://radondb.github.io/radondb-clickhouse-kubernetes/ helm repo upd…

函数的传入参数-传参定义

基于函数的定义语法&#xff1a; def 函数名&#xff08;传入参数&#xff09;函数体return 返回值 可以有如下函数定义&#xff1a; def add(x,y):return xyprint(f"{x} {y}的结果是&#xff1a;{result}") 实现了&#xff0c;每次计算的是xy&#xff0c;而非…

raid0、raid1、raid5、raid10选哪个?一文给你答案!

下午好&#xff0c;我的网工朋友。 关于磁盘阵列的用法&#xff0c;总有朋友对其用途与功能一知半解&#xff0c;很容易弄混。 而我们在做监控项目存储时&#xff0c;经常会用到磁盘阵列。 什么是磁盘阵列&#xff1f;为什么要做磁盘阵列&#xff1f;用什么样的磁盘阵列合适…

三次握手,四次挥手基本概念及其抓包演示

目录 1.tcp三次握手 2.tcp四次挥手 3.思考问题(面试常考) 3.1 三次握手时可能出现什么攻击? 3.2 为什么是三次握手,可不可以是两次,为什么? ​编辑3.3 四次挥手的过程可以用三次完成吗? 4.抓包演示三次握手四次挥手 1.tcp三次握手 tcp协议特点:面向连接的,可靠的,流式…