所在的位置: html >> html市场 >> CSS面试题合集

CSS面试题合集

文档流

文档流分为定位流、浮动流、普通流三种,普通流其实就是FC(formatingcontext)。常见的FC有:BFC(块级格式化上下文)、IFC(行级格式化上下文),还有GFC(网格布局格式化上下文)和FFC(自适应格式化上下文)。BFC可以理解为,满足某些特点的元素,对内部和外部元素会表现出一些特性。就像是拥有了某个开发者不能修改的CSS属性。满足下列条件之一就可触发BFC

根元素,即HTML元素  float的值不为none  overflow的值不为visible  display的值为inline-block、table-cell、table-caption  position的值为absolute或fixed

BFC布局规则:

内部的Box会在垂直方向,一个接一个地放置。  Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠  每个元素的marginbox的左边,与包含块borderbox的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。  BFC的区域不会与floatbox重叠。  BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。  计算BFC的高度时,浮动元素也参与计算

BFC的具体应用:

上述规则第四条,float+BFC,可以实现两栏布局  上述规则第六条,BFC(float+float),父容器能完全包含子元素  上述规则第二条,BFC+BFC不会发生margin重叠  上面的三个应用,其实都体现了上述规则第五条

link和

import

两者都是外部引用CSS的方式,但是存在一定的区别:

link是XHTML标签,除了能够加载CSS外的其他类型;而

import只可以加载CSS。  link引用CSS时,在页面载入时同时加载;

import需要页面完全载入以后再加载。  link是XHTML标签,无兼容问题;

import则是在CSS.1提出的,低版本的浏览器不支持。  link支持使用Javascript控制DOM改变样式;而

import不支持。

选择器

id选择器(#myid)  类选择器(.myclassname)  标签选择器(div,h1,p)  相邻选择器(h1+p)  子选择器(ulli)  后代选择器(lia)  通配符选择器(*)  属性选择器(a[l="external"])  伪类选择器(a:hover,li:nth-child)

可继承的样式:font-sizefont-familycolor,ULLIDLDDDT;不可继承的样式:borderpaddingmarginwidthheight;不同权重的比较规则:

!importantidclasstag

同权重的情况下

定义最近优先级更高:style=""stylelink  其中link方式载入的样式,最后载入的为准

p:first-of-type/*选择属于其父元素的首个p元素的每个p元素。*/p:last-of-type/*选择属于其父元素的最后p元素的每个p元素。*/p:only-of-type/*选择属于其父元素唯一的p元素的每个p元素。*/p:only-child/*选择属于其父元素的唯一子元素的每个p元素。*/p:nth-child()/*选择属于其父元素的第二个子元素的每个p元素。*/:after/*在元素之前添加内容,也可以用来做清除浮动。*/:befo/*在元素之后添加内容*/:enabled:disabled/*控制表单控件的禁用状态。*/:checked/*单选框或复选框被选中。*/

元素布局

水平居中:给div设置一个宽度,然后添加margin:0auto属性

div{width:00px;margin:0auto;}

水平+垂直居中(1):通过margin-left、margin-top设置为-halfwidth/halfheight

div{position:lative;/*相对定位或绝对定位均可*/width:px;height:00px;top:50%;left:50%;margin:-px00-50px;/*外边距为自身宽高的一半*/background-color:pink;/*方便看效果*/}

水平+垂直居中():未知容器宽高,使用transform:translate

div{position:absolute;/*相对定位或绝对定位均可*/width:px;height:00px;top:50%;left:50%;transform:translate(-50%,-50%);background-color:pink;/*方便看效果*/}

水平+垂直居中():flex

.container{display:flex;align-items:center;/*垂直居中*/justify-content:center;/*水平居中*/}.containerdiv{width:px;height:px;background-color:pink;}

新增各种

CSS

选择器,比如

:not(.input)

圆角

border-radius:8px

多列布局

multi-column

阴影和反射

shadow\flect

文字特效

text-shadow

文字渲染

text-decoration

线性渐变

gradient

旋转

transform

缩放,定位,倾斜,动画,多背景因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对

CSS

初始化往往会出现浏览器之间的页面显示差异。当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化。盒子模型包括

content+padding+border+margin

标准盒子模型:宽度=内容的宽度(

content

)即默认模型:

content-box

低版本IE盒子模型:宽度=

content+border+padding

border-box

一般都设置为

boxsizing:border-box;

CSS

弹性盒(

FlexibleBox

flexbox

),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。设为

Flex

布局以后,子元素的

float、clear

vertical-align

属性将失效。弹性盒子由弹性容器

Flexcontainer

和弹性子元素

Flexitem

组成。弹性容器通过设置

display

属性的值为

flex

inline-flex

将其定义为弹性容器。

设置在项目

item

上的属性

display:none

隐藏后的元素不占据任何空间

visibility:hidden

隐藏后的元素空间依旧保留  子元素会继承这个属性,重新给子元素设置visibility:visible,则子元素又会显示出来

什么要浮动,什么时候需要清除浮动,清除浮动都有哪些方法使用浮动之后,父元素的高度会塌陷,变成0,导致布局有问题,这个时候需要清除浮动。

.clear-fix:after{display:block;clear:both;content:"";visibility:hidden;height:0}.clear-fix:after{content:;display:table;clear:both;}

.triangle-up{width:0;height:0;border-bottom:50pxsolidd;border-left:50pxsolid#FFF;border-right:50pxsolid#FFF;border-top:50pxsolid#FFF;}.triangle-down{width:0;height:0;border-bottom:50pxsolid#FFF;border-left:50pxsolid#FFF;border-right:50pxsolid#FFF;border-top:50pxsolidd;}

opacity

会影响到元素到background、color,并且被继承。下面例子中,背景色和字体(本来默认是黑色的),连同

.child

,都是灰色的。

.opacity{background:#;opacity:0.5;}divclass="opacity"opacitypantdivclass="child"child/div/div

rgba

被用于设置背景颜色,它不会影响color,不会被子继承。下面的例子中,背景色灰色,字体黑色,

.chlid

全然不受影响,背景色是完完整整的红。

.rgba{background-color:rgba(0,0,0,.5);}.rgba.child{background:d;}divclass="rgba"rgbapantdivclass="child"child/div/div

注:图中opacity本是看不到的,能看见是因为用光标选中了文字区域。

tranform:scale()

opacity:0;display:none;visibility:hidden;width:0;height:0;inputtype="hidden"name="看不见我"

能够更快速的编写代码结构清晰,便于维护文件切分、模块化、选择符嵌套、变量、运算、函数、

Mixin

工程化

display:none

(不占空间,不能点击);场景,显示出原来这里不存在的结构

visibility:hidden

(占据空间,不能点击);场景:显示不会导致页面结构发生变动,不会撑开)

opacity:0

(占据空间,可以点击);场景:可以跟

transition

搭配做过渡效果已知如下代码,如何修改才能让图片宽度为

00px

?注意下面代码不可修改。

imgsrc="1.jpg"style="width:px!important;”

imgsrc="1.jpg"style="width:px!important;max-width:00px"imgsrc="1.jpg"style="width:px!important;transform:scale(0.65,1);"imgsrc="1.jpg"style="width:px!important;width:00px!important;"

transform

Dtransform变换方法

translate(x,y)

方法,根据左(

X

轴)和顶部(

Y

轴)位置给定的参数,从当前元素位置移动。

x

,

y

的值可以取正负,分别表示表示向不同的方向偏移。

rotate(angle)

方法,表示旋转

angle

角度。

angle

为正时,按顺时针角度旋转,为负值时,元素逆时针旋转。

scale(x,y)

方法,表示元素在

x

轴和

y

轴上的缩放比例,参数大于

1

时,元素放大,小于

1

时,元素缩小。

skew(x-angle,y-angle)

方法,用来对元素进行扭曲变行,第一个参数是水平方向扭曲角度,第二个参数是垂直方向扭曲角度。其中第二个参数是可选参数,如果没有设置第二个参数,那么

Y

轴为

0deg

matrix(n,n,n,n,n,n)

方法,以一个含六值的变换矩阵的形式指定一个

D

变换,此属性值使用涉及到数学中的矩阵

transform-origin属性

transform

的方法都是基于元素的中心来变换的,也就是元素变换的基点默认是元素的中心。

transition

transition

允许

css

的属性值在一定的时间区间内平滑地过渡。这种效果可以在鼠标单击、获得焦点、被点击或对元素任何改变中触发,并圆滑地以动画效果改变

CSS

的属性值。

transition

属性的值包括以下四个:

transition-property

:指定对

HTML

元素的哪个

css

属性进行过渡渐变处理,这个属性可以是

color、width、height

等各种标准的

css

属性。

transition-duration

:指定属性过渡的持续时间

transition-timing-function

:指定渐变的速度(

linear,ease,ease-out,ease-in,ease-in-out

)等

transition-delay

:指定延迟时间

animation

要使用

animation

动画,先要熟悉一下

keyframes

,

Keyframes

的语法规则:命名是由”

keyframes

”开头,后面紧接着是这个“动画的名称”加上一对花括号“{}”,括号中就是一些不同时间段样式规则。不同关键帧是通过

from

(相当于

0%

)、to(相当于

%

)或百分比来表示(为了得到最佳的浏览器支持,建议使用百分比)

animation-name

:动画名称

animation-duration

:一个动画周期花费的时间

animation-timing-function

:

linear,ease,ease-out,ease-in,ease-in-out

animation-delay

:规定延时

animation-iteration-count

:动画播放次数

animation-diction

:是否在下一周期逆向播放

normal,verse,alternate

区别:

Transform

:对元素进行变形;

Transition

:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画。但只有两个关键贞。开始,结束。

Animation

:对元素某个属性或多个属性的变化,进行控制(时间等),类似

flash

的补间动画。可以设置多个关键贞。

Transition

Animation

:

transition

需要触发一个事件,而

animation

在不需要触发任何事件的情况下也可以显式的随着时间变化来改变元素

css

的属性值,从而达到一种动画的效果。它的原因以及解决方法元素被当成行内元素排版的时候,原来

HTML

代码中的回车换行被转成一个空白符,在字体不为

的情况下,空白符占据一定宽度,所以

inline-block

的元素之间就出现了空隙。解决方法:1、给父级元素设置

font-size:0

;子元素设置相应的

font-size

、改变书写方式,元素间留白间距出现的原因就是标签段之间的空格,因此,去掉

HTML

中的空格,自然间距就消失了、

margin

负值4、设置父元素,

display:table

word-spacing

viewport

指视口,浏览器上(或一个

app

中的

webview

)显示网页的区域。

PC

端的视口是浏览器窗口区域,而移动端的则存在三个不同的视口:

layoutviewport

:布局视口

visualviewport

:视觉视口

idealviewport

:理想视口

layoutviewport

布局视口:在

PC

端的网页的

layoutviewport

即浏览器页面显示的整个区域,也可以理解成网页的绘制区域。而在移动端由于其屏幕较小,无法全部显示PC端页面的全部内容,所以默认情况下(不用

metaname="viewport"

去控制),移动端会指定一个大于其浏览器显示区域

layoutviewport

,一般是

px

;

visualviewport

视觉视口:

visualviewport

,顾名思义指浏览器可视区域,即我们在移动端设备上看到的区域

idealviewport

理想视口:理想视口,即页面绘制区域可以完美适配设备宽度的视口大小,不需要出现滚动条即可正常查看网站的所有内容,且文字图片清晰,如所有

iphone

的理想视口宽度都为

0px

,安卓设备的理想视口有

0px、60px

等等。

metaname="viewport"content="width=width-device,initial-scale=1.0,maximum-scale=1.0,user-scalable=no"

width

:

width

用来设置

layoutviewport

的宽度,即页面具体绘制区域的宽度,在不使用

meta

进行控制视口时,以

iphone

为例,其会设置视口宽度为

px

。另外

width

可设置为

width-device

字符串,表示设置视口宽度为设备的

idealviewport

,如在

iphone

上为

0px

initial-scale

:指页面初始的缩放值,其值可以通过如下公式进行计算

initial-scale=idealviewport/visualviewport

A

元素垂直居中,

A

元素距离屏幕左右各边各

10px

,

A

元素里的文字

font—size:0px

,水平垂直居中,

A

元素的高度始终是

A

元素宽度的

50%

divclass="box"divclass="Abox"我是居中元素/div/div

*{margin:0;padding:0;}html,body{width:%;height:%;}.box{position:lative;background:d;width:%;height:%;}.Abox{position:absolute;margin-left:10px;width:calc(vw-0px);height:calc(50vw-10px);top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;font-size:0px;background:yellow;}

首先要了解

CSS

的图层的概念(

Chrome

浏览器)浏览器在渲染一个页面时,会将页面分为很多个图层,图层有大有小,每个图层上有一个或多个节点。在渲染

DOM

的时候,浏览器所做的工作实际上是:1、计算需要被加载到节点上的样式结果(

Recalculatestyle

--样式重计算)、为每个节点生成图形和位置(

Layout

--回流和重布局)、将每个节点填充到图层中(

PaintSetup

Paint

--重绘)4、组合图层到页面上(

CompositeLayers

--图层重组)

触发重布局的属性

盒子模型相关属性会触发重布局:

width  height  padding  margin  display  border-width  border  min-height

定位属性及浮动也会触发重布局:

top  bottom  left  right  position  float  clear

改变节点内部文字结构也会触发重布局:

text-align  overflow-y  font-weight  overflow  font-family  line-height  vertival-align  white-space  font-size

这么多常用属性都会触发重布局,可以看到,他们的特点就是可能修改整个节点的大小或位置,所以会触发重布局

触发重绘的属性

修改时只触发重绘的属性有:

color  border-style  border-radius  visibility  text-decoration  background  background-image  background-position  background-peat  background-size  outline-color  outline  outline-style  outline-width  box-shadow

opacity

不会触发重绘。

translate

这个不会触发重布局。这个是

flex

布局的内容,其实就是一个边距的区别,按水平布局来说,

space-between

在左右两侧没有边距,而

space-around

在左右两侧会留下边距,垂直布局同理。

三栏布局

三栏布局是很常见的一种页面布局方式。左右固定,中间自适应。实现方式有很多种方法。

第一种:flex

divclass="container"divclass="left"left/divdivclass="main"main/divdivclass="right"right/div/div

.container{display:flex;}.left{flex-basis:00px;background:gen;}.main{flex:1;background:d;}.right{flex-basis:00px;background:gen;}

第二种:position+margin

divclass="container"divclass="left"left/divdivclass="right"right/divdivclass="main"main/div/div

body,html{padding:0;margin:0;}.left,.right{position:absolute;top:0;background:d;}.left{left:0;width:00px;}.right{right:0;width:00px;}.main{margin:px;background:gen;}

第三种:float+margin

divclass="container"divclass="left"left/divdivclass="right"right/divdivclass="main"main/div/div

body,html{padding:0;margin:0;}.left{float:left;width:00px;background:d;}.main{margin:px;background:gen;}.right{float:right;width:00px;background:d;}

.squa{width:10vw;height:10vw;background:d;}

注:需要考虑兼容性

/*单行:*/.cls{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}/*多行:*/.cls{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:;overflow:hidden;}/*兼容:*/p{position:lative;line-height:0px;max-height:40px;overflow:hidden;}p::after{content:"...";position:absolute;bottom:0;right:0;padding-left:40px;background:-webkit-linear-gradient(left,transpant,#fff55%);background:-o-linear-gradient(right,transpant,#fff55%);background:-moz-linear-gradient(right,transpant,#fff55%);background:linear-gradient(toright,transpant,#fff55%);

divclass="box"divclass="left"asdfads/divdivclass="right"asdfasdbrasdfadbradfasdfabrasfdas/div/div

/*flex布局默认的align-items属性的值为sttch,所以默认是撑开的*/.box{display:flex;}.left,.right{margin:00px;background:d;}/*tabletable-cell*/.box{display:flex;border-spacing:0px;}.left,.right{display:table-cell;background:d;}

section{width:%;padding-bottom:%;background:#;}

css选择器匹配元素是逆向解析

因为所有样式规则可能数量很大,而且绝大多数不会匹配到当前的DOM元素(因为数量很大所以一般会建立规则索引树),所以有一个快速的方法来判断「这个selector不匹配当前元素」就是极其重要的。  如果正向解析,例如「divdivpem」,我们首先就要检查当前元素到html的整条路径,找到最上层的div,再往下找,如果遇到不匹配就必须回到最上层那个div,往下再去匹配选择器中的第一个div,回溯若干次才能确定匹配与否,效率很低。  逆向匹配则不同,如果当前的DOM元素是div,而不是selector最后的em,那只要一步就能排除。只有在匹配时,才会不断向上找父节点进行验证。

viewport+mbackground-imagescaleborder-imagebox-shadow




转载请注明:http://www.aierlanlan.com/rzdk/3884.html