秋招面试准备HTML与CSS

1  HTML5 drag api参考html5 drag api详解 - 城池 - 博客园 (cnblogs.com)

要让一个元素支持拖拽,首先我们需要在标签上标示出来

元素在拖动过程中可能触发的事件,如下:

1,dragstart:事件主体是被拖放元素,在开始拖放被拖放元素时触发

2,drag:事件主体是被拖放元素,在正在拖放被拖放元素时触发

3,dragenter:事件主体是目标元素,在被拖放元素放入某元素时触发

4,dragover:事件主体是目标元素,在被拖放在某元素内移动时触发。

5,dropleave:事件主体是目标元素,在被拖放元素移出目标元素时触发。

6,drop:事件出体是目标元素,在目标完全接受被拖放元素时触发

7,dragend:事件主体是被拖放元素,在整个拖放操作结束时触发

其中事件主体是拖放元素的是,dragstart(开始拖动) 、darg(正在拖放) 、dragend(拖放结束),其他4个事件主体都是目标元素,进入、移动、离开、完全进入四个状态。

有了HTML5 drag API,判断拖拽元素跟其他dom元素相交变得容易起来了,只需要:

$('.drop-area').on('dragover',function(e){
    console.log('dragover');
    e.preventDefault();
});
$('.drop-area').on('drop',function(e){
    console.log('drop');
});

需要注意的是,必须写上e.preventDefault(),如果不阻止默认事件,drop事件将不会触发。关于这点,可以去w3c查看。

2  HTTP2.0 参考HTTP2.0 - 简书 (jianshu.com)

HTTP2.0 核心变化:二进制分帧

在应用层(HTTP2.0)和传输层(TCP、UDP)新增二进制分帧层。

在二进制分帧层上,HTTP2.0会将所有传输的信息分割成更小的信息和帧,并进行二进制格式的编码,HTTP1.1的head信息会被封装到Headers帧,request body中的数据会封装到Data帧里面。

PUSH_PROMISE frame(推送帧):这种帧是由server端发送给client的帧,用来表示server push的帧,这种帧是实现server push的主要帧类型。
RST_STREAM(取消推送帧):这种帧表示请求关闭帧,简单讲就是当client不想接受某些资源或者接受timeout时会向发送方发送此帧,和PUSH_PROMISE frame一起使用时表示拒绝或者关闭server push。

然后,HTTP2.0通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。响应地,每个数据流以小消息的形式发送,而信息由一个或多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。

头部压缩

HTTP2 .0在客户端和服务端使用首部表来跟踪和存储之间发送的键值对,对于相同的数据,不在通过每次请求和响应发送,通信期间几乎不会改变的键值对(用户代理、可接受的媒体类型,等等)只需要发送一次。事实上,如果请求中不包含首部(例如对统一资源的轮询请求)。那么,首部开销就是零字节。此时,所有首部都自动使用之前请求发送的首部。

如果首部发生变化了,那么只需要发送变化了数据在Headers帧里面,新增或修改的首部帧会被追加到“首部表”,首部表在HTTP2.0的连接存续期内始终存在,由客户端和服务器功能渐进地更新。

所有的HTTP请求在一个连接上

HTTP2.0所有通信都是在一个TCP连接上完成。HTTP2.0把HTTP协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。并行地在同一个TCP连接上双向交换信息。就好比,请求一个页面http://www.qq.com。页面上所有的资源请求都是客户端与服务器上的一条TCP上请求和响应的。

HTTP性能的关键在于低延迟而不是高带宽!大多数HTT连接的时间都很短,而且是突发性的,但TCP只在长时间连接传输大块数据时效率才最高。HTTP2.0通过让所有数据流共用一个连接,可以更有效地使用TCP连接,让高带宽也能真正的服务于HTTP性能提升

同时,单链接多资源的方式,使得自上而下的层面都得到了好处:

  1. 可以减少服务链接压力,内存占用少了,连接吞吐量大了
  2. 由于 TCP 连接减少而使网络拥塞状况得以改观;
  3. 慢启动时间减少,拥塞和丢包恢复速度更快

并行双向字节流的请求和响应 

在HTTP2.0上,客户端和服务器可以把HTTP 消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来。注意,同一链接上有多个不同方向的数据流在传输。客户端可以一边乱序发送stream,也可以一边接收者服务器的响应,而服务器那端同理。

把 HTTP 消息分解为独立的帧,交错发送,然后在另一端重新组装是 HTTP 2.0 最 重要的一项增强。事实上,这个机制会在整个 Web 技术栈中引发一系列连锁反应, 从而带来巨大的性能提升,因为:

可以并行交错地发送请求,请求之间互不影响;
可以并行交错地发送响应,响应之间互不干扰;
只使用一个连接即可并行发送多个请求和响应;
消除不必要的延迟,从而减少页面加载的时间;

HTTP2.0的请求优先级

每个HTTP2.0流里面有个优先值,这个优先值确定着客户端和服务器处理不同的流采取不同的优先级策略,高优先级的流都应该优先发送,但又不会绝对的。绝对地准守,可能又会引入首队阻塞的问题:高优先级的请求慢导致阻塞其他资源交付。分配处理资源和客户端与服务器间的带宽,不同优先级的混合也是必须的。

HTTP2.0的服务器推送

HTTP 2.0 新增的一个强大的新功能,就是服务器可以对一个客户端请求发送多个响应。换句话说,服务器可以强奸你的浏览器,哦不,应该是,除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求。
当浏览器请求一个html,服务器其实大概知道你是接下来要请求资源了,而不需要等待浏览器得到html后解析页面再发送资源请求。我们常用的内嵌图片也可以理解为一种强制的服务器推送:我请求html,却内嵌了张黄图。

有了HTTP2.0的服务器推送,HTTP1.x时代的内嵌资源的优化手段也变得没有意义了。而且使用服务器推送的资源的方式更加高效,因为客户端还可以缓存起来,甚至可以由不同的页面共享(依旧遵循同源策略)。当然,你是个正直的浏览器,是可以决绝服务器推送的黄图的
 

3 Web Worker和Web Socket  参考HTML5简明教程(六)Web Socket和Web Worker - 云+社区 - 腾讯云 (tencent.com)

HTML5的web Socket可以让服务器主动向客户端发送消息,非常适合开发聊天室,多人游戏等协作应用。

Web Worker能够让JavaScript真正意义上实现多线程,并擅长处理大数据计算。

1.web Socket

web socket是一种协议,本质和HTTP,tcp一样,它的URL前缀是ws://或者wss://,后者是加密的。为了使用web socket,需要在web服务器上运行特殊程序,负责协调前后台通信。

以前,为了实现客户端和服务端长连接,一般采用 setInterval/setTimeout   轮询,或者xmlHttpRequest长轮询,但是这些方案不算是真正意义上的服务器推送。Web Socket出现之后,让网页和Web服务器保持持久连接,并且,web服务器可以随时让客户端推送信息。

实现的核心就是 WebSocket对象,监听事件的API有:onopen,onmessage,onclose,onerror,触发事件的API有:send,close。下面是一个简单的客户端例子。

var socket; 
$("#connect").click(function(event){ 
  // 初始化WebSocket对象
  socket = new WebSocket("ws://127.0.0.1:8080/getLog"); 
  // 连接建立后触发
  socket.onopen = function(){ 
    console.log("Socket has been opened"); 
  } 
  // 从服务器收到消息后触发
  socket.onmessage = function(msg){ 
    console.log("get log: " + msg.data); 
  } 
  // 连接关闭时触发
  socket.onclose = function() { 
    alert("Socket has been closed"); 
  } 
  // 连接出现问题时触发
  socket.onerror = function() { 
    console.log(“Web Socket Error!”); 
  } 
}); 

$("#send").click(function(event){ 
  // 客户端向服务端发送消息
  socket.send("send from client"); }
); 

$("#close").click(function(event){ 
  // 关闭连接
  socket.close(); 
})

2.web worker

web worker是一个独立的JavaScript线程,运行在后台,适合做费时的大数据计算。

特点有:

1 无法访问window或者document对象

2不能和前台页面共享数据

3不影响前台页面任何操作

4可以创建多个worker线程,每个worker代码要放在一个独立的JS文件中。

HTML5提供worker对象创建新线程,主页面与web worker线程通过postMessage 传递;通过添加onmessage事件监听消息变化,获取接受到的消息。下面是一个简单的例子:

/*------------主线程 index.js---------------*/
var data = {"name": "主线程", index: 1};
var myWorker = new Worker("subworker.js");
// 主线程监听消息事件
myWorker.addEventListener("message", function (oEvent) {
  console.log("工作线程的结果:" + oEvent.data["name"] + oEvent.data["index"]);
}, false);
// 客户端发送消息
myWorker.postMessage(data); 

$("#stop").click(function () {
  // 停止web worker
  myWorker.terminate();
});

/*------------子线程 subworker.js---------------*/
// 子线程监听消息事件
onmessage = function (oEvent) {
  var data = oEvent.data;
  data["name"] = "我是子线程";
  // 子线程向主线程发送消息
  postMessage(data);
};

4 H5的语义化作用及语义化标签什么是HTML语义化标签?为什么要用H5语义化标签?HTML5语义化标签有哪些_panda_2022的博客-CSDN博客

什么是HTML语义化标签?

语义化标签,就是让标签有自己的含义,利用本身传达它所包含内容的一些信息,使浏览器和搜索引擎直观的认识标签和属性的用途和作用。

过去我们常常采用DIV+CSS的方式布局页面,但DIV标签本身没有独特的含义,这样做的结果就是文档结构不够清晰,不利于浏览器对页面的读取,在分离CSS样式后,用户体验不友好。

所以HTML5新增了很多语义化标签,使文档更具可读性,页面结构更清晰。

为什么要用H5语义化标签?

1,代码结构清晰,可读性高,减少差异化,便于团队开发和维护。

2,在页面没有加载CSS的情况下,也能呈现良好的内容结构,增加用户体验。

3,对搜索引擎友好,良好的结构和语义,有助于爬虫抓取更多的有效信息。

HTML5语义化标签有哪些?

header标签:页眉,通常包括网站标志、主导航、全站链接以及搜索框

nav标签:标记导航,仅对文档中重要的链接群使用

main标签:页面主要内容,一个页面只能使用一次

article标签,用来定义独立于文档且有意义的来自外部的内容

section标签:定义文档中的节(section、区段)。比如章节、页眉、页脚或文档中的其他部分。

aside标签:定义article标签外的内容,可用作文章的侧边栏

footer标签:页脚,只有当父级是body时,才是整个页面的页脚

title标签,定义文档的标题

h1-h6标签:创建文档结构的层级关系

ul标签:无序列表

ol标签:有序列表

strong标签,强调文本,表现为粗体

em标签,强调文本,表现为斜体

p标签,段落

5 iframe是什么?有什么缺点? 参考iframe是什么?有什么缺点?__牛客网 (nowcoder.com)

首先说一下iframe有什么作用:

iframe元素会创建一个包含另一个文档的内联框架。提示:可以将提示文字放在之间,来提示那些不支持iframe的浏览器

有点:

1iframe能够原封不动的把嵌入的页面展现出来。

2如果有多个网页引用iframe,那么你只需要修改frame的内容,就可以实现所有调用该iframe的页面内容的更改,方便快捷,网页如果为了统一风格,头部和版本都是一样的,就可以写成一个页面,用iframe来嵌套,可以增加代码的复用性。

3如果遇到加载缓慢的第三方内用如图表和广告,这些问题都可以由iframe来解决

缺点:

1 iframe会阻塞主页的onload事件

2 iframe和主页面共享连接池,而浏览器对相同与的连接有限制,所以会影响页面的并行和加载

3 会产生很多页面,不容易管理。

4 iframe框架结构有时会让人感到迷惑,如果框架个数多的话,可能 会出现上下、左右滚动条,会分散访问者的注意力,用户体验差。

5 代码复杂,无法被一些搜索引擎搜索到,这一点很关键,现在的搜索引擎爬虫还不能很好的处理iframe的内容,所以使用iframe会不利于搜索引擎优化(SEO)

6 很多的移动设备无法显示框架,设备兼容性差

7 iframe框架页面会增加服务器的http请求,对于大型网站是不可取的

8 安全性也是一个大问题,过去我们访问一个网站,可能会忽然唰唰唰跳过了好几个网站,最后跳到了一个不知道又是啥的广告网站,这就表示我们的iframe被iframe了。

现在基本上都是用Ajax来代替iframe,所以iframe已经渐渐的退出了前端开发。

如果需要使用iframe,最好是通过javascript动态给iframe添加src属性值,这样可以绕开以上一些问题。

6 Doctype作用?严格模式与混杂模式如何区分?它们有何意义  参考Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?_前端校招面试题目合集_牛客网 (nowcoder.com)

1声明位于文档中的最前面,处于标签之前,告诉浏览器的解析器,用什么文档类型规范来解析这个文档。

2 严格模式的排版和JS运行模式是以该浏览器支持的最高标准运行。

3 在混杂模式中,页面以宽松的向后兼容的方式显示,模拟老式浏览器的行为以防止站点无法工作。、

4 DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。

7 如何画一个三角形如何在HTML里画一个三角形_DadaChao的博客-CSDN博客_html画三角形

三角形原理:边框的均分原理

首先:要是我们画一个正方形,然后把正方形的边框设置粗一些

代码如下:

		        width: 20px;    
				height: 20px;  
				border: 40px solid ;   
				border-color: red yellow green blue; 

效果图如下:

秋招面试准备HTML与CSS_第1张图片

这样就得到了四个等腰梯形

要是我们把正方形设置成高度0px宽度0px

代码如下

		        width: 0px;    
				height: 0px;  
				border: 40px solid ;   
				border-color: red yellow green blue; 

效果图如下:

秋招面试准备HTML与CSS_第2张图片

所以我们就得到了一个由四个三角形组成的正方形。

然后我们可以将四个三角形根据需要设置成透明色,即可获得所需要的的三角形

例如,获取一个尖朝上的三角形

 秋招面试准备HTML与CSS_第3张图片

 我们只需要将上、左、右三边的颜色设置成透明色

border-color: transparent transparent green transparent;

其他的不需要改变,这样,就可以随意获得四个角度的三角形了。

8HTML5新增元素HTML5新增元素的介绍_Assassin大神的博客-CSDN博客_html5新增元素

一:html5新增的主体元素

:定义页面独立的内容区域(可以嵌套使用,可以表示插件)。

:定义文档中的节(section,区段)。

在wrapper 的三列 center-wrapper、left、right分别设置左浮动
left 和 right 的宽度分别设置为 300px、200px ,center-wrapper 的宽度设置为 100%
对 left 设置 margin-left:100%,使其回到上一行的最左边
此时 center 中的部分内容会被其遮住,所有对 center-wrapper 设置 margin: 0 200px 0 300px,使其不被遮住
对 right 使用 margin-left:-200px,使其回到上一行的最右边,此时就大功告成
完整代码





  
  
  Document
  



  
1111111

29圣杯布局和双飞翼布局

css经典布局——圣杯布局_越努力,越幸运!-CSDN博客_圣杯布局

css经典布局——双飞翼布局_越努力,越幸运!-CSDN博客_双飞翼布局

30 calc属性CSS3: calc计算属性_CRPER-CSDN博客_css计算属性

calc是css3中新增的计算属性,让很多属性增加了一个表达式的说法;

  .class{
       /*
		 area: expression;
       */
	   width:calc();
	   padding:calc();
	   margin-top:calc();
	   ...
   }

基本理论

  • calc可以做用于任何具有大小的东东,比如border、margin、pading、font-sizewidth等属性设置动态值
  • 支持的运算单位: rem , em , percentage , px
  • 计算优先级别和数学一致

注意点:

calc 内部的表达式,在使用运算符号时,两遍必须加上空格(虽然乘除可以无视,但还是建议带上)!!!!!,不然会解析错误!!,看演示写法

	width:calc(10 * 10px);
	width:calc(50% - 50px);
	width:calc(50% + 5em);
	width:calc(10% / 1rem);

效果图

这里写图片描述

 代码





    
    CSS3 Calc
    



    
margin-top:calc( 5 * 4px );
margin-top:calc( 5 * 4px );
margin-top:calc( 5 * 4px );
margin-top:calc(200px - 20px * 9);
margin-top:calc(200px - 20px * 9);
margin-top:calc(200px - 20px * 9);
width:calc(100% / 3 - (3 * 6px));
margin:calc(2px * 4 );
padding:calc(5 * 1rem - 3rem);
width:calc(100% / 3 - (3 * 6px));
margin:calc(2px * 4 )
width:calc(100% / 3 - (3 * 6px));
margin:calc(2px * 4 )

31 display:table和本身的table有什么区别display:table与本身的table的区别 - 安xiao曦 - 博客园 (cnblogs.com)

一、为什么不用table系表格元素?

目前,在大多数开发环境中,已经基本不用table元素来做网页布局了,取而代之的是div+css,那么为什么不用table系表格元素呢?

1、用DIV+CSS编写出来的文件k数比用table写出来的要小,不信你在页面中放1000个table和1000个div比比看哪个文件大

2、table必须在页面完全加载后才显示,没有加载完毕前,table为一片空白,也就是说,需要页面完毕才显示,而div是逐行显示,不需要页面完全加载完毕,就可以一边加载一边显示

3、非表格内容用table来装,不符合标签语义化要求,不利于SEO

4、table的嵌套性太多,用DIV代码会比较简洁

二、但我想要一个表格的布局方式怎么办?

好处很多,但是有的项目中又需要类似表格的布局怎么办呢?可以用display:table来解决

display:table系列几乎是和table系的元素相对应的,请看下表:

table (类似 )此元素会作为块级表格来显示,表格前后带有换行符。
inline-table (类似 )此元素会作为内联表格来显示,表格前后没有换行符。)此元素会作为一个或多个行的分组来显示。)此元素会作为一个或多个行的分组来显示。)此元素会作为一个或多个行的分组来显示。)此元素会作为一个表格行显示。)此元素会作为一个或多个列的分组来显示。)此元素会作为一个单元格列显示。
table-row-group (类似
table-header-group (类似
table-footer-group (类似
table-row (类似
table-column-group (类似
table-column (类似
table-cell (类似 )此元素会作为一个表格单元格显示。
table-caption (类似
)此元素会作为一个表格标题显示。

“display:table;”的CSS声明能够让一个HTML元素和它的子节点像table元素一样。使用基于表格的CSS布局,使我们能够轻松定义一个单元格的边界、背景等样式,而不会产生因为使用了table那样的制表标签所导致的语义化问题。

display:table能解决哪些问题?

(1)大小不固定的元素垂直居中

  父元素设置:display:table; 子元素:display:table-cell; vertical-align:middle;

(2)两列自适应布局

(3)等高布局

32z-index的定位方法css中z-index层级 - 简书 (jianshu.com)

33如果想要改变一个DOM元素的字体颜色,不在它本身上进行操作

可以更改父元素的color

34line-height和height的区别line-height和height的区别_CodingAlarm的专栏-CSDN博客

line-height是行高的意思,它决定了元素中文本内容的高度,height则是定义元素自身的高度。

如:

测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本

假如定义p标签的行高为line-height:20px,文字在浏览器中显示为一行时,这个p标签的高度就会为20px,如果为两行,则p标签的高度为40px

行高20px:这里写图片描述

 行高变为40px

这里写图片描述

 但是,我们定义p的样式为height:20px,那么这个元素的高度并不会因为内容的多少而改变,如果显示变为2行,文字的总高度超出了,这个p标签的高也不会随着文本而改变

height:20px,执行后文本超出了元素

这里写图片描述

 这里写图片描述

 技巧一

行高等于元素高,可将文本内容垂直居中

p{ height: 50px; line-height: 50px; background: yellowgreen; width:100px; }

测试文本

这里写图片描述

 行高尽量不要大于元素高,如果行高大于元素高,多个相同的结构下很容易发生错位

这里写图片描述

技巧二

设置高度和浏览器一样高

效果

 这里写图片描述

设置高为100%,再设置边是不起作用的,需要把html和body一起设置为200%,完整代码如下

html,body{ height: 100%; overflow: hidden; }
body{ border:10px solid red;}

写在style中就可以了。

35设置一个元素的背景颜色,背景颜色会填充哪些区域?

background-color设置的背景颜色会填充元素的content、padding、border区域

36用CSS实现一个硬币旋转的效果CSS:硬币旋转效果_Bule_daze的博客-CSDN博客

37了解重绘和重排吗?知道怎么减少重绘和重排吗,让文档脱离文档流有哪些方法浅谈CSS重绘和回流(重排)—— 如何减少重绘和回流(重排)_༺隆冬飘落の初霁༻的博客-CSDN博客_如何减少重绘和回流

浏览器的渲染过程

在这里插入图片描述

1解析HTML,构建DOM树

2解析CSS,生成CSS规则树

3合并DOM树和CSS规则,生成render树

4布局render树(layout/reflow),负责各元素尺寸,位置的计算

5绘制render树(paint),绘制页面像素信息

6浏览器会将各层的信息发送给GPU,GPU会将各层合成(composite),显示在屏幕上

 在这里插入图片描述

基本概念

重绘:当页面元素样式改变不影响元素在文档流中的位置时(如background-color,border-color,visibility),浏览器只会将新样式赋予元素并进行重新绘制操作

 回流:当渲染树render tree中的一部分或全部因为元素的规模尺寸、布局、隐藏等改变时,浏览器重新渲染部分DOM或全部DOM的过程。

回流必将引起重绘,而重绘不一定会引起回流

什么时候会触发回流或重绘?

添加或删除可见的DOM元素

元素的位置发生改变

元素的尺寸发生改变(包括外边距、内边距、边框大小、高度和宽度等)

内容发生变化,比如文本变化或图片被另一个不同尺寸的图片所替代

页面渲染初始化

浏览器的窗口resize尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的)

最复杂的一种,获取某些属性,引发回流

(1) offset(Top/Left/Width/Height)
(2) scroll(Top/Left/Width/Height)
(3) cilent(Top/Left/Width/Height)
(4) width,height
(5) 调用了getComputedStyle()或者IE的currentStyle
如何减少重绘和回流(重排)

一、CSS避免回流、重绘

1、尽可能在DOM树的最末端改变class

2、避免设置多层内联样式

3、动画效果应用到position属性为absolute的元素上

4避免使用table布局

5使用css3硬件加速,可以让transform、opacity、filters等动画效果不会引起回流重绘

二、JS操作避免回流、重绘

1、避免使用JS一个样式修改完接着改下一个样式,最好每次一次性更改CSS样式,或者将样式列表定义为class的名称

2、避免频繁操作DOM、使用文档片段创建一个子树,然后再拷贝到文档中

3、先隐藏元素,然后修改后再显示该元素,因为display:none上的DOM操作不会引发回流和重绘

4、避免循环读取offset、left等属性,在循环之前把他们保存起来

5、对于复杂动画效果,使用绝对定位让其脱离文档流,否则会引起父元素及后续元素大量的回流

怎么脱离文档流HTML脱离文档流的三种方法_theLostLamb的博客-CSDN博客

1:float

使用float可以脱离文档流

注意使用float脱离文档流时,其他盒子会无视这个元素,但其他盒子内的文本依然会为这个元素让出位置,环绕在该元素的周围

2:absolute
absolute称为绝对定位,其实博主觉得应该称为相对定位,因为使用absolute脱离文档流后的元素,是相对于该元素的父类(及以上,如果直系父类元素不满足条件则继续向上查询)元素进行定位的,并且这个父类元素的position必须是非static定位的(static是默认定位方式)。

3:fixed

完全脱离文档流,相对于浏览器窗口进行定位。(相对于浏览器窗口就是相对于html)。

38CSS画正方体

39overflow的原理神奇的overflow:hidden及其背后的原理_zjxin000的专栏-CSDN博客_overflowhidden原理

两个overflow:hidden的使用例子

1、嵌套布局内部块元素设置float:left时,导致外部元素塌方,高度为0的问题。

CSS和HTML分别如下:

.wrap {
    outline: red 1px solid;
    width: 250px;
    /*overflow: hidden;*/
}

.item {
    height: 20px;
    width: 100px;
    outline: blue 1px solid;
    float: left;
    margin: 10px;
}

显示效果如下:

这里写图片描述

通过去掉wrap CSS中的overflow:hidden的注释,显示效果如下:

 这里写图片描述

2、左右布局DIV,左侧DIV设置为float:left,当右侧DIV高度超过左侧DIV时,右侧内容向左塌陷问题。

css和HTML分别如下:

.left {
    float: left;
    height: 20px;
    width: 100px;
    outline: red 1px solid;
}

.content {
    /*overflow: hidden;*/
    outline: green 1px solid;
    width: 250px;
}

.content div {
    outline: blue 1px solid;
    margin: 5px;
    height: 20px;
}
AAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCC

显示效果如下:

这里写图片描述

通过去掉left CSS中的overflow:hidden的注释,显示效果如下:

 这里写图片描述

 以上,我们可以发现overflow:hidden在布局时有神奇的治理布局塌方的功效

其实,这是CSS2.1中定义的一个叫BFC(Block formatting context)的概念在起作用。所谓BFC,可直译为“块格式化上下文”,BFC定义了一块独立的渲染区域,规定了其内部块级元素的渲染规则,其渲染效果不受外界环境的干扰,

BFC定义了如下布局规则:

1、内部的块元素会在垂直方向,一个接一个地放置

2、块元素垂直方向的距离由margin决定,两个相邻元素的垂直方向的margin会发生重叠

3、每个元素的左外边距,与包含块的左边相接触(对于从左往右的格式化)。即使存在浮动也是如此

4、BFC的区域不会与float元素的区域重叠

5、BFC就是页面上的一个隔离的容器,容器里面的子元素不会影响到外面的元素,反之也如此

6、计算BFC的高度时,浮动元素也参与计算

以上两个例子,分别用到了规则6和4

那么,在什么情况下,元素的BFC才能生效呢?

根据CSS规范,当给元素添加到下列style属性时,元素成为一个BFC元素

1、float为left|right

2、overflow为hidden|auto|scroll

3、display为table-cell|table-caption|inline-block

4、position为absolute|fixed

40box-sizing的语法和基本用处box-sizing的语法和基本用处__牛客网 (nowcoder.com)

border-sizing属性重点辨析两个值:content-box、border-box(下面说的盒子的宽度,均是指盒子的实际宽度)

先说一下为什么需要border-sizing

盒模型可以被分为两种,一种是标准盒模型,一种是IE盒模型,区别之处就在于对于width这个变量的定义

标准盒模型:width=content

IE盒模型:width=content+padding+border

标准盒子的宽度可以表示为:width+padding+border+margin

IE盒子的宽度可以表示为:width+margin

当我们去手动设置一个盒子的width变量的值时,就需要先声明一下这个盒子属于哪种盒子

当我们将值设置为content-box时,就表示将其看做标准盒子,设置width变量的值自然就等于这个盒子的content的宽度,当我们将值修改为border-box时,也就视其为IE盒子,设置width的值就等于三者宽度之和

inhert很好说,就是从父元素继承盒子的模式,父元素是标准盒模型,那么该元素就也是标准盒模型,反之亦然

一个例子:CSS之box-sizing的用处简单介绍_蜗牛的专栏-CSDN博客

41两个嵌套的div,position都是absolute,子div设置top属性,那么这个top是相对于父元素的哪个位置定位的两个嵌套的div,position都是absolute,那么top是相对父元素的哪个位置_前端精髓-CSDN博客

父元素margin的边缘

42displaydisplay显示属性理解 - 前端panda - 博客园 (cnblogs.com)

一、隐藏元素display:none;

主要区别visibility:hidden;和display:none

display:none可以隐藏某个元素,且隐藏的元素不会占用任何空间,也就是说,该元素不但被隐藏了,而且该元素本占用的空间也会从页面布局中消失。

visibility:hidden可以隐藏某个元素,但隐藏的元素仍需占用与未隐藏之前一样的空间。也就是说,该元素虽然被隐藏了,但仍然会影响布局。

visibility属性指定一个元素可见还是隐藏,默认元素是可见的

visibility:visible

比如,当我们在浏览网页时,如果看到了某个烦人的广告遮挡了我们的实现,更为可气的是,它还没有关闭的选项,这时(以chrome为例),我们就可以按下F12,打开开发者工具,点击element,然后使用左上角的选择工具选中想要删除的广告,可以看到element中会有高亮的一行或几行代码,右键,点击Add Attribute,然后输入:style="display:none",这时就可以发现广告不见啦!

二、块元素display:block

块元素特征:

  • 块元素的display属性值默认为block。
  • 总是以一个块的形式表现出来,占领一整行。若干同级块元素会从上之下依次排列(使用float属性除外)。
  • 可以设置高度、宽度、各个方向外补丁(margin)以及各个方向的内补丁(padding)。支持margin:auto;
  • 当宽度(width)缺省时,它的宽度时其容器的100%,除非我们给它设定了固定的宽度。
  • 块元素中可以容纳其他块级元素或行内元素。
  • 常见的块元素由

  • 等等

三、内联元素display:inline

内联元素特性:

  • 内联元素的display属性值默认为inline。
  • 它不会单独占据一整行,而是只占领自身的宽度和高度所在的空间。若干同级内联元素会从左到右(即某个行内元素可以和其他行内元素共处一行),从上到下依次排列。
  • 内联元素不可以设置高度、宽度,其高度一般由其字体的大小来决定,其宽度由内容的长度控制。
  • 内联元素只能设置左右的margin值和左右的padding值,而不能设置上下的margin值和上下的padding值。因此我们可以通过设置左右的padding值来改变行内元素的宽度。
  • 常见的内联元素由等等。
  • 内联元素一般不可以包含块级元素。

通过对一个行内元素设置display: block;可以将行内元素设置为块级元素,进而设置它的宽高和上下左右的padding和margin。

应用:

如果我们经常会制作导航栏,这时就要使用ul li 和a组合的方式,但是是行内元素,我们无法设置它的宽和高,这时,就可以在的样式表中,将之设置为display:block。这样就可以设置它的宽和高,以及上下左右的margin和padding以达到我们想要的效果了。




    
    Title
    


    

四、内联块元素display:inline-block

内联块元素特性:

  • 不强制换行,没有宽度内容撑开宽高
  • 支持宽、高、margin、padding,但不支持margin:auto;
  • 内联块元素居中可使用父容器居中。
  • 即使margin padding都设置为0;代码换行仍然会产生空白符,解决方法:设置父元素字体大小为0像素
  • IE6,7只支持inline元素设置为inline-block,其它类型元素均不可以
  • 常见内联块元素

根据名字,实际上我们就可以才出来它是结合了inline和block的特性于一身。即设置了inline-block属性的元素既具有block元素可以设置width和height属性的特性,又保持了inline元素不换行的特性。举例说明,我们之前在做横向导航菜单的时候,一般是用ul li a组合,然后将li设置为float,这样就可以得到横向的导航标签了。而现在我们可以通过li和display:inline-block;来实现。

五.display:inherit;

规定应该从父元素继承 display 属性的值。

CSS中的display属性(none,block,inline,inline-block,inherit) - XJT2019 - 博客园 (cnblogs.com)

42block、inline、inline-block的区别。block,inline和inline-block概念和区别 - K.W - 博客园 (cnblogs.com)

总体来说:

1、block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素)。block元素通常被现实为独立的一块,会单独换一行;inline元素则前后不会产生换行,一系列inline元素都在一行内显示,直到该行排满。

2、大体来说HTML元素各有其自身的布局级别(block元素还是inline元素):常见的块级元素有 DIV, FORM, TABLE, P, PRE, H1~H6, DL, OL, UL 等。常见的内联元素有 SPAN, A, STRONG, EM, LABEL, INPUT, SELECT, TEXTAREA, IMG, BR 等。

3、block元素可以包含block元素和inline元素;但inline元素只能包含inline元素。要注意的是这个是个大概的说法,每个特定的元素能包含的元素也是特定的,所以具体到个别元素上,这条规律是不适用的。比如 P 元素,只能包含inline元素,而不能包含block元素。

4、一般来说,可以通过display:inline和display:block的设置,改变元素的布局级别。

  • display:block
    1. block元素会独占一行,多个block元素会各自新起一行。默认情况下,block元素宽度自动填满其父元素宽度。
    2. block元素可以设置width,height属性。块级元素即使设置了宽度,仍然是独占一行。
    3. block元素可以设置margin和padding属性。
  • display:inline
    1. inline元素不会独占一行,多个相邻的行内元素会排列在同一行里,直到一行排列不下,才会新换一行,其宽度随元素的内容而变化。
    2. inline元素设置width,height属性无效。
    3. inline元素的margin和padding属性,水平方向的padding-left, padding-right, margin-left, margin-right都产生边距效果;但竖直方向的padding-top, padding-bottom, margin-top, margin-bottom不会产生边距效果。
  • display:inline-block
    1. 简单来说就是将对象呈现为inline对象,但是对象的内容作为block对象呈现。之后的内联对象会被排列在同一行内。比如我们可以给一个link(a元素)inline-block属性值,使其既具有block的宽度高度特性又具有inline的同行特性。

43CSS布局

六种布局方式总结:圣杯布局、双飞翼布局、Flex布局、绝对定位布局、表格布局、网格布局。

44CSS预处理器

你可能感兴趣的:(css,面试,html5)