前端面试题系列之-CSS及页面布局篇

html-css010

前端面试题系列之-CSS及页面布局篇,第1张

CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列、对齐和分配空白空间。可以用简单的方式满足很多常见的复杂的布局需求。它的优势在于开发人员只是声明布局应该具有的行为,而不需要给出具体的实现方式。浏览器会负责完成实际的布局。该布局模型在主流浏览器中都得到了支持。

采用flex布局的元素,成为flex容器。它的所有子元素自动成为容器成员,称为flex项目。常用的,设置到容器上的属性有:

设置到项目上的属性:

(Block Formatting Context)块级格式化上下文。BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之也如此.并且在一个BFC中,块盒与行盒(行盒由一行中所有的内联元素所组成)都会垂直的沿着其父元素的边框排列。

上述方法都可以创建BFC,但是会带来一些负面影响:

::before是css3的写法,:before是css2的写法,用来设置对象前的内容

:before的兼容性要比::before好

更准确的说法

1、transition 是过渡,是样式值的变化的过程,只有开始和结束;animation 其实也叫关键帧,通过和 keyframe 结合可以设置中间帧的一个状态;

2、animation 配合 @keyframe 可以不触发时间就触发这个过程,而 transition 需要通过 hover 或者 js 事件来配合触发;

3、animation 可以设置很多的属性,比如循环次数,动画结束的状态等等,transition 只能触发一次;

4、animation 可以结合 keyframe 设置每一帧,但是 transition 只有两帧;

常规方法

不需要使用transform属性时

webkit内核

参考链接:

CSS实现不换行/自动换行/文本超出隐藏显示省略号

object-fit CSS 属性指定可替换元素的内容应该如何适应到其使用的高度和宽度确定的框。这个CSS属性可以达到最佳最完美的居中自动剪裁图片的功能

@import规则一定要先于除了@charset的其他任何CSS规则。

不推荐使用@import:

因为浏览器的兼容的问题,不同浏览器有些标签的默认值是不同的,如果没有CSS初始化往往会出现浏览器之间的页面显示差异。

伪元素和伪类的区别总结

css继承指的是被包在内部的标签将拥有外部标签的样式性,即子元素可以继承父元素的属性。

相关链接:

CSS 继承,哪些属性能继承,哪些不能

z-index可以改变元素层叠顺序,z-index较大的会叠加在z-index较小的元素上方。z-index值相同时,则按照文档流顺序,后面的覆盖前边的。

px就是pixel的缩写,意为像素。px就是一张图片最小的一个点,一张位图就是千千万万的这样的点构成的,比如常常听到的电脑像素是1024x768的,表示的是水平方向是1024个像素点,垂直方向是768个像素点。注意css中的1px并不一定是物理像素的一个像素块,需要根据DPR计算,对应多少物理像素块

设备像素比:dpr = 物理像素 / 逻辑像素(px),例如,iPhone6的dpr为2,物理像素750(x轴),则它的逻辑像素为375

参考物是父元素的font-size,具有继承的特点。如果自身定义了font-size按自身来计算(浏览器默认字体是16px),整个页面内1em不是一个固定的值。

css3新单位,相对于根元素html(网页)的font-size,不会像em那样,依赖于父元素的字体大小,而造成混乱。

css3新单位,viewpoint width的缩写,视窗宽度,1vw等于视窗宽度的1%。举个例子:浏览器宽度1200px, 1 vw = 1200px/100 = 12 px。

1英寸(inch)=2.54厘米(cm)

手机对角线的长度换算成英寸

屏幕横向和纵向的像素点

1px即代表一个物理像素点/像素块

PPI,是每英寸可以显示的像素点的英文缩写。如果说上面分辨率是一个质量总量的概念,那么,ppi就是密度的概念。我们可以通过屏幕的像素总量除以屏幕大小来计算屏幕的PPI,公式如下: a:横向像素数量,b:纵向像素数量,c:屏幕尺寸(英寸)

1px与多少厘米之间是不能直接划等号的,需要看分辨率。

一般电脑的像素分辨率是72ppi,计算公式: (((1**2 + 1**2)**0.5)/72)*2.54 ,此时1px=0.0498cm,1cm=25px;

很多手机是300ppi,计算公式: (((1**2 + 1**2)**0.5)/300)*2.54 ,此时1px=0.0119cm。

参考链接:

画一条0.5px的线

在继承性上:

一开始针对低版本的浏览器构建页面,满足最基本的功能,再针对高级浏 览器进行效果,交互,追加各种功能以达到更好用户体验,换句话说,就是以最低要求,实现最基础功能为基本,向上兼容。以css为例,以下这种写法就是渐进增强。

一开始针对一个高版本的浏览器构建页面,先完善所有的功能。然后针对各个不同的浏览器进行测试,修复,保证低级浏览器也有基本功能 就好,低级浏览器被认为“简陋却无妨 (poor, but passable)” 可以做一些小的调整来适应某个特定的浏览器。但由于它们并非我们所关注的焦点,因此除了修复较 大的错误之外,其它的差异将被直接忽略。也就是以高要求,高版本为基准,向下兼容。同样以css为例,优雅降级的写法如下。

渐进增强,开发时间长,成本高,优雅降级,节约成本,开发周期短。

今天小编要跟大家分享的文章是关于参加Web前端面试的常见面试题汇总。准备参加Web前端面试的小伙伴们来和小编一起看一看吧,希望本篇文章能够对大家有所帮助。

1.渐进增强与优雅降级

渐进增强

并不是一种技术,而是一种设计思想。各个浏览器的渲染能力各不相同,要做一个每个人都能看到的网页、感受到的体验都一致的网站几乎不可能。但还是得网站的可访问性,保证用户在任何环境下都能正常访问网页得核心内容或能使用基本功能(避免网页打不开、排版错误等),并为他们提供当前条件下最好的体验,这就是渐进增强得核心思想。

优雅降级也是一种设计思想,为了保证在高版本浏览器中提供最好的体验,碰到低版本浏览器再降级进行兼容处理,使其能正常浏览。

这两种思想的区别在于:

1.渐进增强是向上兼容,优雅降级是向下兼容

2.渐进增强是从简单到复杂,优雅降级是从复杂到简单

3.渐进增强关注的是内容(保证核心内容),优雅降级关注的是浏览体验(为了兼容低版本浏览器)

2.DOCTYPE

作用

DTD(DocumentTypeDefinition,文档类型定义)是一系列的语法规则,用来定义XML或(X)HTML

的文档类型。浏览器会使用它来判断文档类型,决定何种协议来解析,以及切换浏览模式。

DOCTYPE是用来声明文档类型和DTD

规范的,一个主要的用途便是文件的合法性验证。如果文档代码不合法,那么浏览器解析时便会出现一些差错。

HTML5的文档类型声明:

HTML4.01Strict(HTML4.01严格模式)的DTD包含所有HTML

元素和属性,但不包括展示性的和弃用的元素(如font),它的文档类型声明:

-//W3C//DTDXHTML1.0Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

标准模式与怪异模式

怪异模式(Quirks

Mode)用于模拟旧浏览器的行为。早期的网站并不会遵循完整的规范,随着浏览器支持越来越多的规范,在那些旧的浏览器中开发的页面在显示时会被破坏。为了向后兼容,浏览器发明了怪异模式,一行错误或无效的

DOCTYPE都会触发怪异模式。

浏览器使用文件开头的DOCTYPE来决定用怪异模式处理或标准模式处理。DOCTYPE

可以确保不同浏览器以相同的方式解析文档,以及执行相同的渲染模式。

怪异模式与标准模式的主要区别:

1.怪异模式的宽度和高度会包含padding和border。标准模式不包含,标准模式下可以通过设置box-sizing:

border-box将标准盒模型转化成怪异模式下的盒模型。

2.怪异模式下,当内容超出容器高度时,会将容器拉伸,而不是溢出。

3.怪异模式下,在表格中的字体样式(如font-size)不会继承。

4.怪异模式下颜色值必须使用十六进制标记法。

3.语义化

HTML5

中的语义化就是让元素、属性或属性值有含义,更准确地标记特定类型的内容。对元素语义化的目的是为了让元素的语义和呈现分离,元素只负责文档内容的结构与含义,而CSS

样式控制内容的呈现,像元素,没有语义但却能将字体变粗,这类元素违背了语义化的目的,将会被废弃。

优点

·使得HTML文档结构清晰、布局合理、主体突出、可读性更强。

·有利于SEO,搜索引擎根据标签来确定上下文和各个关键字的权重。

·方便其他设备解析,如盲人阅读器根据语义渲染网页。

·有利于开发和维护,语义化更具可读性,代码更好维护,与CSS3关系更和谐。

语义化标签

·定义文档的页眉区域,应作为介绍内容或者导航链接栏的容器

·footer内容的页脚,通常包含该章节作者、版权数据或者与文档相关的链接等信息

·article

文档、页面、应用或网站中的独立结构,是可独立分配的、可复用的结构,如在发布中,它可能是论坛帖子、杂志或新闻文章、博客、用户提交的评论、交互式组件,或者其他独立的内容项目

·nav描述一个含有多个超链接的区域,该区域包含跳转到其他页面或页面内部其他部分的链接列表

·section表示文档中的一个区域(或节),比如,内容中的一个专题组

·main定义文档的主要内容,该内容在文档中应当是独一无二的,不包含任何在文档中重复的内容,比如侧边栏,导航栏链接,版权信息,网站

logo,搜索框(搜索框作为文档的主要内容)

·aside

表示一个和其余页面内容几乎无关的部分,被认为是独立于该内容的一部分且可以被单独的拆分出来而不会影响整体。通常表现为侧边栏或嵌入内容。

4.超链接伪类

:link、:visited、:active和:hover的声明顺序是怎样的?

:link表示未访问的链接状态

:visited表示已访问状态:active表示激活状态(鼠标按下):hover表示悬停状态。

推荐顺序是LVHA,即:link:visited:hover:active。理由如下:

·当鼠标悬停在未访问的链接上时,:link和:hover都会命中,如果:hover在:link

之前声明,那么(:hover)就会被覆盖

·当鼠标悬停在已访问的连接上时,:visited和:hover都会命中,如果:hover在:visited

之前声明,那么(:hover)就会被覆盖

·当鼠标单击链接时,:active和:hover都会命中,我们大多是想让:hover只在悬停时展示样式,按下鼠标时使用:active

样式,因此:active在:hover之后声明

·综上,:hover应在:link和:visited之后,在:active之前,因此active在最后。而:link和

:visited两者的顺序无所谓,互不影响。

5.CSS常见的长度单位

CSS中除了px长度单位之外,还有下面几个长度单位:

·pc六分之一英寸,1pc=12pt=1/6*1in=16px

·pt一磅,72分之一英寸。1pt=1/12_1pc=1/72_1in≈1.33px

·in一英寸,1in=2.54cm=96px

·ex在含有“X”字母的字体中,它是该字体的小写字母的高度。对于很多字体来说,1ex≈0.5em

·em1em等于父级元素的字体大小,2em就是父级元素字体大小的二倍

·rem当用在根元素()的font-size上面时,它代表了它的初始值

·ch代表元素所用字体font中“0”这一字形的宽度

·vh1vh相当于视口高度的1%,100vh就是视口的高度

·vw1vw相当于视口宽度的1%,100vw就是视口的宽度

·vmax视口高度vw和宽度vh两者中的最小值

·vmin视口高度vw和宽度vh两种中的最大值

·%相对于父级元素的大小来确定

参考:CSS[1]

CSSpercentage[2]

6.事件对象

冒泡与捕获

事件冒泡与捕获是事件处理的两种机制,主要描述当在一个元素上有两个相同类型的事件处理器被激活会发生什么。

在点击子元素时,浏览器运行了两种不同的阶段:捕获阶段和冒泡阶段。捕获阶段的行为:

·浏览器检查元素的最外层祖先,是否在捕获阶段中注册了一个onclick事件处理程序,如果是,则运行它

·

然后,它移动到中单击元素的下一个祖先元素,并执行相同的操作,然后是单击元素再下一个祖先元素,依此类推,直到到达实际点击的元素

而冒泡与捕获恰恰相反:

·浏览器检查实际点击的元素是否在冒泡阶段中注册了一个onclick事件处理程序,如果是,则运行它

·然后它移动到下一个直接的祖先元素,并做同样的事情,然后是下一个,等等,直到它到达元素

而现代浏览器在默认情况下,所有事件处理程序都在冒泡阶段进行注册。因此上面代码在点击子元素时会先执行子元素绑定的事件,然后向上冒泡,触发父元素绑定的事件。

addEventListener函数的第三个参数是个布尔值。含义:

·当布尔值是false时(这也是默认值),表示向上冒泡触发事件

·当布尔值是true时,表示向下捕获触发事件

不能冒泡的事件

有些事件是不会冒泡的。比如:

·blur元素失去焦点时触发,focusout事件也是失去焦点时触发,但可以冒泡

·focus元素获取焦点时触发

·mouseenter鼠标移动到元素上时会触发该事件,与之对应的是mouseover事件,但会冒泡

·mouseleave鼠标离开元素时触发,与之对应的是mouseout,但会冒泡

事件冒泡可以让我们利用事件委托,尤其是处理大量子元素时,如果给每个子元素都绑定事件,这是不优雅的,可以将事件绑定到父元素上,并让子节点上发生的事件冒泡到父节点上,利用

e.target属性可以获取到当前触发事件的子元素。

事件对象中的方法

·stopPropagation()阻止事件冒泡,当设置后,点击该元素时父元素绑定的事件就不会再触发

·preventDefault()阻止默认事件的发生

·stopImmediatePropagation()它用来阻止监听同一事件的其他事件监听器被调用以及阻止事件冒泡,比如给同一个div

元素绑定多个click事件(使用addEventListener方法可以注册多个),当在第二个事件函数中调用

stopImmediatePropagation方法时,点击div元素时,后面注册的click将不会被触发,而且还会阻止事件冒泡

比如下面的例子,给p绑定多个click事件,在第二个事件函数中调用stopImmediatePropagation,第三个click

事件就不会触发,因为也阻止了冒泡,因此父元素的click事件也不会触发。

paragraph




document.querySelector("div").addEventListener("click",(event)=>{


alert("我是div元素,我是p元素的上层元素")


//p元素的click事件没有向上冒泡,该函数不会被执行


},false)


constp=document.querySelector('p')


p.addEventListener("click",(event)=>{


alert("我是p元素上被绑定的第一个监听函数")


},false)


p.addEventListener("click",(event)=>{


alert("我是p元素上被绑定的第二个监听函数")


event.stopImmediatePropagation()


//执行stopImmediatePropagation方法,阻止click事件冒泡,并且阻止p元素上绑定的其他click
事件的事件监听函数的执行.


},false)


p.addEventListener("click",(event)=>{


alert("我是p元素上被绑定的第三个监听函数")


//该监听函数排在上个函数后面,该函数不会被执行


},false)


在IE浏览器中,使用e.cancelBubble=true也可以取消事件冒泡使用e.returnValue=false

也能阻止默认事件的发生。

target与currentTarget

target属性指向的是事件目标,而currentTarget属性指向的是正在处理当前事件的对象,它总是指向事件绑定的元素。而target

指向的可能不是定义时的事件目标。

例如:

div.addEventListener('click',(e)=>{

console.log(e.target,e.currentTarget)

},false)

e.target可能指向div元素,也可能指向它的子元素。而e.currentTarget总是指向div元素。

以上就是小编今天为大家分享的关于参加Web前端面试的常见面试题汇总的文章,希望本篇文章能够对正准备参加前端面试的小伙伴们有所帮助,想要了解更多Web前端知识记得关注北大青鸟Web前端培训官网,最后祝愿小伙伴们工作顺利,成为一名优秀的Web前端工程师。

参考资料

[1]

CSSlength:#/zh-CN/docs/Web/CSS/length

[2]

CSSpercentage:

#/zh-CN/docs/Web/CSS/percentage

1.position:absolute+transform:translate(-50%,-50%)

2.position:absolute+margin-top:-100px+margin-left:-100px(需要直到div的宽高)

3.flex

4.绝对定位的top,left,bottom,right都设置为0,然后通过margin:auto实现水平垂直居中

5.display:table-cellvertical-align:middletext-align:center

6.calc函数计算实现

1. DOM结构 :元素不会渲染

2. 事件监听 :不能监听DOM事件

3. 继承 :子元素不会继承

4. 性能 :改变此属性会重排,性能较差

1. DOM结构 :元素会渲染

2. 事件监听 :能监听DOM事件

3. 继承 :子元素会继承,可以通过visibility:visible来取消继承

4. 性能 :改变此属性会重绘,性能较好

1. DOM结构 :元素会渲染

2. 事件监听 :能监听DOM事件

3. 继承 :子元素会继承,而且不能通过opcity:1来取消隐藏

4. 性能 :改变此属性会重绘,性能较好

window.divicePixelRatio=2(默认)

意思是:我们css中1px相当于实际移动端设备2px

1.border-width:0.5px

2.box-shadow内阴影模拟边框,

box-shadow:inset 0px -1px 1px 1px red

3.通过viewport设置rem的基准值,就可以直接写rem了,较好的解决方案

4.伪类+transform

通过:after或:before设置border,结合定位

两侧宽度固定,中间宽度自适应

所以我们要尽量少使用以上属性和方法