<!DOCTYPE html> 声明文档的类型、按标准模式解析
<html>
<head>
<meta charset="utf-8"> 页面的元数据信息
<title></title> 页面的标题
<link rel="stylesheet" type="text/css" href=""/> 引入的外部样式
<style type="text/css"> 自定义样式
</style>
<script type="text/javascript"> 脚本
</script>
</head>
<body> 内容
</body>
</html>
<header></header> 头部
<nav></nav> 导航栏
<section></section> 区块(有语义化的div)
<main></main> 主要区域
<article></article> 主要内容
<aside></aside> 侧边栏
<footer></footer> 底部
DOCTYPE是HTML5的文档类型声明,它的目的是告诉浏览器(解析器)应该以什么样(html或xhtml)的文档类型定义来解析文档,不同的渲染模式会影响浏览器对 CSS 代码甚⾄ JavaScript 脚本的解析。它必须声明在HTML⽂档的第⼀⾏。
浏览器渲染页面的两种模式:
一个行内元素只占据它对应标签的边框所包含的空间
常见的行内元素有:
块级元素占据其父元素(容器)的整个空间
块级元素可以包含行内元素和其他块级元素
换行
每个块级盒子都会换行;内联盒子不会产生换行
默认宽高
块级盒子默认宽度为父容器宽度的100%,默认高度取决于内容本身;
内联盒子默认宽高由内容本身决定
设置宽高
块级盒子可以直接设置 width
,height
;
内联盒子直接设置不起作用,需要设置 display: block
或 display: inline-block
变为块级盒子后,再设置宽高
注意:inline-block
存在空隙问题,这是因为当处理行内元素排版时,浏览器会处理元素间的空白符(如空格,回车),解决办法主要有:
display
值变为 block
,因此还需要解决由浮动带来的高度坍塌或绝对定位后再调整位置内外边距及边框
块级盒子设置内外边距,边框大小后,水平垂直方向都被应用,且能将其他元素按预期推开;内联元素设置这些属性后,水平垂直方向都被应用,但是只有水平方向会按预期将元素推开
包含的元素
块级元素可以包含块级元素和行内元素;
行内元素中最好只包含行内元素,如包含块级元素,父行内元素并不会包含子块级元素
内联盒子默认宽高由内容本身决定
meta 标签可以用来定义文档的各种元数据。
使用 name
,content
指定名/值元数据对
设置 description
,keywords
提高点击率
并不一定能促进 SEO(Search Engine Optimization,搜索引擎优化)
需要看不同搜索引擎的搜索策略
设置 viewport
控制视口大小及比例
设置 HTTP [Referer
]
使用 charset
声明字符编码
使用 http-equiv
,content
模拟 HTTP 标头字段
content-type
属性只能用于 MIME type 为 text/html
的文档,不能用于MIME类型为XML的文档。、<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
1px
被渲染成 2px
问题,及其原因mate
标签中的viewport
属性 ,initial-scale
设置为1
rem
按照设计稿标准走,外加利用transfrome
的scale(0.5)
缩小一倍即可;mate
标签中的viewport
属性 ,initial-scale
设置为0.5
rem
按照设计稿标准走即可#container[data-device="2"] {
position: relative;
}
#container[data-device="2"]::after{
position:absolute;
top: 0;
left: 0;
width: 200%;
height: 200%;
content:"";
transform: scale(0.5);
transform-origin: left top;
box-sizing: border-box;
border: 1px solid #333;
}
}
移动端适配主要有两个维度:
解决
src
与 href
区别src和href都是用来引用外部的资源,它们的区别如下:
响应式页面中经常用到根据屏幕密度设置不同的图片。这时就用到了 img 标签的srcset属性。srcset属性用于设置不同屏幕密度下,img 会
自动加载不同的图片。用法如下
图片的属性ALT标签用于对图片进行描述说明。ALT标签众多关键词信息在搜索引擎优化中曾发挥了一定作用
getElementById
getElementsByTagName
getElementsByClassName
childNodes
:包含空格,换行children
firstChild
/ lastChild
:包含空格,换行firstElementChild
/ lastElementChild
parentElement
/ parentNode
offsetParent
previousSibling
/ nextSibling
:包含空格,换行previousElementSibling
/ nextElementSibling
<header></header> 头部
<nav></nav> 导航栏
<section></section> 区块(有语义化的div)
<main></main> 主要区域
<article></article> 主要内容
<aside></aside> 侧边栏
<footer></footer> 底部
audio
<audio src='' controls autoplay loop='true'></audio>
video
<video src='' poster='imgs/aa.jpg' controls></video>
source
<video>
<source src='aa.flv' type='video/flv'></source>
<source src='aa.mp4' type='video/mp4'></source>
</video>
因为浏览器对视频格式支持程度不一样,为了能够兼容不同浏览器,可以通过source指定视频源
生命周期:localStorage:localStorage的生命周期是永久的,关闭页面或浏览器之后localStorage中的数据也不会消失。localStorage除非主动删除数据,否则数据永远不会消失。 sessionStorage的生命周期是在仅在当前会话下有效。sessionStorage引入了一个“浏览器窗口”的概念,sessionStorage是在同源的窗口中始终存在的数据。只要这个浏览器窗口没有关闭,即使刷新页面或者进入同源另一个页面,数据依然存在。但是sessionStorage在关闭了浏览器窗口后就会被销毁。同时独立的打开同一个窗口同一个页面,sessionStorage也是不一样的。
存储大小:localStorage和sessionStorage的存储数据大小一般都是:5MB
存储位置:localStorage和sessionStorage都保存在客户端,不与服务器进行交互通信。
存储内容类型:localStorage和sessionStorage只能存储字符串类型,对于复杂的对象可以使用ECMAScript提供的JSON对象的stringify和parse来处理
获取方式:localStorage:window.localStorage;;sessionStorage:window.sessionStorage;。
应用场景:localStoragese:常用于长期登录(+判断用户是否已登录),适合长期保存在本地的数据。sessionStorage:敏感账号一次性登录;
可以使用postMessage和iframe
假设有a.haorooms.com/text.html和b.haorooms.com/text.html两个页面。
通过a.haorooms.com/text.html页面去修改b.haorooms.com/text.html页面的本地数据:
① 在a.haorooms.com/text.html页面创建一个iframe,嵌入b.haorooms.com/text.html页面。
② a.haorooms.com/text.html页面通过postMessage传递指定格式的消息给b.haorooms.com/text.html页面。
③ b.haorooms.com/text.html页面解析a.haorooms.com/text.html页面传递过来的消息内容,调用localStorage API 操作本地数据。
④ b.haorooms.com/text.html页面包装localStorage的操作结果,并通过postMessage传递给a.haorooms.com/text.html页面。
⑤ a.haorooms.com/text.html页面解析b.haorooms.com/text.html页面传递回来的消息内容,得到 localStorage 的操作结果。
利用nginx的方向代理来解决cookie跨域问题,其实是通过“欺骗”浏览器来实现的,通过nginx,我们可以将不同工程的cookie放到nginx域下,通过nginx反向代理就可以取到不同工程写入的cookie。
关闭当前页面数据的销毁与否有两种情况:
①如果它的页面中没有其他的超链接,或者没有打开,那么关闭当前页面,数据就会被销毁。
②而如果通过当前这个页面,打开了其他的页面,那么只有当这些页面都关闭了,数据才会销毁。
HTML5引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问。
应用程序缓存为应用带来三个优势:
原理
HTML5的离线存储是基于一个新建的.appcache文件的,通过这个文件上的解析清单离线存储资源,这些资源就会像cookie一样被存储了下来。之后当网络在处于离线状态下时,浏览器会通过被离线存储的数据进行页面展示。
作用
可以加载一个JS进行大量的复杂计算而不挂起主进程,并通过postMessage,onmessage进行通信
可以在worker中通过importScripts(url)加载另外的脚本文件
可以使用 setTimeout(), clearTimeout(), setInterval(), and clearInterval()
可以使用XMLHttpRequest来发送请求
可以访问navigator的部分属性
有哪些局限性:
因为 HTTP 协议有一个缺陷:通信只能由客户端发起。只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。
服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话
建立在 TCP 协议之上,服务器端的实现比较容易。
与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
数据格式比较轻量,性能开销小,通信高效。
可以发送文本,也可以发送二进制数据。
没有同源限制,客户端可以与任意服务器通信。
协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。
优点:
缺点:
选择器 | 格式 | 优先级权重 |
---|---|---|
id选择器 | #id | 100 |
类选择器 | #classname | 10 |
属性选择器 | a[ref=“eee”] | 10 |
伪类选择器 | li:last-child | 10 |
标签选择器 | div | 1 |
伪元素选择器 | li:after | 1 |
相邻兄弟选择器 | h1+p | 0 |
子选择器 | ul>li | 0 |
后代选择器 | li a | 0 |
通配符选择器 | * | 0 |
对于选择器的优先级:
注意事项:
(1)block: 会独占一行,多个元素会另起一行,可以设置width、height、margin和padding属性;
(2)inline: 元素不会独占一行,设置width、height属性无效。但可以设置水平方向的margin和padding属性,不能设置垂直方向的padding和margin
(3)inline-block: 将对象设置为inline对象,但对象的内容作为block对象呈现,之后的内联对象会被排列在同一行内。
对于行内元素和块级元素,其特点如下:
(1)行内元素
display:会让元素完全从渲染树中消失,渲染的时候不占据任何空间,不能点击。子孙节点修改属性不改变本身显隐。会引起重排,性能较差。
visibility:不会让元素从渲染树消失,元素继续占据空间,只是内容不可见,不能点击。通过设置visibility: visible,可以让子孙节点显示。只会引起本元素重绘,性能较好
opacity:不会让元素从渲染树消失,元素继续占据空间,只是内容不可见,可以点击。子孙节点修改属性不改变本身显隐。提升到合成层后,不会触发重绘,否则只引起本元素重绘,性能较好
transition是过度属性,强调过度,它的实现需要触发一个事件(比如鼠标移动上去,焦点,点击等)才执行动画。它类似于flash的补间动画,设置一个开始关键帧,一个结束关键帧
animation是动画属性,它的实现不需要触发事件,设定好时间之后可以自己执行,且可以循环一个动画。它也类似于flash的补间动画,但是它可设置多个关键帧(用@keyframe定义)完成动画。
p::before {content:"第一章:";}
p::after {content:"Hot!";}
p::first-line {background:red;}
p::first-letter {font-size:30px;}
a:hover {color: #FF00FF}
p:first-child {color: red}
总结: 伪类是通过在元素选择器上加⼊伪类改变元素状态,⽽伪元素通过对元素的操作进⾏对元素的改变。
盒模型都是由四个部分组成的,分别是margin、border、padding和content。
标准盒模型和IE盒模型的区别在于设置width和height时,所对应的范围不同:
可以通过修改元素的box-sizing属性来改变元素的盒模型:
BFC,块格式化上下文
它会将内部内容与外部上下文隔开来,不会和外部的元素重叠或相互影响
BFC 的好处为
开启方式
解决方式
给父元素添加属性 overflow: hidden;
优点:浏览器支持好,简单;
缺点:当子元素有定位属性时,设置 overflow: hidden; 容器以外的部分会被裁剪掉。
在子元素的末尾添加一个空的 div ,并设置下方样式
div{
clear: both;
height: 0;
overflow: hidden;
}
- 优点:所有浏览器都支持,并且容器溢出不会被裁剪
- 缺点:在页面中添加无意义的div,容易造成代码冗余。
.box1:after{
/*添加一个内容*/
content: "";
/*转换为一个块元素*/
display: block;
/*清除两侧的浮动*/
clear: both;
}
优点:不会造成代码冗余,剩余代码性能优化,推荐使用。
计算原则:
折叠合并后外边距的计算原则如下:
解决办法:
对于折叠的情况,主要有两种:兄弟之间重叠和父子之间重叠
(1)兄弟之间重叠
(2)父子之间重叠
绝对定位:
* 1.开启绝对定位,会使元素脱离文档流
* 2.开启绝对定位以后,如果不设置偏移量,则元素的位置不会发生变化
* 3.绝对定位是相对于离他最近的开启了定位的祖先元素进行定位的(一般情况,开启了子元素的绝对定位都会同时开启父元素的相对定位)
* 如果所有的祖先元素都没有开启定位,则会相对于浏览器窗口进行定位
* 4.绝对定位会使元素提升一个层级
* 5.绝对定位会改变元素的性质,
* 内联元素变成块元素,
* 块元素的宽度和高度默认都被内容撑开
(1)BMP,是无损的、既支持索引色也支持直接色的点阵图。这种图片格式几乎没有对数据进行压缩,所以BMP格式的图片通常是较大的文件。
(2)GIF是无损的、采用索引色的点阵图。采用LZW压缩算法进行编码。文件小,是GIF格式的优点,,所以GIF格式适用于对色彩要求不高同时需要文件体积较小的场景。
(3)JPEG是有损的、采用直接色的点阵图。JPEG的图片的优点是采用了直接色,得益于更丰富的色彩,JPEG非常适合用来存储照片,
(4)PNG-8是无损的、使用索引色的点阵图。无损压缩、质量高、支持透明;体积大;应用:logo 等小图
(5)SVG特点:基于 XML;文本文件、体积小、可压缩性强、不失真、兼容性好;图片在放大时,不会失真,所以它适合用来绘制Logo、Icon等。
.outer {
position: relative;
height: 100px;
}
.left {
position: absolute;
width: 100px;
height: 100px;
background: tomato;
}
.right {
position: absolute;
top: 0;
right: 0;
width: 200px;
height: 100px;
background: gold;
}
.center {
margin-left: 100px;
margin-right: 200px;
height: 100px;
background: lightgreen;
}
.outer {
display: flex;
height: 100px;
}
.left {
width: 100px;
background: tomato;
}
.right {
width: 100px;
background: gold;
}
.center {
flex: 1;
background: lightgreen;
}
.outer {
height: 100px;
}
.left {
float: left;
width: 100px;
height: 100px;
background: tomato;
}
.right {
float: right;
width: 200px;
height: 100px;
background: gold;
}
.center {
height: 100px;
margin-left: 100px;
margin-right: 200px;
background: lightgreen;
}
.main{
width: 100%;
display: table;
}
.left,.center,.right{
display: table-cell;
}
.left{
width: 300px;
background-color: red;
}
.center{
background-color: blue;
}
.right{
width: 300px;
background-color: red;
}
.div{
width: 100%;
display: grid;
grid-template-rows: 100px; //行
grid-template-columns: 300px auto 300px; //列
}
.outer {
height: 100px;
padding-left: 100px;
padding-right: 200px;
}
.left {
position: relative;
left: -100px;
float: left;
margin-left: -100%;
width: 100px;
height: 100px;
background: tomato;
}
.right {
position: relative;
left: 200px;
float: right;
margin-left: -200px;
width: 200px;
height: 100px;
background: gold;
}
.center {
float: left;
width: 100%;
height: 100px;
background: lightgreen;
}
.outer {
height: 100px;
}
.left {
float: left;
margin-left: -100%;
width: 100px;
height: 100px;
background: tomato;
}
.right {
float: left;
margin-left: -200px;
width: 200px;
height: 100px;
background: gold;
}
.wrapper {
float: left;
width: 100%;
height: 100px;
background: lightgreen;
}
.center {
margin-left: 100px;
margin-right: 200px;
height: 100px;
}
.box{
height: 500px;
background: #0000FF;
overflow: auto;
}
.box1{
float: left;
width: 200px;
height: 500px;
background: red;
}
.box2{
margin-left: 200px;
height: 500px;
}
.box{
overflow: auto;
position: relative;
background: red;
width: 500px;
height: 500px;
}
.box1{
position: absolute;
left: 0;
top: 0;
width: 200px;
height: 500px;
background:black;
}
.box2{
margin-left: 200px;
background: skyblue;
height: 500px;
}
<style type="text/css">
.box{
display: flex;
}
.left{
width: 200px;
height: 500px;
background-color: #00008B;
}
.right{
background-color: #008000;
flex: 1;
}
</style>
/* 清除浏览器默认边距 */
* {
margin: 0;
padding: 0;
}
/* 表格布局 */
.wrap {
display: table;
width: 100%;
}
.left {
display: table-cell;
width: 200px;
height: 200px;
background: purple;
}
.right {
display: table-cell;
background: skyblue;
height: 200px;
}
.top-center-bottom>div{
position:absolute;
}
.top-center-bottom .top{
top:0;
height:100px;
width:100%;
background:red;
}
.top-center-bottom .bottom{
bottom:0;
height:100px;
width:100%;
background:red;
}
.top-center-bottom .center{
bottom:100px;
top:100px;
width:100%;
background:green;
}
html, body, .top-center-bottom{
height:100%;
}
.top-center-bottom{
display:flex;
flex-direction:column;
}
.top-center-bottom .top{
height:100px;
background:red;
}
.top-center-bottom .bottom{
height:100px;
background:red;
}
.top-center-bottom .center{
flex:1;
background:green;
}
.html, body, .top-center-bottom{
width:100%;
height:100%;
}
.top-center-bottom{
display:grid;
grid-template-rows:100px auto 100px;
grid-template-columns:100%
}
.top-center-top{
background:red;
}
top-center-bottom{
background:red;
}
top-center-center{
background:green;
}
#main {
}
#top{
top:0;
height: 200px;
width: 100%;
background-color: #49FF55;
}
#center{
background-color: #FFFF00;
width: 100%;
height: calc(100vh - 400px);
}
#bottom{
bottom: 0;
height: 200px;
width: 100%;
background-color: firebrick;
}
1.flex
.wrap {
width: 200px;
height: 200px;
border: solid 1px red;
display: flex;
justify-content: center;
align-items: center;
}
.inner {
width: 80px;
height: 80px;
border: solid 1px blue;
}
2.定位
.wrap {
width: 200px;
height: 200px;
border: solid 1px red;
position: relative;
}
.inner {
width: 80px;
height: 80px;
border: solid 1px blue;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
}
3.表格
.wrap {
width: 200px;
height: 200px;
border: solid 1px red;
display: table-cell;
text-align: center;
vertical-align: middle;
}
.inner {
width: 80px;
height: 60px;
border: solid 1px blue;
display: inline-block;
}
4.auto+定位
.wrap{
width: 200px;
height: 200px;
border: solid 1px red;
position: relative;
}
.inner {
width: 80px;
height: 80px;
border: solid 1px blue;
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
margin: auto;
}
5.网格grid
.wrap {
width: 200px;
height: 200px;
border: solid 1px red;
display: grid;
justify-content: center;
align-items: center;
}
.inner {
width: 80px;
height: 80px;
border: solid 1px blue;
}
以下6个属性设置在容器上:
以下6个属性设置在项目上:
flex:1 为 0 1 0px
<div class="parent">
<div class="a"></div>
<div class="b"></div>
</div>
.parent {
display: flex;
height: 200px;
width: 1000px;
background-color: pink;
}
.a {
width: 100px;
flex: 1;
background-color: skyblue;
}
.b {
width: 100px;
flex: 2;
background-color: yellow;
}
#triangle-up {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid red;
}
#triangle-down {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-top: 100px solid red;
}
#main{
width: 200px;
height: 200px;
border-radius: 50%;
background-color: #49FF55;
}
#main{
width: 200px;
height: 200px;
border-radius: 50%;
background-color: #49FF55;
padding: 10px;
border: 1px solid red;
background-clip:content-box;//只在内容区显示
}
div{
border: 100px solid transparent;
width: 0;
heigt: 0;
border-radius: 100px;
border-top-color: red;
}
.square {
width: 10%;
height: 10vw;
background: tomato;
}
.square {
width: 20%;
height: 0;
padding-top: 20%;
background: orange;
}
.square {
width: 30%;
overflow: hidden;
background: yellow;
}
.square::after {
content: '';
display: block;
margin-top: 100%;
}
transform: scale(0.5,0.5);
<meta name="viewport" content="width=device-width, initial-scale=0.5, minimum-scale=0.5, maximum-scale=0.5"/>
使用css3的transform缩放属性-webkit-transform:scale(0.5); 注意-webkit-transform:scale(0.75);收缩的是整个元素的大小,这时候,如果是内联元素
元素转换成块元素,可以使用display:block/inline-block/…;
链接