当前位置: 首页 > article >正文

2024 CSS - 保姆级系列教程三 - 选择器与布局详解

CSS 选择器

CSS中,选择器用来指定网页上我们想要样式化的HTML元素。有 CSS 选择器提供了很多种方法,所以在选择要样式化的元素时,我们可以做到很精细的地步。本文和本文的子篇中,我们将会详细地讲授选择器的不同使用方式,并了解它们的工作原理。-- MDN

选择器定义
CSS 选择器是 CSS 规则的第一部分。它是元素和其他部分组合起来告诉浏览器哪个 HTML 元素应当是被选为应用规则中的 CSS 属性值的方式。选择器所选择的元素,叫做“选择器的对象”。

<div id="box"><div class="one"><p class="one_1"></p><p class="one_1"></p></div><div class="two"></div><div class="two"></div><div class="two"></div></div>

关于css属性选择器常用的有:

  • id选择器(#box),选择id为box的元素​
  • 类选择器(.one),选择类名为one的所有元素​
  • 标签选择器(div),选择标签为div的所有元素​
  • 后代选择器(#box div),选择id为box元素内部所有的div元素​
  • 子选择器(.one>one_1),选择父元素为.one的所有.one_1的元素​
  • 相邻同胞选择器(.one+.two),选择紧接在.one之后的所有.two元素​
  • 群组选择器(div,p),选择div、p的所有元素

还有一些使用频率相对没那么多的选择器:
伪类选择器:

:link :选择未被访问的链接​
:visited:选取已被访问的链接​
:active:选择活动链接​
:hover :鼠标指针浮动在上面的元素​
:focus :选择具有焦点的​
:first-child:父元素的首个子元素

伪元素选择器

:first-letter :用于选取指定选择器的首字母​
:first-line :选取指定选择器的首行​
:before : 选择器在被选元素的内容前面插入内容​
:after : 选择器在被选元素的内容后面插入内容

属性选择器

[attribute] 选择带有attribute属性的元素​
[attribute=value] 选择所有使用attribute=value的元素​
[attribute~=value] 选择attribute属性包含value的元素​
[attribute|=value]:选择attribute属性以value开头的元素

在CSS3中新增的选择器有如下:​

  • 层次选择器(p~ul),选择前面有p元素的每个ul元素​
  • 伪类选择器

:first-of-type 父元素的首个元素​
:last-of-type 父元素的最后一个元素​
:only-of-type 父元素的特定类型的唯一子元素​
:only-child 父元素中唯一子元素​
:nth-child(n) 选择父元素中第N个子元素​
:nth-last-of-type(n) 选择父元素中第N个子元素,从后往前​
:last-child 父元素的最后一个元素​
:root 设置HTML文档​
:empty 指定空的元素​
:enabled 选择被禁用元素​
:disabled 选择被禁用元素​
:checked 选择选中的元素​
:not(selector) 选择非 selector 元素的所有元素

属性选择器

[attribute*=value]:选择attribute属性值包含value的所有元素​
[attribute^=value]:选择attribute属性开头为value的所有元素​
[attribute$=value]:选择attribute属性结尾为value的所有元素

二、优先级
相信大家对CSS选择器的优先级都不陌生:​

内联 > ID选择器 > 类选择器 > 标签选择器​

到具体的计算层⾯,优先级是由 A 、B、C、D 的值来决定的,其中它们的值计算规则如下:​

  • 如果存在内联样式,那么 A = 1, 否则 A = 0​
  • B的值等于 ID选择器出现的次数​
  • C的值等于 类选择器 和 属性选择器 和 伪类 出现的总次数​
  • D 的值等于 标签选择器 和 伪元素 出现的总次数​
    这里举个例子:
#nav-global > ul > li > a.nav-link

用上面的算法,依次求出 A B C D 的值:​

  • 因为没有内联样式 ,所以 A = 0​
  • ID选择器总共出现了1次, B = 1​
  • 类选择器出现了1次, 属性选择器出现了0次,伪类选择器出现0次,所以 C = (1 + 0 + 0) = 1​
  • 标签选择器出现了3次, 伪元素出现了0次,所以 D = (3 + 0) = 3​
    上面算出的A 、 B、C、D 可以简记作:(0, 1, 1, 3)​
    知道了优先级是如何计算之后,就来看看比较规则:​
  • 从左往右依次进行比较 ,较大者优先级更高​
  • 如果相等,则继续往右移动一位进行比较​
  • 如果4位全部相等,则后面的会覆盖前面的​
    经过上面的优先级计算规则,我们知道内联样式的优先级最高,如果外部样式需要覆盖内联样式,就需要使用**!important**

三、继承属性
在css中,继承是指的是给父元素设置一些属性,后代元素会自动拥有这些属性 关于继承属性,可以分成:​
字体系列属性

font:组合字体​
font-family:规定元素的字体系列​
font-weight:设置字体的粗细​
font-size:设置字体的尺寸​
font-style:定义字体的风格​
font-variant:偏大或偏小的字体

文本系列属性

text-indent:文本缩进​
text-align:文本水平对齐​
line-height:行高​
word-spacing:增加或减少单词间的空白​
letter-spacing:增加或减少字符间的空白​
text-transform:控制文本大小写​
direction:规定文本的书写方向​
color:文本颜色

元素可见性

visibility

表格布局属性

caption-side:定位表格标题位置​
border-collapse:合并表格边框​
border-spacing:设置相邻单元格的边框间的距离​
empty-cells:单元格的边框的出现与消失​
table-layout:表格的宽度由什么决定

列表属性

list-style-type:文字前面的小点点样式​
list-style-position:小点点位置​
list-style:以上的属性可通过这属性集合

引用

quotes:设置嵌套引用的引号类型

光标属性

cursor:箭头可以变成需要的形状

继承中比较特殊的几点:​

  • a 标签的字体颜色不能被继承​
  • h1-h6标签字体的大下也是不能被继承的

无继承的属性​

  • display​
  • 文本属性:vertical-align、text-decoration​
  • 盒子模型的属性:宽度、高度、内外边距、边框等​
  • 背景属性:背景图片、颜色、位置等​
  • 定位属性:浮动、清除浮动、定位position等​
  • 生成内容属性:content、counter-reset、counter-increment​
  • 轮廓样式属性:outline-style、outline-width、outline-color、outline​
  • 页面样式属性:size、page-break-before、page-break-after

CSS布局

flexbox(弹性盒布局模型)是什么,适用什么场景?

Flexbox(弹性盒布局模型)是一种用于创建灵活且自适应的网页布局的 CSS 模块。它提供了一种在容器和其子元素之间建立灵活关系的方式,以实现多个元素的对齐、分布和调整大小。​

适用场景​

  • 等高的多列布局:Flexbox 可以轻松创建等高的多列布局,使得每一列的高度相等,无论其内容的长度如何。​
  • 水平和垂直居中:Flexbox 提供了强大的对齐和居中功能,可以在容器中轻松实现水平和垂直居中元素。​
  • 自适应布局:Flexbox 具有弹性特性,可以根据可用空间自动调整项目的大小和位置,从而实现自适应的布局。​
  • 等间距的分布:通过使用 Flexbox 的 justify-content 和 align-items 属性,可以轻松地在容器中创建等间距的分布,使项目之间具有相等的间距。​
  • 响应式布局:Flexbox 是响应式设计的有力工具,可以通过简单的 CSS 更改来构建适应不同屏幕尺寸和设备类型的布局。

总结​
Flexbox 是一种强大的 CSS 布局模块,适用于创建各种灵活和自适应的网页布局。它可以解决传统布局方式中的很多问题,并提供了更强大的对齐、居中和分布控制功能,使开发者能够更轻松地实现复杂的布局需求。

MDN reference Link: Flex 布局官方详解

flex 布局下,怎么改变元素的顺序?

可以使用order属性来改变Flex布局下元素的顺序。order属性指定了Flex容器内部各个项目的排列顺序,其默认值为0。​
通过调整order属性的值,可以改变元素的顺序。具体步骤如下:​

  • 将元素定义为Flex容器,使用display: flex;或者display: inline-flex;。​
  • 为每个子元素设置order属性,根据需要设置不同的值,值越小的元素会在前面,值相等的元素按照文档流原始顺序排列。​
    以下是一个示例代码:
<div class="flex-container"><div class="item">1</div><div class="item">2</div><div class="item">3</div></div>
.flex-container {display: flex;}​
​
.item {order: 2; /* 改变顺序 */}

在上述代码中,通过将第二个子元素的order属性设置为2,可以将其放置在其他子元素之后。​
请注意,order属性接受任意整数值,负数也可以使用。同时,当多个元素的order值相同时,它们会按照它们在文档流中的位置进行排序。

flex: auto 是什么意思?

flex 是复合属性,是flex-grow,flex-shrink 和 flex-basis的简写,默认值为0 1 auto,后两个属性可选。​

  • flex-grow 属性定义项目的放大比例,默认为0,即如果存在剩余空间也不放大​
  • flex-shrink 属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小​
  • flex-basis 属性定义了在分配多余空间之前,项目占据的主轴空间(相当于我们设置的width)​

而 flex: auto; 是 flex:1 1 auto; 的简写,即元素尺寸可以弹性增大,也可以弹性变小,具有十足的弹性,但在尺寸不足时会优先最大化内容尺寸。​
再介绍下使用场景:​
当希望元素充分利用剩余空间,但是各自的尺寸按照各自内容进行分配的时候,适合使用 flex:auto。​
flex:auto 多用于内容固定,或者内容可控的布局场景,例如导航数量不固定,每个导航文字数量也不固定的导航效果就适合使用 flex:auto 效果来实现.

CSS Grid 布局

Grid 布局即网格布局,是一个二维的布局方式,由纵横相交的两组网格线形成的框架性布局结构,能够同时处理行与列​
擅长将一个页面划分为几个主要区域,以及定义这些区域的大小、位置、层次等关系
在这里插入图片描述
这与之前讲到的flex一维布局不相同​
设置display:grid/inline-grid的元素就是网格布局容器,这样就能出发浏览器渲染引擎的网格布局算法

<div class="container"><div class="item item-1"><p class="sub-item"></p ></div><div class="item item-2"></div><div class="item item-3"></div></div> 

上述代码实例中,.container元素就是网格布局容器,.item元素就是网格的项目,由于网格元素只能是容器的顶层子元素,所以p元素并不是网格元素​
这里提一下,网格线概念,有助于下面对grid-column系列属性的理解​
网格线,即划分网格的线,如下图所示:

在这里插入图片描述
上图是一个 2 x 3 的网格,共有3根水平网格线和4根垂直网格线​
二、属性​
同样,Grid 布局属性可以分为两大类:​

  • 容器属性,​
  • 项目属性​

关于容器属性有如下:​

  • display 属性​
  • 文章开头讲到,在元素上设置display:grid 或 display:inline-grid 来创建一个网格容器​
  • display:grid 则该容器是一个块级元素​
    -display: inline-grid 则容器元素为行内元素​
  • grid-template-columns 属性,grid-template-rows 属性​
  • grid-template-columns 属性设置列宽,grid-template-rows 属性设置行高
.wrapper {​
  display: grid;​
 /*  声明了三列,宽度分别为 200px 200px 200px */​
  grid-template-columns: 200px 200px 200px;​
  grid-gap: 5px;​
  /*  声明了两行,行高分别为 50px 50px  */​
  grid-template-rows: 50px 50px;}

以上表示固定列宽为 200px 200px 200px,行高为 50px 50px​
上述代码可以看到重复写单元格宽高,通过使用repeat()函数,可以简写重复的值​

  • 第一个参数是重复的次数​
  • 第二个参数是重复的值​

所以上述代码可以简写成

.wrapper {display: grid;grid-template-columns: repeat(3,200px);grid-gap: 5px;grid-template-rows:repeat(2,50px);}

除了上述的repeact关键字,还有:​

  • auto-fill:示自动填充,让一行(或者一列)中尽可能的容纳更多的单元格​
  • grid-template-columns: repeat(auto-fill, 200px) 表示列宽是 200 px,但列的数量是不固定的,只要浏览器能够容纳得下,就可以放置元素​
  • fr:片段,为了方便表示比例关系​
  • grid-template-columns: 200px 1fr 2fr 表示第一个列宽设置为 200px,后面剩余的宽度分为两部分,宽度分别为剩余宽度的 1/3 和 2/3​
  • minmax:产生一个长度范围,表示长度就在这个范围之中都可以应用到网格项目中。第一个参数就是最小值,第二个参数就是最大值​
  • minmax(100px, 1fr)表示列宽不小于100px,不大于1fr​
  • auto:由浏览器自己决定长度​
  • grid-template-columns: 100px auto 100px 表示第一第三列为 100px,中间由浏览器决定长度​
  • grid-row-gap 属性, grid-column-gap 属性, grid-gap 属性​
  • grid-row-gap 属性、grid-column-gap 属性分别设置行间距和列间距。grid-- -gap 属性是两者的简写形式​
  • grid-row-gap: 10px 表示行间距是 10px​
  • grid-column-gap: 20px 表示列间距是 20px​
  • grid-gap: 10px 20px 等同上述两个属性​
  • grid-template-areas 属性​ 用于定义区域,一个区域由一个或者多个单元格组成
.container {display: grid;grid-template-columns: 100px 100px 100px;grid-template-rows: 100px 100px 100px;grid-template-areas: 'a b c''d e f''g h i';}

上面代码先划分出9个单元格,然后将其定名为a到i的九个区域,分别对应这九个单元格。​
多个单元格合并成一个区域的写法如下

grid-template-areas: 'a a a''b b b''c c c';

上面代码将9个单元格分成a、b、c三个区域​如果某些区域不需要利用,则使用"点"(.)表示​grid-auto-flow 属性​划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。​顺序就是由grid-auto-flow决定,默认为行,代表"先行后列",即先填满第一行,再开始放入第二行
在这里插入图片描述
当修改成column后,放置变为如下:
在这里插入图片描述
justify-items 属性, align-items 属性, place-items 属性​
justify-items 属性设置单元格内容的水平位置(左中右),align-items 属性设置单元格的垂直位置(上中下)​
两者属性的值完成相同

.container {justify-items: start | end | center | stretch;align-items: start | end | center | stretch;}

属性对应如下:​

  • start:对齐单元格的起始边缘​
  • end:对齐单元格的结束边缘​
  • center:单元格内部居中​
  • stretch:拉伸,占满单元格的整个宽度(默认值)​
  • place-items属性是align-items属性和justify-items属性的合并简写形式​
  • justify-content 属性, align-content 属性, place-content 属性​
  • justify-content属性是整个内容区域在容器里面的水平位置(左中右),align-- content属性是整个内容区域的垂直位置(上中下)
.container {justify-content: start | end | center | stretch | space-around | space-between | space-evenly;align-content: start | end | center | stretch | space-around | space-between | space-evenly;}

两个属性的写法完全相同,都可以取下面这些值:​

  • start - 对齐容器的起始边框​
  • end - 对齐容器的结束边框​
  • center - 容器内部居中

在这里插入图片描述

  • space-around - 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍​
  • space-between - 项目与项目的间隔相等,项目与容器边框之间没有间隔​
  • space-evenly - 项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔​
    stretch - 项目大小没有指定时,拉伸占据整个网格容器

在这里插入图片描述
grid-auto-columns 属性和 grid-auto-rows 属性​
有时候,一些项目的指定位置,在现有网格的外部,就会产生显示网格和隐式网格​
比如网格只有3列,但是某一个项目指定在第5行。这时,浏览器会自动生成多余的网格,以便放置项目。超出的部分就是隐式网格​
而grid-auto-rows与grid-auto-columns就是专门用于指定隐式网格的宽高​
关于项目属性,有如下:​
grid-column-start 属性、grid-column-end 属性、grid-row-start 属性以及grid-row-end 属性​指定网格项目所在的四个边框,分别定位在哪根网格线,从而指定项目的位置​

  • grid-column-start 属性:左边框所在的垂直网格线​
  • grid-column-end 属性:右边框所在的垂直网格线​
  • grid-row-start 属性:上边框所在的水平网格线​
  • grid-row-end 属性:下边框所在的水平网格线​
    举个例子:
1 <style>​
2    #container{​
3        display: grid;​
4        grid-template-columns: 100px 100px 100px;​
5        grid-template-rows: 100px 100px 100px;​
6    }​
7    .item-1 {​
8        grid-column-start: 2;​
9        grid-column-end: 4;​
10    }​
11 </style>​
12​
13 <div id="container">​
14    <div class="item item-1">1</div>​
15    <div class="item item-2">2</div>​
16    <div class="item item-3">3</div>​
17</div>

通过设置grid-column属性,指定1号项目的左边框是第二根垂直网格线,右边框是第四根垂直网格线
在这里插入图片描述
grid-area 属性 : grid-area 属性指定项目放在哪一个区域

.item-1 {grid-area: e;}

意思为将1号项目位于e区域​
与上述讲到的grid-template-areas搭配使用​

  • justify-self 属性、align-self 属性以及 place-self 属性​
    justify-self属性设置单元格内容的水平位置(左中右),跟justify-items属性的用法完全一致,但只作用于单个项目。​
  • align-self属性设置单元格内容的垂直位置(上中下),跟align-items属性的用法完全一致,也是只作用于单个项目
.item {justify-self: start | end | center | stretch;align-self: start | end | center | stretch;}

这两个属性都可以取下面四个值。​

  • start:对齐单元格的起始边缘。​
  • end:对齐单元格的结束边缘。​
  • center:单元格内部居中。​
  • stretch:拉伸,占满单元格的整个宽度(默认值)​

三、应用场景​
文章开头就讲到,Grid是一个强大的布局,如一些常见的 CSS 布局,如居中,两列布局,三列布局等等是很容易实现的,在以前的文章中,也有使用Grid布局完成对应的功能​
关于兼容性问题,结果如下:
在这里插入图片描述
总体兼容性还不错,但在 IE 10 以下不支持​
目前,Grid布局在手机端支持还不算太友好


http://www.kler.cn/a/385867.html

相关文章:

  • 网络基础(4)传输层
  • kafka消费者出现频繁Rebalance
  • SQL Server Service Broker完整示例
  • UNIX网络编程-TCP套接字编程(实战)
  • AI大模型(二):AI编程实践
  • 创建vue插件,发布npm
  • 【MySQL】——数据库恢复技术
  • 数仓工具—Hive语法之窗口函数窗口范围/边界 range between和rows between
  • 黑马程序员Redis学习【持续更新】
  • 数据发生变化时(DOM)视图没有更新的原因及解决方案 - 2024最新版前端秋招面试短期突击面试题【100道】
  • 移动应用开发项目——图书影片管理系统【安卓项目|前后端】
  • Ubuntu /etc/sudo.conf is owned by uid 1000, should be 0 的一种解决方法
  • 掌握 .NET 8 中最小 API 的单元和集成测试:高质量代码的最佳实践
  • CTF —— 网络安全大赛
  • ABAP开发-12、Dialog屏幕开发_1
  • 设计模式-构建者
  • IO作业day4
  • redis:list列表命令和内部编码
  • jenkins使用slave节点进行node打包报错问题处理
  • 【JAVA毕业设计】基于Vue和SpringBoot的技术交流分享平台
  • C++ 游戏开发:打造高效、性能优越的游戏世界
  • 【观察】华为持续投入开源开放“结硕果”,openEuler走出操作系统“创新路”...
  • 怎么对 PDF 添加权限密码或者修改密码-免费软件分享
  • .NET中通过C#实现Excel与DataTable的数据互转
  • Docker使用相关记录
  • 【PGCCC】postgresql 缓存池并发设计