写在前面
接着上一篇面试总结-HTML篇,整理了之前面试的笔记,发出来希望对大家有一些帮助。博客中收集引用了其他大佬的文章,感谢各位大佬,如有问题请与我联系。欢迎大家评论区讨论指正,谢谢。
CSS
- at-rules(css@规则)
- @charset(指定样式表中使用的字符编码)
- @import(用于从其他样式表导入样式规则)
- @media(重要,媒体查询)
- @page(用于在打印文档时修改某些CSS属性)
- @counter-style(可以自定义counter的样式)
- @keyframes(重要,可以控制动画序列的中间步骤)
- @font-face(重要,指定一个用于显示文本的自定义字体)
- @supports(不推荐,指定依赖于浏览器中的一个或多个特定的CSS功能的支持声明)
- @namespace(定义使用在CSS样式表中的XML命名空间的@规则)
- rule(CSS普通规则)
- 选择器(Selector)
- selector_group(组)
/* no grouping */ h1 {color:blue;} h2 {color:blue;} h3 {color:blue;} h4 {color:blue;} h5 {color:blue;} h6 {color:blue;} /* grouping */ h1, h2, h3, h4, h5, h6 {color:blue;}- selector
- > (子元素)
- <sp> (空格,后代选择器)
- + (相邻兄弟选择器)
- ~ (普通兄弟选择器)
- simple_selector
- type (div|a)
- * (全部)
- . (clas)
- # (id)
- [] (属性选择器)
- : (伪类)伪类是操作文档中已有的元素
- :any-link
- :visited(选择所有访问过的链接,a:visited)
- :hover(选择鼠标在链接上面时,a:hover)
- :active(选择活动链接,a:active)
- :focus(选择具有焦点的输入元素,input:focus)
- :target (选取当前活动的目标元素)
- :empty (选择没有子元素的元素)
- :nth-child(n) (匹配父元素下指定子元素,在所有子元素中排序第n)
- :nth-last-child(n)(选择其父级的第n个子元素,从最后一个子项计数)
- :first-child(匹配父元素下第一个子级的样式)
- :last-child(匹配父元素下最后一个子级的样式)
- :only-child(匹配父元素下唯一子元素)
- :not(selector) (选择除 selector 元素意外的元素)
- :root (选择文档的根元素,等同于html元素)
- :: (伪元素选择器)伪元素是创建了一个文档外的元素
- ::before(在当前元素之前插入内容)
- ::after(在当前元素之后插入内容)
- ::first-line(选择当前元素的首行)
- ::first-letter(选择当前元素的首字母)
- 声明(Declaration)
- Key
- Properties(属性的名)
- Variables(变量)
body{ --bg-color: lightblue; background-color: var(--bg-color); } - Value
- calc(函数,width:calc(100% - 100px))
- number
- length
- ......
- Key
- 选择器(Selector)
px,em,rem,vw,vh,vmax,vmin
- px:相对长度单位。像素px是相对于显示器屏幕分辨率而言的
- em:相对长度单位,相对于父元素设定font-size的尺寸
- rem:相对于根元素,常用语响应式布局
- vh:网页视口高度的 1 / 100
- vw:网页视口宽度的 1 / 100
- vmax 取两者最大值,vmin 取两者最小值
网页视口尺寸:
- window.screen.height // 屏幕高度
- window.innerHeight // 网页视口高度
- document.body.clientHeight // body 高度
常见的页面布局实现
- 两栏布局(边栏定宽主栏自适应)
- 三栏布局(两侧栏定宽主栏自适应)
- 多列等高布局
- 三行布局(头尾定高主栏自适应)
响应式布局方案
- 媒体查询
- 百分比%
- vw/vh
- rem
- media-query,根据不同屏幕宽度设置根元素font-size
- js根据设计稿和屏幕宽度设置根元素font-size
- 利用UI框架实现响应式布局(比如;elementUi的<row><col>)
盒模型
就是用来装页面上的元素的矩形区域。CSS盒子模型组成:外边距(margin)、边框(border)、内边距(padding)、内容(content)。CSS 中的盒子模型包括 IE 盒子模型和标准的 W3C 盒子模型。W3C模型中:CSS中的宽(width)=内容(content)的宽,CSS中的高(height)=内容(content)的高。IE模型中:CSS中的宽(width)= 内容(content)的宽 +(border + padding)* 2,CSS中的高(height)= 内容(content)的高 +(border + padding)* 2。
CSS排版(layout)技术
- 1代 正常流(放置盒的格式化上下文)
- 行为:依次排列,排不下了换行。
- 当遇到块级盒:排入块级格式化上下文,没有块格式化上下文,则创建一个
- 当遇到行内级盒或者文字:首先尝试排入行内级格式化上下文,如果排不下,那么创建一个行盒,先将行盒排版(行盒是块级,由一行中所有的内联元素所组成,所以到第一种情况),行盒会创建一个行内级格式化上下文。
- 遇到float:把盒的顶部跟当前行内级上下文上边缘对齐,然后根据float的方向把盒的对应边缘对到块级格式化上下文的边缘,之后重排当前行盒。
- 原理:块级格式化上下文(Block Formatting Contexts)和行内级格式化上下文(Inline Formatting Contexts)
- BFC:块级排布,一个独立的布局环境,其中的元素布局是不受外界的影响
- BFC布局规则
- 内部的Box会在垂直方向,一个接一个地放置。
- Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
- 每个盒子(块盒与行盒)的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
- BFC的区域不会与float box重叠。
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
- 计算BFC的高度时,浮动元素也参与计算。
- 设置方法
- 根元素(),这里就可以理解正常流的逻辑
- float的值不是none
- position 是 absolute 或者 fixed
- display的值是inline-block、table-cell、flex、table-caption或者inline-flex
- overflow 不是 visible
- 应用
- 避免外边距折叠
- 清除浮动
- 自适应两栏布局
- BFC布局规则
- IFC:行内排布,盒子在水平方向的 内外边距+边框 所占用的空间都会被考虑
- BFC:块级排布,一个独立的布局环境,其中的元素布局是不受外界的影响
- 行为:依次排列,排不下了换行。
- 2代 flex(弹性布局)
- FFC(自适应格式上下文)
- 3代 grid
- GFC(网格布局格式化上下文)
- 3.5代 CSS Houdini
flex常用语法
- flex-direction:决定主轴的方向(即项目的排列方向)
- row(默认值):主轴为水平方向,起点在左端
- row-reverse:主轴为水平方向,起点在右端
- column:主轴为垂直方向,起点在上沿
- column-reverse:主轴为垂直方向,起点在下沿
- justify-content:定义了项目在主轴上的对齐方式
- flex-start(默认值):左对齐
- flex-end:右对齐
- center: 居中
- space-between:两端对齐,项目之间的间隔都相等
- space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍
- align-items:定义项目在交叉轴上如何对齐
- flex-start:交叉轴的起点对齐
- flex-end:交叉轴的终点对齐
- center:交叉轴的中点对齐
- baseline: 项目的第一行文字的基线对齐
- stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度
- flex-wrap:定义,如果一条轴线排不下,如何换行
- nowrap(默认):不换行
- wrap:换行,第一行在上方
- wrap-reverse:换行,第一行在下方
- align-self:允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch
- 该属性可能取6个值,除了auto,其他都与align-items属性完全一致
视觉格式化模型
CSS 的视觉格式化模型(visual formatting model) 是根据 基础盒模型(CSS basic box model) 将 文档(doucment) 中的元素转换一个个盒子的实际算法。官方说法就是: 它规定了用户端在媒介中如何处理文档树( document tree )。
line-height的继承问题
- 写具体数值,如30px, 则继承该值
- 写比例,如2/1.5,则继承该比例
- 写百分比,如200%,则继承计算出来的值
手写clearFloat
.clear-float::after{
content: '';
display: table;
clear: both;
}
12px问题
/* Chrome支持小于12px 的文字 */
.shrink {
-webkit-transform: scale(0.8);
-o-transform: scale(1);
display: inilne-block;
}
margin负值问题
- margin-left和margin-top负值,元素向左和向上移动
- margin-right负值,右侧元素左移,自身不受影响
- margin-bottom负值,下方元素上移,自身不受影响
水平居中
- inine 元素: text-align: center
- block元素: margin: auto;
- absolute元素: left 50% + margin-left 负值
- display: flex, justify-content: center
垂直居中
- inline元素: line-height 的值等于height值
- absolute元素: top 50% +margin-top负值
- absolute元素: transform:translate(-50%, -50%)
- absolute元素: top, left, bottom, right = 0 + margin: auto
- display: flex; align-items: center;
1px边框解决方案
- 产生的原因是DPR(设备像素比,window.devicePixelRatio=物理像素 /CSS像素)
- IOS 8+,非安卓:border:0.5px solid #E5E5E5
- 使用边框图片:border-image: url('./../../image/96.jpg') 2 repeat;
- 使用box-shadow:0 -1px 1px -1px #e5e5e5,
- 使用伪元素+缩放(-webkit-transform: scale(.5);)
.border(
@borderWidth: 1px;
@borderStyle: solid;
@borderColor: @lignt-gray-color;
@borderRadius: 0) {
position: relative;
&:before {
content: '';
position: absolute;
width: 98%;
height: 98%;
top: 0;
left: 0;
transform-origin: left top;
-webkit-transform-origin: left top;
box-sizing: border-box;
pointer-events: none;
}
@media (-webkit-min-device-pixel-ratio: 2) {
&:before {
width: 200%;
height: 200%;
-webkit-transform: scale(.5);
}
}
@media (-webkit-min-device-pixel-ratio: 2.5) {
&:before {
width: 250%;
height: 250%;
-webkit-transform: scale(.4);
}
}
@media (-webkit-min-device-pixel-ratio: 2.75) {
&:before {
width: 275%;
height: 275%;
-webkit-transform: scale(1 / 2.75);
}
}
@media (-webkit-min-device-pixel-ratio: 3) {
&:before {
width: 300%;
height: 300%;
transform: scale(1 / 3);
-webkit-transform: scale(1 / 3);
}
}
.border-radius(@borderRadius);
&:before {
border-width: @borderWidth;
border-style: @borderStyle;
border-color: @borderColor;
}
}
.border-all(
@borderWidth: 1px;
@borderStyle: solid;
@borderColor: @lignt-gray-color;
@borderRadius: 0) {
.border(@borderWidth; @borderStyle; @borderColor; @borderRadius);
}
优雅降级和渐进增强
- 渐进增强:一开始就针对低版本浏览器进行构建页面,完成基本的功能,然后再针对高级浏览器进行效果、交互、追加功能达到更好的体验。
- 优雅降级:一开始就构建站点的完整功能,然后针对浏览器测试和修复。比如一开始使用 CSS3 的特性构建了一个应用,然后逐步针对各大浏览器进行 hack 使其可以在低版本浏览器上正常浏览。
实现动画requestAnimationFrame和setTimeout有什么区别?
- 引擎层面:
- setTimeout 属于 JS 引擎,存在事件轮询,存在事件队列。
- requestAnimationFrame 属于 GUI 引擎,发生在渲 染过程的中重绘重排部分,与电脑分辨路保持一致。
- 性能层面:
- 当页面被隐藏或最小化时,定时器 setTimeout 仍在后台执行动画任 务。
- 当页面处于未激活的状态下,该页面的屏幕刷新任 务会被系统暂停,requestAnimationFrame 也会停止。
- 应用层面:
- 利用 setTimeout,这种定时机制去做动画,模拟固定时间刷新页面。
- requestAnimationFrame 由浏览器专门为动画提供 的 API,在运行时浏览器会自动优化方法的调用,在特定性环境下可以有效节省了 CPU 开销。
写在最后
打个广告,网易灵犀事业部,团队氛围好,技术有挑战,欢迎各位加入,详情点击链接查看juejin.cn/pin/7021051…