一、CSS基础

1. CSS选择器及其优先级

选择器 格式 优先级权重
id选择器 #id 100
类选择器 .classname 10
属性选择器 a[ref=“eee”] 10
伪类选择器 li:last-child 10
标签选择器 div 1
伪元素选择器 li:after 1
相邻兄弟选择器 h1+p 0
子选择器 ul>li 0
后代选择器 li a 0
通配符选择器 * 0

对于选择器的优先级

  • 标签选择器、伪元素选择器:1;
  • 类选择器、伪类选择器、属性选择器:10;
  • id 选择器:100;
  • 内联样式:1000;
  • !important 最高

2. CSS中可继承与不可继承属性有哪些

一、无继承性的属性

  1. display:规定元素应该生成的框的类型
  2. 文本属性
  • vertical-align:垂直文本对齐
  • text-decoration:规定添加到文本的装饰
  • text-shadow:文本阴影效果
  • white-space:空白符的处理
  • unicode-bidi:设置文本的方向
  1. 盒子模型的属性:width、height、margin、border、padding
  2. 背景属性:background、background-color、background-image、background-repeat、background-position、background-attachment
  3. 定位属性:float、clear、position、top、right、bottom、left、min-width、min-height、max-width、max-height、overflow、clip、z-index
  4. 生成内容属性:content、counter-reset、counter-increment
  5. 轮廓样式属性:outline-style、outline-width、outline-color、outline
  6. 页面样式属性:size、page-break-before、page-break-after
  7. 声音样式属性:pause-before、pause-after、pause、cue-before、cue-after、cue、play-during

二、有继承性的属性

  1. 字体系列属性
  • font-family:字体系列
  • font-weight:字体的粗细
  • font-size:字体的大小
  • font-style:字体的风格
  1. 文本系列属性
  • text-indent:文本缩进
  • text-align:文本水平对齐
  • line-height:行高
  • word-spacing:单词之间的间距
  • letter-spacing:中文或者字母之间的间距
  • text-transform:控制文本大小写(就是uppercase、lowercase、capitalize这三个)
  • color:文本颜色
  1. 元素可见性
  • visibility:控制元素显示隐藏
  1. 列表布局属性
  • list-style:列表风格,包括list-style-type、list-style-image等
  1. 光标属性
  • cursor:光标显示为何种形态

3. display 的属性值及其作用

属性值 作用
none 元素不显示,并且会从文档流中移除。
block 块类型。默认宽度为父元素宽度,可设置宽高,换行显示。
inline 行内元素类型。默认宽度为内容宽度,不可设置宽高,同行显示。
inline-block 默认宽度为内容宽度,可以设置宽高,同行显示。
list-item 像块类型元素一样显示,并添加样式列表标记。
table 此元素会作为块级表格来显示。
inherit 规定应该从父元素继承display属性的值。

4. display 的 block 、 inline 和 inline-block 的区别

(1 )block 会独占一行,多个元素会另起一行,可以设置 width | heigth | margin | padding 属性
(2) inline 元素不会独占一行,设置 width | heigth 属性无效。 但是可以设置水平方向的 padding | margin 、不能设置垂直方向的 margin | padding
(3) inline-block : 将对象设置为 inline对象,但是对象内容将视为 block 对象呈现,之后的内联对象会被排列在同一行

对于行内元素和块级元素,其特点如下:
(1)行内元素

  • 设置宽高无效;
  • 可以设置水平方向的margin和padding属性,不能设置垂直方向的padding和margin;
  • 不会自动换行;

(2)块级元素

  • 可以设置宽高;
  • 设置margin和padding都有效;
  • 可以自动换行;
  • 多个块状,默认排列从上到下。

5. 隐藏属性的方法

  • display: none 渲染树不会包含该渲染对象,因此该元素不会在页面中占据位置,也不会响应绑定的监听事件。
  • visibility: hidden 元素在页面中仍占据空间,但是不会响应绑定的监听事件。
  • opacity: 0 将元素的透明度设置为 0,以此来实现元素的隐藏。元素在页面中仍然占据空间,并且能够响应元素绑定的监听事件。
  • position: absolute 通过绝对定位将元素移动到可视范围之外,以此来实现元素的隐藏。
  • z-index: 负值 让其他元素遮盖住该元素,以此来实现元素的隐藏
  • transform: scale(0, 0) 将元素缩放为0 ,来实现元素的隐藏, 这种方法下,元素仍在页面中占据位置,但是不会响应绑定的监听事件。

6. link 和 @import 的区别

两者都是外部引用CSS的方式,它们的区别如下:

  • link 是 XHTML 的标签,除了加载CSS外,还可以定义RSS等其他业务@import属于CSS范畴,只能加载CSS
  • link引用CSS时,在页面载入时同时加载;@import需要页面网页完全载入以后加载。
  • link是XHTML标签,无兼容问题;@import是在CSS2.1提出的,低版本的浏览器不支持。
  • link支持使用Javascript控制DOM去改变样式;而@import不支持。

7. transition 和 animation 的区别

  • transition 是过度属性,强调过度,它的实现需要触发一个事件(比如鼠标移动上去,焦点,点击等)才执行动画。它类似于flash的补间动画,设置一个开始关键帧,一个结束关键帧。
  • animation是动画属性,它的实现不需要触发事件,设定好时间之后可以自己执行,且可以循环一个动画。它也类似于flash的补间动画,但是它可以设置多个关键帧(用@keyframe定义)完成动画。

8. display: none 和 visibility:hidden 的区别

这两个属性都是让元素隐藏,不可见。两者区别如下:

  1. 在渲染树中
  • display: none 会让元素从渲染中消失, 渲染时不会占据任何空间
  • visibility: hidden 不会让元素从渲染树中消失,渲染的元素还会占据相应的空间,只是内容不可见
  1. 是否被继承
  • display:none是非继承属性,子孙节点会随着父节点从渲染树消失,通过修改子孙节点的属性也无法显示;
  • visibility:hidden是继承属性,子孙节点消失是由于继承了hidden,通过设置visibility:visible可以让子孙节点显示;

9. 伪元素和伪类的区别和作用?

伪元素: p::first-line
伪类: a:hover

伪元素: 在内容元素的前后插入额外的元素或样式,但是这些元素实际上并不在文档中生成。它们只在外部显示可见,但不会在文档的源代码中找到它们,因此,称为“伪”元素; 例如:

  1. p::before {content:"第一章:";}
  2. p::after {content:"Hot!";}
  3. p::first-line {background:red;}
  4. p::first-letter {font-size:30px;}

伪类:将特殊的效果添加到特定选择器上。 它是已有元素添加类别,不会产生新的元素。 例如:

  1. a:hover {color: #FF00FF}
  2. p:first-child {color: red}

总结:伪类是通过在元素选择器上加⼊伪类改变元素状态,⽽伪元素通过对元素的操作进⾏对元素的改变。

10 . 对和模型的理解

在CSS3 中的盒子模型有以下两种: 标准盒子模型、IE盒子模型

盒模型都是由四个部分组成的,分别是margin、border、padding和content。

标准盒模型和IE盒模型的区别在于设置width和height时,所对应的范围不同:

  • 标准盒模型的width和height属性的范围只包含了content,
  • IE盒模型的width和height属性的范围包含了border、padding和content。

可以通过修改元素的box-sizing属性来改变元素的盒模型:

  • box-sizing: content-box表示标准盒模型(默认值)
  • box-sizing: border-box表示IE盒模型(怪异盒模型)

11. 为什么有时候⽤translate来改变位置⽽不是定位?

translate 是 transform 属性的⼀个值。改变transform或opacity不会触发浏览器重新布局(reflow)或重绘(repaint),只会触发复合(compositions)。⽽改变绝对定位会触发重新布局,进⽽触发重绘和复合。
transform使浏览器为元素创建⼀个 GPU 图层,但改变绝对定位会使⽤到 CPU。 因此translate()更⾼效,可以缩短平滑动画的绘制时间。 ⽽translate改变位置时,元素依然会占据其原始空间,绝对定位就不会发⽣这种情况。

12. CSS3中有哪些新特性

  • 新增的各种CSS选择器 :not(.input)
  • 圆角 border-radius: 10px
  • 多列布局(multi-column layout)
  • 阴影与反射 Shadoweflect
  • 文字特效 text-shadow
  • 文字渲染 text-decoration
  • 线性渐变 gradient
  • 旋转 transform
  • 增加了旋转,缩放,定位,倾斜,动画,多背景

13. li 与 li 之间有看不见的空白间隔是什么引起的? 如何解决?

浏览器会把 inline 内联元素间的空白字符 (空格,换行,Tab等)渲染成一个空格。 为了美观,通常是一个<li>放在一行,这导致<li>换行后产生换行字符,它变成一个空格,占用了一个字符的宽度。

解决办法:

  • <li>设置 float: left 不足:有些容器是不能设置浮动,如左右切换的焦点图等。
  • 将所有的 <li> 写在同一行。 不足: 代码不美观
  • <ul>内的字符尺寸直接设为0,即font-size:0。不足:<ul>中的其他字符尺寸也被设为0,需要额外重新设定其他字符尺寸,且在Safari浏览器依然会出现空白间隔。
  • 消除<ul>的字符间隔 letter-spacing:-8px,不足:这也设置了<li>内的字符间隔,因此需要将<li>内的字符间隔设为默认letter-spacing:normal

14. 对 CSSSprites 的理解

CSSSprites(精灵图, 雪碧图),将一个页面涉及到的所有图片都包含到一张大图中去,然后利用CSS的 background-image,background-repeat,background-position属性的组合进行背景定位。

优点:

  • 利用 CSS Sprites 能够很好地减少网页的 HTTP 请求,从而大大提高了页面的性能,这是 CSS Sprites 最大的优点
  • CSS Sprites 能够减少图片的字节,把3张图片合并成1张图片的字节总是小于这3张图片的字节总和。

缺点:

  • 合并复杂,难度大
  • 开发麻烦, 需要PS
  • 不好维护

15. margin 和 padding 的使用场景

  • 在 border 外侧添加空白, 且空白处不需要背景色时, 使用 margin
  • 在 boder 内侧添加空白,且空白处需要背景时,使用 padding

16. 对 line-height 的理解 及其赋值方式

line-heigth概念

  • line-height 指一行文本的高度,包含了字间距,实际上是下一行基线到上一行基线距离;
  • 如果一个标签没有定义 height 属性,那么其最终表现的高度由 line-height 决定;
  • 一个容器没有设置高度,那么撑开容器高度的是 line-height,而不是容器内的文本内容;
  • 把 line-height 值设置为 height 一样大小的值可以实现单行文字的垂直居中
  • line-height 和 height 都能撑开一个高度

line-height 的赋值方式

  • 带单位 : px 是固定值,而 em 会参考父元素 font-size 值计算自身的行高
  • 纯数字:会把比例传递给后代。
  • 百分比:将计算后的值传递给后代

17. CSS 优化和提高性能的方法

加载方面

  • CSS压缩: 将写好的css进行打包压缩, 减少文件体积
  • CSS单一样式: 当需要下边距和左边距的时候,很多时候会选择 margin:top 0 bottom 0;但margin-bottom:bottom;margin-left:left 执行效率会更高
  • 减少使用 @import, 建议使用 link ,因为后者在加载页面时一起加载,前者是等待加载完成之后再进行加载

选择器方面

  • 关键选择器(key selector)。选择器的最后面的部分为关键选择器(即用来匹配目标元素的部分)。CSS选择符是从右到左进行匹配的。当使用后代选择器的时候,浏览器会遍历所有子元素来确定是否是指定的元素等等;
  • 使用 id 选择器,不用为规则增加标签。过滤无关规则,渲染引擎不会浪费时间进行匹配
  • 避免使用 通配规则, 例如 * {} , 计算量大,会影响性能
  • 具有相同的样式, 使用 class 选择器

渲染性能

  • 慎用使用高性能的属性: 浮动、定位
  • 尽量减少使用页面重排、重绘
  • 属性值为 0 时, 不加单位
  • 标准化各种浏览器前缀:带浏览器前缀的在前。标准属性在后。
  • 不适用 @import ,会影响新能
  • 选择器的嵌套, 尽量避免过深
  • css雪碧图,同一页面相近部分的小图标,方便使用,减少页面的请求次数,但是同时图片本身会变大,使用时,优劣考虑清楚,再使用。
  • 正确使用display的属性,由于display的作用,某些样式组合会无效,徒增样式体积的同时也影响解析性能。
  • 将相同属性的样式抽离出来,进行整合使用 class在页面中使用,提高性能
  • 样式与内容分离: 将css 代码定义到外部css中, 容易维护

18. CSS预处理器/后处理器是什么?, 为什么要使用它们?

CSS的预处理器: Less / SASS / Stylus 用来预编译 sass / less , 增加了 css代码的复用性,层级, mixin ,变量,循环,函数等对编写以开发 UI 组件极为方便

后处理器, 如: postCss,通常是在完成的样式表中根据css规范处理css,让其更加有效。目前最常做的是给css属性添加浏览器私有前缀,实现跨浏览器兼容性的问题。

使用原因:

  • 结构清晰, 便于扩展
  • 可以很方便的屏蔽浏览器私有语法的差异
  • 可以轻松实现多重继承
  • 完美的兼容了CSS代码,可以应用到老项目中

19. ::before:after 的双冒号和单冒号有什么区别

  • 冒号 : 用于 CSS3 伪类, 双冒号 :: 用于 CSS3伪元素
  • ::before 就是以一个子元素的存在,定义在元素体内容之间的一个伪元素。并不存在 dom 之中,只存在页面中

注意: :before:after 这两个伪元素,是在CSS2.1里新出现的。起初,伪元素的前缀使用的是单冒号语法,但随着Web的进化,在CSS3的规范里,伪元素的语法被修改成使用双冒号,成为::before::after

20. 单行、多行文本溢出隐藏

  • 单行文本溢出

    1. overflow: hidden; // 溢出隐藏
    2. text-overflow: ellipsis; // 溢出用省略号显示
    3. white-space: nowrap; // 规定段落中的文本不进行换行
  • 多行文本溢出

    1. overflow: hidden; // 溢出隐藏
    2. text-overflow: ellipsis; // 溢出用省略号显示
    3. display:-webkit-box; // 作为弹性伸缩盒子模型显示。
    4. -webkit-box-orient:vertical; // 设置伸缩盒子的子元素排列方式:从上到下垂直排列
    5. -webkit-line-clamp:3; // 显示的行数

21. Sass、Less 是什么?为什么要使用他们?

他们都是 CSS 预处理器,是 CSS 上的一种抽象层。他们是一种特殊的语法/语言编译成 CSS。 例如 Less 是一种动态样式语言,将 CSS 赋予了动态语言的特性,如变量,继承,运算, 函数,LESS 既可以在客户端上运行 (支持 IE 6+, Webkit, Firefox),也可以在服务端运行 (借助 Node.js)。

为什么要使用它们?

  • 结构清晰,便于扩展。 可以方便地屏蔽浏览器私有语法差异。封装对浏览器语法差异的重复处理, 减少无意义的机械劳动。
  • 可以轻松实现多重继承。 完全兼容 CSS 代码,可以方便地应用到老项目中。LESS 只是在 CSS 语法上做了扩展,所以老的 CSS 代码也可以与 LESS 代码一同编译。

22. 如何判断元素是否到达可视区域

以图片显示为例:

  • window.innerHeight 是浏览器可视区的高度
  • document.body.scrollTop || document.documentElement.scrollTop 是浏览器滚动的过的距离;
  • img.offsetTop 是元素顶部距离文档顶部的高度

23. z-index 属性在什么情况下会失效

通常使用z-index在两个重叠的元素标签,z-index 值越大就越在上层。
z-index元素的position属性需要是relative,absolute或是fixed。

z-index属性在下列情况下会失效

  • 父属性 postition 为 relative 时, 子元素的 z-index 失效。解决:父元素 postition 改为 absolute | static
  • 元素没有设置 position属性为 非static 属性。 设置该元素的position属性为relative,absolute或是fixed中的一种;
  • 元素在设置z-index的同时还设置了float浮动。解决:float去除,改为display:inline-block;

二、页面布局

1. 常见的CSS布局单位

常见的布局单位包括 px % em rem vw/vh

  • px 页面布局的基础,屏幕能显示的最小区域
  • 百分比 % 对比浏览器的宽高,确定百分比。 一般认为子元素的百分比相对于直接父元素。
  • em / rem 相对于px更具灵活性,它们都是相对长度单位,它们之间的区别:em相对于父元素,rem相对于根元素。
    • em 文本相对长度单位。 相对于当前对象内文本的字体尺寸。
    • rem 相对于根元素(html元素)的font-size的倍数
  • vh/vw 是与视图窗口有关的单位,vw表示相对于视图窗口的宽度,vh表示相对于视图窗口高度,

vw/vh 和百分比很类似,两者的区别:

  • 百分比(%):大部分相对于祖先元素,也有相对于自身的情况比如(border-radius、translate等)
  • vw/vm:相对于视窗的尺寸

2. px 、 em 、 rem 的区别以及使用场景

区别

  • px 是固定像素,一旦确定了,就无法因为适应页面场景改变
  • em / rem 是相对单位, 长度不是固定的, 更使用于响应式布局

使用场景:

  • 对于只需要适配少部分移动设备,且分辨率对页面影响不大的,使用px即可 。
  • 对于需要适配各种移动设备,使用rem,例如需要适配iPhone和iPad等分辨率差别比较挺大的设备。

3. 两栏布局的实现

一般两栏布局指的是左边一栏宽度固定,右边一栏宽度自适应,两栏布局的具体实现:

方式一: 利用浮动,将左边元素宽度设置为200px,并且设置向左浮动。将右边元素的margin-left设置为200px,宽度设置为auto(默认为auto,撑满整个父元素)。

  1. .outer {
  2. height: 100px;
  3. }
  4. .left {
  5. float: left; // 设置左浮动,和固定宽度
  6. width: 200px;
  7. background: tomato;
  8. }
  9. .right {
  10. margin-left: 200px; // 抵消左边固定的宽度
  11. width: auto; // 设置右边宽度 自动 auto
  12. background: gold;
  13. }

方式二: 利用浮动,左侧元素设置固定大小,并左浮动,右侧元素设置overflow: hidden; 这样右边就触发了BFC,BFC的区域不会与浮动元素发生重叠,所以两侧就不会发生重叠。

  1. .outer {
  2. height: 100px;
  3. }
  4. .left {
  5. float: left; // 设置浮动
  6. width: 200px; // 固定宽度
  7. height: 100px;
  8. background-color: red;
  9. }
  10. .right {
  11. height: 100px;
  12. overflow: hidden; // 产生 BFC,利用BFC浮动元素不会发生重叠
  13. background-color: salmon;
  14. }

方式三: 利用flex布局,将左边元素设置为固定宽度200px,将右边的元素设置为flex:1。

  1. .outer {
  2. display: flex; // 使用 flex 布局
  3. height: 100px;
  4. }
  5. .left {
  6. width: 200px; // 左边设置固定宽度
  7. background-color: red;
  8. }
  9. .right {
  10. flex: 1; // 设置 flex: 1; 占据所有 flex 内容
  11. background-color: #ccc;
  12. }

方式四: 使用绝对定位, 父元素 设置 相对定位, 左边设置 固定定位,给定宽高。右边 使用 margin-left移出左边的宽度大小

  1. .outer {
  2. position: relative; // 父元素相对定位
  3. height: 200px;
  4. }
  5. .left {
  6. position: absolute; // 左边使用 固定定位
  7. width: 200px;
  8. height: 200px;
  9. background-color: red;
  10. }
  11. .right {
  12. margin-left: 200px; // 移出 左边的位置
  13. background-color: salmon;
  14. height: 200px;
  15. }

4. 三栏布局的实现

三栏布局: 两侧固定, 中间自适应

方式一: 使用固定定位, 父元素 相对定位, 左右两边固定定位,中间使用 margin-left|right 移出左右的宽度

  1. .outer {
  2. position: relative;
  3. height: 200px;
  4. }
  5. .left {
  6. position: absolute;
  7. width: 200px;
  8. height: 200px;
  9. background-color: red;
  10. }
  11. .right {
  12. /* 这里需要设置 top | right */
  13. top: 0;
  14. right: 0;
  15. position: absolute;
  16. width: 200px;
  17. height: 200px;
  18. background-color: #ff22ff;
  19. }
  20. .center {
  21. margin-left: 200px;
  22. margin-right: 200px;
  23. height: 200px;
  24. background-color: #ccc;
  25. }

方式二: 使用 flex 布局, 两边固定宽度, 中间设置 flex: 1

  1. .outer {
  2. display: flex;
  3. height: 200px;
  4. }
  5. .left {
  6. width: 200px;
  7. height: 200px;
  8. background-color: red;
  9. }
  10. .right {
  11. width: 200px;
  12. height: 200px;
  13. background-color: #ff22ff;
  14. }
  15. .center {
  16. flex: 1;
  17. height: 200px;
  18. background-color: #ccc;
  19. }

使用浮动方式实现: 左右两边 使用 float: left| right 中间使用margin-left|right

  1. /* 使用浮动方式实现 */
  2. .outer {
  3. height: 200px;
  4. }
  5. .left {
  6. float: left;
  7. width: 200px;
  8. height: 200px;
  9. background-color: red;
  10. }
  11. .right {
  12. float: right;
  13. width: 200px;
  14. height: 200px;
  15. background-color: #ff22ff;
  16. }
  17. .center {
  18. margin-left: 200px;
  19. margin-right: 200px;
  20. background-color: #ccc;
  21. height: 200px;
  22. }

双飞翼布局:左右宽度固定,中间的列宽根据浏览器的窗口大小自适应
双飞翼布局的优点 :

  • 兼容性好,兼容所有的主流浏览器, 包括万恶的 IE6
  • 因为在DOM中center_panel 在三列结构的前面,因此可以实现主要的内容优先加载 ```css .container { width: 100%; / 清除浮动 / overflow: hidden; }

.left, .content, .right { / 浮动,占一行 / float: left; }

.content { / 需要中间自适应 content的 width 就是设置成 100% / width: 100%; height: 100px; background-color: #F00; }

.left { width: 200px; height: 100px; background-color: #0F0; / 使用 margin-left 让元素和 content 占一行 / / 使用 margin-left: -100% , 回到最左侧 / margin-left: -100%; }

.right { width: 200px; height: 100px; background-color: #00F; / 让 right 到 最右边 使用 margin-left: -200px, right 的宽度 / margin-left: -200px; }

  1. 圣杯布局 : 由三列组成,两端固定,中间自适应。<br />和双飞翼布局的区别 :双飞翼布局是左右两边叠加在中间的, 圣杯是将左右两边移动到padding给的值,固定起来了,不会影响到 content的内容
  2. ```html
  3. <style>
  4. body {
  5. /* 设置浏览器 最小的值 */
  6. min-width: 600px;
  7. }
  8. .header,
  9. .footer {
  10. /* 设置网页的 头部和尾部 */
  11. width: 100%;
  12. height: 100px;
  13. line-height: 100px;
  14. text-align: center;
  15. background-color: rgb(15, 240, 187);
  16. font-size: 30px;
  17. }
  18. .container {
  19. /* padding 设置的 200 是 放置left 和 right 的内容 */
  20. padding: 0 200px;
  21. overflow: hidden;
  22. }
  23. .content,
  24. .left,
  25. .right {
  26. /* 浮动 */
  27. float: left;
  28. height: 200px;
  29. /* 圣杯布局需要 增加 定位, 然后通过定位移动元素*/
  30. position: relative;
  31. }
  32. .content {
  33. /* 中间自适应 ,width 设置成 100% */
  34. width: 100%;
  35. background-color: #f00;
  36. }
  37. .left {
  38. width: 200px;
  39. background-color: #0f0;
  40. /* 使用 margin-left 样元素移动到 center 两边, 和 双飞翼布局一样 */
  41. margin-left: -100%;
  42. /* 通过定位的 relative , 将元素移动到 padding 给的200值 里边 */
  43. left: -200px;
  44. }
  45. .right {
  46. width: 200px;
  47. background-color: #00f;
  48. /* 和双飞翼布局的, 移动元素到 content 的两边 */
  49. margin-left: -200px;
  50. /* 通过定位的 relative , 将元素移动到 padding 给的200值 里边 */
  51. right: -200px;
  52. }
  53. </style>
  54. </head>
  55. <body>
  56. <!-- 通常网页由三部分组成 -->
  57. <!-- 1, header 头部 -->
  58. <div class="header">#Header</div>
  59. <!-- 2. content 内容部分 -->
  60. <div class="container">
  61. <div class="content"></div>
  62. <div class="left"></div>
  63. <div class="right"></div>
  64. </div>
  65. <!-- 3, footer 尾部 -->
  66. <div class="footer">#Footer </div>
  67. </body>

5. 水平垂直居中的实现

方式一: 使用绝对定位, 先将元素的左上角通过top:50%和left:50%定位到页面的中心, 然后使用 translate 调整元素到中心

  1. .parent {
  2. position: relative;
  3. }
  4. .child {
  5. position: absolute;
  6. width: 100px;
  7. height: 100px;
  8. background-color: red;
  9. top: 50%;
  10. left: 50%;
  11. transform: translate(-50%, -50%); // 使用top|left确定中心位置 使用transform设置居中
  12. }

方式二: 利用绝对定位,设置四个方向的值都为0,并将margin设置为auto,由于宽高固定,因此对应方向实现平分,可以实现水平和垂直方向上的居中。该方法适用于盒子有宽高的情况:

  1. .parent {
  2. position: relative;
  3. }
  4. .child {
  5. position: absolute;
  6. top: 0;
  7. bottom: 0;
  8. left: 0;
  9. right: 0;
  10. width: 100px;
  11. height: 100px;
  12. background-color: red;
  13. margin: auto; // 设置 margin 为 auto 自动居中
  14. }

方式三: 使用绝对定位, 先将元素的左上角通过top:50%和left:50%定位到页面的中心,然后再通过margin负值来调整元素的中心点到页面的中心。该方法适用于盒子宽高已知的情况

  1. .parent {
  2. position: relative;
  3. }
  4. .child {
  5. position: absolute;
  6. width: 100px;
  7. height: 100px;
  8. background-color: red;
  9. top: 50%;
  10. left: 50%;
  11. margin-left: -50px; /* 自身 height 的一半 */
  12. margin-top: -50px; /* 自身 width 的一半 */
  13. }

方式四: 使用 flex布局,通过 align-items: center | justify-content: center 设置水平 居中对对其,然后它的子元素也实现垂直和水平居中

  1. .parent {
  2. display: flex;
  3. justify-content: center;
  4. align-items: center;
  5. }
  6. .child {
  7. width: 100px;
  8. height: 100px;
  9. background-color: red;
  10. margin-top: -50px;
  11. }

6. 如何根据设计稿进行移动端适配

移动端适配主要有两个维度:

  • 适配不同像素密度 : 针对不同的像素密度,使用 CSS 媒体查询,选择不同精度的图片,以保证图片不会失真;
  • 适配不同屏幕大小: 根据移动端屏幕大小,有着逻辑像素的大小之分,如果使用 px 像素会导致不同屏幕显示不同, 可能还会失真。

为了让页面尺寸自适应,通常使用的是 rem | em | vw | vh 等相对单位

7. 对 flex 布局的理解

flex 布局, 也就是弹性布局,设置 flex 布局后, 子元素的 float | clear | vertical-align 属性将失效。
设置flex 的元素叫做 “容器”,而它的子元素叫做 “项目 item”。容器默认存在两根轴: 水平的主轴 , 垂直的交叉轴。

设置在 容器 的6的属性

  • flex-direction 设置主轴的方向 (item的排列方向)
  • flex-wrap 设置 item , 如果一条轴线排不下,如何换行。
  • flex-flow flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap
  • justify-content 设置 item 在主轴上的对其方式
  • align-items 设置 item 在交叉轴上 对其方式
  • align-content 设置 多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用

设置在 项目 item 的属性 6个

  • order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。
  • flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
  • flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
  • flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。
  • flex属性是flex-grow,flex-shrink和flex-basis的简写,默认值为0 1 auto。
  • align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

8. 响应式设计的概念及基本原理

响应式网站设计 Responsive Web design , 一个网站能够兼容多个终端, 而不是为每一个终端特意做的版本

原理: 基本原理是通过媒体查询 @media 查询不同设备屏幕尺寸做处理
兼容: 页面头部必须有 meta 声明的 viewport

  1. <meta name="’viewport’" content="”width=device-width," initial-scale="1." maximum-scale="1,user-scalable=no”"/>

9. 品字布局实现

  1. 使用 float 浮动布局实现

    1. div {
    2. width: 100px;
    3. height: 100px;
    4. line-height: 100px;
    5. font-size: 40px;
    6. text-align: center;
    7. color: #000;
    8. }
    9. .div1 {
    10. margin: 0 auto; // 盒子1 水平居中
    11. background-color: red;
    12. }
    13. .div2 {
    14. float: left; // 盒子2 使用float: left
    15. margin-left: 50%; // 移动盒子距离
    16. background-color: green;
    17. }
    18. .div3 {
    19. float: left;
    20. margin-left: -200px;
    21. background-color: blue;
    22. }
  2. 使用 inline-block 实现 ```css div { width: 100px; height: 100px; line-height: 100px; font-size: 40px; text-align: center; color: #000; } .div1 { margin: 0 auto; background-color: red; }

.div2 { display: inline-block; margin-left: 50%; background-color: #ccc; }

.div3 { display: inline-block; background: burlywood; margin-left: -200px; }

  1. <a name="o4m4q"></a>
  2. ### 10. 九宫格布局
  3. ```html
  4. <div class="box">
  5. <ul>
  6. <li>1</li>
  7. <li>2</li>
  8. <li>3</li>
  9. <li>4</li>
  10. <li>5</li>
  11. <li>6</li>
  12. <li>7</li>
  13. <li>8</li>
  14. <li>9</li>
  15. </ul>
  16. </div>

1. flex 布局方法

  1. ul {
  2. padding: 0;
  3. /* 主要设置 换行方式 wrap : 表示超出换行 */
  4. display: flex;
  5. flex-wrap: wrap;
  6. width: 100%;
  7. height: 100%;
  8. }
  9. li {
  10. list-style-type: none;
  11. text-align: center;
  12. border-radius: 5px;
  13. background-color: skyblue;
  14. width: 30%;
  15. height: 30%;
  16. margin-right: 5%;
  17. margin-bottom: 5%;
  18. }
  19. li:nth-of-type(3n) {
  20. margin-right: 0;
  21. }
  22. li:nth-of-type(n+7) {
  23. margin-bottom: 0;
  24. }

2. float 浮动方式

  1. ul {
  2. padding: 0;
  3. }
  4. li {
  5. list-style-type: none;
  6. text-align: center;
  7. border-radius: 5px;
  8. background-color: skyblue;
  9. }
  10. ul {
  11. width: 100%;
  12. height: 100%;
  13. overflow: hidden;
  14. }
  15. li {
  16. float: left;
  17. width: 30%;
  18. height: 30%;
  19. margin-right: 5%;
  20. margin-bottom: 5%;
  21. }
  22. li:nth-of-type(3n) {
  23. margin-right: 0;
  24. }
  25. li:nth-of-type(n+7) {
  26. margin-bottom: 0;
  27. }

3. 使用 grid 方式

  1. .box {
  2. width: 100%;
  3. height: 100%;
  4. }
  5. ul {
  6. padding: 0;
  7. }
  8. li {
  9. list-style-type: none;
  10. text-align: center;
  11. border-radius: 5px;
  12. background-color: skyblue;
  13. }
  14. ul {
  15. display: grid;
  16. width: 100%;
  17. height: 100%;
  18. grid-template-columns: 30% 30% 30%;
  19. grid-template-rows: 30% 30% 30%;
  20. grid-gap: 5%;
  21. }

4. 使用 inline-block 方式

  1. ul {
  2. padding: 0;
  3. }
  4. li {
  5. list-style-type: none;
  6. text-align: center;
  7. border-radius: 5px;
  8. background-color: skyblue;
  9. }
  10. ul {
  11. width: 100%;
  12. height: 100%;
  13. letter-spacing: -10px;
  14. }
  15. li {
  16. display: inline-block;
  17. width: 30%;
  18. height: 30%;
  19. margin-right: 5%;
  20. margin-bottom: 5%;
  21. }
  22. li:nth-of-type(3n) {
  23. margin-right: 0;
  24. }
  25. li:nth-of-type(n+7) {
  26. margin-bottom: 0;
  27. }

三、 定位与浮动

1. 浮动的定义, 为什么要清除浮动? 清除浮动的方式

浮动的定义: 在容器不设置高度 且 子元素浮动时, 容器高度不能被内容撑开。 此时内容并会溢出到容器外面, 从而影响页面的布局。 这种现象就是浮动 (溢出)

浮动的工作原理

  • 浮动元素脱离文档流,不占据空间
  • 浮动元素碰到包含它的边框或者其他浮动元素的边框停留

浮动元素引起的问题?

  • 父元素的高度无法被撑开,影响与父元素同级的元素 -》 父元素内容无法撑开
  • 与浮动元素同级的非浮动元素会跟随其后 -》 浮动元素 与 同级元素 跟随其后
  • 若浮动的元素不是第一个元素,则该元素之前的元素也要浮动,否则会影响页面的显示结构

清除浮动的方式

  • 给父级 div 定义 height 属性
  • 在浮动元素之后在上 一个空的 div 标签,并添加 clean: both 样式
  • 在浮动元素的父级元素添加 overflow: auto | hidden

2. 对BFC的理解, 如何创建BFC

先来看两个相关的概念:

  • Box : Box 是CSS布局的对象和对象基本单位, 一个页面由多个Box组成,这个 Box就是所说的盒子模型
  • Formatting context : 块级上下⽂格式化, 它是页面中的一块渲染区域,并有一套渲染规则,它决定了其子元素将如何定位, 以及和其他元素的关系和相互作⽤。

块格式化上下文(Block Formatting Context,BFC)是Web页面的可视化CSS渲染的一部分,是布局过程中生成块级盒子的区域,也是浮动元素与其他元素的交互限定区域。

通俗来讲: BFC是一个独立的布局环境,可以理解为一个容器, 在这个容器中按照一定规则进行物品摆放,并且不会影响其他环境中的物品。 如果一个元素符合触发BFC的条件,则BFC中元素布局不受外部影响

创建BFC的条件

  • 根元素 : body
  • 元素设置浮动: float 除 none 以外的值
  • 元素设置绝对定位: postition: absolute | fixed
  • display 的值为 : inline-block | table-cell | table-caption | flex
  • overflow 值为 : hidden | auto | scroll

BFC 的特定:

  • 垂直方向向上,自上而下排序,和文档流的排列方式一致
  • 在BFC中上下相邻的两个容器的 margin 会重叠
  • 计算BFC的高度时, 需要计算浮动元素的高度
  • BFC区域不会与浮动的容器发生重叠
  • BFC是独立的容器,容器内部元素不会影响外部元素
  • 每个元素的左 margin 值和容器的左 border 相接触

BFC的作用:

  • 解决 margin 的重叠问题: 由BFC是一个独立区域,内部的元素和外部元素互不影响,将两个元素变为两个BFC,就解决了 margin 重叠的问题
  • 解决高度塌陷问题: 在对子元素设置浮动后,父元素会发生高度塌陷,也就是父元素的高度变为0。解决这个问题,只需要把父元素变成一个BFC。常用的办法是给父元素设置overflow:hidden
  • 创建自适应两栏布局:可以用来创建自适应两栏布局:左边的宽度固定,右边的宽度自适应。 ```css .left{ width: 100px; height: 200px; background: red; / 添加 float: left 后 .left 变成独立容器, / float: left; } .right{ height: 300px; background: blue; overflow: hidden; }

  1. 左侧设置`float:left`,右侧设置`overflow: hidden`。这样右边就触发了BFCBFC的区域不会与浮动元素发生重叠,所以两侧就不会发生重叠,实现了自适应两栏布局。
  2. <a name="hdt4u"></a>
  3. ### 3. position 的属性有哪些, 区别是什么
  4. `position` 有以下属性值
  5. | 属性值 | 概述 |
  6. | --- | --- |
  7. | absolute | 生成绝对定位的元素,相对于static定位以外的一个父元素进行定位。元素的位置通过lefttoprightbottom属性进行规定。 |
  8. | relative | 生成相对定位的元素,相对于其原来的位置进行定位。元素的位置通过lefttoprightbottom属性进行规定。 |
  9. | fixed | 生成绝对定位的元素,指定元素相对于屏幕视⼝(viewport)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变,⽐如回到顶部的按钮⼀般都是⽤此定位⽅式。 |
  10. | static | 默认值,没有定位,元素出现在正常的文档流中,会忽略 top, bottom, left, right 或者 z-index 声明,块级元素从上往下纵向排布,⾏级元素从左向右排列。 |
  11. | inherit | 规定从父元素继承position属性的值 |
  12. - relative : 元素相对于自身定位,和其他元素没有关系,也不会影响其他元素
  13. - fixed : 元素的定位是相对 window 定位的, 但是它具有破坏性,会导致其他元素位置的变化。
  14. - absolute :相对于 父元素设置了 `relative`元素进行定位,就以该元素为基准定位,如果没找到,就以浏览器边界定位。
  15. <a name="ckXVU"></a>
  16. ### 4. absolute 与 fixed 共同点与不同点
  17. <a name="SFTTK"></a>
  18. #### 共同点
  19. - 改变行内元素的呈现方式,将 `display` 设置为 `inline-block`
  20. - 使元素脱离文档流,不再占据文档物理空间
  21. - 覆盖非定位文档元素
  22. <a name="Ldr1v"></a>
  23. #### 不同点
  24. - `absolute` `fixed` 的根元素不同, `absolute`的根元素可以设置, `fixed`的根元素是 浏览器
  25. - 在具有滚动条时, `absolute`会跟随父元素进行滚动, `fixed`固定在页面的具体位置
  26. <a name="O30xQ"></a>
  27. ### 5. 对 sticky 定位的理解
  28. `sticky`粘性的意思, 使用时叫做 粘性定位, 语法: `position: sticky` 基于用户的滚动位置来定位。
  29. 粘性定位的元素是依赖于用户的滚动,在 **position:relative** **position:fixed** 定位之间切换。它的行为就像 **position:relative;** 而当页面滚动超出目标区域时,它的表现就像 **position:fixed;**,它会固定在目标位置。元素定位表现为在跨越特定阈值前为相对定位,之后为固定定位。这个特定阈值指的是 top, right, bottom left 之一,换言之,指定 top, right, bottom left 四个阈值其中之一,才可使粘性定位生效。否则其行为与相对定位相同。
  30. <a name="B5Un8"></a>
  31. ## 四、 场景应用
  32. <a name="cWldO"></a>
  33. ### 1. 实现一个三角形
  34. CSS绘制三角形主要用到的是border属性,也就是边框。
  35. CSS border 属性是由三角形组成
  36. ```css
  37. div {
  38. width: 0;
  39. height: 0;
  40. border: 100px solid ;
  41. border-color: orange blue red green;
  42. }

image.png

所以实现三角形, 可以这样

  1. div {
  2. width: 0;
  3. height: 0;
  4. border-top: 50px solid red;
  5. border-right: 50px solid transparent;
  6. border-left: 50px solid transparent;
  7. }

image.png

2. 实现一个扇形

  1. div {
  2. width: 0;
  3. height: 0;
  4. border: 100px solid transparent;
  5. /* 扇形 需要加上圆角边框 */
  6. border-radius: 100px;
  7. border-top-color: red;
  8. }

image.png

3. 实现一个⚪ 和 半圆

  1. div {
  2. width: 100px;
  3. height: 100px;
  4. background-color:red;
  5. border-radius: 50%;
  6. }

image.png

  1. div {
  2. background-color: red;
  3. width: 100px;
  4. height: 50px;
  5. /* 实现半圆*/
  6. border-radius: 0px 0px 100px 100px;
  7. }

image.png

4. 画一条 0.5px 的线

  1. transform: scale(0.5,0.5);

5. 设置小于 12 px 的字体

在谷歌下css设置字体大小为12px及以下时,显示都是一样大小,都是默认12px。

解决办法

  • 使用 transform: scale(0.5) 收缩整个元素的大小, 如果是内联元素,必须将内联元素转为跨级元素