一文全概CSS
关于 CSS
CSS(层叠样式表)在前端开发中具有重要的作用和重要性,主要体现在:
- 样式控制:CSS 用于控制网页的外观和样式,包括字体、颜色、背景、边框、布局等。通过 CSS,开发者可以轻松地改变网页的外观,使其更加吸引人和易于阅读。
- 网页布局:CSS 提供了强大的布局能力,可以控制和定位网页中的元素。使用 CSS,开发者可以创建多栏布局、网格系统、响应式布局等,使网页在不同设备和屏幕尺寸下都能良好地显示和适应。
- 维护和可重用性:通过将样式定义为 CSS 规则,可以将样式应用于整个网站或多个页面,实现样式的统一和可重用性。这样,在需要修改样式时,只需更改 CSS 文件中的规则,而不必逐个修改每个页面的样式,提高了维护效率。
- 分离结构和样式:CSS 可以将网页的结构(HTML)与样式(CSS)分离,使得代码更加清晰和易于维护。这种分离还使得不同人员可以并行工作,不会互相干扰。
- 动画和交互效果:CSS 提供了丰富的动画和过渡效果,可以实现页面元素的平滑动画和交互效果,提升用户体验和网页的视觉吸引力。
- 响应式设计:CSS 提供了媒体查询等技术,使得开发者可以创建响应式网页,使其能够适应不同设备和屏幕尺寸。响应式设计已经成为现代网页开发的标准,帮助网页在移动设备上呈现良好的用户体验。
总之,CSS 在网页开发中是不可或缺的工具,它使开发者能够更好地控制和定制网页的外观和布局,提高用户体验,同时也提供了更高的代码可维护性和重用性。
下面来总结下 CSS 常见问题和知识
一.position
在 CSS 中,position
属性用于指定 HTML 元素在网页上的位置。该属性有四个可能的值:
static
:元素被放置在正常的文档流中,并按照页面布局显示。这是默认值。relative
:元素相对于其正常位置进行定位,并可以使用top
,bottom
,left
和right
属性来指定相对位置。absolute
:元素相对于其最近的非static
祖先元素进行定位,并可以使用top
,bottom
,left
和right
属性来指定绝对位置。fixed
:元素相对于视口进行定位,并可以使用top
,bottom
,left
和right
属性来指定固定位置。
这些不同的位置值使得开发人员能够更精细地控制页面布局和元素的位置。
二.行内元素 块状元素
在 HTML 中,元素可以分为两种主要类型:行内元素和块状元素。
行内元素指的是那些默认情况下只占据它包含的内容宽度的元素,比如 <span>
、<a>
、<em>
等。行内元素可以在一行内显示多个,而且通常不会有明显的换行。行内元素可以通过 CSS 的 display
属性设置为 block
或 inline-block
,以改变其默认行为。
块状元素指的是那些默认情况下会占据整个可用宽度的元素,比如 <div>
、<p>
、<h1>
等。块状元素通常会在上下文中形成一个独立的块,并且会自动换行。块状元素可以通过 CSS 的 display
属性设置为 inline
或 inline-block
,以改变其默认行为。
需要注意的是,行内元素和块状元素的特性不仅仅是它们默认的显示方式,还包括其他的一些特性,比如它们所能包含的内容类型、它们所能设置的样式属性等等。了解这些特性对于进行网页布局和样式设计非常重要。
三.关于 flex 布局
Flex 布局是 CSS3 中新增的一种布局方式,它通过对容器和其子元素的属性设置来实现灵活的布局和对齐方式。相比传统的基于盒子模型的布局方式,Flex 布局更加简单直观,也更易于响应式设计。
在 Flex 布局中,容器元素通过设置 display: flex
或 display: inline-flex
属性来声明使用 Flex 布局。然后,我们可以通过设置以下属性来控制容器和子元素的布局和对齐方式:
flex-direction
:设置主轴的方向,可以是row
(水平方向)、column
(垂直方向)、row-reverse
(水平方向,反向)或column-reverse
(垂直方向,反向)。justify-content
:设置主轴上的对齐方式,可以是flex-start
(左对齐)、flex-end
(右对齐)、center
(居中对齐)、space-between
(两端对齐)、space-around
(每个子元素周围留有相同的间距)、space-evenly
(每个子元素周围和之间留有相同的间距)。align-items
:设置交叉轴上的对齐方式,可以是stretch
(拉伸填满容器)、flex-start
(顶部对齐)、flex-end
(底部对齐)、center
(居中对齐)、baseline
(基线对齐)。align-content
:设置多行子元素在交叉轴上的对齐方式,只有在多行情况下生效,可以是flex-start
(顶部对齐)、flex-end
(底部对齐)、center
(居中对齐)、space-between
(两端对齐)、space-around
(每行周围留有相同的间距)、stretch
(拉伸填满交叉轴)。
在 Flex 布局中,子元素可以通过设置 flex-grow
、flex-shrink
和 flex-basis
属性来控制其在主轴上的大小和分配方式。另外,还可以使用 order
属性来指定子元素的顺序。
Flex 布局是一种强大而灵活的布局方式,可以应用于各种网页布局场景。但需要注意的是,Flex 布局虽然简单易用,但仍需要一定的学习和掌握,以便使用其特性和实现复杂的布局效果。
四.如何使用 flex 布局九宫格
使用 Flex 布局可以很容易地实现九宫格布局,以下是一种简单的实现方法:
HTML 代码:
<div class="grid-container">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
<div class="grid-item">4</div>
<div class="grid-item">5</div>
<div class="grid-item">6</div>
<div class="grid-item">7</div>
<div class="grid-item">8</div>
<div class="grid-item">9</div>
</div>
CSS 代码:
.grid-container {
display: flex;
flex-wrap: wrap;
justify-content: center;
}
.grid-item {
flex: 0 0 calc(33.333% - 20px);
height: 100px;
margin: 10px;
background-color: #ddd;
text-align: center;
line-height: 100px;
font-size: 24px;
}
解释:
- 使用
display: flex
将容器设置为 Flex 布局。 - 使用
flex-wrap: wrap
让子元素自动换行,以便在较小的屏幕上也能显示完整的九宫格。 - 使用
justify-content: center
让子元素在主轴上居中对齐。 - 对每个子元素设置
flex
属性来控制它们在主轴上的大小和分配方式。使用flex: 0 0 calc(33.333% - 20px)
让每个子元素占据父容器宽度的 33.333%,并留出 20px 的间隙。其中flex-grow: 0
表示子元素不放大,flex-shrink: 0
表示子元素不缩小,flex-basis: calc(33.333% - 20px)
表示子元素在主轴上的基准大小。 - 设置子元素的高度、间距、背景颜色、文本居中等样式,以达到九宫格的效果。
以上代码可以实现一个基本的九宫格布局,你可以根据需要进行修改和扩展,以实现更加复杂的布局效果。
五. Flex1 是什么,Flex 默认属性是什么
flex
是 Flexbox 布局中的一个重要属性,它用于设置 Flex 容器中的子元素的大小、分配方式和增缩比例等。
当设置为 flex: 1
时,表示子元素将占据剩余的可用空间。它相当于设置了以下三个属性的值:
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0%;
其中,flex-grow
表示子元素在空间有剩余的情况下放大的比例,默认值为 0
;flex-shrink
表示子元素在空间不足时缩小的比例,默认值为 1
;flex-basis
表示子元素在主轴方向上的初始大小,默认值为 auto
。因此,当 flex: 1
时,子元素会尽可能地占据剩余的空间,并且在空间不足时会缩小。
默认情况下,Flexbox 容器的子元素并没有默认的 flex
属性值,而是默认设置了 flex: 0 1 auto
。这相当于设置了 flex-grow: 0; flex-shrink: 1; flex-basis: auto;
。这意味着子元素在空间有剩余时不会放大,但会在空间不足时等比例缩小,且初始大小由内容自适应决定。
六.flex grid
Grid 布局是一种二维布局系统,它通过在网格中布置元素来实现灵活的页面布局。Grid 布局提供了比 Flexbox 更多的布局选项,可以更好地实现复杂的布局需求。以下是 Grid 布局的一些基本概念和用法:
- Grid 容器和 Grid 项目:Grid 布局的基本结构是一个 Grid 容器和多个 Grid 项目。Grid 容器是一个网格布局的父元素,通过设置
display: grid
将其变成一个 Grid 容器。Grid 项目是容器中的子元素,通过将其设置为 Grid 项目来参与网格布局。 - 网格轨道和网格线:Grid 布局中的网格是由一系列网格轨道和网格线组成的。网格轨道是网格中的一行或一列,网格线是轨道的边缘线。轨道和线可以通过
grid-template-rows
和grid-template-columns
属性来定义。 - 网格单元格和网格区域:网格中的每个单元格都由相邻的四个网格线包围而成,每个单元格可以包含一个或多个 Grid 项目。网格区域是由多个相邻的网格单元格组成的矩形区域,可以通过
grid-template-areas
属性来定义。 - 网格布局属性:Grid 布局提供了一系列属性,用于控制 Grid 容器和 Grid 项目的布局。常用的属性包括
grid-template-rows
和grid-template-columns
(用于定义网格轨道和网格线)、grid-template-areas
(用于定义网格区域)、grid-auto-rows
和grid-auto-columns
(用于定义自动填充的网格轨道大小)、grid-gap
(用于设置网格间距)、grid-row-start
、grid-row-end
、grid-column-start
和grid-column-end
(用于设置 Grid 项目的位置和大小)等。
使用 Grid 布局可以更加灵活地实现网格布局效果,可以实现复杂的布局需求,例如栅格布局、等分布局、不规则布局等。同时,与 Flexbox 布局相比,Grid 布局的兼容性更好,可以在更多的现代浏览器上使用。
七.移动端 1px 问题怎么解决
在移动端,由于设备像素比(Device Pixel Ratio,DPR)的存在,1 个 CSS 像素可能对应多个物理像素,这就会导致在某些情况下,使用 1px 的边框或者线条在高像素密度的设备上显示会变粗或者模糊的问题。
为了解决这个问题,常见的解决方案有以下几种:
- 使用 viewport meta 标签:通过设置 viewport meta 标签的 initial-scale 属性和 minimum-scale 属性来调整页面的缩放比例,以达到在高像素密度的设备上显示 1px 边框或线条的效果。例如:
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0"
/>
2. 使用 transform: scale():使用 CSS3 的 transform 属性,将元素缩放到原来的 1/DPR 大小,并将其边框或线条的宽度设置为原来的 DPR 倍。例如:
.box {
width: 100px;
height: 100px;
border: 1px solid #000;
transform: scale(0.5);
transform-origin: 0 0;
}
- 使用 border-image:使用 CSS3 的 border-image 属性,通过设置边框图片和边框宽度来实现 1px 边框或线条的效果。例如:
.box {
width: 100px;
height: 100px;
border: 1px solid transparent;
border-image: url(border.png) 2 stretch;
}
- 使用 box-shadow:使用 CSS3 的 box-shadow 属性,通过设置阴影颜色和阴影距离来实现 1px 边框或线条的效果。例如:
.box {
width: 100px;
height: 100px;
box-shadow: 0 0 0 1px #000;
}
以上是一些常见的解决方案,不同的方案有各自的优缺点,具体使用哪种方案需要根据实际情况来选择。
八.关于 rem 和 vw 方案,分别有什么优缺点
rem(font-size of the root element)和 vw(viewport width)都是用于响应式布局的单位,但它们的具体使用方式和优缺点略有不同。
- rem 方案
rem 单位是相对于根元素(html)的字体大小(font-size)来计算的,因此它的大小会受到根元素字体大小的影响。通过设置根元素的字体大小,就可以实现整个页面中的字体大小、间距、尺寸等的统一变化。
rem 方案的优点包括:
- 方便统一控制整个页面的大小和间距;
- 相对于 px 更容易进行扩展和调整,适合于响应式布局;
- 可以使用媒体查询来设置不同的根元素字体大小,以适应不同的屏幕尺寸。
rem 方案的缺点包括:
- 需要手动设置根元素字体大小,不太方便;
- 对于一些非文本的元素(如图片、视频等),不太适合使用 rem 单位。
- vw 方案
vw 单位是相对于视口宽度(viewport width)的比例单位,它的值是相对于视口宽度的百分比。通过使用 vw 单位,可以根据屏幕宽度的变化来自动调整元素的大小和间距。
vw 方案的优点包括:
- 不需要手动设置字体大小或根元素大小,更加方便;
- 可以自适应不同的屏幕宽度,具有很好的响应式布局效果;
- 适合于一些非文本元素的大小调整。
vw 方案的缺点包括:
- 在某些情况下,vw 单位的表现可能会受到设备像素比的影响,导致布局不稳定;
- 在一些低版本浏览器中可能不支持。
总的来说,rem 方案和 vw 方案都有各自的优缺点,应根据具体的需求和情况选择使用。在实际开发中,可以结合使用两种方案,以实现更加灵活的响应式布局效果。
九.rem 方案的 font-size 方案是挂在那里的
rem 和 font-size 方案都是挂在 CSS 样式中的。
rem 方案是通过设置根元素(html)的字体大小来控制整个页面中元素的大小和间距。具体实现方式为:
html {
font-size: 16px; /* 设置根元素字体大小为 16px */
}
body {
font-size: 1rem; /* 其他元素可以使用 rem 单位,以根元素的字体大小为基准 */
}
vw 方案是通过设置元素的宽度、高度、边距等为视口宽度的比例,来实现自适应布局。具体实现方式为:
.container {
width: 100vw; /* 设置容器宽度为视口宽度 */
}
.box {
width: 50vw; /* 设置元素宽度为视口宽度的 50% */
height: 20vw; /* 设置元素高度为视口宽度的 20% */
margin: 5vw; /* 设置元素边距为视口宽度的 5% */
}
需要注意的是,rem 和 vw 方案的使用应该结合具体的业务场景和需求,以实现最佳的响应式布局效果。
十.rem 方案时移动端字体怎么处理的
在 rem 方案中,字体的大小同样可以使用 rem 单位进行设置。不过需要注意的是,由于 rem 单位是相对于根元素(html)的字体大小而言的,因此对于移动端来说,需要根据屏幕密度(DPR)进行适当的调整。
通常来说,移动端的 DPR 为 2 或 3,因此可以将根元素的字体大小设置为相应的值,比如 16px/2=8px 或 16px/3=5.33px,以便于在不同密度的屏幕上显示合适的字体大小。
具体实现方式为:
/* 以 DPR 为 2 的情况为例 */
html {
font-size: 8px;
}
body {
font-size: 1.6rem; /* 相当于 16px */
}
h1 {
font-size: 2rem; /* 相当于 20px */
}
这样,无论在什么密度的屏幕上,都可以按照比例显示出合适的字体大小。需要注意的是,如果使用 rem 单位设置字体大小,不要将字体大小设置为过小的值,以免在高密度屏幕上出现字体模糊的情况。
十一.关于重绘和回流
重绘(Repaint)和回流(Reflow)是指浏览器渲染页面时所进行的两种计算操作。
重绘是指页面中某个元素的外观(比如背景色、字体颜色等)发生改变,但不影响其在页面中的位置和大小等属性,浏览器只需要重新绘制该元素的外观即可。重绘不会影响整个页面的布局。
回流是指页面中某个元素的布局发生改变,导致该元素的位置、大小等属性需要重新计算,从而引发整个页面的重新布局。回流会涉及到计算整个页面中所有元素的位置和大小等属性,因此比重绘更加耗费性能。
当页面发生重绘或回流时,会触发浏览器的重新渲染流程,从而导致页面性能的下降。为了避免过多的重绘和回流操作,可以采用一些优化手段,比如:
- 减少 DOM 操作,避免频繁的改变页面布局;
- 使用 CSS 动画代替 JavaScript 实现动画效果;
- 将需要多次读取的属性(比如 offsetWidth、offsetHeight 等)缓存起来,避免重复计算;
- 使用事件委托来优化事件绑定,避免对每个子元素都进行事件绑定;
- 将多次改变样式的操作合并为一次,减少回流次数。
需要注意的是,重绘和回流是浏览器的基本行为,无法完全避免。优化应该基于实际情况和性能瓶颈,避免过度优化而影响代码可维护性和可读性。
十二.居中/常见 布局
在 CSS 中实现居中或常见布局的方式有很多种,以下是一些常见的示例:
水平居中
1. text-align
对于内联元素或文本,可以使用 text-align
属性将其水平居中:
.container {
text-align: center;
}
.container > span {
display: inline-block;
}
2. margin
对于块级元素,可以使用 margin
属性将其水平居中:
.container {
width: 300px;
margin: 0 auto;
}
3. flexbox
使用 flexbox 可以将容器中的元素进行水平和垂直居中:
.container {
display: flex;
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
}
垂直居中
1. line-height
对于单行文本或内联元素,可以使用 line-height
属性将其垂直居中:
.container {
height: 100px;
line-height: 100px;
}
2. table-cell
使用 display: table-cell
和 vertical-align: middle
属性可以将元素进行垂直居中:
.container {
height: 100px;
display: table-cell;
vertical-align: middle;
}
3. flexbox
使用 flexbox 可以将容器中的元素进行水平和垂直居中:
.container {
display: flex;
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
}
常见布局
1. 圣杯布局
圣杯布局是一种三栏布局,其中两侧列宽度固定,中间列自适应,可以使用 float 和负 margin 实现:
<div class="container">
<div class="center"></div>
<div class="left"></div>
<div class="right"></div>
</div>
.container {
padding-left: 200px;
padding-right: 150px;
}
.center {
float: left;
width: 100%;
}
.left {
float: left;
width: 200px;
margin-left: -100%;
position: relative;
left: -200px;
}
.right {
float: left;
width: 150px;
margin-left: -150px;
position: relative;
right: -150px;
}
2. 两栏布局
两栏布局是一种常见的布局方式,其中一侧宽度固定,另一侧自适应,可以使用 float 或 flexbox 实现:
<div class="container">
<div class="left"></div>
<div class="right"></div>
</div>
/* float 方式 */
.container {
overflow: hidden;
}
.left {
float: left;
width: 200px;
}
.right {
margin-left: ;
}
十三.层叠上下文 说说 z-index
在 HTML 中,每个元素都有一个 z-index 属性,用于控制元素在 z 轴上的堆叠顺序。具体来说,z-index 属性定义了元素的层叠顺序,数值越大,元素就越靠上面。
但是,当元素发生重叠时,并不一定按照 z-index 值的大小来确定它们的层叠顺序,这时就要考虑到层叠上下文的概念。
层叠上下文是一种三维概念,它可以理解为是一个 z 轴方向上的盒子,它包含了一系列层叠元素。每个层叠上下文都有自己的层叠顺序,它可以影响包含在它内部的层叠元素的层叠顺序。
一个元素成为一个层叠上下文的条件有很多,以下是其中一些常见的情况:
- 根元素和 position 属性值为 fixed 或 sticky 的元素会创建一个层叠上下文。
- z-index 值不为 auto 的 position 值为 absolute 或 relative 的元素会创建一个层叠上下文。
- opacity 属性值小于 1 的元素会创建一个层叠上下文。
- transform 属性值不为 none 的元素会创建一个层叠上下文。
- filter 属性值不为 none 的元素会创建一个层叠上下文。
- isolation 属性值为 isolate 的元素会创建一个新的层叠上下文。
当一个元素成为一个层叠上下文时,它的 z-index 值就和其他层叠上下文中的元素的 z-index 值进行比较,而不是和当前层叠上下文中的其他元素进行比较。这样可以避免不同层叠上下文之间的混乱和冲突。
在使用 z-index 属性时,需要注意以下几点:
- z-index 属性只在定位元素上生效,即 position 属性值为 relative、absolute 或 fixed 的元素。
- z-index 只对同一层叠上下文中的元素进行比较,不同层叠上下文中的元素不受其影响。
- 当两个元素的层叠顺序相同时,后面的元素会覆盖前面的元素。
十四.Sass 和 Less
Sass 和 Less 是两种常见的 CSS 预处理器,它们可以增强 CSS 的能力并提供更加高效的开发方式。
Sass 是最早的 CSS 预处理器之一,它使用 Ruby 语言编写,具有丰富的功能和广泛的应用场景。Sass 可以让开发者使用类似于编程语言的语法来编写 CSS,支持变量、嵌套、混合、继承、函数等特性,可以大大提高 CSS 的可维护性和复用性。此外,Sass 还支持通过模块化的方式组织 CSS,可以方便地管理大型项目中的样式。
Less 是 Sass 的一个类似的预处理器,它使用 JavaScript 语言编写,和 Sass 有着类似的功能。Less 同样支持变量、嵌套、混合、继承、函数等特性,并可以通过模块化的方式组织 CSS。与 Sass 不同的是,Less 的语法更加简洁,更加类似于原生的 CSS,对于 CSS 开发者来说更易于学习和使用。
总的来说,Sass 和 Less 都是非常优秀的 CSS 预处理器,它们可以帮助开发者更高效地编写和管理 CSS。选择哪一种预处理器主要取决于个人的喜好和实际需求,开发者可以根据项目的特点和团队的技术背景来选择适合自己的预处理器。
总结
除了以上的一些常见知识点的学习汇总之外,以下是一些学习 CSS 的步骤和资源:
- 学习基础知识:了解 CSS 的基本概念、语法和属性。你可以查看一些在线教程、教学视频或者阅读 CSS 相关的书籍。这些资源可以帮助你理解 CSS 的核心概念和基本语法。
- 实践编码:通过实践编写 CSS 代码来加深理解。创建一个简单的网页,并使用 CSS 来设计和布局元素。逐渐尝试不同的 CSS 属性和选择器,观察它们如何影响网页的外观和行为。
- 深入学习布局:学习 CSS 布局技术,包括盒模型、定位、浮动和弹性布局等。这些技术可以帮助你掌握如何精确控制网页中元素的位置和大小。
- 学习响应式设计:了解如何使用媒体查询和其他技术创建响应式网页,使其能够适应不同的设备和屏幕尺寸。响应式设计是现代网页开发中非常重要的一个方面。
- 掌握 CSS 高级技巧:学习一些高级的 CSS 技巧和技术,如动画效果、过渡、变形和渐变等。这些技术可以使你的网页更加生动和吸引人。
- 实践项目:通过实际项目来应用你所学的 CSS 技能。参与开源项目或者创建自己的项目,这样你可以面对真实的挑战并不断提升你的技能。
- 不断学习和探索:CSS 是一个广泛而深入的主题,不断学习和保持对新技术的探索是很重要的。关注最新的 CSS 规范和趋势,了解新的布局技术和特性。
除了上述步骤外,以下是一些学习 CSS 的资源:
- Mozilla Developer Network(MDN):MDN 提供了关于 CSS 的详细文档和教程,是一个非常好的学习资源。你可以查阅他们的 CSS 文档以获取更多信息。
- CSS-Tricks:这是一个关于 CSS 技术和技巧的知名网站,提供大量的教程、示例和文章。你可以在这里找到很多有用的信息和实践经验。
- Codecademy:Codecademy 提供交互式的在线课程,包括 CSS。你可以通过完成他们的课程来学习和练习 CSS。