CSS高频面试问题及基础知识

CSS

1、怎么实现三栏布局?

  • float
  • 定位(position)
  • flex布局
  • table-cell
  • bfc (set middle area overflow is hidden)
  • 网格布局

2、垂直居中问题

  • line-height
  • absolute + transform 居中为什么要使用 transform(为什么不使用marginLeft / Top),这是一道重绘重排的问题。(重绘重排后面再讲)
  • flex + align-items: center(flex布局太强大)
  • absolute + top:0 bottom:0 margin:auto (如果加上right和left为0,就能横向居中了)

3、盒模型

  • w3c标准盒模型:content(设置宽高) + padding + border = 实际宽高
  • ie盒模型:content + padding + border = 实际宽高 = 设置宽高

4、CSS单位

尺寸

  • em:1em 等于当前的字体尺寸。2em 等于当前字体尺寸的两倍。例如,如果某元素以 12pt 显示,那么 2em 是24pt。在 CSS 中,em 是非常有用的单位,因为它可以自动适应用户所使用的字体。
  • %:百分比。
  • px:像素 (计算机屏幕上的一个点)
  • pt:磅 (1 pt 等于 1/72 英寸)

颜色

  • rgb:RGB 值 (比如 rgb(255,0,0) 或者RGB 百分比值 (比如 rgb(100%,0%,0%))

5、CSS选择器

  • 元素选择器:标签名{ }

  • ID选择器: #id属性值{ }

  • 类选择器:.类名{ }

  • 后代元素选择器 : 先代标签名 后代标签名{ }

  • 子元素选择器: 父标签名>子标签名{ }

  • 伪类选择器:
    1、未访问的链接a:link { }、已访问的链接a:visited { }、鼠标移动到链接上a:hover { }、选定的链接a:active { } 。注意:a:hover 必须被置于 a:link 和 a:visited 之后。a:active 必须被置于 a:hover 之后。
    2、:focus获取焦点,当鼠标点击文本框时,对应状态改变。
    3、::selection:为选中的文字设置样式。

  • 伪元素
    1、first-letter:为元素第一个字设置样式
    2、first-line:为元素第一行设置样式
    3、:before
    4、:after

  • 子元素的伪类
    1、:nth-child(数字/even/odd):选中任意位置/偶数位/奇数位
    2、:first-of-type :last-of-type :nth-of-type 和前几个非常类似,只不过child是在所有的子元素中排列,而type是在当前类型的子元素中排列

  • 否定伪类
    p:not(.hello){ }为p段落中的除了class=“hello”的添加样式。

  • 属性选择器
    语法:
    元素[属性名] 选取含有指定属性值的元素
    元素[属性名=“属性值”] 选取含有指定属性值的元素
    元素[属性名^=“属性值”] 选取属性值以指定内容开头的元素
    元素[属性名$=“属性值”] 选取属性值以指定内容结尾的元素
    元素[属性名*=“属性值”] 选取属性值含有指定内容的元素,如:有若干属性值ab、bag、sd,若指定的为a,则会选取ab、bag。

  • 兄弟元素选择器
    前一个+后一个{} 选中一个元素紧挨着的后一个兄弟元素添加样式
    前一个~后一个 选中后边的所有兄弟元素

  • 样式的继承
    背景相关的样式不会被继承,包括边框、定位
    关于文字样式的属性,都具有继承性。这些属性包括:color、 text-开头的、line-开头的、font-开头的。

    1、css可以和不可以继承的属性
    不可继承的:display、margin、border、padding、background、height、min-height、max-height、width、min-width、max-width、overflow、position、left、right、top、bottom、z-index、float、clear、table-layout、vertical-align、page-break-after、page-bread-before和unicode-bidi。
    所有元素可继承:visibility和cursor。
    内联元素可继承:letter-spacing、word-spacing、white-space、line-height、color、font、font-family、font-size、font-style、font-variant、font-weight、text-decoration、text-transform、direction。
    终端块状元素可继承:text-indent和text-align。
    列表元素可继承:list-style、list-style-type、list-style-position、list-style-image。
    表格元素可继承:border-collapse。

    2、值的继承
      继承也是基于文档树的,文档树中元素的某些属性可以被其子元素继承,每一个CSS属性都定义了它能否被继承。要设定文档的某些缺省样式属性,可以在文档树的根上设定该属性,如果这个属性可以继承,则其后代元素将继承这个属性,例如color、font-size等属性。
      
    3、“inherit(继承)”值
      每一个属性可以指定值为“inherit”,即:对于给定的元素,该属性和它父元素相对属性的计算值取一样的值。继承值通常只用作后备值,它可以通过显式地指定“inherit”而得到加强,例如:p { font-size: inherit; }
      
    4、继承的局限性
    继承虽然减少了重复定义的麻烦,但是,有些属性是不能继承的,例如border(边框)、margin(边距)、padding(补白)和背景等。

    5、能否取消
    css属性一旦继承了不能被取消,只能重新定义样式。

    6、案例
    父元素position:relative 子元素:position:absolute 父元素宽度固定,子元素会继承父元素的宽度(对于二级导航很重要,当隐藏的那个导航栏宽度不固定,或者宽度大于父元素时,此时一般只能重新设置子元素的宽度)

  • 选择器的优先级
    内联样式(1000)>id选择器(100)>类和伪类(10)>元素选择器(1)>全局选择器>继承的样式(0)
    注意:当选择器中包含多种选择器时(p#p2),需要将多种选择器的优先级相加再比较.选择器的优先级不会超过他的最大数量级,比如多个id选择器相加不会超过999.
    如果选择器的优先级一样,则使用位置靠后的样式。class=“p1 p2”
    并集选择器h1,p,div{}的优先级是单独计算的,会各自运用到自己的内容中。在样式的最后添加一个!inportant会获得最高的优先级,优先显示。

  • css3选择器
    CSS3选择器大全


6、层叠上下文z-index

层叠上下文详解


7、常见页面布局?响应式布局?

一、静态布局(Static Layout)

概念:

最传统、原始的Web布局设计。网页最外层容器(outer)有固定的大小,所有的内容以该容器为标准,超出宽高的部分用滚动条(overflow:scroll)来实现滚动查阅。

优点

采用的是css2之前的写法,不存在浏览器兼容性。布局简单。

缺点

但是移动端不可以使用pc端的页面,两个页面的布局不一致,移动端需要自己另外设计一个布局并使用不同域名呈现。

实现方法

PC端:
最外层居中,使用固定的宽(高)度,超出部分用滚动条查阅。
例如百度首页外层body设置了一个min-width:1000px;,当我打开调试器的时候,底部x轴滚动条就出现了。
在这里插入图片描述
移动端
由于静态布局不适用于手机端,所以一般都会另设计一个布局,并使用另一个域名。
例如刚刚百度的PC端我们切换成手机模拟器访问试试:
在这里插入图片描述
访问一下百度的手机端页面:m.baidu.com
在这里插入图片描述
总结:
PC端限制了最小的宽度, 低于了则以最小宽度出现滚动条
移动端限制了最大的宽度, 超过了则以最大宽度居中显示

二、流式布局(Liquid Layout)

概念:
流式布局也叫百分比布局

这边引入一下自适应布局:
分别为不同的屏幕设置布局格式,当屏幕大小改变时,会出现不同的布局,意思就是在这个屏幕下这个元素块在这个地方,但是在那个屏幕下,这个元素块又会出现在那个地方。只是布局改变,元素不变。可以看成是不同屏幕下由多个静态布局组成的。

而流式布局的特点是随着屏幕的改变,页面的布局没有发生大的变化,可以进行适配调整,这个正好与自适应布局相补。

流式布局常用的设计模板:
左侧固定+右侧自适应
左右固定宽度+中间自适应(参考京东手机版)

页面元素的宽度按照屏幕进行适配调整,主要的问题是如果屏幕尺度跨度太大,那么在相对其原始设计而言过小或过大的屏幕上不能正常显示 。 你看到的页面,元素的大小会变化而位置不会变化——这就导致如果屏幕太大或者太小都会导致元素无法正常显示。

优点:
元素的宽高用百分比做单位,元素宽高按屏幕分辨率调整,布局不发生变化

缺点:
屏幕尺度跨度过大的情况下,页面不能正常显示。

三、弹性布局(Flex Layout)

概念:
弹性布局是CSS3引入的强大的布局方式,用来替代以前Web开发人员使 的一些复杂易错的hacks方法(如float实现流式布局)。

优点:
简单、方便、快速

缺点:
CSS3新特性,浏览器兼容性非常头疼。而且手机浏览器对flex的支持也不是很理想。

主要属性及实现方式:
flex-flow: ||

flex-direction和flex-wrap的简写,在两者选其一。

flex-direction: row(初始值) | row-reverse | column | column-reverse

flex-direction定义了弹性项目在弹性容器中的放置方向,默认是row,即行内方向(一般而言是由左往右,但注意这个和书写模式有关)。

row:主轴为水平方向,项目沿主轴从左至右排列

column:主轴为竖直方向,项目沿主轴从上至下排列

row-reverse:主轴水平,项目从右至左排列,与row反向

column-reverse:主轴竖直,项目从下至上排列,与column反向

Flex布局详解实现


8、BFC

BFC 定义
BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

在解释什么是BFC之前,我们需要先知道Box、Formatting Context的概念。
Box:css布局的基本单位

Box 是 CSS 布局的对象和基本单位, 直观点来说,就是一个页面是由很多个 Box 组成的。元素的类型和 display 属性,决定了这个 Box 的类型。 不同类型的 Box, 会参与不同的 Formatting Context(一个决定如何渲染文档的容器),因此Box内的元素会以不同的方式渲染。让我们看看有哪些盒子:

block-level box:display 属性为 block, list-item, table 的元素,会生成 block-level box。并且参与 block fomatting context;
inline-level box:display 属性为 inline, inline-block, inline-table 的元素,会生成 inline-level box。并且参与 inline formatting context;
run-in box: css3 中才有, 这儿先不讲了。

Formatting Context

Formatting context 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。最常见的 Formatting context 有 Block fomatting context (简称BFC)和 Inline formatting context (简称IFC)。

BFC是一个独立的布局环境,其中的元素布局是不受外界的影响,并且在一个BFC中,块盒与行盒(行盒由一行中所有的内联元素所组成)都会垂直的沿着其父元素的边框排列。

BFC的布局规则

内部的Box会在垂直方向,一个接一个地放置。

Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。

每个盒子(块盒与行盒)的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。

BFC的区域不会与float box重叠。

BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。

计算BFC的高度时,浮动元素也参与计算。

如何创建BFC(触发)

1、float的值不是none。
2、position的值不是static或者relative。
3、display的值是inline-block、table-cell、flex、table-caption或者inline-flex
4、overflow的值不是visible

BFC的作用

  1. 利用BFC避免margin重叠。
  2. 自适应两栏布局
  3. 清楚浮动。

实现以上作用代码


9、css预处理器

一般回答 变量 / 嵌套 / 自动前缀 / 条件语句 / 循环语句
常用css预处理器:less、sass


10 、css3新特性

animation和transiton的相关属性,animate和translate

11、display

display的几种常用取值

12、相邻的两个inline-block节点为什么会出现间隔,该如何解决

解决inline-block节点出现间隔问题

13、meta viewport 移动端适配

移动端适配之viewport篇

14、CSS实现宽度自适应100%,宽高16:9的比例的矩形

概念:
到目前为止,CSS实现这种效果已经非常容易了,它有一个专业的术语叫“宽高比”或“纵宽比”。就CSS实现方案来说有多种方案可以实现。
这种方案是最早被采用的一种方案,简单地说,就是把容器的height设置为0,然后设置padding-top或padding-bottom的值为宽高比=56.25%。

padding-top = (元素高度 / 元素宽度) * 100% 
padding-bottom = (元素高度 / 元素宽度) * 100%

在这里插入图片描述
如果用SCSS可以这样来写:

@mixin fixed-aspect-rations($height, $width) { 
padding-bottom: $height / $width * 100%; 
// 或者 
padding-top: $height / $width * 100%; 
}

// 或者···
@function aspect-ratio($height, $width) { 
$aspect-ratio: $height / $width * 100%; @return $aspect-ratio; 
}

示例:

<div class="container"> 
<iframe class="embed"></iframe> 
</div>

/*CSS*/
.container { 
position: relative; 
width: 100%; 
height: 0; 
padding-top: 56.25% // 9 / 16 * 100% 
} 
.embed { 
position: absolute; 
top: 0; 
left: 0; 
width: 100%; 
height: 100%; 
}

其他各种方式或者最新实现规范写法


15、rem 布局的优缺点

什么是Rem:
rem和em很容易混淆,其实两个都是css的单位,并且也都是相对单位,现有的em,css3才引入的rem,在介绍rem之前,我们先来了解下em

em作为font-size的单位时,其代表父元素的字体大小,em作为其他属性单位时,代表自身字体大小——MDN

我在面试时经常问会一道和em有关的题,来看一下面试者对css细节的了解程度,如下,问s1、s2、s5、s6的font-size和line-height分别是多少px,先来想一想,结尾处有答案和解释

<div class="p1">
	<div class="s1">1</div>
  	<div class="s2">1</div>
</div>
<div class="p2">
	<div class="s5">1</div>
  	<div class="s6">1</div>
</div>
.p1 {font-size: 16px; line-height: 32px;}
.s1 {font-size: 2em;}
.s2 {font-size: 2em; line-height: 2em;}

.p2 {font-size: 16px; line-height: 2;}
.s5 {font-size: 2em;}
.s6 {font-size: 2em; line-height: 2em;}

em可以让我们的页面更灵活,更健壮,比起到处写死的px值,em似乎更有张力,改动父元素的字体大小,子元素会等比例变化,这一变化似乎预示了无限可能

em做弹性布局的缺点还在于牵一发而动全身,一旦某个节点的字体大小发生变化,那么其后代元素都得重新计算,X﹏X

rem作用于非根元素时,相对于根元素字体大小;rem作用于根元素字体大小时,相对于其出初始字体大小——MDN

rem取值分为两种情况,设置在根元素时和非根元素时,举个例子

/* 作用于根元素,相对于原始大小(16px),所以html的font-size为32px*/
html {font-size: 2rem}

/* 作用于非根元素,相对于根元素字体大小,所以为64px */
p {font-size: 2rem}

rem有rem的优点,em有em的优点,尺有所短,寸有所长,我一直不觉得技术没有什么对错,只有适合不适合,有对错的是使用技术的人,杰出与优秀的区别就在于能否选择合适的技术,并让其发挥优势

我一直觉得em就是为字体和行高而生的,有些时候子元素字体就应该相对于父元素,元素行高就应该相对于字体大小;而rem的有点在于统一的参考系

Rem布局原理:
其实rem布局的本质是等比缩放,一般是基于宽度,试想一下如果UE图能够等比缩放,那该多么美好啊

假设我们将屏幕宽度平均分成100份,每一份的宽度用x表示,x = 屏幕宽度 / 100,如果将x作为单位,x前面的数值就代表屏幕宽度的百分比

rem原理及具体实现方案链接

16、画三角形

实现原理:
三角形实现原理:宽度width为0;height为0;(1)有一条横竖边(上下左右)的设置为border-方向:长度 solid red,这个画的就是底部的直线。其他边使用border-方向:长度 solid transparent。(2)有两个横竖边(上下左右)的设置,若斜边是在三角形的右边,这时候设置top或bottom的直线,和右边的斜线。若斜边是在三角形的左边,这时候设置top或bottom的直线,和左边的斜线。

实现:

实现三角形角度链接

其他理解链接(推荐)

transparent属性
注:用来指定全透明色彩。
transparent是全透明黑色(black)的速记法,即一个类似rgba(0,0,0,0)这样的值。
在CSS1中,transparent被用来作为background-color的一个参数值,用于表示背景透明。
在CSS2中,border-color也开始接受transparent作为参数值,《Open eBook™ Publication Structure 1.0.1》[OEB101]延伸到color也接受transparent作为参数值。IE6不支持border的颜色为transparent,边框色会显示为黑色。
在CSS3中,transparent被延伸到任何一个有color值的属性上。IE8及以下,color属性值为transparent时,文本显示为黑色。


17、1px 边框问题

方案:
解决移动端1px的问题及方案的优缺点

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值