视觉艺术

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

2020-08-10  本文已影响0人  wowoqu

IE盒模型和标准盒模型的区别

目前使用此属性需要加前缀,-moz-、-webkit-、-o-、-ms-等
box-sizing:content-box;
box-sizing:border-box;

如何让一个div水平垂直居中

.container {
    background: silver;
    width: 100%;
    height: 200px;
}
.position {
    position: relative;
}
.flex {
    display: flex;
}
.tableCell {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
}
.child {
    width: 100px;
    height: 100px;
    background: pink;
}

1. div绝对定位水平垂直居中【margin:auto实现绝对定位元素的居中】

.f1 {
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    right: 0;
    margin: auto;
}
<p>方案一:绝对定位 + margin:auto</p>
<div class="container position">
    before
    <div class="child f1"></div>
    after
</div>

2. div绝对定位水平垂直居中【margin 负间距】

.f2 {
    position: absolute;
    left: 50%;
    top: 50%;
    margin-left: -50px;
    margin-top: -50px;
}
<p>方案二:绝对定位 + margin负一半,<i class="red">需要子元素宽高</i></p>
<div class="container position">
    before
    <div class="child f2"></div>
    after
</div>

3. div绝对定位水平垂直居中【Transforms 变形】

.f3 {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}
<p>方案三:绝对定位 + translate负50%</p>
<div class="container position">
    before
    <div class="child f3"></div>
    after
</div>

4. 弹性盒子水平垂直居中

.f4 {
    justify-content: center;
    align-items: center;
}
<p>方案四:弹性盒子,父元素设置水平垂直居中,<i class="aqua">受其他元素影响</i></p>
<div class="container flex f4">
    before
    <div class="child"></div>
    after
</div>

5. 将父盒子设置为table-cell元素,可以使用text-align:center和vertical-align:middle实现水平、垂直居中。

.f5 {
    display: inline-block;
}
<p>方案五:tabel-cell,<i class="aqua">受其他元素影响</i></p>
<div class="container tableCell">
    before
    <div class="child f5"></div>
    after
</div>

6. div绝对定位,利用calc计算位置

.f6 {
    position: absolute;
    left: calc((100vw - 100px)/2);
    top: calc((200px - 100px)/2);
}
<p>方案六:绝对定位 + calc计算,<i class="red">需要父元素及子元素宽高</i></p>
<div class="container position">
    before
    <div class="child f6"></div>
    after
</div>

7. 弹性盒子 【margin:auto实现水平垂直居中】

.f7 {
    margin: auto;
}
<p>方案七:flex + margin</p>
<div class="container flex">
    before
    <div class="child f7"></div>
    after
</div>

什么是弹性盒子,有哪些属性,通常怎么用

什么是弹性盒子

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

.box{
  display:flex;
}
/* 行内元素也可以设置为flex */
.box{
    display:inline-flex;
}
/* 注意设为flex布局后,子元素的float,clear,vertical-align属性将失效。*/

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

/* 1.flex-direction:属性决定主轴的方向(即项目的排列方向)。 */
.box {
flex-direction: row | row-reverse | column | column-reverse
}
/* 2. flex-wrap:默认情况下,项目都排在一条线上。这个属性定义,如果一条轴线拍不下,如何换行。 */
.box{
flex-wrap: nowrap | wrap | wrap-reverse
}
/* 3. justify-content:属性定义了项目在主轴上的对齐方式。 */
.box{
justify-content: flex-start | flex-end | center | space-between | space-around
}
/* 4.align-items:属性定义项目在交叉轴上如何对齐 */
.box{
align-items: flex-start | flex-end | center | baseline | stretch
}
/* baseline 项目的第一行文字的基线对齐 */
/* stretch(默认值)  如果项目未设置高度或设为auto,将占满整个容器的高度。 */

/* 5. align-content:属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。 */
.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
/* 6. flex-flow  是flex-direction和 flex-wrap的简写,默认是 row nowrap */

设置到项目上的属性:

/* 1.order 属性定义项目的排列顺序。数值越小,排列越靠前。默认为0 */
.item {
  order: 1;
}
/* 2.flex-grow属性定义项目的放大比例,默认为0.即如果有剩余空间,也不放大。 */
.item {
  flex-grow: <number>; /* default 0 */
}
/* 3.flex-shrink 属性定义了项目的缩小比例。默认为1,如果空间不足,项目将缩小。 */
.item {
  flex-shrink: <number>; /* default 1 */
}
/* 如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。 */
/* 负值对该属性无效。 */

/* 4. flex-basis 属性定义了在分配多余空间之前,项目占据的主轴空间。默认为auto.即项目本来的大小。它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。 */
.item {
  flex-basis: <length> | auto; /* default auto */
}
/* 5. flex 属性是flex-grow,flex-shrink,flex-basis,默认值为0 1 auto */
/* 该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。 */
/* 建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。 */

/* 6.align-self 属性 允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性,默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。 */
.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

什么是BFC,通常用来干什么

什么是BFC

(Block Formatting Context)块级格式化上下文。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. display:table 可能会引发响应性问题;
  2. overflow:scroll 可能产生多余的滚动条;
  3. float:left 将把元素移至左侧,并被其他元素环绕;
  4. overflow:hidden 将裁切溢出元素

创建BFC的作用

  1. 解决浮动引起的父元素塌陷问题
.container {
    border: 1px solid red;
    background: #ccc;
    overflow: hidden;  /* 解决父元素塌陷问题 */
}
.left {
    width: 100px;
    height: 200px;
    background: pink;
    float: left;
}
.right {
    float: left;
     /* overflow: hidden; */  /* 解决浮动布局问题 */
    width: 200px;
    height: 400px;
    background: orange;
}
<div class="container">
    <div class="left">left</div>
    <div class="right">right</div>
</div>
  1. 浮动带来的布局问题(上例)
  2. 解决上下margin边距重叠的问题

.top {
    width: 100px;
    height: 200px;
    background: pink;
    margin: 10px 0;
    overflow: hidden;
}
.bottom {
    width: 200px;
    height: 200px;
    background: orange;
    margin: 10px 0;
    overflow: hidden;
}
.bfc {
    overflow: hidden;
}
<div>
    <!-- 添加bfc -->
    <div class="bfc">
        <div class="top">top</div>
    </div>
    <div class="bottom">bottom</div>
</div>

::before和:before的区别,这个属性是用来干什么的

::before是css3的写法,:before是css2的写法,用来设置对象前的内容
:before的兼容性要比::before好

清除浮动的方法有哪些

  1. 额外标签法
  2. BFC设置overflow
  3. 使用after伪元素清除浮动
  4. 使用before和after双伪元素清除浮动
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试清除浮动</title>
    <style type="text/css">
        .container {
            border: 1px solid red;
            background: #ccc;
        }
        .left {
            width: 100px;
            height: 100px;
            background: pink;
            float: left;
        }
        .right {
            width: 100px;
            height: 100px;
            background: orange;
            float: right;
        }
        .clear {
            clear: both;
        }
        .f2 {
            overflow: hidden;
        }
        .f3 {
            *zoom: 1;
        }
        .f3:after {
            content: "";
            display: block;
            clear: both;
            height: 0; /* 可以不设置 */
            visibility: hidden; /* 可以不设置 */
        }
        .f4 {
           *zoom: 1; /* ie6清除浮动的方式 *号只有IE6-IE7执行,其他浏览器不执行 */
        }
        .f4:after,.f4:before {
            content: "";
            display: table; /* 可以换成block */
        }
        .f4:after {
            clear:both;
        }
    </style>
</head>
<body>
    <div>
        <h1>额外标记法</h1>
        <div class="container f1">
            <div class="left">left</div>
            <div class="right">right</div>
            <div class="clear"></div>
        </div>
        <h1>BFC设置overflow</h1>
        <div class="container f2">
            <div class="left">left</div>
            <div class="right">right</div>
        </div>
        <h1>使用after伪元素</h1>
        <div class="container f3">
            <div class="left">left</div>
            <div class="right">right</div>
        </div>
        <h1>使用before和after双伪元素</h1>
        <div class="container f4">
            <div class="left">left</div>
            <div class="right">right</div>
        </div>
    </div>
</body>
</html>


css选择器的优先级

更准确的说法

  1. 越具体,优先级越高
  2. 写在后面的,会覆盖写在前面的
  3. important优先级最高,但是要少用

CSS:opacity:0,visibility:hidden,display:none的区别

transition 和 animation 的区别

1、transition 是过渡,是样式值的变化的过程,只有开始和结束;animation 其实也叫关键帧,通过和 keyframe 结合可以设置中间帧的一个状态;    
2、animation 配合 @keyframe 可以不触发时间就触发这个过程,而 transition 需要通过 hover 或者 js 事件来配合触发;    
3、animation 可以设置很多的属性,比如循环次数,动画结束的状态等等,transition 只能触发一次;    
4、animation 可以结合 keyframe 设置每一帧,但是 transition 只有两帧;

如何使用css3开启GPU硬件加速

常规方法

.example{
   -webkit-transform: translate3d(250px,250px,250px)
   rotate3d(250px,250px,250px,-120deg)
   scale3d(0.5, 0.5, 0.5);
}

不需要使用transform属性时

.example {
   -webkit-transform: translateZ(0);
   -moz-transform: translateZ(0);
   -ms-transform: translateZ(0);
   -o-transform: translateZ(0);
   transform: translateZ(0);
   /* Other transform properties here */
}

webkit内核

.example {
   -webkit-transform: translate3d(0, 0, 0);
   -moz-transform: translate3d(0, 0, 0);
   -ms-transform: translate3d(0, 0, 0);
   transform: translate3d(0, 0, 0);
  /* Other transform properties here */
}

如何设置文字超出隐藏及文字换行

  1. 自动换行
div{
   word-wrap:break-word; /*允许长单词换行到下一行*/
   word-break:normal; /*在恰当的断字点进行换行*/
}
  1. 强制不换行
div{
   white-space:nowrap; /*溢出不换行*/
}
  1. 强制英文单词换行
div{
   word-break:break-all; /*允许在单词内换行*/
}
  1. 单行文本不换行多余文本显示省略号
div{
   width:200px;
   white-space:nowrap; /*溢出不换行*/
   overflow:hidden; /*元素超出隐藏*/
   text-overflow:ellipsis; /*显示省略符号来代表被修剪的文本*/
}
  1. 多行文本超出隐藏多余文本显示省略号
/* -webkit-box 只适用webkit内核的浏览器 */
div{
   display:-webkit-box;
   overflow:hidden;
   text-overflow:ellipsis;
   -webkit-line-clamp:3;
   -webkit-box-orient:vertical;
}
  1. table表格中单元格单行文本不换行
table{
   table-layout:fixed;
}
table tr td{
   width:60%;
   white-space:nowrap;
   overflow:hidden;
   text-overflow:ellipsis;
}

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

如何设置元素不可选取文字

body{
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}

object-fit属性

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

页面导入时,使用 link 和 @import 有什么区别?

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

不推荐使用@import:

  1. @import混合js文件时,在IE中引发资源文件的下载顺序被打乱,即 使排列在@import后面的js文件先于@import下载,并且打乱甚至破坏@import自身的并行下载
  2. link混合@import会破坏并行下载,这是一个很严重的问题,这会导致原本并行下载的样式变成一个一个的同步下载
  3. 而仅仅使用LINK 可确保样式在所有浏览器里面都能被并行下载,并且按照顺序被下载

简述 src 和 href 的区别?

写页面元素样式初始化库的意义

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

伪类选择器有哪些,伪元素和伪类的区别?

伪元素选择器:

伪类选择器

区别

伪元素和伪类的区别总结

什么是 CSS 继承?哪些属性能继承,哪些不能?

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

相关链接:
CSS 继承,哪些属性能继承,哪些不能

z-index 有什么作用?如何使用?

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

px,em,rem,vw 有什么区别?

px

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

dpr

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

em

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

rem

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

vw

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

屏幕尺寸,分辨率,像素,PPI之间到底什么关系?1px和1cm的关系?

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

屏幕尺寸

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

分辨率

屏幕横向和纵向的像素点

像素

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

PPI

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

PPI= \frac{\mathrm{\sqrt{a^{2} + b^{2}}} }{\mathrm{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的直线?

.hr {
    width: 300px;
    background: #000;
    margin: 20px 0;
}
.base {
    height: 1px;
}
.f1 {
    height: 0.5px;
}
<p>设置值为0.5px</p>
<div class="hr f1"></div>
<p>基准值</p>
<div class="hr base"></div>

1. 直接设置0.5px

.hr {
    width: 300px;
    background: #000;
    margin: 20px 0;
}
.base {
    height: 1px;
}
.f1 {
    height: 0.5px;
}
<!-- 缺点是浏览器兼容性差,各浏览器效果不一致 -->
<p>设置值为0.5px</p>
<div class="hr f1"></div>
<p>基准值</p>
<div class="hr base"></div>

2. 使用scale缩放

.f2 {
    height: 1px;
    transform: scaleY(0.5);
}
.f2.plus {
    transform-origin: 50% 100%;
}
<p>设置缩放</p>
<div class="hr f2"></div>
<!-- scale缩放会使线条变虚,plus的则不会 -->
<p>设置缩放 + 基准定位点</p>
<div class="hr f2 plus"></div>

3. 线性渐变linear-gradient

.f3 {
    height: 1px;
    background: linear-gradient(0deg, #fff, #000);
}
<p>线性渐变</p>
<div class="hr f3"></div>

4. boxshadow

.f4 {
    height: 1px;
    background: none;
    box-shadow: 0 0.5px 0 #000;
}
<p>boxshadow</p>
<div class="hr f4"></div>

5. viewport

<!-- UI需要按2倍图的出,整体面面的单位都会放大一倍 -->
<meta name="viewport" content="width=device-width, initial-scale=0.5, minimum-scale=0.5, maximum-scale=0.5">

参考链接:
画一条0.5px的线

inline-block 有什么特性?在实际工作中有什么作用?

block

inline

inline-block

line-height: 2; 和 line-height: 200%; 有什么区别?

在继承性上:

<div>
    <div style="font-size: 20px;line-height: 2;">line:2 本身字体20px 实际行高应为 40px</div>
    <!-- line-height: 200% 如果不设置字体默认为页面默认字体的200%,如果设置字体则为设置字体的200% -->
    <div style="font-size: 14px;line-height: 200%;">line:200% 本身字体20px 实际行高应为28px</div>
    <div style="font-size: 16px;line-height: 20px;">line:20px 本身字体16px 实际行高应为20px</div>
</div>
<div>
    <div style="line-height: 2;background: pink;">
        <div style="font-size: 16px;">font-size:16</div> <!-- 32px -->
        <div style="font-size: 18px;">font-size:18</div><!-- 36px -->
        <div style="font-size: 20px;">font-size:20</div><!-- 40px -->
    </div>
    <div style="line-height: 200%;background: orange;">
        <div style="font-size: 16px;">font-size:16</div><!-- 32px -->
        <div style="font-size: 18px;">font-size:18</div><!-- 32px -->
        <div style="font-size: 20px;">font-size:20</div><!-- 32px -->
    </div>
</div>

calc, support, media各自的含义及用法?

渐进增强和优雅降级

渐进增强

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

.box {-webkit-border-radius: 10px;-moz-border-radius: 10px;border-radius: 10px;}

优雅降级

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

.box {border-radius: 10px;-moz-border-radius: 10px;-webkit-border-radius: 10px;}

区别

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

常见的PC端布局

移动端常用的布局方法及其优缺点

上一篇 下一篇

猜你喜欢

热点阅读