【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典

【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典

请添加图片描述

半桔个人主页
 🔥 个人专栏: 《前端扫盲》《手撕面试算法》《C++从入门到入土》

🔖阻止了我的脚步的,并不是我所看见的东西,而是我所无法看见的那些东西。 ​《海上钢琴师》


文章目录

前言

在网页开发领域,CSS(层叠样式表,Cascading Style Sheets) 是让网页从 “单调结构” 走向 “美观交互” 的关键技术:如果把 HTML 比作搭建网页骨架的 “砖瓦”,CSS 就是定义 “外观风格” 与 “空间布局” 的 “设计师”—— 它能为网页赋予色彩、字体、间距、动画等视觉表现,让页面从 “能用” 真正升级为 “好看且易用”。

对于想要入门前端开发,或是希望系统提升网页样式能力的学习者而言,CSS 是必须深入掌握的核心内容。从理解 CSS 的基本概念与语法逻辑,到学习如何将 CSS 与 HTML 进行结合;从灵活运用各类 “选择器” 精准控制页面元素,到熟练操作文本、背景、边框等基础样式属性,再到借助 “盒模型”“布局定位”(包括弹性布局等现代方案)打造符合需求的页面结构…… 每一个环节,都直接影响着最终网页的呈现效果。

本文将围绕 CSS 的核心知识体系逐步展开:从 CSS 的基础概念、引入方式讲起,深入解析 “基础选择器”“复合选择器” 等样式控制逻辑,再系统讲解文本、背景、边框、盒模型,以及布局与定位(如元素显示模式、弹性布局)等常用属性。无论你是刚接触前端的新手,还是需要梳理 CSS 知识的开发者,都能通过本文建立清晰的 CSS 知识框架,为后续打造精美、专业的网页奠定基础。

现在,就让我们一同走进 CSS 的世界,探索网页样式与布局的无限可能。

一. CSS是什么

1.1 概念

CSS 是层叠样式表(Cascading Style Sheets) 的缩写,核心作用是定义和控制网页的外观与布局,让 HTML 构建的网页结构更美观。

简单来说就是让原本朴素的网页,变得更加丰富,好看。相当于给网页进行"化妆"。

HTML与CSS之间的关系就是:HTML 负责搭建网页的 “骨架”,比如创建标题、段落、图片等基础结构;CSS 则负责给这个 “骨架” 穿上 “衣服”,决定结构的视觉呈现效果。两者分工明确,共同构成了可视化的网页。

1.2 基本语法

<style> 选择器 +{ 一条 / N条声明 } </style> 
  1. 选择器可以绝对要对那些板块进行修改,丰富;
  2. 后面大括号中的声明,则绝对能对该板块中的那些元素进行修饰;
  3. 声明的属性是键值对,后续会进行详细介绍。

二. CSS如何引入HTML

在HTML中使用CSS的方法大体上可以分为3种:

  1. 内部样式表;
  2. 行内样式表;
  3. 外部引入。

2.1 内部样式表

直接将CSS镶嵌到HTML页面种,通过<style>标签来进行嵌套。

  • 直接将CSS放在,head中,对标签进行修饰。

比如像百度网页中就有这种内部样式表的CSS:

请添加图片描述
  • 理论上<style>放在html的任何位置都是可以的,一般都会放在head标签中。

此处我们也可以写一个简单的内部样式表的CSS:

比如一下,我们对<p>标签的颜色进行修饰:

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>Document</title><style>p{color: red;}</style></head><body><p>这是第一段的内容</p></body></html>

2.2 行内选择器

我们除了可以在<style>中对颜色进行设置,我们也是允许在一个具体标签中进行设置,比如:

<body><pstyle="color: red">这是第一段内容</p></body>
  • 注意:如果行内样式表和内部样式表同时存在,行内样式表中的设置优先级更高

2.3 外部引入

对于行内选择器来说,如果一个html文件很大的时候,如果我们想要对一个类别的标签进行修改,就需要将所有相同标签进行重复设置,耗时耗力,不同该方便。

对于内部样式表来说,将CSS嵌套到HTML中,并没有将七放在每一个具体标签中,确实将样式与页面结构进行了很好的分离,但是分离的还是不够彻底,当CSS内容很多的时候,尤其明显。

  • 因此就出现了外部引入式:将CSS内容,全部都放到一个单独的CSS文件中,该文件以.css后缀进行命名。

此时在进行编写HTML的时候,如果我们希望使用这种CSS样式,就需要进行链接

<linkrel="stylesheet"href="对应的CSS文件地址">

三. CSS选择器

  • CSS中的选择器大体上分为两种:(1)基础选择器;(2)复合选择器。

3.1 基础选择器

基础选择器:由单个选择器构成,其中主要包含4种:

  1. 标签选择器;
  2. 类选择器;
  3. id选择器;
  4. 通配符选择器。

3.1.1 标签选择器

直接使用标签进行选择,对该标签进行设置。

语法:

<style>/* 标签名称{ 声明要设置的属性 } */h1{color:antiquewhite;}</style>

直接对标签进行选择,HTML中所有该类型的标签都会被进行设置。
一般这种标签使用较少。

3.1.2 类选择器

语法:

<style>/* .类名{ 声明要设置的属性 } */.name{color:antiquewhite;}</style>

其中类名指的是,HTML中我们对一些特定标签设置的类名称:

<body><pclass="name">张三</p><p>12岁</p></body>

一个标签可以设置多个类,中间用空格进行分割,比如:

<pclass="s1 s2 s3"><p/>

3.1.3 id选择器

  • 通过ID来进行选择,与类不一样的是,每个标签只有一个ID,并且每个标签的ID要求是唯一的。

语法:

<style>/* #id{ 声明要设置的属性 } */#张三{color:red;}</style>

对ID进行设置的方法与类一样:

<body><pid="张三">张三</p><p>12岁</p></body>

3.1.4 通配符选择器

  • 在 CSS 中,通配符选择器用 * 表示,它的作用是匹配页面中所有 HTML 元素(包括 <html><body><p><div> 等所有标签)。它是一种范围最广的选择器,常用于全局样式初始化或批量设置基础样式。

语法:

/* 匹配页面中所有元素,清除默认margin和padding */*{margin: 0;padding: 0;}

使用起来简单,在实际开发中,主要是用来针对页面中所有元素默认样式进行消除的,主要被用来消除边距。

3.2 复合选择器

复合选择器,顾名思义就是由多个基础选择器构成的,主要也是4种:

  1. 子选择器;
  2. 后代选择器;
  3. 并集选择器;
  4. 仿类选择器。

3.2.1 子选择器

当一个标签中含有子标签,比如:

<body><ul><li>内容1</li><li>内容2</li><li>内容3</li></ul><ol><li>内容1</li><li>内容2</li><li>内容3</li></ol></body>

此时我们想对<ul>中的<li>的输出样式进行设置,但是不想改变<ol>中的<li>就可以采用子选择器来实现:

语法:

<style> /* 父标签>子标签{ 属性声明 } */ul>li{color: red;} </style> 

其中不仅仅可以是标签的父子关系,也可以是类名的父子关系。

3.2.2 后代选择器

后代选择器与上面的子选择器使用起来类似,只不过后代选择器不再仅仅现在在父子之间了,也可以爷孙等后代关系

语法:

<style>/* 长辈标签 后代标签{ 属性声明 } */ul li{color: red;}</style>

3.2.3 并集选择器

  • 并集选择器,顾名思义就是对多个标签,类,id同时进行设置,其中有逗号隔开。

语法:

<style>/* 多个标签/类/id { 属性声明 } */ul,li{color: red;}</style>

3.2.4 伪类选择器

伪类选择器是 CSS 中一类特殊的选择器,用于选择元素的特定状态、位置或关系,而不是基于元素的标签名、类名或 ID。它们以冒号 : 开头,语法为 选择器:伪类 { 样式 }
  • 伪类不直接匹配元素本身,而是根据元素的动态状态(如鼠标悬停)、文档结构位置(如第一个子元素)或特殊关系(如被点击的链接)来筛选元素,让样式控制更灵活。
在这里插入图片描述

比如百度页面中,对于被选中的标签设置为蓝色,没有被选中的标签设置为黑色。

其中最常使用的有4种:

  1. :link:选择未被访问的;
  2. :visted:选择已被访问的;
  3. :hover:鼠标悬停的;
  4. :active:活动的,鼠标按下但是还没有弹起的。
/* 未访问的链接 */a:link{color: #333;}/* 已访问的链接 */a:visited{color: #999;}

四. CSS常用属性

可以设置的属性有很多,此处就选择一些最为常见的进行介绍。

4.1 文本属性

名称说明
font-family字体类型
font-size字体大小
color字体颜色
font-weight字体粗细程度
font-style字体样式
text-align文本对其方式
text-indent文本缩进
text-decoration字体装饰
line-height行高

其中color有三种表示形式:

  1. 直接使用颜色对应的英文;
  2. 使用三原色进行表示:#ff0000其中每两个十六进制表示一个颜色,从前往后:红绿蓝
  3. 依旧是使用三原色进行表示:rgb(255 , 0 , 0)从前往后还是:红绿蓝。

对于font-weight表示字体的粗细程度:

  1. 可以使用数字100~900数字也大越粗;
  2. 也可以使用bold/normal/light来进行表示。

字体类型font-style有三种形式:normal/italic/oblique分别表示正常,斜体和倾斜。

斜体和倾斜有什么区别:
  • italic(斜体):使用字体本身自带的 “斜体版本”。这种字体是由设计师专门设计的,倾斜角度、笔画粗细等细节会根据字体特性进行优化,整体风格更自然协调(例如衬线字体的斜体可能会有更明显的笔画变化)。
  • oblique(倾斜):不使用字体的斜体版本,而是将正常字体(正体,normal)通过算法强制倾斜一定角度得到的效果。它本质上是对正体文字的 “变形处理”,而非字体原生设计的斜体。

文本对齐方式text-align有三种:left/center/right分别表示左中右。

文本装饰text-decoration也有三种:underline/line-through/overline表示下划线,删除线和上划线。

4.2 背景属性

名称说明
background-color背景颜色
background-image背景图
background-repeat背景平铺方式
background-position背景位置
background-size背景大小

关于背景颜色和背景图就不再赘述了,此处详细介绍一下背景的平铺方式

  1. repeat(默认值):背景图像在水平方向(x 轴)和垂直方向(y 轴)同时重复平铺,直到完全填满元素的背景区域。
  2. repeat-x:背景图像仅在水平方向(x 轴)重复平铺,垂直方向不重复(只显示一次)。
  3. repeat-y:背景图像仅在垂直方向(y 轴)重复平铺,水平方向不重复(只显示一次)。
  4. no-repeat:背景图像不重复平铺,仅在背景区域内显示一次。

对于背景的位置background-position可以直接设置x坐标和y坐标,也可以使用top/bottom/left/right来进行替代。

对于背景的大小background-size可以直接使用宽度和高度来进行设置,也可以使用提供的一些方式:

  1. auto默认值:保持背景图像的原始尺寸(宽高比例不变),不进行缩放。
  2. cover:背景图像会被等比例缩放,确保完全覆盖整个背景区域(可能会裁剪图像的边缘)。
  3. contain:背景图像会被等比例缩放,确保图像完全显示在背景区域内(可能会在区域内留下空白)。

4.3 边框属性

对于边框属性,最常用的就一个:设置边框的圆角

border-radius:内切圆半径/百分比 
  1. 对于内切圆半径,值越大,弧度越大。
  2. 百分比对应的:
    1. 圆角的水平半径(控制左右方向的曲率) = 元素宽度 × 百分比;
    2. 圆角的垂直半径(控制上下方向的曲率) = 元素高度 × 百分比;

4.4 盒模型属性

HTML的每一个元素,都相当于一个矩形的盒子

在浏览器中进行调试的时候,我们也可以看到:

在这里插入图片描述

盒模型主要由四部分组成:

  1. 边框boarder;
  2. 内容content;
  3. 内边距padding;
  4. 外边距margin;
请添加图片描述
  1. 内边距就是内容相对于边框的距离;
  2. 外边距就是每一个边框之间的距离。

比如下面,我对一个段落的边框进行设置:

<style>p{width:100px;height:50px;color: red;border: black solid;padding: 10px;margin: 100px;}</style><body><p>段落1</p></body>
请添加图片描述

可以看到上述就是我们设置好的盒模型了。

但是:我们的和模型的宽和高明明是:100 50的,为什么这里变成了12474的,这也不难理解,因为我们设置了边框和内边距,因此盒子被撑大了。*

如果不希望盒模型被撑大,可以设置box-sizing:border-box

在上述进行设置的时候,我们是直接对上下左右的内边距,外边距进行设置的,CSS也允许我们对单个进行设置:

padding-left/right/top/bottom: ...; margin-left/right/top/bottom: ...;

4.5 布局与定位属性

4.5.1 元素显示模式

HTML中的元素可以分为两种:块级元素,独占一行;行内元素。
对于行内元素来说,也可以通过CSS中的设置转变为块级元素:display:block

4.5.2 弹性布局

  • 弹性布局是一种手段,专门用于解决元素在容器中的对齐、分布和动态尺寸调整问题。

弹性容器:通过 display: flexdisplay: inline-flex 声明的父元素,它会 “包裹” 内部的子元素。

弹性布局通过 “轴线” 控制项目的排列方向,这是理解布局规则的核心:

  • 主轴:默认沿主轴排列,方向由 flex-direction 决定(默认水平向右)。
  • 交叉轴:垂直于主轴的轴线,方向随主轴变化(默认垂直向下)。

容器属性用于定义项目的排列方向、换行规则、对齐方式等,常用属性如下:

  1. flex-direction:决定主轴方向(项目排列方向)
  • row(默认):主轴水平,项目从左到右排列。
  • row-reverse:主轴水平,项目从右到左排列。
  • column:主轴垂直,项目从上到下排列。
  • column-reverse:主轴垂直,项目从下到上排列。
.flex-container{flex-direction: row;/* 默认值 *//* flex-direction: row-reverse; *//* flex-direction: column; *//* flex-direction: column-reverse; */}
  1. flex-wrap:控制项目是否换行

默认情况下,项目会在主轴上 “挤压” 不换行,通过 flex-wrap 可设置换行规则:

  • nowrap(默认):不换行,项目可能被压缩。
  • wrap:换行,超出容器的项目移至下一行(沿交叉轴方向)。
  • wrap-reverse:换行,但新行在上方(交叉轴反向)。
.flex-container{flex-wrap: wrap;/* 超出容器时换行 */}
  1. flex-flowflex-direction + flex-wrap 的简写

语法:flex-flow: <flex-direction> <flex-wrap>,简化代码:

.flex-container{flex-flow: row wrap;/* 等价于 flex-direction: row; flex-wrap: wrap; */}
  1. justify-content:控制项目在主轴上的对齐方式

根据主轴方向(水平 / 垂直),控制项目的水平 / 垂直对齐:

  • flex-start(默认):靠主轴起点对齐。
  • flex-end:靠主轴终点对齐。
  • center:沿主轴居中对齐(常用:水平居中)。
  • space-between:项目两端对齐,中间间距相等(常用:两端分布)。
  • space-around:项目两侧间距相等(总间距 = 中间间距 ×2)。
  • space-evenly:项目之间及与容器边缘的间距完全相等。
.flex-container{justify-content: center;/* 主轴居中对齐 *//* justify-content: space-between; */}
  1. align-items:控制项目在交叉轴上的对齐方式:根据交叉轴方向(垂直 / 水平),控制项目的垂直 / 水平对齐:
  • stretch(默认):项目拉伸至填满交叉轴方向(需项目无固定高度 / 宽度)。
  • flex-start:靠交叉轴起点对齐。
  • flex-end:靠交叉轴终点对齐。
  • center:沿交叉轴居中对齐(常用:垂直居中)。
  • baseline:项目沿基线(文字基线)对齐。
.flex-container{height: 300px;/* 给容器固定高度,才能看到垂直对齐效果 */align-items: center;/* 交叉轴居中对齐(垂直居中) */}

我们可以通过类似于这种弹性布局来实现,百度首页侧栏中的链接排列:

请添加图片描述
<style> div{margin-left: 20px;display: flex;height: 50px;width: 500px;justify-content: space-between;align-items: center;} </style> </head> <body> <div> <span>新文</span> <span>地图</span> <span>贴吧</span> <span>视频</span> <span>图片</span> <span>网盘</span> </div> </body> 
请添加图片描述

Read more

Flutter 三方库 filterator 的鸿蒙化适配指南 - 掌握声明式数据流过滤技术、助力鸿蒙应用构建极速且易维护的复杂列表筛选逻辑

Flutter 三方库 filterator 的鸿蒙化适配指南 - 掌握声明式数据流过滤技术、助力鸿蒙应用构建极速且易维护的复杂列表筛选逻辑

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 filterator 的鸿蒙化适配指南 - 掌握声明式数据流过滤技术、助力鸿蒙应用构建极速且易维护的复杂列表筛选逻辑 前言 在 OpenHarmony 鸿蒙应用全场景信息交互的开发中,“数据清洗与过滤(Data Filtering)”是提升用户体验的关键环。当你需要在一个包含上万件商品的电商列表中,同时根据“价格区间”、“用户评分”、“物流时效”以及“是否有货”进行复合筛选时,嵌套的 if-else 或繁琐的迭代逻辑会让代码迅速变得臃肿且难以调试。filterator 作为一个专为 Dart 集合设计的声明式过滤利器,旨在通过链式调用与逻辑组合,将复杂的数据筛选过程转化为语义清晰、模块化的流式配置。本文将介绍如何在鸿蒙端利用 filterator 打造极致的数据交互体验。 一、原原理分析 / 概念介绍 1.1 基础原理 filterator 的核心逻辑是 基于谓词逻辑的集合管道过滤器

By Ne0inhk
Flutter 三方库 vendure 的适配鸿蒙实战 - 驾驭核心电商交易总网,实现 OpenHarmony 下的大并发 GraphQL 无头电商网关与数据强防腐

Flutter 三方库 vendure 的适配鸿蒙实战 - 驾驭核心电商交易总网,实现 OpenHarmony 下的大并发 GraphQL 无头电商网关与数据强防腐

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 vendure 的适配鸿蒙实战 - 驾驭核心电商交易总网,实现 OpenHarmony 下的大并发 GraphQL 无头电商网关与数据强防腐 前言 随着鸿蒙(OpenHarmony)生态的全球化出海,超级应用与万物互联的电商新纪年已经拉开帷幕。我们在将手机、平板、车载大屏甚至穿戴设备接入商城入口时,必须面对传统 RESTful 接口带来的巨大挑战:接口散乱、冗余数据多、联调效率低。 在处理类似 0308 批次这种千万级大字段的商品详情系统时,如果前端对后端接口的变动缺乏抗崩御能力,一次小小的结构调整就可能导致全链条的业务断裂,直接造成现金流的损失。我们需要一种“逻辑高层编排、数据按需即取、边界强悍防御”的接口总网。vendure 库正是为此而生的 GraphQL 客户端架构重炮。本文将详细揭秘它如何帮助你在鸿蒙端打造一套坚不可摧的交易底盘。 一、原理解析 / 概念介绍 1.

By Ne0inhk
Flutter for OpenHarmony:json_path 像 XPath 一样查询 JSON 数据,复杂结构再也不怕(数据提取神器) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:json_path 像 XPath 一样查询 JSON 数据,复杂结构再也不怕(数据提取神器) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 处理深层嵌套的 JSON 数据是开发者的噩梦。当你需要从一个复杂的 API 响应中提取特定条件的字段时,手写多层 map() 和 if 判断简直是灾难。 json_path 实现了 RFC 9535 标准,允许你使用类似 XPath 的语法来查询 JSON。本指南将结合 OpenHarmony 示例,展示如何优雅地进行数据提取。 一、 核心原理解析 json_path 的核心在于声明式查询。你只需要描述「我要什么」,而不需要关心「怎么遍历」。 * $: 根节点。 * …: 递归搜索(查找任意层次的字段)。 * [*]: 匹配数组中的所有元素。 * [?(@.condition)]: 过滤器(筛选符合条件的项)。 二、 核心 API

By Ne0inhk
鸿蒙APP开发从入门到精通:性能优化与Next原生合规

鸿蒙APP开发从入门到精通:性能优化与Next原生合规

《鸿蒙APP开发从入门到精通》第11篇:性能优化与Next原生合规 🏎️✅ 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第11篇——性能优化与Next原生合规篇,承接第10篇的「AI原生与用户增长」,100%复用项目架构,为后续第12篇的电商购物车全栈项目最终上线铺垫性能优化与Next原生合规的核心技术。 学习目标: * 掌握鸿蒙APP性能优化的定义与架构; * 实现启动优化、渲染优化、网络优化等性能优化功能; * 理解Next原生合规的原理与实现方式; * 开发代码规范、权限合规、数据合规等合规功能; * 优化性能与合规的用户体验(响应速度、内存占用、电池消耗)。 学习重点: * 鸿蒙APP性能优化的开发流程; * 性能优化的分类与使用场景; * 启动优化、渲染优化、网络优化的实现; * Next原生合规的设计与实现。 一、 性能优化基础 🎯 1.1 性能优化定义 性能优化是指对应用进行优化,提高应用的响应速度、降低内存占用、减少电池消耗等,主要包括以下方面: * 启动优化:优化应用的启动时间; * 渲染优化:优化应用的界

By Ne0inhk