【青训营】- css还只停留在写布局?10分钟带你探索css中更为奇妙的奥秘!(一)

简介: 那么在下面的这篇文章中,将带领大家来探索 css 中更为奇妙的奥秘~

70.png

📖序言


对于前端来说, css 是入门时和 HTML 一起学习的一门语言,它规定了很多样式和规范。但对于很多小伙伴来说,有时候可能只是简单的使用,但却不知道原来 css 还能画动画,又或者原来 css 还有层叠上下文等等概念。

那么在下面的这篇文章中,将带领大家来探索 css 中更为奇妙的奥秘~

一起来学习吧~🧐


📃一、css是啥


1. CSS是什么


CSS ,层叠样式表( cascading syle sheets ),是一种用来为结构化文档(基本就是  html )添加样式的语言。

举个例子:

假设我们现在要选择一个 HTML 页面里所有的段落元素,并将其中的文本改成红色,那么我们可以这样写 CSS代码如下:

p {
  color: red;
}
复制代码


2. 诞生背景


在没有 css 以前,所有样式都混在 html 里。假如一个标题要用斜体字红色的字符白色的底色的话,那么我们要这样写:

<h2>
    <font color="red" bgcolor="white"><i>使用css</i></font>
</h2>
复制代码

这样看起来似乎也太冗余了。因此呢,现在有了 css 样式,来使得样式和文章结构顺利地达到分离的效果。


我们来看下上面这段代码用 htmlcss 如何进行样式和结构分离。代码如下:

<h2>
    使用css
</h2>
<style>
    h2{
        color: red;
        background: white;
        font-style: italic;
    }
</style>
复制代码

大家可以看到,有了 css ,这样的文章结构是不是就清晰了很多呢。


3. 基础规则


(1)一些基础规则


现在,让我们用一段代码来仔细地分析下 css 的一些规则。大家先看下图:

71.png

在上图中,整个结构称为规则集(通常简称为“规则”),其各部分释义如下:

  • 选择器: 选择了一个或多个需要添加样式的元素(在这个例子中就是 p 元素);
  • 声明: 一个单独的规则,如 color: red; 用来指定添加样式元素的属性;
  • 属性: 指定要改变 HTML 元素样式;
  • 属性的值: 从指定属性的众多外观中选择一个值(除了 red 之外还有很多 color 的值)。


(2)其他重要的语法

了解了以上规则集之后,同时我们还需要注意其他重要的语法。具体如下:

  • 每个规则集(除了选择器的部分)都应该包含在成对的大括号里 {}
  • 在每个声明里要用冒号 : 将属性与属性值分隔开。
  • 在每个规则集里要用分号 ; 将各个声明分隔开。
  • 如果要同时修改多个属性,只需要将它们用分号 ; 隔开。
  • 也可以选择多种类型的元素并为它们添加一组相同的样式。将不同的选择器用逗号分开。


(3)选择器

现在,我们来对 css 的选择器做一个详细的介绍。

选择器有许多不同的类型,它主要是用来选择 HTML 文档中给定的元素。下面给出一些常用的选择器类型:

选择器名称 选择的内容 示例
元素选择器(也称作标签或类选择器) 所有指定(该)类型的 HTML 元素 p,选择 <p>
ID选择器 具有特定 ID 的元素(单一 HTML 页面中,每个 ID 只对应一个元素,一个元素只对应一个 ID) #my-id,选择 <p id="my-id"> 或者 <a id="my-id">
类选择器 具有特定类的元素(单一页面中,一个类可以有多个实例 .my-class,选择<p class="my-class">或者<a class="my-class">
属性选择器 拥有特定属性的元素 img[src],选择 <img src="myimage.png"> 而不是 <img>
伪(Pseudo)类选择器 特定状态下的特定元素(比如鼠标指针悬停) a:hover,仅在鼠标指针悬停在链接上时选择<a>


(4)层叠与继承

了解完选择器之后,我们还需要了解 css 中一个很重要的概念,层叠与继承。接下来就让我们一起来学习这个概念。

1)层叠

浏览器由选择器优先级来决定规则,一般来说,一个选择器越具体,那么它的优先级就越高。比如:

  • 一个元素选择器不是很具体 —— 会选择页面上该类型的所有元素。
  • 一个类选择器稍微具体点 —— 它会选择该页面中有特定 class 属性值的元素,所以它的优先级就要高一点。

我们来举个例子看看效果,具体如下:

.main-heading {
  color: red;
}
h1 {
  color: blue;
}
<h1 class="main-heading"> This is my heading.</h1>
复制代码

我们来看下显示效果:

72.png

大家可以看到,这个 h1 最终显示的是红色字体,而不是蓝色字体。那有小伙伴就会有疑惑说,不是哪个在后面才会选择哪个吗?

答案其实只对了一半。在上面的这段代码中,  class 选择器的优先级要比 h1 属性选择器的优先级要高,所以最终显示的是红色

2)继承

css 中,一些设置在父元素上的 css 属性是可以被子元素继承的,有些则不能。

举个例子:

如果你设置一个元素的 colorfont-family ,那么每个在里面的元素也都会有相同的属性值,除非你直接在元素上设置属性。

来看一段代码:

p {
  color: blue;
}
<p>text in p<span>text in span</span>.</p>
复制代码

在上面的这段代码中,它将全部显示为蓝色。这是为什么呢??

理论上 span 会显示为黑色,但是它没有。原因在于 color 是继承属性,因此 span 中的文字也将继承到 p 的样式,所以最终显示的也为蓝色。


📜二、css怎么学


在进一步讲解 css 有哪些规则之前,先给大家分享几个学习资源。 css 的内容非常多,也比较适合自学,因此这里分享几个可以在课后不断耕耘的 css 知识网站。


1. 在线网站


(1)codecademy.com

codecademy.com 是一个老牌的在线编程教育网站,全程交互式自助式学习体验,非常适合 css 边学边练的的场景。

73.png


(2)udacity.com

udacity.com 也是一个老牌的在线编程教育网站。虽然是外文网站,但进入课程内中文是拉满的。有以下两点推荐理由:免费;视频式教学+课后实验互动的形式,给喜欢看着老师讲解的小伙伴们推荐。

74.png

75.png


(3)w3school.com && runoob.com

一个中文一个英文。免费,交互式,内容比较全面,不错的实操演练场。

76.png

77.png


(4)freecodecamp.org

Githubstar 最多的项目。由社区贡献而成的全面的程序员自学课程。

78.png


(5)挑一个

有小伙伴说,看了这么多,不知道要挑哪一个来学呢?

推荐顺序的话就是从前到后推荐。就是 专业在线课程团队出品 > 自助式学习 ≈ 社区型自助式

如果你是零基础,上面任一一个课程,一个周末左右应该能学的差不多。有了基础后,以后你再想深挖哪个场景下的 css 应用规则,再去看文档即可。什么场景(字体、定位、颜色等),这些内容对应的需要去查哪些属性相信你心中也应该有了自己的一个答案~


2. 持续学习


如果一直在干前端这一行的话,那么,以下这些网站,可能会陪你到 35岁,甚至也有可能是一辈子。(言重了hh)

下面我们一起来看一下是哪几个网站吧~


(1)MDN文档

网站地址为 [developer.mozilla.org/zh- CN/docs/Web/CSS](developer.mozilla.org/zh- CN/docs/Web/CSS) 。它是 css 的文档库,基本上会是前端程序员最常来的地方,同时 htmljs 的规则也在这里面。除此之外呢,里面还有丰富的各式各样的教程,把它当做是一个自由探索的网站也是相当不错滴。

79.png


(2)CSS-TRICKS

网站地址为 css-tricks.com/almanac/ 。这是另外一个 css 文档库,它拥有非常活跃的 css 社区,里面有各种奇技淫巧,把它作为 mdn 的补充也是相当合适的。

80.png


(3)w3c CSS标准

网站地址为 w3.org/Style/CSS。前面的网站和文档基本上都只在告诉你一些css的用法。比如 color:red; ,就是文本变为红色。但其实,它远不止于用来实现文本的颜色,那你想知道它还能干嘛么?

w3c文档,或许就能告诉你答案。

81.png


📄三、CSS常用规则


1. 布局相关


(1)盒模型


1)css的盒模型


在介绍布局相关的属性之前,我们要先了解一个概念:在 CSS 中,所有的元素都被一个个的 “盒子(box)” 包围着。因此,理解这些盒子的基本原理,是我们使用 CSS 实现准确布局处理元素排列的关键。

我们先来看一张图:

82.png


2)盒模型内容详述

现在,我们来对盒模型中的内容进行一个详细的了解。具体如下👇

css 中,组成一个块级盒子需要以下内容:

  • Content box:这个区域主要是用来显示内容,它的大小可以通过 widthheight 来进行设置。
  • Padding box:这个区域包围在内容区域外部的空白区域,它的大小可以通过 padding 的相关属性来进行设置。
  • Border box:这个区域是边框盒,边框盒包裹内容内边距,它的大小通过 border 的相关属性来进行设置。
  • Margin box:这是最外面的区域,是盒子和其他元素之间的空白区域,它的大小通过 margin 的相关属性来进行设置。


3)盒模型的分类

盒模型中的“盒子” ,又包括块级盒子(block box)和内联盒子(inline box)。这两种盒子会在页面流(page flow)和元素之间的关系方面表现出不同的行为。

我们现在就这两个盒子的一些行为来进行阐述。具体如下:

Ⅰ. 第一种行为👇

如果一个盒子对外显示为 inline ,那么它的行为如下:

  • 盒子不会产生换行
  • widthheight 属性将不起作用。
  • 垂直方向的内边距、外边距以及边框会被应用但是不会把其他处于 inline 状态的盒子推开。
  • 水平方向的内边距、外边距以及边框会被应用且会把其他处于 inline 状态的盒子推开。
  • 用做链接的 <a> 元素、 <span> 都是默认处于 inline 状态的。
Ⅱ. 第二种行为👇

下面我们用一个例子来展示下 contet-box 。具体如下:

附上代码:

.box {
    width: 350px;
    height: 150px;
    margin: 25px;
    padding: 25px;
    border: 5px solid black;
}
复制代码

附上显示效果:

83.png

我们来计算一下,在上面的这个例子中, box 元素真正占用的面积是多少?

模型宽度 = 350px(content) + 25px(padding) + 25px(padding) + 5px(border) + 5px(border) = 410px。

模型高度 = 150px(content) + 25px(padding) + 25px(padding) + 5px(border) + 5px(border) = 210px。

大家可以看到,对于 content-box 的盒子来说,它整个盒子包含的内容是 content + padding + border


那如果我们想要修改浏览器这一默认行为,也就是想要不管 paddingborder 怎么撑开,整个盒子加起来的宽高就只能是我们定义的宽高,又该怎么处理呢?

附上代码:

.box {
    width: 350px;
    height: 150px;
    margin: 25px;
    padding: 25px;
    border: 5px solid black;
}
.box {
  box-sizing: border-box;
}
复制代码

附上显示效果:

84.png

大家可以看到,使用了 box-sizing: border-box 之后,它的所有宽度加起来是 350px ,高度加起来是 150px 。通过这个属性,达到了我们想要的效果。


但是细心的效果可能已经发现了一个问题,如果我们每次都要去控制它具体的类选择器来实现宽高,那这样写起来得多累人呀对吧。

因此呢,如果你希望所有元素都使用替代模式,那么你可以直接设置 box-sizing<html> 元素上,然后设置所有元素来继承该属性,如下代码所示:

html {
  box-sizing: border-box;
}
*, *::before, *::after {
    box-sizing: inherit;
}
复制代码

Ⅲ. 第三种行为👇

display 有一个特殊的值,它在内联和块之间提供了一个中间状态。这在一种情况下非常有用,比如说,你不希望一个项切换到新的一行,但是呢,又希望它可以设定宽度和高度。那么我们可以设置 display: inline-block; ,来达到我们最后的效果。下面我们来看一个例子:

附上代码:

span {
    margin: 20px;
    padding: 20px;
    width: 80px;
    height: 50px;
    border: 2px solid blue;
    display: inline-block;
}
复制代码

附上效果图:

85.png

到这里,关于盒模型的内容讲解就告一段落啦!还有更多的使用技巧和延伸属性,可以进一步前往 mdn 文档学习。


(2)正常文档流


1)举例说明

盒模型解释了一个元素块的尺寸,那么元素块在整篇文档中的位置是如何确定的呢?

我们先来看一段代码:

<style>
    p {
        background: rgba(255, 84, 104, 0.3);
        border: 2px solid rgb(255, 84, 104);
        padding: 10px;
        margin: 10px;
    }
    span {
        background: white;
        border: 1px solid black;
    }
</style>
<p>
  这是 p 标签内容
</p>
<p>
    这是 p 标签内容
    <span>这是 span 标签内容</span>
</p>
复制代码

现在我们来看下效果:

86.png

在上面的代码中, <p> 标签是块级元素,而 <span> 标签是内联元素。下面,我们就这两个元素来进行解析。


2)块级元素和内联元素

块级元素👇

  • 默认情况下,块级元素按照基于其父元素的书写顺序(默认值: horrizontal-tb )的块流动方向( block flow direction )放置;
  • 每个块级元素会在上一个元素的下方另起一行,它们会被设置好的 margin 分隔开,且块级元素是垂直组织的。

内联元素👇

  • 而对于内联元素来说,其表现与块级元素有所不同,它们不会另起一行;只要其父级块级元素的宽度内有足够的空间,那么块级元素里面的内容将与其他内联元素被安排在同一行。
  • 但是呢,如果空间不够,那么溢出的文本或元素将被移到新的一行


(3)弹性布局

1)弹性布局是什么

弹性盒子是一种用于按行或按列来布局元素的一维布局方法。元素可以膨胀以填充额外的空间,收缩以适应更小的空间。如下图所示:

87.png

2)一些概念

第一个概念👇

只需要在容器上加 display:flex 属性,你就可以得到一个横排的布局。就盒模型而言,此时容器类似于块级元素( display:block ) ,但宽度默认由子元素决定;子元素类似 inline-block 元素,可以设置宽高且不换行。且子元素原本的 display 实行基本被无视了,这是一种隐含的盒模型状态

来看一段演示:

.container {
    display: flex;
}
复制代码

具体显示效果如下:

88.png


第二个概念👇

这种布局非常灵活,可以完成 90% 的布局要求。同时,可以使用 flex-direction 属性来控制子元素 的排布顺序。

来看一个例子:

.container {
    disply: flex;
}
.container {
    flex-direction: row | row-reverse | column | column-reverse;
}
复制代码

具体显示效果如下:

89.png


相关文章
|
16天前
|
前端开发 开发者 UED
解锁网页布局的秘密武器:探索 CSS Grid 布局的神奇魔力
解锁网页布局的秘密武器:探索 CSS Grid 布局的神奇魔力
20 3
|
15天前
|
UED 开发者 容器
【专栏】Flexbox是CSS3的全新布局模式,提供灵活响应式的页面设计
【4月更文挑战第27天】Flexbox是CSS3的全新布局模式,提供灵活响应式的页面设计。其特点包括灵活性、响应式和易理解,通过主轴和交叉轴控制元素排列对齐。核心概念有容器和项目,常用于导航栏、卡片布局、响应式设计、表格和表单布局。关键属性如flex-direction定义主轴方向,justify-content和align-items控制对齐,flex属性调整项目伸缩,order改变排序。在实践中,要关注响应式、代码维护和浏览器兼容性,以优化布局和用户体验。
|
12天前
|
前端开发 UED
【专栏:HTML与CSS实战项目篇】创建一个具有复杂布局的电商详情页
【4月更文挑战第30天】构建复杂布局的电商详情页涉及页面结构规划、样式设计和交互效果实现。首先规划顶部导航栏、商品图片展示区、商品信息区、用户评价区和相关商品推荐区。在样式设计上,注重色彩搭配、字体选择、布局与间距及图片处理。交互效果包括图片放大、添加到购物车按钮、滚动监听和评论互动,以提升用户体验。实际开发中需考虑跨设备兼容性和用户体验优化。
|
12天前
|
编解码 缓存 前端开发
【专栏:HTML与CSS移动端开发篇】移动端网页布局与适配
【4月更文挑战第30天】本文探讨了如何使用HTML和CSS优化移动端网页布局与适配,强调响应式设计、灵活布局和媒体查询的重要性。针对移动设备的屏幕尺寸、操作方式、网络速度和性能差异,提出了断点选择、触摸优化、图像和性能优化等最佳实践。测试和调试、框架工具的应用也是关键步骤,以确保在多设备上提供优秀用户体验。开发者需持续学习新趋势和工具,以适应移动端发展。
|
12天前
|
前端开发 UED 容器
【专栏:CSS进阶篇】CSS Grid布局:构建复杂的二维布局
【4月更文挑战第30天】CSS Grid布局是二维布局系统,适用于复杂页面结构,如页眉、主体和侧边栏。通过定义网格线和单元格,能轻松创建行和列。基本语法包括设置容器为grid容器,定义`grid-template-rows`和`grid-template-columns`。高级特性包括命名网格线、网格区域、网格间隙、重复网格线和自动填充。在实际应用中,CSS Grid能有效提升开发效率和用户体验,尤其在响应式设计和复杂布局场景下。
|
12天前
|
前端开发 开发者 容器
【专栏:CSS进阶篇】CSS Flexbox布局:实现灵活的响应式设计
【4月更文挑战第30天】CSS Flexbox是现代网页设计中创建响应式布局的关键工具,它提供了一种一维布局模型,使元素能灵活适应各种屏幕尺寸。通过设置容器的`display`属性为`flex`,开发者可以利用主轴和交叉轴调整元素排列和对齐方式。核心概念包括弹性项、伸缩性、空间分配和对齐。通过实例,如导航栏、卡片布局、图片画廊和响应式表单,展示了Flexbox在实现响应式设计中的应用。尽管需要注意浏览器兼容性,但掌握Flexbox能帮助开发者构建出功能强大且适应性强的界面。
|
12天前
|
前端开发 开发者 容器
【专栏:CSS基础篇】CSS定位与布局:从静态到浮动、定位
【4月更文挑战第30天】本文介绍了CSS定位与布局的基础,包括静态、相对、绝对、固定定位以及浮动。静态定位遵循HTML顺序,相对定位可在正常位置基础上偏移,不占用额外空间。绝对定位基于最近已定位祖先元素定位,脱离文档流。固定定位相对于浏览器窗口定位,无视页面滚动。浮动用于文字环绕图片等,可能导致父元素高度塌陷。Flexbox布局提供更灵活的元素排列和对齐方式,适配各种复杂布局需求。理解并掌握这些布局技术能提升网页设计的灵活性和响应性。
|
12天前
|
前端开发
【专栏:CSS基础篇】CSS盒模型:理解网页布局的核心
【4月更文挑战第30天】CSS盒模型是网页布局关键,将HTML元素视为内容、内边距、边框和外边距的矩形。内容决定元素大小,padding增加内部空间,border设置线条样式,margin控制元素间距。理解盒模型及其计算方式(内容+padding+border+margin)有助于布局设计。通过调整相关属性,实现浮动、Flexbox或定位布局,创建响应式网页。
|
13天前
|
前端开发
CSS弹性布局justify-content的用法
CSS弹性布局justify-content的用法
|
17天前
|
容器
css_flex布局
css_flex布局
16 0