实战演示元素的样式来源以及基本选择器,和上下文选择器 并对比选择器的权重,并分析了为什么常用class属性少用id和标签属性
程序员文章站
2022-03-27 08:28:08
...
课后作业
实战演示元素的样式来源以及基本选择器,和上下文选择器 并对比选择器的权重,并分析了为什么常用class属性少用id和标签属性
<!DOCTYPE html>
<html lang="zh-CN">
<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>
</head>
<body>
<div>
<h1>作业内容:</h1>
<h5>示例演示元素的样式来源</h5>
<!-- 上面使用的h1和h5是浏览器自带的样式来源,并非用户自定义的样式来源 -->
<!-- 下面为用户自定义来源,来源的方式有三种 -->
<h1 style="color: blue">用户自定义样式来源</h1>
<!-- 理解为行内 -->
<h1 class="h1">内部样式</h1>
<style>
.h1 {
color: brown;
}
</style>
</div>
<!-- 上面理解为内部 -->
<h2 class="h2">引用外部样式</h2>
<link rel="stylesheet" href="demo.css" />
<!-- 引用外部的css -->
<!-- 1. 实例演示: 元素的样式来源结束 -->
<!-- 示例演练以下几种常用的选择器 -->
<h2>基本选择器常用的几种</h2>
<h4>标签选择器</h4>
<p>像常用的标签选择器有div/h1/h2/h3以标签命名</p>
<p>标签选择器实现当前的效果</p>
<style>
h2 {
background-color: brown;
}
p {
color: blue;
}
h4 {
background-color: blueviolet;
}
</style>
<!-- 标签选择器演练结束下面将使用class选择器 -->
<div class="tags">
<p>当前使用了class选择器,当前页面前面已经使用了p标签选择器,</p>
<p>但是我现在又用了class选择器,class选择器的权重比标签选择器高,</p>
<p>来查看下效果吧</p>
</div>
<style>
div.tags p {
color: red;
}
</style>
<!-- 下面将使用id选择器,按照权重的分配,标签选择器的权重比id选择器更低,这里将使用到id选择器 -->
<div id="tags" class="tags">
<p>id选择器具有较高的权限,比默认的浏览器自带的,和class选择器的级别更改,</p>
<p>当前使用了id选择器,在之前的代码中,已经写到了class选择器p标签的颜色,</p>
<p>红色,但是我用id选择器又更改为了另外的颜色</p>
</div>
<style>
#tags p {
color: chocolate;
}
</style>
<!-- 下面为群组选择器的实战演练 -->
<div>
<div>
<a href="">群组选择器1</a>
<a href="">群组选择器2</a>
<a href="">群组选择器3</a>
<a href="">群组选择器4</a>
<a href="">群组选择器5</a>
</div>
</div>
<div>
<li>
<a href="">第二组1</a><a href="">第二组2</a><a href="">第二组3</a><a href="">第二组4</a><a href="">第二组5</a>
</li>
</div>
<style>
div a,
li a {
color: crimson;
}
</style>
<!-- 上面为群组选择器的实战演练 -->
<!-- 下面为通配符选择器演练部分 -->
<style>
html body ul li * {
color: darkgreen;
}
</style>
<ul>
<li>
<a href="baidu.com">百度一下1</a><a href="baidu.com">百度一下2</a><a href="baidu.com">百度一下3</a
><a href="baidu.com">百度一下4</a><a href="baidu.com">百度一下5</a>
</li>
</ul>
<!-- 上方为通配选择器演练部分 -->
<!-- 下面为上下文选择器实战部分 -->
<!-- 常规的子元素选择器 -->
<ul class="php">
<li>
<a href="php.cn">上级</a>
<li>
<a href="php.cn">1</a><a href="php.cn">2</a><a href="php.cn">3</a
><a href="php.cn">4</a><a href="php.cn">5</a>
</li>
</li>
</ul>
<style>
ul.php > li > a{color: darkmagenta;}
</style>
<!-- 兄弟元素和和后代元素同时使用,词快穷了 -->
<ul>
<li>后代元素15</li>
<li class="h">后代元素25</li>
<li>后代元素35</li>
<li>后代元素45</li>
<li>后代元素55</li>
</ul>
<style>ul li.h + *{color: darkmagenta;}</style>
<!-- 兄弟后代元素完毕 -->
<div>
<div>
<li>
<a href="" class="a1">证明一下后面的所有元素</a>
<a href="" class="a2">证明一下后面的所有元素</a>
<a href="" class="a3">证明一下后面的所有元素</a>
<a href="" class="a4">证明一下后面的所有元素</a>
<a href="" class="a5">证明一下后面的所有元素</a>
</li>
</div>
</div>
<style>div div li a.a2 ~ *{color: darkturquoise;}</style>
<!-- 后面所有的元素证明完毕 -->
<!-- 最后面选择器的权重 -->
选择器的权重id>class>标签,而同类相比,数量又居上,
<div>
<div><div><div><div><li>
<a href="">标签权重测试</a>
</li></div></div></div></div>
</div>
<style>
/* 下面属性标签为4个div 一个a标签.标签的值为0 0 5 所以为紫色 */
div div div li a{color: darkviolet;}
/* 如果不注释上面的标签,使用下面的标签 标签的值为0 0 6 */
div div div div li a{color: red;}
</style>
<!-- 上面为标签属性权重对比 -->
<!-- 下面为class权重属性对比 -->
<div>
<div><div class="div"><div><div><li class="li">
<a href="">class权重测试</a>
</li></div></div></div></div>
</div>
<style>
/* 下面属性标签+class为4个div 一个class 一个a标签.标签的值为0 1 5 所以为紫色 */
div div div li.li a{color: darkviolet;}
/* 如果不注释上面的标签,使用下面的标签 标签的值为0 2 6 */
div div.div div div li.li a{color: red;}
</style>
<!-- id属性+class属性+标签属性权重测试 -->
<div>
<div id="nav"><div class="div nav"><div><div><li class="li">
<a href="">综合属性权重测试</a>
</li></div></div></div></div>
</div>
<style>
/* 下面属性标签+class为4个div 一个class 一个a标签.标签的值为0 1 5 所以为紫色 */
div div div li.li a{color: darkviolet;}
/* 如果不注释上面的标签,使用下面的标签 标签的值为0 2 6 */
div div.div div div li.li a{color: red;}
/* 如果不注释上面的标签,使用下面的标签 标签的值为0 3 6 */
div div.div.nav div div li.li a{color: rgb(60, 0, 255);}
/* 如果不注释上面的标签,使用下面的标签 标签的值为1 3 6 */
div#nav div.div.nav div div li.li a{color: orangered;}
</style>
</body>
</html>
以下部分为本人理解部分,老师可以略过.
元素来源:
元素的两大样式来源
- 浏览器默认样式
- 用户自定义样式
- 浏览器默认样式
浏览器的默认样式常用的都存在于标签中,如h1/h2/h3/a标签,都是常见的浏览器自默认样式的标签,h1标签对文字增大,a标签对文字颜色加色 - 用户自定义样式
用户自定义样式的格式如下面几篇代码均为用户自定义样式<h1 style="color: red">你好php</h1>
<a href="#"style="color: red" >把a标签默认的颜色蓝色换成红色</a>
用户定义了颜色为红色的文字,也叫设置样式/* h1 : 标签/也叫元素选择器 */
有了标签需给标签添加样式,上面已经添加了样式,样式是包裹在标签里面,形式如下:style="老师叫形式声明"
写法如下:/* h1 { */
/* 样式声明: 使用是"名值对" */
/* color: red; */
/* } */
而形式声明又分为三种
- 行内形式
- 内部形式
- 外部形式
- 行内形式
行内形式顾名思义,是写在标签行内的形式,如以下:<h1 style="color: red">你好php</h1>
-
内部形式
内部形式是写在页面内部,如以下<h1 style="color: indigo">大家晚上好,吃了吗?</h1>
<style>
h1 {
color: blue;
}
</style>
-
外部形式
外部形式是引用外部css到当前页面或多个页面调用使用,示例代码如下:<link rel="stylesheet" href="css/style1.css" />
上面css里面已经写入了css
<h1 class="love">大家晚上好,吃了吗?</h1>
其优先级关系调用,行内>内部>外部 当然还有个秒天秒地秒空气的..尽量调试用的
这里直接贴入老师写注释代码,以防自己忘记.<!-- 当前是HTML, 结构化的文本文档,它内部的所有元素,必须使用"标签"进行描述 -->
<!-- 只要放到了html中内容,并且要被浏览器进行解析或处理的,就必须要放到一个"标签" -->
<style>
/* 1. 查询: 找到要被添加样式的元素 */
/* selector : 选择器 */
/* h1 : 标签/元素选择器 */
/* 2. 为匹配的元素,设置样式规则 */
/* 样式规则: 放入一对大括号中 */
/* h1 { */
/* 样式声明: 使用是"名值对" */
/* color: red; */
/* } */
/* 选择器 {
一个或多个样式声明
} */
/* css工作流: 1. 找到元素; 2. 设置样式 */
</style>
<!-- style属性的优先级要大于 style 标签 -->
<!-- style="..." : 行内样式/内联样式, 直接作用到"元素级" -->
<!-- <style>: 内部样式/文档样式, 直接作用到"文档级" -->
再说下内页优先级,常用在页面内部和css内部,当一个css当中,例如颜色为多个颜色,优先使用最后一个,如以下:
<style>
h1 {
color: red;
color: green;
color: blue;
/* 样式来源, 除了与优先级相关, 还与书写顺序相关 */
/* 写到后面,会覆盖前面的 */
}
</style>
标签属性的样式集成
先贴代码:
<div>
<p>html是一个具有层级结构的文档,可以根据元素之间层级关注,实现样式复用</p>
<a href="#">样式继承</a>
<h3 style="color: turquoise">Hello</h3>
</div>
<style>
div {
/* div是P的父级 */
border: 1px solid #000;
color: violet;
}
p {
color: green;
/* 颜色/前景色: 是可以继承的属性 */
color: inherit;
}
/* 默认样式/代理样式 > 继承样式 */
/* 1. style标签
2. 外部css文档
3. 样式继承 */
</style>
子级集成父级别的样式,例如代码中如果不存在p标签单独的属性,div中的颜色会继承为p标签,但如果p标签有了自己的颜色,将使用p标签单独的颜色,其中p标签color: inherit;意思是强制继承父级color颜色.就是无论p标签的color单独设置什么颜色,都将继承div里面的color的颜色,多用多数量
属性基本选择器
属性的基本选择器常用的分为以下几种:
<h2>item1</h2>
<h2 title="hello">item2</h2>
<!-- id的唯一性由开发者确保,浏览器不检查 -->
<h2 id="a">item3</h2>
<h2 id="a">item4</h2>
<h2 class="b">item5</h2>
<h2 class="b">item6</h2>
<style>
/* 基本选择器: 根据元素自身特点来选择 */
/* 1. 标签选择器 */
h2 {
color: red;
}
/* 2. 属性选择器 */
h2[title="hello"] {
color: green;
}
/* id: 用于唯一元素 */
h2[id="a"] {
color: blue;
}
/* class: 用于多个元素 */
h2[class="b"] {
color: violet;
}
/* id, class是 高频属性 */
/* id => # */
h2#a {
color: cyan;
}
/* class = "." */
h2.b {
color: orange;
}
/* 推荐尽可能只用class */
/* 3. 群组选择器 */
h2#a,
h2.b {
background-color: yellow;
}
/* 4. 通配选择器: * */
html body * {
background-color: gray !important;
}
/* !important: 瞬间提权到100%*只建议在开发中使用 */
</style>
上下文选择器/层级选择器
示例代码:
<ul class="list">
<li class="item">item1</li>
<li class="item second">item2</li>
<li class="item">
item3
<!-- <ul class="inner">
<li>item3-1</li>
<li>item3-2</li>
<li>item3-3</li>
</ul> -->
</li>
<li class="item">item4</li>
<li class="item">item5</li>
<li class="item">item6</li>
<li class="item">item7</li>
<li class="item">item8</li>
</ul>
<style>
/* 1. 子元素(就是class属性+标签,是用符号>,具体的区分可以看下后代元素部分)
也就是说,这里生效的部分仅限于第四行以前,超出第四行部分css部分不会生效*/
.list > li {
border: 1px solid #000;
}
/* 2. 后代元素: 空格 (后代元素是后面是后面所有的,意思就是,不止第四行的css会变,第10行以前的li都会改变css样式)*/
.list li {
border: 1px solid #000;
}
/* 3. 相邻兄弟: + */(比较好理解就是下一行代码执行的命令)
.item.second + * {
background-color: lightcyan;
}
/* 4. 所有兄弟: ~ */ (定位的后面所有代码都将执行下面的css)
.item.second ~ * {
background-color: yellow;
}
</style>
选择器的继承
<body>
<h1 class="title" id="active">Hello</h1>
<style>
/* 1 1 2 */
/* 2: 表示2个标签,
1: 表示1个class
1: 表示1个id */
body h1.title#active {
color: red;
}
/* 0 1 2 */
/* 2: 表示2个标签,
1: 表示1个class
0: 表示没有id */
body h1.title {
color: blue;
}
/* 就想放在第一行,又想让它生效,只有提权 */
/* 0 0 2 */
/* 2: 表示2个标签,
0: 表示没有class
0: 表示没有id */
body h1 {
color: green;
}
/* 相同的权重,由位置决定样式 */
/* 0 0 1 */
/* 1: 表示只有一个标签,
0: 表示没有class
0: 表示没有id */
h1 {
color: darkorange;
}
/* 三个权重的位置, 从右到左
第1位: 标签数量
第2位: class数量
第3位: id数量 */
/* css 将 id, class, tag 看成一个"三位整数", id -> 百位, class -> 十位, tag -> 个位 */
/* h1 {
color: violet !important;
} */
/* id : 为什么不推荐用? 因为权重太高, 为了让你的代码具有弹性,尽可能用class */
/* 为什么不用权重最低的标签呢? 只是标签的数量太少了, 而class可以任何命名 */
/* bootstrap , element ui */
</style>
<div class="col-md-3 vip">Bootstrap</div>
<style>
/* 0 2 1 */
div.col-md-3.vip {
border: 5px solid red;
}
/* 0 1 1 */
div.col-md-3 {
border: 1px solid #000;
}
</style>
</body>