CSS transform属性允许对某一个元素进行某些形变, 包括旋转,缩放,倾斜或平移等。
transform
是形变的意思,transformer就是变形金刚;
注意事项: 并非所有的盒子都可以进行transform的转换(通常行内级元素不能进行形变)
所以,transform对于行内级非替换元素是无效的;
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>Documenttitle>
<style>
.container {
display: inline-block;
border: 5px solid #f00;
}
.container .box {
width: 200px;
height: 200px;
background-color: orange;
transform: translate(100px, 100px);
}
style>
head>
<body>
<div class="container">
<div class="box">div>
div>
body>
html>
transform
属性的语法如下:
常见的函数transform function有:
translate(x, y)
scale(x, y)
rotate(deg)
skew(deg, deg)
通过上面的几个函数,我们可以改变某个元素的形变
◼ 平移:translate(x, y)
translate
本身可以表示翻译的意思,在物理上也可以表示平移;◼ 值个数
◼ 值类型:
补充:
translate
是translateX
和translateY
函数的简写。
translate
的百分比可以完成一个元素的水平和垂直居中:translate
函数相对于flex布局的兼容性会好一点点
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>Documenttitle>
<style>
.container {
display: inline-block;
border: 5px solid #f00;
}
.container .box {
width: 200px;
height: 100px;
background-color: orange;
/* 百分比: 你的百分比是相对于谁? */
/* 不同地方的百分比相对参照物是不一样 */
/* traslate的百分比是相对于自身的 */
/* 如果设置的x位移: 那么参考的是自身的宽度 */
/* 如果设置的y位移: 那么参考的是自身的高度 */
transform: translate(100%, 100%);
/* transform: translate(x, y); */
/* transform: translateX();
transform: translateY(); */
}
style>
head>
<body>
<div class="container">
<div class="box">div>
div>
body>
html>
◼ 缩放:scale(x, y)
scale()
CSS 函数可改变元素的大小。◼ 值个数
◼ 值类型:
◼ scale函数时scaleX和scaleY的缩写:
scale3d
后续再了解;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>Documenttitle>
<style>
body {
text-align: center;
padding-top: 200px;
}
.container {
display: inline-block;
border: 20px solid #f00;
}
.box {
border: 20px solid #0f0;
width: 200px;
height: 200px;
background-color: orange;
/* 形变 */
transform: scale(60%, 60%);
}
.box1 {
border: 20px solid #0f0;
width: 200px;
height: 200px;
background-color: purple;
/* 形变 */
/* 0~1 对元素进行缩小 */
/* 大于1 对元素进行放大 */
/* transform: scale(1.2, 1.2); */
}
.box1:hover {
transform: scale(1.1, 1.1);
}
style>
head>
<body>
<div class="container">
<div class="box">div>
div>
<div class="container">
<div class="box1">div>
div>
body>
html>
◼ 旋转:rotate()
◼ 值个数
◼ 值类型:
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>Documenttitle>
<style>
body {
text-align: center;
padding-top: 200px;
}
.container {
display: inline-block;
border: 10px solid #f00;
}
.box {
width: 200px;
height: 100px;
background-color: orange;
}
.box:hover {
transform: rotate(-45deg);
}
style>
head>
<body>
<div class="container">
<div class="box">div>
div>
body>
html>
◼ transform-origin:形变的原点
◼ 一个值:
◼ 两个值:
◼ 必须是
,
,或 left, center, right, top, bottom关键字中的一个
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>Documenttitle>
<style>
body {
text-align: center;
padding-top: 200px;
}
.container {
display: inline-block;
border: 10px solid #f00;
}
.box {
width: 200px;
height: 100px;
background-color: orange;
/* 修改当前元素的形变的原点位置 */
/* transform-origin: center top; */
/* transform-origin: 20px 20px; */
transform-origin: 10% 10%;
}
.box:hover {
transform: rotate(45deg) scale(0.5);
}
style>
head>
<body>
<div class="container">
<div class="box">div>
div>
body>
html>
◼ 倾斜:skew(x, y)
◼ 值个数
◼ 值类型:
◼ 注意:倾斜的原点受transform-origin
的影响
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>Documenttitle>
<style>
.box {
font-style: italic;
width: 200px;
height: 100px;
background-color: orange;
}
.box:hover {
transform: skew(10deg, 10deg);
}
style>
head>
<body>
<div class="box">我是div元素div>
body>
html>
◼ 前面我们看到了 transform 的语法,它是可以设置多个transform-function的:
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>Documenttitle>
<style>
.box {
width: 200px;
height: 100px;
background-color: orange;
}
.box:hover {
/* transform: translateX(50px);
transform: scale(1.2);
transform: rotate(45deg); */
/*
+
+: 一个或者多个, 并且多个之间以空格分隔
transform: scale() translate();
#
#: 一个或者多个, 多个之间以, 分隔
box-shadow: 1px 1px 1px 1px #f00,
*/
transform: translate(50px) scale(1.2) rotate(45deg);
}
style>
head>
<body>
<div class="box">div>
body>
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>Documenttitle>
<style>
.container {
/* position: relative; */
/* display: flex;
align-items: center; */
height: 300px;
background-color: orange;
}
.box1 {
position: absolute;
width: 100px;
/* height: 100px; */
top: 0;
bottom: 0;
margin: auto 0;
background-color: #f00;
}
.box2 {
background-color: #f00;
}
.box3 {
display: inline-block;
height: 100px;
background-color: #f00;
/* 两件事情:
1.让元素向下位移父元素的50%
2.让元素向上位移自身的50%
*/
/* margin-top的百分比是相对于包含块(父元素)的宽度 */
/* margin-top: 50%; */
position: relative;
top: 50%;
transform: translate(0, -50%);
}
style>
head>
<body>
<div class="container">
<div class="box3">coderdiv>
aaaaa
div>
body>
html>
◼ 什么是transition动画呢?
◼ 通常将两个状态之间的过渡称为隐式过渡(implicit transitions),因为开始与结束之间的状态由浏览器决定。
◼ CSS transitions 可以决定
◼ 并非所有的CSS属性都可以执行动画的,那么我们如何知道哪些属性支持动画呢?
◼ 方法一:在MDN可执行动画的CSS属性中查询
◼ 方法二:阅读CSS属性的文档说明
◼ transition CSS 属性是 transition-property,transition-duration,transition-timing-function 和 transition-delay 的一个简 写属性。
◼ transition-property
:指定应用过渡属性的名称
◼ transition-duration
:指定过渡动画所需的时间
◼ transition-timing-function
:指定动画的变化曲线
◼ transition-delay
:指定过渡动画执行之前的等待时间
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>Documenttitle>
<style>
.container {
background-color: #f00;
}
.box {
position: relative;
left: 0;
width: 200px;
height: 100px;
background-color: orange;
/* 告知浏览器 box 在进行一些CSS属性变化的时候有一个过渡效果 */
/* transition-property: transform, left; */
/* transition-property: all;
transition-duration: 1s;
transition-timing-function: ease-in;
transition-delay: 1s; */
/* 简写属性 */
transition: all 1s ease-in 1s;
}
.container:hover .box {
left: 100px;
transform: translate(100px);
width: 500px;
}
style>
head>
<body>
<div class="container">
<div class="box">div>
div>
body>
html>
◼ 之前我们学习了transition来进行过渡动画,但是过渡动画有如下的缺点:
◼ 如果我们希望可以有更多状态的变化,我们可以使用 CSS Animation。
◼ CSS Animation的使用分成两个步骤:
步骤一:使用 keyframes 定义动画序列(每一帧动画如何执行)
步骤二:配置动画执行的名称、持续时间、动画曲线、延迟、执行次数、方向等等
◼ 接下来我们一个个步骤来学习。
◼ 可以使用@keyframes
来定义多个变化状态,并且使用animation-name来声明匹配:
percentage
来指定动画发生的时间点;◼ 也就是说可以使用from和to关键字:
◼ CSS animation 属性是 animation-name,animation-duration, animation-timing-function,animation-delay,animation-iteration-count,animation-direction,animation-fill-mode 和 animation-play-state 属性的一个简写属性形式。
◼ animation-name:指定执行哪一个关键帧动画
◼ animation-duration:指定动画的持续时间
◼ animation-timing-function:指定动画的变化曲线
◼ animation-delay:指定延迟执行的时间
◼ animation-iteration-count:指定动画执行的次数,执行infinite表示无限动画
◼ animation-direction:指定方向,常用值normal和reverse
◼ animation-fill-mode:执行动画最后保留哪一个值
◼ animation-play-state:指定动画运行或者暂停(在JavaScript中使用,用于暂停动画)
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>Documenttitle>
<style>
.box {
width: 200px;
height: 100px;
background-color: orange;
/* box要执行moveAnim的动画 */
animation-name: moveAnim;
animation-duration: 3s;
animation-timing-function: ease-in-out;
/* 其他属性: */
/* 动画执行的次数 */
/* animation-delay: 2s; */
/* animation-iteration-count: 2; */
/* animation-direction: reverse; */
/* 元素停留在动画的哪一个位置 */
/* animation-fill-mode: forwards; */
/* js动态修改 */
/* animation-play-state: paused; */
animation: moveAnim 3s linear 1s 2 normal forwards, ;
}
@keyframes moveAnim {
0% {
transform: translate(0, 0) scale(0.5, 0.5);
}
33% {
transform: translate(0, 200px) scale(1.2, 1.2);
}
66% {
transform: translate(400px, 200px) scale(1, 1);
}
100% {
transform: translate(400px, 0) scale(0.5, 0.5);
}
}
style>
head>
<body>
<div class="box">
div>
body>
html>