007:CSS3新特性:层次选择器、属性选择器、伪类选择器、文本阴影和盒子阴影、圆角、怪异盒模型、弹性盒、多列布局、响应式布局、rem布局、vw 布局、网格布局
目录
1:层次选择器 #box+p #box~p
(#second+p: 会选中id为second元素且和#box 同一个级别的第一个兄弟元素p,
#second~p: 会选中id为second元素且和#box 同一个级别的后面的所有兄弟元素,前面的兄弟元素不管)
2:属性选择器 div[class] div[class="box"] div[class~="box"] div[class^="box"] div[class*="box"] div[class$="box"]
3:伪类选择器
3.1: 结构性伪类选择器 li:first-child li:last-child li:nth-child(2) :root
3.2:目标伪类选择器 div:target(选中的 div)
3.3:UI 状态伪类选择器 input:enabled input:disabled input:checked p::selection
3.4:否认和动态伪类选择器 input:not(:enabled) a:link a:visited a:hover a:active [lvha]
4:阴影 text-shadow: h-shadow v-shadow blur color; box-shadow: h-shadow v-shadow blur spread color position;
5:圆角 border-radius: 10px 20px 30px 40px;
6:字体 @font-face
7:怪异盒模型 box-sizing: content-box; box-sizing: border-box;
8:弹性盒
9:多列布局
10:响应式布局(横屏检测)
11: px em rem 区别
12:rem 布局
13:vw、vh 布局
14:网格布局
正文
前言
一:层次选择器
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>层次选择器</title> <style> .box { background-color: aqua; } /* 群组选择器 */ .box, .box1 { background-color: red; } /* 后代选择器 后辈儿子、孙子之后等级别*/ .box li { background-color: blue; } /* 子代选择器 儿子级别 */ .box>ul>li{ background-color: purple; } /* 兄弟节点 层次选择器 +代表.li2后面的第一个兄弟节点 */ .box .li2+li { background-color: greenyellow; } /* 兄弟节点 层次选择器 ~代表.li2后面的第一个兄弟节点 */ .box .li2~li { background-color: green; } </style> </head> <body> <div class="box"> <ul> <li>box-1111</li> <li class="li2">box-2222</li> <li>box-3333</li> <li>box-4444</li> <li>box-5555</li> <li>box-6666</li> </ul> </div> <div class="box1"> <ul> <li>box1-1111</li> <li class="li12">box1-2222</li> <li>box1-3333</li> <li>box1-4444</li> <li>box1-5555</li> <li>box1-6666</li> </ul> </div> </body> </html>
详解
1:群组选择器
.box1, .box2
2:后代选择器
.box1 .box2
3:子代选择器
.box1>.box2
4:层次选择器
.box1+li
.box1~li
二:属性选择器
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>属性选择器</title> <style> div { width: 150px; height: 150px; background-color: aqua; } .box1 { background-color: red; } .box2 { background-color: blue; } .box3 { background-color: greenyellow; } .box4 { background-color: purple; } .box5 { background-color: fuchsia; } .box6 { background-color: gray; } .BoldSize { font-size: 20px; font-weight: bold; } /* 属性选择器 包含class属性 */ div[class] { background-color: cornflowerblue; } /* 属性选择器 包含class属性 完全匹配:当 class 属性值等于box1*/ div[class="box1"] { background-color: turquoise; } /* 属性选择器 包含class属性 包含匹配:当 class 属性值包含box1*/ div[class~="box1"] { background-color: teal; } /* 匹配正则表达式 以 box 开头*/ div[class^="box"] { background-color: chocolate; } /* 匹配正则表达式 模糊搜索box*/ div[class*="box"] { background-color: darkorchid; } /* 匹配正则表达式 以x1结尾*/ div[class$="x1"] { background-color: gold; } </style> </head> <body> <div class="box1" width="100px" height="200px">box1</div> <div class="box2">box2</div> <div class="box3">box3</div> <div class="box4">box4</div> <div class="box5">box5</div> <div class="box6">box6</div> <div class="BoldSize box1">box1 boldSize</div> <div class="BoldSize box2">box2 boldSize</div> </body> </html>
详解
3:伪类选择器
3.1: 结构性伪类选择器
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>伪类选择器-1:结构伪类选择器</title> <style> /* box 中的 li 标签集合中的第一个标签 */ .box1 li:first-child { background-color: aqua; } /* box 中的 li 标签集合中的最后一个标签 */ .box1 li:last-child { background-color: aqua; } /* box 中的 li 标签集合中的第二个 */ .box1 li:nth-child(2) { background-color: red; } /* box 中的 li 标签集合中偶数集合 */ .box1 li:nth-child(2n) { background-color: red; } /* box 中的 li 标签集合中偶数集合 */ .box1 li:nth-child(even) { background-color: blue; } /* box 中的 li 标签集合中奇数集合 */ .box1 li:nth-child(2n+1) { background-color: lawngreen; } /* box 中的 li 标签集合中奇数集合 */ .box1 li:nth-child(odd) { background-color: hotpink; } /* .box2 后代中有 p 的标签集合中 只有一个 p标签的 的元素 */ .box2 p:only-child { background-color: purple; } /* 根元素 */ :root, body { height: 100%; background-color: coral; } .box3:empty { background-color: aquamarine; width: 100px; height: 100px; } </style> </head> <body> <div class="box1"> <ul> <li>111111</li> <li>222222</li> <li>333333</li> <li>444444</li> <li>555555</li> <li>666666</li> </ul> </div> <div class="box2"> <p>box2</p> </div> <div class="box3"></div> </body> </html>
详解
3.2:目标伪类选择器
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>目标伪类选择器</title> <style> ul { position: fixed; right: 10px; top: 50px; } div { width: 200px; height: 300px; } div:target { background-color: red !important; } #a { background-color: aqua; } #b { background-color: hotpink; } #c { background-color: chocolate; } #d { background-color: blueviolet; } </style> </head> <body> <ul> <li><a href="#a">aaa</a></li> <li><a href="#b">bbb</a></li> <li><a href="#c">ccc</a></li> <li><a href="#d">ddd</a></li> </ul> <div id="a"></div> <div id="b"></div> <div id="c"></div> <div id="d"></div> </body> </html>
详解
3.3:UI 状态伪类选择器
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>UI元素伪类选择器</title> <style> /* 可用状态 */ input:enabled { background-color: blue; } /* 禁用状态 */ input:disabled { background-color: gray; } /* ** checkbox 需要去到原先的样式 appearance: none; ** */ input[type=checkbox] { /* 去掉默认样式 */ appearance: none; background-color: green; width: 20px; height: 20px; border: 1px solid red; } input:checked { background-color: indigo; } /*选中状态 */ p::selection { color: red; background-color: aqua; } </style> </head> <body> <form action=""> <input type="text"> <br> <input type="password" disabled> <br> <input type="checkbox" checked> <br> <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quis, debitis doloribus. Perferendis assumenda possimus, maxime unde alias praesentium illo repudiandae et deserunt deleniti! Animi magni alias quia tempora labore itaque!</p> </form> </body> </html>
详解
3.4:否认和动态伪类选择器
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>UI元素伪类选择器</title> <style> /* 可用状态 不是可用的,禁用状态 */ input:not(:enabled) { background-color: blue; } </style> </head> <body> <form action=""> <input type="text"> <br> <input type="password" disabled> <br> <input type="checkbox" checked> <br> <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quis, debitis doloribus. Perferendis assumenda possimus, maxime unde alias praesentium illo repudiandae et deserunt deleniti! Animi magni alias quia tempora labore itaque!</p> </form> </body> </html>
详解
四:文本阴影和盒子阴影
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>盒子阴影</title> <style> /* 文本阴影 */ .box1 { text-shadow: 1px 2px 3px red; } /* 1px: 水平方向位移 2px: 垂直方向位移 3px: 模糊程度,数值越大,越模糊 red: 颜色 */ .box2 { margin-top: 50px; width: 100px; height: 100px; background-color: aqua; /* 可以单独写 */ box-shadow: 10px 10px 10px #888888; /* 可以合些,用逗号拼接 */ box-shadow: 10px 10px 10px #888888, -10px -10px 10px red; /* 1px: 水平方向位移 2px: 垂直方向位移 3px: 模糊程度,数值越大,越模糊 red: 颜色 */ } </style> </head> <body> <div class="box1">文本阴影</div> <div class="box2">盒子阴影</div> </body> </html>
详解
五:圆角
1:圆角
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>圆角</title> <style> .box1 { width: 100px; height: 100px; background-color: blue; /* 四个角 */ /* border-radius: 10px; */ /* 左上右下10px 左下右上20px */ /* border-radius: 10px 20px; */ /* 左上、左下右上、右下 */ /* border-radius: 10px 20px 30px; */ /* 左上、右上、右下、左下 */ border-radius: 10px 20px 30px 40px; } .box2 { width: 100px; height: 100px; background-color: red; border-top-left-radius: 10px; border-top-right-radius: 10px; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px; } </style> </head> <body> <div class="box1"></div> <div class="box2"></div> </body> </html>
代码2:圆角、半圆、扇形
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>圆角的使用</title> <style> /* 圆形 */ .box1 { width: 100px; height: 100px; margin-bottom: 10px; background-color: aqua; text-align: center; line-height: 100px; /* 边框半径 大于50%都是圆 */ border-radius: 50px; border-radius: 50%; border-radius: 100%; } /* 椭圆 */ .box2 { width: 100px; height: 100px; margin-bottom: 10px; background-color: aqua; text-align: center; line-height: 100px; /* 边框半径 水平方向 垂直方向 */ border-radius: 10px/20px; border-radius: 10px 10px 10px 10px/20px 30px 40px 50px; } /* 半圆 */ .box3 { width: 200px; height: 100px; margin-bottom: 10px; background-color: aqua; text-align: center; line-height: 100px; /* 边框半径 宽度是高度的一倍。 左上 右上的偏移量是高度 */ border-radius: 100px 100px 0px 0px; } /* 扇形 */ .box4 { width: 100px; height: 100px; margin-bottom: 10px; background-color: aqua; text-align: center; line-height: 100px; /* 边框半径 宽度是高度的一倍。 左上 右上的偏移量是高度 */ border-radius: 100px 0px 0px 0px; } </style> </head> <body> <div class="box1">圆角</div> <div class="box2">椭圆</div> <div class="box3">半圆</div> <div class="box4">扇形</div> </body> </html>
六:字体引入
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>字体</title> <style> /* 使用 font-face 引入字体 */ @font-face { /* 自定义字体名字 */ font-family: zk; src: url(font/YeZiGongChangChuanQiuShaXingKai-2.ttf); } div { font-size: 30px; font-family: zk; text-shadow: 3px 1px 0px green; } </style> </head> <body> <div>字体使用</div> </body> </html>
详解
字体:见文件
七:怪异盒模型
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>怪异盒模型</title> <style> .box1 { width: 200px; height: 200px; background-color: aqua; border: 10px solid red; margin-bottom: 20px; /* 正常的盒子模型 */ box-sizing: content-box; } .box2 { width: 200px; height: 200px; background-color: teal; border: 10px solid red; /* 怪异盒模型 */ box-sizing: border-box; } </style> </head> <body> <div class="box1"></div> <div class="box2"></div> </body> </html>
详解
八:弹性盒
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>弹性盒</title> <style> .box { width: 500px; height: 500px; background-color: lightgray; margin: 0 auto; /* 1:弹性盒 */ display: flex; /* 2:弹性盒主轴 row 水平排列 column 垂直排列 row-reverse 横向取反 column-reverse 纵向取反 */ flex-direction: row ; /* 3:调整主轴对齐方向 flex-start 开始 flex-end 末端 center 中间 space-between 两端对齐 space-around 距离环绕 */ /* justify-content: flex-start; */ /* justify-content: center; */ /* justify-content: flex-end; */ /* justify-content: space-between; */ /* justify-content: space-around; */ /* 4:调整侧轴的对齐方式 */ align-items: flex-start; /* align-items: center; */ /* align-items: flex-end; */ /* 5:折行 */ /* flex-wrap: wrap; */ /* 6:调整折行后的行间距 flex-start 开始 flex-end 末端 center 中间 space-between 两端对齐 space-around 距离环绕 */ /* align-content: flex-start; */ } .box div { border: 1px solid red; margin: 3px; /* text-align: center; */ /* line-height: 100px; */ } .box1, .box3 { width: 100px; height: 100px; } .box2 { /* 7:项目对齐 Align-self flex-start center flex-end baseline stretch(不设置高度,撑开高度 ) 把折行去掉 */ align-self: stretch; /* 8: 宽高剩余 主轴 */ flex: 1; /* 9:调整顺序 */ order: 1; } </style> </head> <body> <!-- 弹性盒是一种新的布局方式,特别适合移动端布局 影响: 1。子元素默认横向排列 2.行内元素,变成了块级元素 3.只有一个元素的时候, margin:auto 自动居中 --> <div class="box"> <div class="box1">111</div> <div class="box2">222</div> <div class="box3">333</div> <!-- <div>444</div> <div>555</div> <div>666</div> <div>777</div> <div>888</div> <div>111</div> <div>222</div> <div>333</div> <div>444</div> <div>555</div> <div>666</div> <div>777</div> <div>888</div> --> </div> </body> </html>
九:多列布局
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>多列布局</title> <style> * { margin: 0; padding: 0; } html, body { height: 100%; } .box { /* 1:显示分几列 */ /* 共三列 */ column-count: 3; /* 2:分隔间隔 */ column-gap: 10px; /* 3:分割边框 */ column-rule: 2px solid red; /* 列尺寸为自适应宽度 */ /* column-fill: auto; */ /* 设置列宽 */ /* column-width: 100px; */ } .box div { height: 200px; background-color: aqua; /* 333这个div 分区折行 */ /* 禁止 div 这个盒子折行 */ break-inside: avoid; } .box h1 { /* 横框所有列 */ column-span: all; } </style> </head> <body> <div class="box"> <h1>多列布局</h1> <div>111</div> <div>222</div> <div>333</div> <div>444</div> <div>555</div> <div>666</div> <div>777</div> </div> </body> </html>
详解
十:响应式布局
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>响应式布局</title> <style> html, body { height: 100%; } * { margin: 0; padding: 0; } .box { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: flex-start; align-self: flex-start; } .box div { width: 24%; height: 100px; box-sizing: border-box; background-color: blue; margin-bottom: 2px; } @media screen and (max-width: 400px) { .box div { width: 90%; } } @media screen and (min-width: 400px) and (max-width: 600px) { .box div { width: 48%; } } @media screen and (min-width: 600px) and (max-width: 800px) { .box div { width: 33%; } } @media screen and (min-width: 800px) and (max-width: 1000px) { .box div { width: 24%; } } </style> </head> <body> <div class="box"> <div>111</div> <div>222</div> <div>333</div> <div>444</div> <div>555</div> <div>666</div> <div>777</div> <div>888</div> <div>999</div> <div>111</div> <div>222</div> <div>333</div> <div>444</div> <div>555</div> <div>666</div> <div>777</div> <div>888</div> <div>999</div> <div>111</div> <div>222</div> <div>333</div> <div>444</div> <div>555</div> <div>666</div> <div>777</div> <div>888</div> <div>999</div> </div> </body> </html>
详解
十一: px em rem 区别
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>rem布局开发-等比例缩放布局</title> <style> html { font-size: 18px; } body { font-size: 16px; } .box1 { font-size: 16px; } .box2 { font-size: 32px; } .box3 { font-size: 2em; } .box4 { font-size: 2rem; } .box5 { font-size: 32px; } </style> </head> <body> <!-- px em rem 才去rem 布局 em:相对单位, 相对于父元素的字体大小, rem 相对单位,是相对于根元素的字体大小, div width:10em, 相对于根元素字体大小的10倍 --> <div class="box1">春风明媚</div> <div class="box2">春风明媚</div> <div class="box2">春风明媚</div> <div class="box3">春风明媚</div> <div class="box4">春风明媚</div> <div></div> </body> </html>
十二:rem 布局
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>rem 布局</title> <style> /* 1:先让 div 和 html 的 fontsize 成为固定的 比例 2:让 html 的 fantsize成为动态的 插件名字:px to rem & rpx(cssrem)插件 插件是基于16px 来计算的 其他的 px 需要修改配置。 */ * { margin: 0; padding: 0; } html { font-size: 16px; } body { font-size: 16px; } div { width: 46.875rem; height: 12.5rem; background-color: red; } </style> <script> // fontsize动态计算 // fontsize = 当前设别的 css 布局宽度/物理分辨率 * 基准fontsize document.documentElement.style.fontSize = document.documentElement.clientWidth/750 * 16 +"px"; </script> </head> <body> <div></div> </body> </html>
详解
十三:vw、vh 布局
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>等比例缩放-VM、VH</title> <style> /* px 等价于 多少vm vh */ * { margin: 0; padding: 0; } div { width: 100vw; height: 100vh; background: red; } </style> </head> <body> <!-- vh 与 vw --> <!-- vh view-height 100vh === 视口的高度 vw view-width 100 vw === 视口高度 --> </body> <div></div> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>等比例缩放-VM、VH</title> <style> /* px 等价于 多少vm vh */ * { margin: 0; padding: 0; } /* vw 布局 */ html { /* 16px */ font-size: 5vw; } div { /* 100vw 包含滚动条 100%不包含滚动条 */ width: 100vw; height: 6.25rem; background: red; } </style> </head> <body> <!-- vh 与 vw --> <!-- vh view-height 100vh === 视口的高度 vw view-width 100 vw === 视口高度 --> </body> <div></div> </html>
十四:网格布局
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>网格布局</title> <style> .box { width: 600px; height: 600px; margin: 10px auto; border: 1px solid gray; /* 一:网格布局 */ display: grid; /* 二:几行几列 */ /* 1:固定值的方式 */ /* 3行,每行200px 高度 */ /* grid-template-rows: 200px 200px 200px; */ /* 3列,每列200px 高度 */ /* grid-template-columns: 200px 200px 200px; */ /* 2:百分比的方式 */ /* grid-template-rows: 33.3% 33.3% 33.4%; */ /* grid-template-columns: 33.3% 33.3% 33.4%; */ /* 3:repeat函数 */ /* grid-template-rows: repeat(3, 33.3%); */ /* grid-template-columns: repeat(3, 33.3%); */ grid-template-rows: repeat(3, 100px); grid-template-columns: repeat(3, 100px); /* 4:repeat auto-fill 自动填充 */ /* grid-template-rows: repeat(auto-fill, 33.3%); */ /* grid-template-columns: repeat(auto -fill, 33.3%); */ /* 5:fr 片段 */ /* grid-template-rows: 100px 1fr 200px; */ /* grid-template-columns: 100px 1fr 200px; */ /* 6: minmax 最小最大函数,设置最小最大 用的比较少 */ /* grid-template-rows: minmax(100px, 200px) 200px 300px; */ /* grid-template-columns: 200px 200px 200px; */ /* 7:auto */ /* grid-template-rows: 200px auto 200px; */ /* grid-template-columns: 200px auto 200px; */ /* 三:行列间距 */ /* 行间距 */ /* row-gap: 10px; */ /* 列间距 */ /* column-gap: 20px; */ /* 行列间距 */ gap: 10px 20px; /* 四:区域合并 只能够正方向或者矩形 */ grid-template-areas: 'a a c' 'd h f' 'g h i'; /* 五:网格布局-对齐方式 column:垂直方向布局 row:水平方向布局 */ grid-auto-flow: row; /* 水平对齐 */ justify-content: start; justify-content: center; /* justify-content: end; */ /* justify-content: space-around; */ /* justify-content: space-between; */ /* justify-content: stretch; */ /* 垂直对齐 */ align-content: start; align-content: center; /* align-content: end; */ /* align-content: space-around; */ /* align-content: space-between; */ /* 六:控制每个单元格里面元素的对齐方式 */ /* 水平对齐 */ /* justify-items: start; */ /* justify-items: center; */ /* justify-items: end; */ /* justify-items: space-around; */ /* justify-items: space-between; */ /* 垂直对齐 */ /* align-items: start; */ /* align-items: center; */ /* align-items: end; */ /* align-items: space-around; */ /* align-items: space-between; */ /* 复合写法 */ /* place-content: center center; */ /* place-items: center center; */ } .box div { border: 1px solid red; width: 50px; height: 50px; } /* 七:网格线合并 m行 n 列有 行有m+1根线,列有n+1条线 */ .box div:nth-child(1) { /* grid-area: a; */ /* start end 左开右闭 */ /* grid-column-start: 1; */ /* grid-column-end: 3; */ /* 复合写法 */ grid-column: 1/3; } .box div:nth-child(5) { /* grid-area: h; */ /* start end 左开右闭 */ /* grid-row-start: 2; */ /* grid-row-end: 4; */ /* 复合写法 */ grid-row: 2/4; } </style> </head> <body> <div class="box"> <div>1</div> <div>2</div> <div>3</div> <div>4</div> <div>5</div> <div>6</div> <div>7</div> </div> </body> </html>
详解
引用