CSS新特性
过渡
作用:让元素的样式慢慢的变化,常配合hover使用,增强网页交互体验
属性名:transition
使用: transition:all 1s ( 过渡时长:数字+s 秒)
注意点:
- 过渡需要:默认状态 和 hover状态样式不同,才能有过渡效果
- transition属性给需要过渡的元素本身加
transition属性设置在不同状态中,效果不同的① 给默认状态设置,鼠标移入移出都有过渡效果② 给hover状态设置,鼠标移入有过渡效果,移出没有过渡效果
<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>
div{
width: 200px;
height: 200px;
background: pink;
/* 过渡 一般放到元素本身,鼠标移入移出都有效果, 如果放到hover里面,只有移入才会有效果*/
/* transition: width 1s; *//* 宽度 1秒钟 */
/* transition: all 1s; */ /* 全部 1秒钟 */
}
div:hover{
width: 800px;
height: 400px;
transition: all 1s; /* 过渡放到hover里面,只有移入才有效果,移出时没有 */
}
</style>
</head>
<body>
<div></div>
</body>
位移
目标
使用translate实现元素位移效果
语法
transform: translate(水平移动距离, 垂直移动距离);
transform: translateX() 单独x轴
transform: translateY() 单独Y轴
取值(正负均可)
像素单位数值 百分比(参照物为盒子自身尺寸)
注意:X轴正向为右,Y轴正向为下
技巧
translate()如果只给出一个值, 表示x轴方向移动距离
单独设置某个方向的移动距离:translateX() & translateY()<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>
.father{
width: 500px;
height: 500px;
border:1px solid black;
}
.son{
width: 200px;
height: 100px;
background: pink;
transition: all 1s;/* 让儿子的移动有过渡效果 */
}
/* 鼠标移入盒子的时候,son改变位置 */
.father:hover .son{
/* 往右移动 */
/* transform: translateX(100px); */
transform: translateX(50%);/* 50%是相对于小盒子自身的 */
/* 往下移动 */
/* transform: translateY(100px); */
transform: translateY(50%);
/* 向右向下移动100px */
transform: translate(100px,100px);
/* translate里面只有一个值的话,表示往x轴的方向 */
transform:translate(300px) ;
}
</style>
</head>
<body>
<div class="father">
<div class="son"></div>
</div>
</body>
旋转
目标
使用rotate实现元素旋转效果
语法
transform: rotate(角度deg);
注意:角度单位是deg
技巧:取值正负均可
取值为正, 则顺时针旋转 取值为负, 则逆时针旋转<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>
img{
transition: all 1s;/* 过渡 */
}
img:hover{
/* 顺 */
transform: rotate(30deg);/* 旋转 */
/* 逆 */
transform: rotate(-30deg);/* 旋转 */
}
</style>
</head>
<body>
<img src="./img/rotate.png" alt="">
</body>
渐变
目标:
使用background-image属性实现渐变背景效果
特点
渐变是多个颜色逐渐变化的视觉效果
一般用于设置盒子的背景
语法
background-image: linear-gradient(颜色1,颜色2, );
background-image: linear-gradient(transparent, rgba(0,0,0, .6) );
取值
可以是关键字 或者 rgb rgba transparent(透明)
<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>
div{
width: 200px;
height: 200px;
background-image: linear-gradient(
pink,
hotpink
);
background-image: linear-gradient(
transparent,/* 透明 */
rgba(0,0,0,.5)
);
}
</style>
</head>
<body>
<div></div>
</body>
动画
概念
动画的本质是快速切换大量图片时在人脑中形成的具有连续性的画面
构成动画的最小单元:帧或动画帧
语法
1,先定义动画
@keyframes 动画名称 {
0%{
width: 200px;
}
100%{
width: 600px;
}
}
2, 使用动画
使用animation相关属性控制动画执行过程
animation: 动画名称 动画花费时长 ;
animation: change 1s infinite; (infinite 无限次重复动画)
注意
动画名称和动画时长必须赋值
取值不分先后顺序
如果有2个时间值,第一个时间表示动画时长,第二个时间表示延迟时间
<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>
div{
width: 200px;
height: 200px;
background: pink;
/* 二,使用动画 */
animation: change 1s infinite;
}
/* 一,定义动画 宽度从200变到600*/
/* @keyframes change {
from{
width: 200px;
}
to{
width: 600px;
}
} */
@keyframes change {
0%{
width: 200px;
}
100%{
width: 600px;
}
}
</style>
</head>
<body>
<div></div>
</body>
flex布局
概念
Flex布局/弹性布局:
是一种浏览器提倡的布局模型
布局网页更简单、灵活
避免浮动脱标的问题
作用
基于 Flex 精确灵活控制块级盒子的布局方式,避免浮动布局中脱离文档流现象发生。 <br /> Flex布局非常适合结构化布局
设置方式
父元素添加 display: flex,子元素可以自动的挤压或拉伸
<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>
.father{
display: flex;
/* height: 300px; *//* 父元素不会受到子元素脱标的影响,依然有高度 */
justify-content: space-between;/* 很方便的控制元素的显示效果 */
background: pink;
}
.son{
/* float: left; */
width: 100px;
height: 100px;
background: skyblue;
}
</style>
</head>
<body>
<!-- .father>.son{$}*3 -->
<div class="father">
<div class="son">1</div>
<div class="son">2</div>
<div class="son">3</div>
</div>
</body>
组成部分
1 弹性容器(父元素)<br /> 2 弹性盒子(子元素)<br /> 3 主轴(默认是水平方向,元素就会水平排布)<br /> 4 侧轴/交叉轴
<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>
.father{
/* 1,在父级中设置布局方式 : 视觉效果:元素水平排布*/
/* 水平排布的原因: 默认主轴在水平方向,弹性盒子,都是沿着主轴排布 */
display: flex;
height: 300px;
background: pink;
}
.son{
width: 100px;
height: 100px;
background: skyblue;
}
</style>
</head>
<body>
<!-- .father>.son{$}*3 -->
<div class="father">
<div class="son">1</div>
<div class="son">2</div>
<div class="son">3</div>
</div>
</body>
主轴对齐方式
在Flex布局模型中,调节主轴或侧轴的对齐方式来设置盒子之间的间距。
修改主轴对齐方式属性: justify-content
flex-start 默认 从左边开始
center 水平居中
space-between 间隙就在子元素之间(两边没有间隙)
space-around 两边有间隙,并且两边的间隙是中间间隙的一半
space-evenly 间隙等分
<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>
.father{
/* 1,在父级中设置布局方式 : 视觉效果:元素水平排布*/
/* 水平排布的原因: 默认主轴在水平方向,弹性盒子,都是沿着主轴排布 */
display: flex;
/* 设置主轴对齐方式 */
/* 不常用 */
justify-content: flex-start;/* 默认:从左开始 */
justify-content: flex-end;/* 默认 从右边开始 */
/* 居中 */
justify-content: center;
/* 间距在弹性盒子(子级元素)之间 */
justify-content: space-between;
/* 所有地方的间距都相等 */
justify-content: space-evenly;
/* 间距加在子级两侧 */
/* 视觉效果:子级之间的距离是父级两头距离的2倍 */
justify-content: space-around;
height: 300px;
background: pink;
}
.son{
width: 100px;
height: 100px;
background: skyblue;
}
</style>
</head>
<body>
<!-- .father>.son{$}*3 -->
<div class="father">
<div class="son">1</div>
<div class="son">2</div>
<div class="son">3</div>
</div>
</body>
侧轴对齐方式
修改侧轴对齐方式属性:
align-items(添加到弹性容器)
flex-start 默认 从上面开始
center 垂直居中
stretch 拉伸 默认(子元素不写高度的情况下)
<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>
.father{
/* 1,在父级中设置布局方式 : 视觉效果:元素水平排布*/
/* 水平排布的原因: 默认主轴在水平方向,弹性盒子,都是沿着主轴排布 */
display: flex;
/* 设置侧轴对齐方式 */
/* 几乎不用 */
/* align-items: flex-start */ /* 默认 上面排布 */
/* align-items: flex-end; */ /* 下面排布*/
/* 居中 */
/* align-items: center; */
/* 拉伸,默认值(测试的时候,需要去掉子级的高度,才有效果) */
align-items: stretch;
height: 300px;
background: pink;
}
.son{
width: 100px;
/* height: 100px; */
background: skyblue;
}
</style>
</head>
<body>
<!-- .father>.son{$}*3 -->
<div class="father">
<div class="son">1</div>
<div class="son">2</div>
<div class="son">3</div>
</div>
</body>
**align-self:** 控制某个弹性盒子在侧轴的对齐方式(添加到弹性盒子),即单独修改某个子级元素的属性
<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>
.father{
/* 1,在父级中设置布局方式 : 视觉效果:元素水平排布*/
/* 水平排布的原因: 默认主轴在水平方向,弹性盒子,都是沿着主轴排布 */
display: flex;
height: 300px;
background: pink;
}
.son{
width: 100px;
height: 100px;
background: skyblue;
}
.son:nth-child(2){
align-self: center;/* 单独设置第二个子级元素侧轴居中对齐 */
}
</style>
</head>
<body>
<!-- .father>.son{$}*3 -->
<div class="father">
<div class="son">1</div>
<div class="son">2</div>
<div class="son">3</div>
</div>
</body>
弹性盒子尺寸特点
特点总结
给宽给高,就按你给的走,不给,就按内容走,如果有拉伸,就拉伸的跟它的父级一样大
<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>
.father{
/* 1,在父级中设置布局方式 : 视觉效果:元素水平排布*/
/* 水平排布的原因: 默认主轴在水平方向,弹性盒子,都是沿着主轴排布 */
display: flex;
height: 300px;
background: pink;
}
.son{
/* width: 100px; */ /*如果去掉宽度,1,2,3都是靠自己的的内容决定宽度 */
/* height: 100px; */ /* 如果去掉高度,1,3就会被拉伸跟父级一样的高度(默认是stretch),2由于单独设置了居中,靠内容撑开 */
background: skyblue;
}
.son:nth-child(2){
align-self: center;/* 单独设置第二个子级元素侧轴居中对齐 */
}
/* 特点总结
给宽给高,就按你给的走,不给,就按内容走,如果有拉伸,就拉伸的跟它的父级一样大
*/
</style>
</head>
<body>
<!-- .father>.son{$}*3 -->
<div class="father">
<div class="son">11111</div>
<div class="son">2</div>
<div class="son">3</div>
</div>
</body>
伸缩比
使用flex属性修改弹性盒子伸缩比,实现盒子宽度不一样
flex:数值 取父元素剩余宽度的xx份
属性
flex : 值;
取值分类
数值(整数)
注意 : 只占用父盒子剩余尺寸
<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>
.father{
/* 1,在父级中设置布局方式 : 视觉效果:元素水平排布*/
/* 水平排布的原因: 默认主轴在水平方向,弹性盒子,都是沿着主轴排布 */
display: flex;
height: 300px;
background: pink;
}
.son{
height: 100px;
margin: 0 20px;/* 为了让子级之间有间距,设置左右外边距为20px */
background: skyblue;
}
.son:nth-child(1){
width: 50px;
}
.son:nth-child(2){
flex: 1;/* 只占用父级剩余尺寸的一份 */
}
.son:nth-child(3){
flex: 2;/* 只占用父级剩余尺寸的二份 */
}
</style>
</head>
<body>
<!-- .father>.son{$}*3 -->
<div class="father">
<div class="son">1</div>
<div class="son">2</div>
<div class="son">3</div>
</div>
</body>
主轴方向
使用flex-direction改变元素排列方向
主轴默认是水平方向, 侧轴默认是垂直方向
修改主轴方向属性: flex-direction
修改轴向
flex-direction: column 此时主轴就是垂直方向,侧轴就变成水平方向了
如果要实现水平居中:align-items:center
如果要实现垂直居中:justify-content:center
修改轴向示例:
<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>
li{
list-style: none;
width: 80px;
height: 80px;
border: 1px solid black;
display: flex;
/* 修改主轴方向: 列的方向 */
/* 视觉效果:以前图片和文字是横着排布的,现在变成竖着排布了 */
flex-direction: column;
}
img{
width: 32px;
height: 32px;
}
</style>
</head>
<body>
<!-- div>ul>li>img+span -->
<div>
<ul>
<li><img src="img/media.png" alt=""><span>媒体</span></li>
</ul>
</div>
</body>
修改轴向后的对齐方式示例:
<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>
li{
list-style: none;
width: 80px;
height: 80px;
border: 1px solid black;
display: flex;
/* 修改主轴方向: 列的方向 */
/* 视觉效果:以前图片和文字是横着排布的,现在变成竖着排布了 */
flex-direction: column;
/* 视觉效果: 实现子级元素水平居中 因为侧轴现在在水平方向上 */
align-items: center;
/* 视觉效果: 实现子级元素垂直居中 因为主轴现在在垂直方向上*/
justify-content: center;
/*
一旦修改了轴向(先确定主轴方向,再选择对应的属性实现主轴或者侧轴对齐方式)
*/
}
img{
width: 32px;
height: 32px;
}
</style>
</head>
<body>
<!-- div>ul>li>img+span -->
<div>
<ul>
<li><img src="img/media.png" alt=""><span>媒体</span></li>
</ul>
</div>
</body>
弹性盒子换行
弹性盒子换行显示 : flex-wrap: wrap;
使用flex-wrap属性
默认是不换行的,取值为nowrap
如果需要换行,修改值为wrap
<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>
.father{
display: flex;
/* 默认值:不换行 */
flex-wrap: nowrap;
/* 换行 */
flex-wrap: wrap;
height: 500px;
background: pink;
}
.son{
width: 100px;
height: 100px;
background: skyblue;
}
.son:nth-child(1){
background: red;
}
.son:nth-child(2){
background: green;
}
</style>
</head>
<body>
<div class="father">
<div class="son">1</div>
<div class="son">2</div>
<div class="son">3</div>
<div class="son">4</div>
<div class="son">5</div>
<div class="son">6</div>
<div class="son">7</div>
<div class="son">8</div>
</div>
</body>
调整行的对齐方式 :align-content (取值与justify-content基本相同)
center: 居中
space-around:中间间隙是两边间隙的两倍
space-between:两边没有间隙
<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>
.father{
display: flex;
/* 默认值:不换行 */
flex-wrap: nowrap;
/* 换行 */
flex-wrap: wrap;
/* 设置行的对齐方式 */
align-content: center;/* 居中 */
align-content: space-around;/* 中间间隙是两边间隙的两倍 */
align-content: space-between;/* 两边没有间隙 */
height: 500px;
background: pink;
}
.son{
width: 100px;
height: 100px;
background: skyblue;
}
.son:nth-child(1){
background: red;
}
.son:nth-child(2){
background: green;
}
</style>
</head>
<body>
<div class="father">
<div class="son">1</div>
<div class="son">2</div>
<div class="son">3</div>
<div class="son">4</div>
<div class="son">5</div>
<div class="son">6</div>
<div class="son">7</div>
<div class="son">8</div>
</div>
</body>