CSS 基础语法 + 弹性盒子

CSS(Cascading Style Sheet)是用于控制页面样式与布局 并允许样式信息与网页内容相分离的一种标记性语言。如果将HTML类比为人,那么CSS就是我们身上的衣服和化妆品!

CSS由选择器属性属性值组成:

css 复制代码
selector{prosperties:value;}
  • 选择器:用于定义CSS样式名称
  • 属性:例如网页中的字体样式、字体颜色等
  • 属性值:例如字体的大小、颜色等

  • 属性和属性值必须写在{}内,且用":"隔开
  • 每写完一个完整的属性和属性值,必须用";"隔开
  • 如果一个属性有多个属性值,每个属性值用space隔开

引入CSS

1.内联引入

每个HTML元素都拥有一个<style>属性,我们的CSS代码都是作为HTML中<style>属性的属性值出现的:

html 复制代码
<p style="color: red;">这是段落</p>

这是段落

2.内部引入

当我们页面有很多元素时,这样内联引入CSS样式代码显然是不合适的,比如当同一个元素需要复用同一种样式 ,我们需要在每一个元素内部手动添加 ,这样产生很多重复性 的操作和劳动。所以我们可以将有相同需求的元素整理好分成许多类别,让相同类别元素使用同一种样式。

我们使用<style>标签进行对CSS的引入,在页面的<head>区域引入<style>标签,在其中写入需要的CSS样式:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
    p{
        color:red;
        font-size:20px;
    }
    span{
        color:green;
        font-size:10px;
    }
    </style>
</head>
<body>
    <p> It's been a long day without you, my friend.</p>
    <span>And I'll tell you all about it when I see you again.</span>
</body>
</html>
3.外部引入

在我们实际开发过程中,项目的页面不会少,如果我们希望所有的页面都使用同一个CSS样式 ,那么我们就需要将CSS样式单独放在一个文件中(新建一个以.css为后缀名的样式表 )然后通过<link>标签引入到我们的页面中,这是你还会发现,当我们需要对所有页面进行样式修改时,就只需要修改一个CSS文件,不用对所有页面逐个修改!

CSS选择器

1.元素选择器

对HTML元素进行选取,如<p><ul>

css 复制代码
<sytle>
p{
    color:red;
    font-size:20px;
}
ul{
    list-style-type:none;
}
a{
    text-decoration:none;
}
</style>
2.类选择器

通过class属性确定类名进行选取,相同类名的元素含有相同的CSS样式

css 复制代码
<body>
<p class="title">我是一个段落</p>
<div class="container">这是一个容器</div>
</body>
<sytle type="text/css">
.title{
    color:red;
    font-size:20px;
    text-align:center;
}
</sytle>
  • 类选择器前需要加.
  • vscode中,属性名+.+类名Tab自动补全<元素 class="类名">的形式
3.ID选择器

以上两种都是对同一类元素进行选取和操作,当我们需要单独为一个元素 进行操作时,通过id属性确定ID名进行选取,如<p id="title"><ul id="list">,相同ID名的含有相同的CSS样式

css 复制代码
<body>
<p id="title">我是一个段落</p>
<div id="container">这是一个容器</div>
</body>
<sytle type="text/css">
#title{
    color:red;
    font-size:20px;
    text-align:center;
}
#container{
    background-color:yellow;
}
</sytle>
  • ⚠️ ID选择器前需要加#

网页常用样式

字体

font-family字体
font-size字号
  • 像素(px
  • 点数(pt
  • 英寸(in)、厘米(cm)、毫米(mm
  • 倍数(em
  • 百分比(%
font-weight字重
  • 正常(normal):400
  • 加粗(bold):700
  • 更粗(bolder
  • 更细(lighter
  • 数字(100~900):只能写成整百的数字
color颜色

相关内容前文有相应介绍,不再赘述

  • color_name
  • hex_number
  • rgb_number
  • rgba_number
text-decoration文本修饰
  • none:无修饰
  • underline:下划线
  • overline:上划线
  • line-through:中划线
  • blink:闪烁

段落

letter-spacing字间距
  • normal:正常
  • length:长度
word-spacing词间距
  • normal:正常
  • length:长度
text-indent缩进
  • length:长度
  • %:百分比
text-align水平对齐
  • left:左对齐
  • right:右对齐
  • center:居中对齐
  • justify:两端对齐
vertical-align垂直对齐
  • top:顶部对齐
  • middle:垂直居中对齐
  • bottom:底部对齐
line-height行间距
  • normal:正常
  • number:与当前字体尺寸相乘来设置行间距
  • length:固定行间距

边框

border-style边框线型
  • none:无边框
  • hidden:隐藏边框
  • dotted:点状边框
  • dashed:虚线边框
  • solid:实线边框
  • double:双线边框
css 复制代码
border-style:dotted solid double dashed;
复制代码
上边框是点状
右边框是实线
下边框是双线
左边框是虚线

css 复制代码
border-style:dotted solid double;
复制代码
上边框是点状
右边框和左边框是实线
下边框是双线

css 复制代码
border-style:dotted solid;
复制代码
上边框和下边框是点状
右边框和左边框是实线

css 复制代码
border-style:dotted;
复制代码
四个边框均为点状

border-color边框颜色
border-width边框宽度

盒子模型

根据上图,俯视 这个盒子,内边距(padding)可以理解为盒子里装的东西和边框的距离 ;而边框(border)就是盒子本身 ;内容(content)就是盒子中装的东西 ;外边距就是边框外面自动留出的一段空白;而填充(padding)就是怕盒子里装的东西损坏而添加的泡沫或者其他抗震材料 ;至于边界(margin)则说明盒子摆放时不能全部堆在一起,要留有一定空隙保持通风,同时方便取出!

外边距设置

使用margin属性设置外边距margin边界环绕在该元素的content区域四周,如果margin为0,则margin边界与border边界重合。

属性 描述
margin-top 上外边距
margin-right 右外边距
margin-bottom 下外边距
margin-left 左外边距

margin属性值仍然有四个参数 ,对应上、右、下、左即顺时针方向旋转

html 复制代码
 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            width:200px;
            height:100px;
            border:2px green solid;
            background-color:crimson
        }
        .d2{
            margin-top: 20px;
            margin-right:auto;
            margin-bottom: 40px;
            margin-left:10px;
            // margin:20px auto 40px 10px;
        }
    </style>
</head>
<body>
    <div class="d1"></div>
    <div class="d2"></div>
    <div class="d3"></div>
</body>
</html>

当两个垂直外边距相遇时,他们将会形成一个外边距 ,合并后的外边距的高度等于两个外边距的最大高度(注意不是外边距相加)

内边距设置

使用padding属性设置内边距 ,内边距在边框和内容区之间,padding属性接受长度值和百分比,但不允许使用负值。

属性 描述
padding-top 上内边距
padding-right 右内边距
padding-bottom 下内边距
padding-left 左内边距

弹性盒子

默认流式布局中,块级元素(如div)会独占一行,多个div会垂直堆叠,无法横向排列;而当我们使用floatinline-box进行横向排列时,会带来间距、对齐、父元素高度塌陷等问题。

当一种页面需要适应不同的屏幕大小以及设备类型 时,弹性盒子可以确保元素拥有恰当行为的布局方式,这样的布局模型能提供一种更有效的方式来对一个容器中的子元素进行排列、对齐、分配空白空间

  • 只要给容器设置display: flex;任何一个容器我们都可以设置为弹性盒子

  • 设为flex布局以后,子元素的floatclearvertical-align属性将失效

  • flex-direction:设置排列方向(沿纵轴还是横轴)(正序还是倒序)

描述 动画演示
row 默认值,水平显示,起点在左端 1️⃣2️⃣3️⃣4️⃣_ _ _ _
row-reverse 盒子方向相反,且起点在右端 _ _ _ _4️⃣3️⃣2️⃣1️⃣
column 垂直显示,起点在上端
column-reverse 盒子方向相反,且起点在下端
  • justify-content:在主轴(横轴)上的对齐方式
描述 动画演示
flex-start 起点在左端 1️⃣2️⃣3️⃣4️⃣_ _ _ _
flex-end 终点在右端 _ _ _ _1️⃣2️⃣3️⃣4️⃣
center 居中对齐 _ _1️⃣2️⃣3️⃣4️⃣ _ _
space-between 项目之间的间隔相等,紧贴左右两端 1️⃣ _ 2️⃣ _ 3️⃣ _ 4️⃣
space-around 每个项目两侧的间隔相等 _ 1️⃣ _ 2️⃣ _ 3️⃣ _ 4️⃣ _
space-evenly 项目之间的间隔相等,且项目两侧的间隔相等 _ 1️⃣ _ 2️⃣ _ 3️⃣ _ 4️⃣ _
  • align-items:在侧轴(纵轴)上的对齐方式
描述
flex-start 起点在上端
flex-end 终点在下端
center 居中对齐
baseline 基线对齐
stretch auto尽可能接近所在行的尺寸
  • flex-wrap:弹性盒子的换行方式
描述
nowrap 默认值,不换行,盒子会被压缩
wrap 换行,第一行在上方
wrap-reverse 反向换行,第一行在下方
  • align-content多行情况下侧轴(纵轴)的对齐方式
描述
stretch 默认值auto,将占满整个容器的高度
flex-start 起点在上端
flex-end 起点在下端
center 上下居中对齐
space-between 项目之间的间隔相等
space-around 每个项目两侧的间隔相等

该属性只在多行(flex-wrap: wrapflex-wrap: wrap-reverse)的情况下生效!

下面是使用CSS和HTML创建的"待办事项"demo!

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>hello</title>
</head>

<body>
    <div class="todolist">
        <div class="title">
            Richard的todolist
        </div>
        <div class="todo-form">
            <input class="todo-input" type="text" placeholder="请输入待办事项">
            <div class="todo-button">添加</div>
        </div>

        <div class="item completed">
            <div>
            <input type="checkbox">
            <span class="name">吃饭</span>
            </div>

            <div class="del">删除</div>
        </div>
        <div class="item">
            <div>
            <input type="checkbox">
            <span class="name">睡觉</span>
            </div>

            <div class="del">删除</div>
        </div>
        <div class="item">
            <div>
            <input type="checkbox">
            <span class="name">学习</span>
            </div>

            <div class="del">删除</div>
        </div>
    </div>

    <style>
        .completed{
            text-decoration: line-through;
            opacity: 0.4;
        }
        .del{
            color: red;
        }
        .item{
            display: flex;
            align-items: center; /* 垂直居中对齐 */
            box-sizing: border-box;
            width: 80%;
            height: 50px;
            margin: 8px auto;
            padding: 16px;
            border-radius: 0 20px 20px 0; 
            box-shadow: 0 2px 5px rgba(0,0,0,0.1); /* 修复阴影语法 */
            background-color: #f9f9f9;
        }
        
        .todo-form{ 
            display: flex;
            width: 80%;
            margin: 20px auto; /* 居中表单 */
            height: 50px; /* 固定表单高度 */
        }
        
        .todo-input{ 
            padding-left: 15px;
            border: 1px solid #dfe1e5; 
            outline: none;
            width: calc(100% - 100px); /* 自动计算宽度 */
            height: 100%; /* 与按钮同高 */
            border-radius: 20px 0 0 20px; /* 修复语法错误 */
            box-sizing: border-box; /* 确保padding不增加总宽度 */
            font-size: 16px;
        }
        
        .todo-button{
            width: 100px;
            height: 100%; /* 与输入框同高 */
            border-radius: 0 20px 20px 0;
            text-align: center;
            background: linear-gradient(
                to right,
                rgb(113,65,168),
                rgba(44, 144, 251,1)
            );
            color: white;
            padding: 0 10px; /* 垂直居中文字 */
            line-height: 50px; /* 与高度一致实现垂直居中 */
            cursor: pointer;
            user-select: none;
        }
        
        body{
            background: linear-gradient(
                to right,
                rgb(113,65,168),
                rgba(44, 144, 251,1)
            );
            margin: 0;
            padding: 20px;
        }
        
        .todolist{
            max-width: 600px; /* 限制最大宽度 */
            width: 100%;
            padding: 20px;
            background-color: white;
            border-radius: 10px;
            margin: 40px auto; /* 水平居中 */
            box-shadow: 0 5px 15px rgba(0,0,0,0.1);
        }
        
        .title{
            text-align: center;
            font-size: 30px;
            font-weight: 700;
            color: rgb(113,65,168);
            margin-top: 20px;
            margin-bottom: 30px;
        }
        
        .del {
            margin-left: auto;
            color: #ff4444;
            cursor: pointer;
            padding: 5px 10px;
            border-radius: 12px;
            background-color: #fef0f0;
        }
        
        .name {
            margin-left: 10px;
            flex: 1;
        }
    </style>
</body>
</html> 

封面来源:Learn CSS Flexbox in 20 Minutes (Course)

相关推荐
折果33 分钟前
如何在vue项目中封装自己的全局message组件?一步教会你!
前端·面试
复苏季风34 分钟前
CSS 布局小技巧:用 padding 撑开 div 不香吗?
css
不死鸟.亚历山大.狼崽子37 分钟前
Syntax Error: Error: PostCSS received undefined instead of CSS string
前端·css·postcss
汪子熙37 分钟前
Vite 极速时代的构建范式
前端·javascript
跟橙姐学代码37 分钟前
一文读懂 Python 的 JSON 模块:从零到高手的进阶之路
前端·python
前端小巷子1 小时前
Vue3的渲染秘密:从同步批处理到异步微任务
前端·vue.js·面试
nightunderblackcat2 小时前
新手向:用FastAPI快速构建高性能Web服务
前端·fastapi
小码编匠2 小时前
物联网数据大屏开发效率翻倍:Vue + DataV + ECharts 的标准化模板库
前端·vue.js·echarts
欧阳天风3 小时前
分段渲染加载页面
前端·fcp
艾小码3 小时前
TypeScript在前端的实践:类型系统助力大型应用开发
前端·typescript