Web进阶:Day2 空间转换、动画

简介: Web进阶:Day2 空间转换、动画

Web进阶:Day2

Date: January 4, 2023

Summary: 空间转换、动画


空间转换

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


空间转换也叫3D转换


属性:transform

b41f125b4c942b71654801fdb4a1541f.png

语法:

transform: translate3d(x, y, z);
transform: translateX(值);
transform: translateY(值);
transform: translateZ(值);

取值(正负均可)


像素单位数值、百分比


案例:


Code:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>空间位移</title>
  <style>
    .box {
      width: 200px;
      height: 200px;
      margin: 100px auto;
      background-color: pink;
      transition: all 0.5s;
    }
    .box:hover {
      /* transform: translate3d(50px, 100px, 200px); */
      transform: translateX(100px);
      transform: translateY(100px);
      transform: translateZ(100px);
    }
  </style>
</head>
<body>
  <div class="box"></div>
</body>
</html>

透视

透视概念


透视距离也称为视距,所谓的视距就是人的眼睛到屏幕的距离


属性(添加给父级)


perspective: 值;


取值:像素单位数值, 数值一般在800 – 1200


透视距离也称为视距,所谓的视距就是人的眼睛到屏幕的距离。

6792082fb66336a6c5ce74b7e72affea.png

作用


空间转换时,为元素添加近大远小、近实远虚的视觉效果


案例:

2d7f860a04d058e736948596e704eaad.png

<style>
    body {
      /* 为了实现透视的效果,需要设置一下父级 */
      /* perspective 是为了设置人眼和屏幕的距离 */
      perspective: 1000px;
      /* perspective: 200px; */
      /* perspective: 10000px; */
    }
    .box {
      width: 200px;
      height: 200px;
      margin: 100px auto;
      background-color: pink;
      transition: all 0.5s;
    }
    .box:hover{
      transform: translateZ(200px);
      /* transform: translateZ(-200px); */
    }
  </style>

空间旋转

语法:

/*沿着Z轴转*/
transform: rotateZ(值);
transform: rotateX(值);
transform: rotateY(值);

案例:X轴负向旋转

713ea93f026375b6c2a370949fec1b54.png

Code:

<!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>空间旋转-X轴</title>
    <style>
        .box {
            width: 300px;
            margin: 100px auto;
        }
        img {
            width: 300px;
            transition: all 2s;
        }
        .box {
            /* 透视效果:近大远小,近实远虚 */
            perspective: 1000px;
        }
        .box img:hover {
            transform: rotateX(60deg);
            transform: rotateX(-60deg);
        }
    </style>
</head>
<body>
    <div class="box">
        <img src="./images/hero.jpeg" alt="">
    </div>
</body>
</html>

**注意:**需要添加视距perspective, 效果更好


左手法则

左手法则


判断旋转方向:


1.左手握住旋转轴

2.拇指指向正值方向

3.手指弯曲方向为旋转正值方向

85883e87119a7951b2248cd5b2293414.png


拓展:了解


rotate3d(x, y, z, 角度度数) :用来设置自定义旋转轴的位置及旋转的角度


x,y,z 取值为0-1之间的数字


立体呈现

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


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


实现方法

添加 transform-style: preserve-3d;


使子元素处于真正的3d空间


默认值flat,表示子元素处于2D平面内呈现


呈现立体图形步骤


1.盒子父元素添加 transform-style: preserve-3d;

2.按需求设置子盒子的位置(位移或旋转)

110e3ab6ea8483f7989646e5454aae92.png

Code:

<!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>立体呈现</title>
    <style>
        .cube {
            position: relative;
            width: 200px;
            height: 200px;
            margin: 100px auto;
            background-color: pink;
            transition: all 2s;
            transform-style: preserve-3d;
        }
        .cube div {
            position: absolute;
            width: 200px;
            height: 200px;
            /* 将位置定在左上角开始 */
            left: 0;
            top: 0;
        }
        .front {
            background-color: orange;
            /* 
                向我走近200px 没有设置perspective 
                仅为让橙色在绿色上面
            */
            transform: translateZ(200px);
        }
        .back {
            background-color: green;
        }
        /* cube hover 为了看空间感效果 */
        .cube:hover {
            transform: rotateY(90deg);
        }
    </style>
</head>
<body>
    <div class="cube">
        <div class="front">前面</div>
        <div class="back">后面</div>
    </div>
</body>
</html>

注意:


1.空间内,转换元素都有自已独立的坐标轴,互不干扰


3D导航

思考:绿色和橙色盒子是如何摆放的?


搭建立方体


绿色盒子是立方体的前面


橙色盒子是立方体的上面

51115276935472f1ea3256028d484666.png

结论: 绿色和橙色部分共需要3个标签


1个父级标签


绿色和橙色共2个标签(子级)


实现思路

1.搭建立方体:绿色盒子是立方体的前面,橙色盒子是立方体的上面

2.添加hover状态旋转切换效果

c2c8560ccc0f8eb18e12fdf7737a49c0.png


实现思路

1.搭建立方体

li标签

   添加立体呈现属性`transform-style: preserve-3d;`
   添加旋转属性(为了便于观察效果,案例完成后删除即可)

a标签


调节位置


2.搭建立方体


调节a标签的位置

a标签定位(子绝父相)


英文部分添加旋转和位移样式


中文部分添加位移样式

a1722f2305ac6dc477b528e2e6e87688.png

2.过渡效果

鼠标滑过li, 添加空间旋转样式


li添加过渡属性


注意: 案例完成后,删除li的旋转样式。


Code:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>3D导航</title>
    <style>
        ul {
            margin: 0;
            padding: 0;
            list-style: none;
        }
        .navs {
            width: 300px;
            height: 40px;
            margin: 50px auto;
        }
        .navs li {
            position: relative;
            float: left;
            width: 100px;
            height: 40px;
            line-height: 40px;
            transition: all .5s;
            transform-style: preserve-3d;
            /* 旋转: 让大家在写代码的过程中看到立体盒子 */
            /* transform: rotateX(-20deg) rotateY(30deg); */
            /* 测试缩放效果 */
            /* 三个方向都进行缩放 */
            /* transform: scale3d(0.5, 1.1, 2); */
        }
        .navs li a {
            position: absolute;
            left: 0;
            top: 0;
            display: block;
            width: 100%;
            height: 100%;
            text-align: center;
            text-decoration: none;
            color: #fff;
        }
        .navs li a:first-child {
            background-color: green;
            transform: translateZ(20px);
        }
        .navs li a:last-child {
            background-color: orange;
            /* 躺平x轴旋转  立方体的顶部,位移z(确保看到这个盒子) */
            transform: rotateX(90deg) translateZ(20px);
        }
        /* li:hover 立方体旋转 */
        .navs li:hover {
            transform: rotateX(-90deg);
        }
    </style>
</head>
<body>
    <div class="navs">
        <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>
</html>


空间缩放

使用scale实现空间缩放效果

语法:

transform: scaleX(倍数);
transform: scaleY(倍数);
transform: scaleZ(倍数);
transform: scale3d(x, y, z);

注:代码在上面例子中


动画

动画基础

思考:过渡可以实现什么效果?


答:实现2个状态间的变化过程


动画效果:


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


动画原理:


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

构成动画的最小单元:帧或动画帧


实现步骤:


1.定义动画

@keyframes 动画名称 {
    from {}
    to {}
}
@keyframes 动画名称 {
    0% {}
    10% {}
    50% {}
    100% {}
}

使用动画

animation: 动画名称 动画花费时长

动画属性:

animation : 动画名称 动画时长 速度曲线 延迟时间 重复次数 动画方向 执行完毕时状态

注意:


动画名称和动画时长必须赋值


取值不分先后顺序


如果有2个时间值,第一个时间表示动画时长,第二个时间表示延迟时间


当然,我们这里也可以将属性拆分使用

78176acbb16274f3ad1ebf9765e43aef.png

复合写法案例:


Code:

<!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>动画实现步骤</title>
    <style>
        .box {
            width: 200px;
            height: 100px;
            background-color: pink;
            /* 使用动画 */
            animation: change 1s;
        }
        /* 一. 定义动画:从200变大到600 */
        /* @keyframes change {
            from {
                width: 200px;
            }
            to {
                width: 600px;
            }
        } */
        /* 二. 定义动画:200 到 500*300 到 800*500 */
        /* 百分比指的是动画总时长的占比 */
        @keyframes change {
            0% {
                width: 200px;
            }
            50% {
                width: 500px;
                height: 300px;
            }
            100% {
                width: 800px;
                height: 500px;
            }
        }
    </style>
</head>
<body>
    <div class="box"></div>
</body>
</html>

拆分写法案例:


Code:

<!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>animation拆分写法</title>
    <style>
        .box {
            width: 200px;
            height: 100px;
            background-color: pink;
            animation-name: change;
            animation-duration: 1s;
            animation-iteration-count: infinite;
        }
        .box:hover {
           /* 鼠标移入的时候暂停动画 */
           animation-play-state: paused;
        }
        @keyframes change {
            from {
                width: 200px;
            }
            to {
                width: 600px;
            }
        }
    </style>
</head>
<body>
    <div class="box"></div>
</body>
</html>

逐帧动画

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


补间动画与逐帧动画:

0b4b8df461a965f6b202775c956245b5.png

注意:一般的动画都是补间动画

9373c11e11bc2559c9807832a2b78cf8.png

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


animation-timing-function: steps(N);将动画过程等分成N份


Code :


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>精灵动画</title>
  <style>
    .box {
      /* 1680/12 : 保证显示区域的尺寸和一个精灵小图的尺寸相同 */
      width: 140px;
      height: 140px;
      /* border: 1px solid #000; */
      background-image: url(./images/bg.png);
      /* 12: 净零小图的个数 */
      animation: 
        move 1s steps(12) infinite,
        run 1s forwards
      ;
    }
    @keyframes move {
        /* from {
          background-position: 0 0;
        } */
        to {
          /* 1680: 精灵图的宽度 */
          background-position:  -1680px 0;
        }
    }
    /* 定义一个盒子移动的动画  800px */
    @keyframes run {
      /* 动画的开始状态和盒子的默认样式相同的, 可以省略开始状态的代码 */
      /* from {
        transform: translateX(0);
      } */
      to {
        transform: translateX(800px);
      }
    }
  </style>
</head>
<body>
  <div class="box"></div>
</body>
</html>

精灵动画制作步骤


准备显示区域


设置盒子尺寸是一张小图的尺寸,背景图为当前精灵图


定义动画


改变背景图的位置(移动的距离就是精灵图的宽度)


使用动画


添加速度曲线steps(N),N与精灵图上小图个数相同


添加无限重复效果

1c0f2751ba74e66b63bdd05ef147dbbb.png


综合案例

走马灯(无缝动画的做法)

目标:使用animation实现逐帧图片位移效果

1d99f1ee4dfd6f0d2d58cfa21bbb7a83.png

关键点:


把开头三张图片复制一份,放到尾部


当播放结束时,程序就会自动重新放映,从头开始,从而形成一种循环的感觉


Code:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
      li {
        list-style: none;
      }
      img {
        width: 200px;
      }
      .box {
        width: 600px;
        height: 112px;
        border: 5px solid #000;
        margin: 100px auto;
        overflow: hidden;
      }
      .box ul {
        width: 2000px;
        animation: move 5s infinite linear;
      }
      .box li {
        float: left;
      }
      /* 定义动画:位移, ul 左侧使用  x -1400  */
      @keyframes move {
        to {
          transform: translateX(-1400px);
        }
      }
      /* 用户鼠标移入box,动画暂停 */
      .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>
        <!-- 第567移动的时候,显示区域不能留白 -->
        <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>
</html>

全民出游季

知识点:


1.制作背景图

注意点:


1.html和body的高度都要写上100%

c968367681c7b36be24b7e4df1f394ee.png

1.图片的background-size需要做到cover

Code:

<!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>
    <link rel="stylesheet" href="./css/index.css">
</head>
<body>
    <!-- 云彩图片 -->
    <div class="cloud">
        <img src="./images/yun1.png" alt="">
        <img src="./images/yun2.png" alt="">
        <img src="./images/yun3.png" alt="">
    </div>
</body>
</html>
* {
    margin: 0;
    padding: 0;
}
/* 注意:html的默认高度和浏览器不是一样大的 */
html {
    height: 100%;
}
body {
    height: 100%;
    background: url(./../images/f1_1.jpg) no-repeat center;
    /* 缩放背景图 */
    /* 图片等比例缩放, 当宽度或高度和盒子尺寸相等, 图片就不再缩放 */
    /* background-size: contain; */
    /* 图片等比例缩放, 图片完全覆盖到整个盒子, 可能会导致图片显示不全 */
    background-size: cover;
}
/* 
1. img 引入图片, 控制位置
2. 定义动画,使用动画
*/
.cloud img {
    position: absolute;
    left: 50%;
    top: 0;
}
.cloud img:nth-child(1) {
    margin-left: -300px;
    top: 20px;
    animation: cloud 1s infinite alternate;
}
.cloud img:nth-child(2) {
    margin-left: 400px;
    top: 100px;
    /* 这里的0.2s指延迟时间 */
    animation: cloud 1s infinite alternate 0.2s;
}
.cloud img:nth-child(3) {
    margin-left: -550px;
    top: 200px;
    animation: cloud 1s infinite alternate 0.4s;
}
/* 云彩动画 */
@keyframes cloud {
    to {
        transform: translateX(20px);
    }
}


相关文章
|
8月前
|
网络协议 小程序 生物认证
Web应用&企业产权&指纹识别&域名资产&网络空间&威胁情报
Web应用&企业产权&指纹识别&域名资产&网络空间&威胁情报
|
6月前
|
前端开发
HTML+CSS动画实现动感3D卡片墙:现代Web设计的视觉盛宴
HTML+CSS动画实现动感3D卡片墙:现代Web设计的视觉盛宴
|
7月前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
【7月更文挑战第26天】在 Web 开发中, SQL 注入与 XSS 攻击常令人担忧, 但掌握正确防御策略可化解风险. 对抗 SQL 注入的核心是避免直接拼接用户输入至 SQL 语句. 使用 Python 的参数化查询 (如 sqlite3 库) 和 ORM 框架 (如 Django, SQLAlchemy) 可有效防范. 防范 XSS 攻击需严格过滤及转义用户输入. 利用 Django 模板引擎自动转义功能, 或手动转义及设置内容安全策略 (CSP) 来增强防护. 掌握这些技巧, 让你在 Python Web 开发中更加安心. 安全是个持续学习的过程, 不断提升才能有效保护应用.
73 1
|
7月前
|
缓存 JavaScript 前端开发
JavaScript进阶 - Web Workers与Service Worker
【7月更文挑战第4天】JavaScript的Web Workers和Service Worker增强了Web性能。Web Workers处理后台多线程,减轻主线程负担,但通信有开销,受同源策略限制。Service Worker则用于离线缓存和推送通知,需管理其生命周期、更新策略,并确保安全。两者都带来了挑战,但也极大提升了用户体验。通过理解和优化,开发者能构建更高效、安全的Web应用。
195 2
|
7月前
|
前端开发 开发者 Python
从零到一:Python Web框架中的模板引擎入门与进阶
【7月更文挑战第20天】模板引擎如Jinja2在Python Web开发中连接后端与前端,提高代码可读性和协作效率。Flask默认集成Jinja2,提供条件语句、循环、宏和模板继承等功能。例如,创建一个简单Flask应用,渲染&quot;Hello, World!&quot;,并展示如何使用条件语句和循环处理数据。通过宏定义重用代码,模板继承实现页面结构共享。学习模板引擎能提升开发效率和项目质量。
78 0
|
7月前
|
SQL 前端开发 数据库
Python Web开发进阶之路:从模板引擎到ORM的全面掌握
【7月更文挑战第19天】在Python Web开发中,提升技能的关键是理解和运用模板引擎(如Jinja2)与ORM技术。模板引擎,如在Flask中使用的Jinja2,使前端HTML与后端逻辑分离,便于维护。例如,通过路由函数`show_posts()`和`render_template()`呈现文章列表模板,用Jinja2的`for`循环展示内容。ORM,如SQLAlchemy,提供Pythonic的数据库操作,将表映射为类,SQL转化为方法调用。在博客系统中,定义Post模型并与数据库交互,展示了ORM简化数据管理的优势。通过实践这些工具,开发者能更好地驾驭复杂的Web项目。
79 0
|
8月前
|
JavaScript 前端开发 UED
在Web开发中,拖放(Drag and Drop)和动画效果是提升用户体验的重要工具
【6月更文挑战第12天】本文介绍了如何使用JavaScript实现拖放功能和基本动画效果。拖放功能通过监听mousedown、mousemove和mouseup事件,计算并更新元素位置实现。动画效果则利用requestAnimationFrame函数创建平滑移动的视觉效果。示例代码包括HTML结构和对应的JavaScript实现。
88 1
|
7月前
|
缓存 前端开发 JavaScript
JavaScript进阶 - Web Workers与Service Worker
【7月更文挑战第10天】在Web开发中,Web Workers和Service Worker提升性能。Workers运行后台任务,防止界面冻结。Web Workers处理计算密集型任务,Service Worker则缓存资源实现离线支持。常见问题包括通信故障、资源限制、注册错误及缓存更新。通过示例代码展示了两者用法,并强调生命周期管理和错误处理的重要性。善用这些技术,可构建高性能的Web应用。
198 0
|
7月前
|
缓存 JavaScript 前端开发
JavaScript进阶 - Web Workers与Service Worker
【7月更文挑战第6天】JavaScript的Web Workers和Service Worker增强了浏览器的性能处理和离线功能。Web Workers处理后台计算,减轻主线程压力,但通信有开销,受同源策略限制。Service Worker则能拦截网络请求,支持离线缓存和推送通知,但其生命周期和权限管理需谨慎处理。通过理解它们的工作原理和限制,开发者能创建更流畅、更健壮的Web应用。
223 0
|
9月前
|
网络协议 数据格式 Python
Python进阶---HTTP协议和Web服务器
Python进阶---HTTP协议和Web服务器
72 4

热门文章

最新文章