前端面试css篇

309 阅读6分钟

实现三栏布局(两侧定宽,中间自适应)

采用了 absolute,导致父元素脱离了文档流,那所有的子元素也需要脱离文档流。如果页面复杂,那开发的难度可想而知

利用浮动 当中间内容高于两侧时,两侧高度不会随中间内容变高而变高

弹性盒子布局(flex)

利用负边距和浮动,实现起来比较复杂

利用网格布局

.container {
    display: grid;
    grid-template-columns: 100px auto 200px;
}

CSS选择器及其优先级

  • !important
  • 内联样式style=""
  • ID选择器#id
  • 类选择器/属性选择器/伪类选择器.class.active[href=""]
  • 元素选择器/关系选择器/伪元素选择器html+div>span::after
  • 通配符选择器*

rem原理

rem布局的本质是等比缩放,一般是基于宽度,假设将屏幕宽度分为100份,每份宽度是1rem,1rem的宽度是屏幕宽度/100,,然后子元素设置rem单位的属性, 通过改变html元素的字体大小,就可以设置子元素的实际大小。

对比em

rem相对于根元素,em相对于氟元素

rem布局加载闪烁的问题

解决方案,媒体查询 设置根元素字体大小,比如设计稿是750px;对应的开发方式是1rem=100px,那375px的font-size 大小就是100/(750/375) = 50px

比rem更好的方案

vw(1vw是视口宽度的1%,100vw就是视口宽度),vh(100vh就是视口高度)

div垂直居中

  • 行内元素
.parent {
    height: 高度;
}
.son {
    line-height: 高度;
}
  • table
.parent {
  display: table;
}
.son {
  display: table-cell;
  vertical-align: middle;
}
  • flex

.parent {
    display: flex;
    align-items: center;
}
  • 绝对定位定高
.son {
    position: absolute;
    top: 50%;
    height: 高度;
    margin-top: -0.5高度;
}
  • 绝对定位不定高
.son {
    position: absolute;
    top: 50%;
    transform: translate( 0, -50%);
}

top/bottom: 0;

.son {
    position: absolute;
    height: 高度;
    top: 0;
    bottom: 0;
    margin: auto 0;
}

css3新特性总结

1.圆角边框

  border-radius:5px;

2.多背景图

  background: url(img_flwr.gif) right bottom no-repeat, url(paper.gif) left top repeat;

3.颜色和透明度(由原来的rgb到现在的rgba)

  background: rgba(0,0,0,.5);

4.多列布局和弹性盒模型

display: flex; 5.盒子的变幻(2D、3D)

  transform: translate(50px,100px);//移动
  transform: rotate();//旋转
  transform: scale();//缩放
  transform: skew();//倾斜

用于元素的直接或者鼠标感应变化,没有其他变幻参数(如延时,持续时间,变幻曲线),立即改变。

6.过渡和动画

 transition: width 1s linear 2s;

过渡效果,transition通过指定某些属性和变幻参数,以原始定义为开始状态,通过鼠标操作变化(hover),hover状态定义结束状态,实现过渡效果。

 animation: myfirst 5s;
 @keyframes myfirst {
    0% {background: block;}
    25% {background: red;}
    50% {background: yellow;}
    100% {background: green;}
  }

动画效果,加强版的过渡效果,通过animation指定动画名和动画参数,@keyframes定义动画内容,根据参数自动触发。

7.引入web字体(在服务器端存储)

@font-face {
    font-family: myfirstfont;
    src: url(sansation_light.woff);
}
div {
    font-family: myfirstfont;
}

8.媒体查询

 body{
    background: yellow;
}
@media screen and (max-width: 480px){
    background: red;
 }

9.阴影

h1 {//文字阴影
    text-shadow: 5px 5px 5px red;
}
div {//盒子阴影
    box-shadow: 10px 5px 5px yellow;
}

BFC(块级格式化上下文)

BFC 的原理

其实也就是 BFC 的渲染规则。包括:

1.BFC 内部的子元素,在垂直方向,边距会发生重叠。

2.BFC在页面中是独立的容器,外面的元素不会影响里面的元素,反之亦然。

3.BFC区域不与旁边的float box区域重叠。(可以用来清除浮动带来的影响)。

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

如何生成BFC

1:overflow: 不为visible,可以让属性是 hidden、auto。【最常用】

2:浮动中:float的属性值不为none。意思是,只要设置了浮动,当前元素就创建了BFC。

3:定位中:只要posiiton的值不是 static或者是relative即可,可以是absolute或fixed,也就生成了一个BFC。

4:display为inline-block, table-cell, table-caption, flex, inline-flex

BFC应用

阻止margin重叠

可以包含浮动元素 —— 清除内部浮动(清除浮动的原理是两个div都位于同一个 BFC 区域之中)

自适应两栏布局

可以阻止元素被浮动元素覆盖

盒模型

css的盒模型由content(内容)、padding(内边距)、border(边框)、margin(外边距)组成。 在w3c盒模型中,设置的width/height是content的宽度/高度,在怪异模式中width/height设置的是content+padding+border宽度/高度。 在w3c盒子模型中盒子的大小由content、padding、border决定,在在怪异模式中盒子大小由width和height决定。

flex

属性名 属性值 备注
display flex 定义了一个flex容器,它的直接子元素会接受这个flex环境
flex-direction row,row-reverse,column,column-reverse 决定主轴的方向
flex-wrap nowrap,wrap,wrap-reverse 如果一条轴线排不下,如何换行
flex-flow [flex-direction] , [flex-wrap] 是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap
justify-content flex-start,flex-end,center,space-between,space-around 设置或检索弹性盒子元素在主轴(横轴)方向上的对齐方式
align-items flex-start,flex-end,center,baseline,stretch 设置或检索弹性盒子元素在侧轴(纵轴)方向上的对齐方式

伪类和伪元素

伪类

css引入伪类和伪元素概念是为了格式化文档树以外的信息。也就是说,伪类和伪元素都是用来修饰不在文档树中的部分。

1.获取不存在与DOM树中的信息。比如a标签的:link、visited等,这些信息不存在与DOM树结构中,只能通过CSS选择器来获取;

2.获取不能被常规CSS选择器获取的信息。比如:要获取第一个子元素,我们无法用常规的CSS选择器获取,但可以通过 :first-child 来获取到。

伪元素

伪元素用于创建一些不在文档树中的元素,并为其添加样式。比如说,我们可以通过:before来在一个元素前增加一些文本,并为这些文本添加样式。虽然用户可以看到这些文本,但是这些文本实际上不在文档树中。

常见的伪元素有:::before,::after,::first-line,::first-letter,::selection、::placeholder等

因此,伪类与伪元素的区别在于:有没有创建一个文档树之外的元素。

::after和:after的区别

在实际的开发工作中,我们会看到有人把伪元素写成:after,这实际是 CSS2 与 CSS3新旧标准的规定不同而导致的。

CSS2 中的伪元素使用1个冒号,在 CSS3 中,为了区分伪类和伪元素,规定伪元素使用2个冒号。所以,对于 CSS2 标准的老伪元素,比如:first-line,:first-letter,:before,:after,写一个冒号浏览器也能识别,但对于 CSS3 标准的新伪元素,比如::selection,就必须写2个冒号了。

CSS画圆半圆扇形三角梯形

div{
    margin: 50px;
    width: 100px;
    height: 100px;
    background: red;
}
/* 半圆 */
.half-circle{
    height: 50px;
    border-radius: 50px 50px 0 0;
}
/* 扇形 */
.sector{
    border-radius: 100px 0 0;
}
/* 三角 */
.triangle{
    width: 0px;
    height: 0px;
    background: none;
    border: 50px solid red;
    border-color: red transparent transparent transparent;
}
/* 梯形 */
.ladder{
    width: 50px;
    height: 0px;
    background: none;
    border: 50px solid red;
    border-color: red transparent transparent transparent;
}