面试准备小技巧一(盒模型)

391 阅读5分钟

前言

《旧唐书·魏徵传》中曾这样写道:夫以铜为鉴,可正衣寇;以古为鉴,可知兴替;以人为鉴,可明得失。 唐太宗有魏徵为镜,所以才有了四方来朝的大唐盛世。其实面试也是一样的,相信很多小伙伴在面试的时候,面对对面的大神,都会紧张嘴瓢以至于发挥不到平时的两三成,但是你要相信,神也是人,他只是完成了我们做不到的事。

所以要打败他们,我们就要了解他们,正所谓:“知己知彼,百战不殆”,而最好的了解他们的方法就是成为他们,以他们为镜,知道自己的得失,每天如此,这样的话,楼兰可破,指日可待。

最后,如果把面试比作一场战争的话,那这肯定一场“敌很强,我很弱的战争”,所以“左”倾冒险主义的思想肯定不能有,要使用毛主席的游击战的打法,请君入瓮,把敌人拉进我们的主场去打,才能取得革命的胜利。简单来说,就是引导面试官去问自己想被问的问题。

当我是面试官时,关于《盒模型》,我会问:

面试官: 给我讲一讲盒模型呗!

我: 页面就是由一个个盒模型堆砌起来的,每个HTML元素都可以叫做盒模型,盒模型由外而内包括:边距(margin)、边框(border)、填充(padding)、内容(content)。它在页面中所占的实际宽度是margin + border + paddint + content 的宽度相加,但是,盒模型有标准盒模型和IE的盒模型(引导面试官)

面试官: 标准盒模型和IE的盒模型有啥区别呢?

我: 不同之处就是标准盒模型的内容大小就是content的大小,而IE的则是content + padding +border 总的大小。

20171110162843943.jpg

20171110162919636.jpg 面试官: 那怎么设置他们呢?

我:通过设置 box-sizing:content-box(W3C)/border-box(IE)就可以达到自由切换的效果。

面试官:JS怎么获取和设置box的宽高呢,你能想到几种方法?

我:

  1. clientWidth和ClientHeight
    这组属性可以获取元素可视区的大小,可以得到元素内容及内边距所占据的空间大小。(不包括滚动条)
var obj = document.getElementById("test");
//test为样式名
  alert(obj.clientWidth + "," + obj.clientHeight);
  1. scrollWidth和scrollHeight 这组属性可以获取滚动内容(可见内容)的元素大小

  2. offsetWidth和offsetHeight 这组属性可以返回元素实际大小,包含边框、内边距和滚动条.

 var obj = document.getElementById("test");
    alert(obj.offsetWidth + "," + obj.offsetHeight);
  1. clientLeft和clientTop获取边框大小 这组属性可以获取元素设置了左边框和上边框的大小。

 var obj = document.getElementById("test");
    alert(obj.clientLeft + "," + obj.clientTop);
  1. offsetLeft和offsetTop
    这组属性可以获取当前元素相对于父元素的位置。获取元素当前相对于父元素的位置,最好将它设置为定位position:absolute;
window.onload = function(){
    var obj = document.getElementById("test");
    alert(obj.offsetLeft + "," + obj.offsetTop); // 30, 20
};
  1. scrollTop和scrollLeft 这组属性可以获取滚动条被隐藏(滚动条上方区域)的区域大小,也可设置定位到该区域。如果要让滚动条滚动到最初始的位置,那么可以写一个函数:

function scrollStart (element) {
    if ( element.scrollTop != 0 ) {
        element.scrollTop = 0;
    }
}
  1. getBoundingClientRect() 这个方法返回一个矩形对象,包含四个属性:left、top、right和bottom。分别表示元素各边与页面上边和左边的距离。
  2. 通过window.getComputedStyle(dom).width/height获取元素的宽高。这个方法兼容性较好,支持firefox、chrome
  3. window.innerHeight也可以获得视窗的高度

这些你可以慢慢说,拖时间,这场战争可是持久战呢!

面试官: 什么是边距重叠?什么情况下会发生边距重叠?如何解决边距重叠?

我: 边距重叠:两个box如果都设置了边距,那么在垂直方向上,两个box的边距会发生重叠,以绝对值大的那个为最终结果显示在页面上

父子关系的边距重叠:

父子关系,如果子元素设置了外边距,在没有把父元素变成BFC的情况下,父元素也会产生外边距

同级关系的重叠:

同级元素在垂直方向上外边距会出现重叠情况,最后外边距的大小取两者绝对值大的那个

解决办法:把元素变成BFC(引出面试官问有关BFC的内容)

面试官: 给我讲讲BFC呗!

我: BFC的基本概念–BFC就是“块级格式化上下文”的意思。它是 W3C CSS 2.1 规范中的一个概念,是一个特殊的块,内部有自己的布局方式,不受外边元素的影响。

它的原理是:

  • BFC内部的盒子,会在垂直方向,一个接一个地放置。垂直方向上也会发生边距重叠。
  • BFC就是页面上的一个独立容器,容器里面的子元素不会影响到外面的元素,外边的也不会影响里边的。
  • BFC的区域不会与float box重叠。
  • 计算BFC的高度时,浮动元素也被计算在内。 BFC是这样产生的–
  • overflow: auto/ hidden;
  • position: absolute/ fixed;
  • float: left/ right;
  • display: inline-block/ table-cell/ table-caption/ flex/ inline-flex

面试官: BFC可以实现哪些场景呢?

我: 可以用来自适应布局。

<!-- BFC不与float重叠 -->
    <section id="layout">
        <style media="screen">
          #layout{
            background: red;
          }
          #layout .left{
            float: left;
            width: 100px;
            height: 100px;
            background: #664664;
          }
          #layout .right{
            height: 110px;
            background: #ccc;
            overflow: auto;
          }
        </style>
        <div class="left"></div>
        <div class="right"></div>
        <!-- 利用BFC的这一个原理就可以实现两栏布局,左边定宽,右边自适应。不会相互影响,哪怕高度不相等。 -->
    </section>

可以清除浮动:

<!-- BFC子元素即使是float也会参与计算 -->
        <section id="float">
            <style media="screen">
              #float{
                background: #434343;
                overflow: auto;
              }
              #float .float{
                float: left;
                font-size: 30px;
              }
            </style>
            <div class="float">我是浮动元素</div>
        </section>

解决垂直边距重叠:

 <section id="margin">
        <style>
            #margin{
                background: pink;
                overflow: hidden;
            }
            #margin>p{
                margin: 5px auto 25px;
                background: red;
            }
            #margin>div>p {
                margin: 5px auto 20px;
                background: red;
            }
        </style>
        <p>1</p>
        <div style="overflow:hidden">
            <p>2</p>
        </div>
        <p>3</p>
        <!-- 这样就会出现第一个p标签的margin-bottom不会和第二个p标签的margin-top重叠,这也是BFC元素的另一个原则,不会影响到外边的box,是一个独立的区域。 -->
    </section>

总结

当然,上面的话可能太机械化了,所以懂意思就好了,真正面试的时候,你可以用更戏剧化更形象的话语去描述他们,这样才能打动面试官。

转载自:blog.csdn.net/m0_37585915…