├── CSS ├── BFC.md ├── CSS.md ├── CSS3.md ├── CSS模块化.md ├── Flex.md ├── 垂直居中.md ├── 布局.md ├── 水平居中.md ├── 清除浮动的方法.md ├── 用7种方式实现三栏布局.md └── 自适应布局方式.md ├── HTML ├── HTML.md └── HTML5的新特点.md ├── Javascript ├── Bom.md ├── CallBack.md ├── DOM与事件.md ├── ES6.md ├── EventLoop.md ├── Form.md ├── JS基础.md ├── JS常用方法原理.md ├── Promise.md ├── async和await详解.md ├── 前后端数据交互.md ├── 回调地狱的解决方式总结.md ├── 垃圾回收机制.md ├── 字符串操作API.md ├── 定时器.md ├── 异步.md ├── 数组API.md ├── 正则表达.md ├── 深入理解Generator.md └── 防抖节流.md ├── MVVM └── MVVM.md ├── README.md ├── _config.yml ├── img ├── BFC_01.png ├── BFC_02.png ├── BFC_Box.webp ├── BFC_float.webp ├── BFC_rule03.webp ├── BFC_wordsfloat.webp ├── CROS_01.png ├── CROS_02.png ├── Cache_01.jpg ├── Effective_01.jpg ├── EventLoop_01.gif ├── EventLoop_02.jpg ├── EventLoop_03.jpg ├── FontandBack_01.jpg ├── FontandBack_02.jpg ├── FontandBack_03.jpg ├── JSBase_01.jpg ├── MVVM_01.png ├── MVVM_02.png ├── MVVM_03.png ├── MVVM_04.webp ├── Promise_01.png ├── Render_01.jpg ├── Sort_heapSort.gif ├── Sort_mergeSort.gif ├── Sort_shellSort.gif ├── callback_01.png ├── callback_02.png ├── css_01.png ├── css_02.png ├── css_03.jpg ├── css_04.jpg ├── css_05.jpg ├── http_01.png ├── solution_01.png └── sort_01.png ├── 一些思考 ├── Class中箭头函数和普通函数是咋回事?.md ├── 两个数组去重有多少种方法?性能如何?.md ├── 关于获取DOM节点的思考.md └── 虚拟DOM真的能提升性能吗?.md ├── 准备 ├── CSS面试准备.md ├── HTML面试准备.md ├── JS面试准备.md ├── 复习.md ├── 安全问题的准备.md ├── 对简历的准备.md ├── 性能优化面试准备.md ├── 浏览器相关问题的准备.md └── 跨域面试准备.md ├── 安全 └── 前端的安全防范.md ├── 性能优化 └── 性能优化.md ├── 手撕代码 ├── Javascript原生实现.md ├── Javascript原生实现JS版 │ ├── Ajax.js │ ├── Apply.js │ ├── Bind.js │ ├── Call.js │ ├── Copy.js │ ├── Create.js │ ├── DeepCopy.js │ ├── DoubleBind.js │ ├── EventBus.js │ ├── Instanceof.js │ ├── New.js │ ├── Promise.js │ ├── rem的实现原理.js │ ├── setInterval.js │ ├── 懒加载.js │ ├── 拖拽.js │ ├── 继承.js │ ├── 节流.js │ ├── 路由.js │ └── 防抖.js ├── 剑指offer题目.md └── 面试笔试中遇到的题.md ├── 浏览器 ├── 浏览器存储.md ├── 浏览器渲染.md └── 跨域CORS.md ├── 算法 ├── 十大排序算法.md └── 树.md ├── 网络 ├── Internet Base.md ├── UDP and TCP.md ├── http.md └── 输入URL到页面渲染的整个流程.md └── 面经 └── 面经.md /CSS/BFC.md: -------------------------------------------------------------------------------- 1 | # BFC 2 | 3 | Block Formatting Context, 块级格式化上下文,它是一个独立的渲染区域,只有Block-level Box参与,它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。 4 | 5 | 文档流分定位流、浮动流和 普通流 三种。而普通流其实就是指 BFC 中的 FC。 6 | 7 | FC直译过来是格式化上下文,它是**页面中的一块渲染区域**,有一套渲染规则,决定了其**子元素如何布局,以及和其他元素之间的关系和作用**。 8 | 9 | BFC 对布局的影响主要体现在对 **float** 和 **margin** 两个属性的处理。BFC 让 float 和 margin 这两个属性的表现更加符合我们的直觉。 10 | 11 | 根据 BFC 对其内部元素和外部元素的表现特性,将 BFC 的特性总结为 **对内部元素的包裹性** 及 **对外部元素的独立性**。 12 | 13 | ## 如何触发 14 | 15 | 满足下列条件之一就可触发 BFC。 16 | 17 | - 根元素,即 HTML 元素 18 | - `float` 的值不为 `none` 19 | - `overflow` 的值不为 `visible` 20 | - `display` 的值为 `inline-block`、`table-cell`、`table-caption` 21 | - `position` 的值为 `absolute` 或 `fixed` 22 | 23 | ## BFC 有哪些作用? 24 | 25 | BFC是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素,反之亦然。它与普通的块框类似,但不同之处在于: 26 | 27 | 1. 自适应两栏布局 28 | 2. 可以阻止元素被浮动元素覆盖 29 | 3. 可以包含浮动元素——清除内部浮动 30 | 4. 分属于不同的 BFC 时可以阻止 margin 重叠 31 | 32 | ## BFC 布局规则 33 | 34 | 1. 内部的 Box 会在垂直方向,一个接一个地放置。 35 | 2. Box 垂直方向的距离由 margin 决定。**属于同一个 BFC 的两个相邻 Box** 的 margin 会发生重叠。 36 | 3. 每个元素的 margin box 的左边,与包含块 border box 的左边相接触(对于从左向右的格式化,否则相反)。即使存在浮动也是如此。 37 | 4. BFC 的区域不会与 float box 重叠。 38 | 5. BFC 就是页面上一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。 39 | 6. 计算 BFC 的高度时,浮动元素参与计算。 40 | 41 | 接下来分别去试一下: 42 | 43 | ### BFC 布局规则1:内部的 Box 会在垂直方向, 一个接一个地放置 44 | 45 | 布局规则1就是我们**平常div一行一行块级放置的样式**。 46 | 47 | ```html 48 |
49 |
50 |
51 |
52 |
53 |
54 | ``` 55 | 56 | ```css 57 | .container{ 58 | /*构建BFC*/ 59 | position: absolute; 60 | height: auto; 61 | } 62 | .box3{ 63 | float: left; 64 | } 65 | ``` 66 | 67 | ![BFC rule1](https://github.com/YiiChitty/FrontEndLearning/blob/master/img/BFC_01.png) 68 | 69 | 这里只写了关键的样式,我在另一个资源库上传了具体的代码,可以从这里[预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/BFC/testRule01.html)到截图的页面。 70 | 71 | ### BFC 布局规则2:Box 垂直方向的距离由 margin 决定。属于同一个 BFC 的两个相邻 Box 的 margin 会发生重叠 72 | 73 | 决定块级盒在包含块中与相邻块盒的垂直间距的是margin-box。在常规的文档流中,两个兄弟盒子之间的垂直距离是由他们的外边距所决定的,但是不是外边距之和,而是以较大的那个为准。 74 | 75 | 在BFC内部也是这样: 76 | 77 | ```html 78 |
79 |
80 |
81 |
82 | ``` 83 | 84 | ```css 85 | .container { 86 | overflow: hidden;/*构建一个bfc*/ 87 | } 88 | .box1 { 89 | margin: 10px 0; 90 | } 91 | .box2 { 92 | margin: 20px 0; 93 | } 94 | ``` 95 | 96 | 以上依旧只写了关键代码,效果是box1和box2的间隔为20px,效果如下: 97 | 98 | ![BFC rule2](https://github.com/YiiChitty/FrontEndLearning/blob/master/img/BFC_02.png) 99 | 100 | 浏览器环境[预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/BFC/testRule02.html) 101 | 102 | 不过,也并非没有办法解决,特性5就说了容器里面的子元素不糊印象外面元素,给box1或者box2处于不同的BFC就可以了。 103 | 104 | **结论:**当两个相邻块级子元素**分属于不同的 BFC 时可以阻止 margin 重叠**。 105 | 106 | **操作方法**:给其中一个 div 外面包一个 div,然后通过触发外面这个 div 的 BFC,就可以阻止这两个 div 的 margin 重叠。 107 | 108 | 写法很简单,文章内就不多写了,可以直接[点此预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/BFC/testRule02solve.html) 109 | 110 | ### BFC 布局规则3:每个元素的 margin box 的左边,与包含块 border-box 的左边相接触(对于从左向右的格式化,否则相反)。即使存在浮动也是如此。 111 | 112 | ```html 113 |
114 |
115 |
116 |
117 | // 给这两个子div加浮动,浮动的结果,如果没有清除浮动的话,父div不会将下面两个div包裹,但还是在父div的范围之内。 118 | ``` 119 | 120 | **解析**:给这两个子 div 加浮动,浮动的结果,如果没有清除浮动的话,父 div 不会将下面两个 div 包裹,但还是在父 div 的范围之内,**左浮动是子 div 的左边接触父 div 的 border-box 的左边,右浮动是子 div 的左边接触父 div 的 border-box 的右边**,除非设置 margin 来撑开距离,否则一直是这个规则。 121 | 122 | 这个时候 **BFC 的作用 3:可以包含浮动元素——清除内部浮动** 登场! 123 | 124 | 给父 div 加上 `overflow: hidden;` 125 | 126 | **清除浮动原理**:触发父 div 的 BFC 属性,**使下面的子 div 都处在父 div 的同一 BFC 区域之内**,此时已成功清除浮动。 127 | 128 | ![BFC_wordsfloat](https://github.com/YiiChitty/FrontEndLearning/blob/master/img/BFC_rule03.webp) 129 | 130 | 还可以使父 div 向同一个方向浮动来达到清除浮动的目的,清除浮动的原理是两个 div 都位于同一个浮动的 BFC 区域之中。 131 | 132 | ### BFC 布局规则4:BFC 区域不会与 float box 重叠。 133 | 134 | 直接用两栏布局来说明。 135 | 136 | 如果左边固定宽度,右边自适应,随浏览器窗口大小变化而变化 137 | 138 | ```html 139 |
140 |
141 | ``` 142 | 143 | ```css 144 | .left { 145 | float: left; 146 | width: 200px; 147 | height: 300px; 148 | } 149 | 150 | .right { 151 | overflow: hidden;/*创建bfc */ 152 | height: 300px; 153 | } 154 | ``` 155 | 156 | [点此预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/BFC/testRule04.html) 157 | 158 | ### BFC 与 Layout 159 | 160 | IE 作为浏览器中的奇葩,当然不可能按部就班的支持 BFC 标准,于是乎 IE 中就有了 Layout 这个东西。**Layout 和 BFC 基本是等价的**,为了处理 IE 的兼容性,在需要触发 BFC 时吗,我们除了需要用触发条件中的 CSS 属性来触发 BFC,还需要针对 IE 浏览器使用 **zoom: 1** 来触发 IE 浏览器的 Layout。 161 | 162 | 以上的几个例子都体现了 BFC 布局规则的第 5 条—— 163 | 164 | ### BFC 布局规则5:BFC 就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之亦然。 165 | 166 | ------ 167 | 168 | **文本环绕 float**: 169 | 170 | ```html 171 |
172 |
173 |
174 |
175 |

content

content

content

content

content

176 |
177 | ``` 178 | 179 | ![BFC_wordsfloat](https://github.com/YiiChitty/FrontEndLearning/blob/master/img/BFC_wordsfloat.webp) 180 | 181 | 问题:为什么灰色背景的 div 左上角被覆盖后,红色 div 被覆盖,但是文本却没有被覆盖? 182 | 183 | **解决**: 184 | 185 | **float 的定义和用法**: 186 | 187 | float 属性定义元素在哪个方向上浮动。以往这个属性总应用于图像,**使文本围绕在图像周围**,不过在 CSS 中,**任何元素都可以浮动**。浮动元素会生成一个块级框,而不论它本身是何种元素。 188 | 189 | ![BFC_float](https://github.com/YiiChitty/FrontEndLearning/blob/master/img/BFC_float.webp) 190 | 191 | 从上图可以看到,float 属性确实生效,将 float 隐藏后,下面还有一个红色的 div,这个 div 是被黑色 div 所覆盖掉的。**div 会被 float 覆盖,而文本却没有被 float 覆盖**,是因为 **float 当初设计的时候就是为了使文本围绕在浮动对象的周围。** 192 | 193 | 194 | 195 | ## 块级盒Block-level Box到底是啥? 196 | 197 | ![BFC_box](https://github.com/YiiChitty/FrontEndLearning/blob/master/img/BFC_Box.webp) 198 | 199 | 我们平常说的盒子是由 margin、border、padding、content组成的,实际上每种类型的四条边定义了一个盒子,分别是`content box`、`padding box`、`border box`、`margin box`,这四种类型的盒子一直存在,即使他们的值为0。决定块盒在包含块中与相邻块盒的垂直间距的便是 `margin-box`。 200 | 201 | **提示**:Box 之间的距离虽然也可以使用 padding 来控制,但是此时实际上还是属于 box 内部里面,而且使用 padding 来控制的话就不能再使用 border 属性了。 -------------------------------------------------------------------------------- /CSS/CSS3.md: -------------------------------------------------------------------------------- 1 | ## CSS3 2 | 3 | ### 新特性 4 | 5 | - 新增选择器:E:nth-child(n) E:nth-last-child(n) 6 | - Transition、Transform和Animation 7 | 8 | ```css 9 | transition: 10 | div{ 11 | transition-property:width; 12 | transition-duration:1s; 13 | transition-timing-function:linear; 14 | transition-delay:25; 15 | /*简写形式*/ 16 | transition:width 1s linear 25; 17 | } 18 | 19 | transform: 20 | div{ 21 | transform:rotate(7deg); 22 | -ms-transform:rotate(7deg);/*IE9*/ 23 | -moz-transform:rotate(7deg);/*FireFox*/ 24 | -webkit-transform:rotate(7deg);/*Safari和Chrome*/ 25 | -o-transform:rotate(7deg);/*Opwea*/ 26 | } 27 | 28 | animation: 29 | @keyframes myAnimation{ 30 | 0%{background:red;width:100px;} 31 | 25%{background:orange;width:200px;} 32 | 50%{background:yellow;width:100px;} 33 | 75%{background:green;width:200px;} 34 | 100%{background:blue:width:100px;} 35 | } 36 | #box{ 37 | animation:myAnimation 5s; 38 | width:100px; 39 | height:100px; 40 | background:red; 41 | } 42 | ``` 43 | 44 | - 边框:box-shadow,border-radius 45 | - 背景:background-clip,background-size 46 | - 文字:text-shadow,text-overflow 47 | - 字体:@font-face 48 | 49 | ```css 50 | @font-face{ 51 | font-family:myFirstFont; 52 | src:url(sansation_light,woff); 53 | } 54 | ``` 55 | 56 | ### 硬件加速 57 | 58 | #### 让一个元素左移100px,使用left和transform有什么区别? 59 | 60 | 使用left等属性来设置动画会一直触发浏览器的重绘,而使用CSS3中国的transform会采用GPU硬件加速,不会触发重绘,性能更好 61 | 62 | #### 硬件加速的原理 63 | 64 | DOM树和CSSOM合并后形成Render树。渲染树中包含了大量的渲染元素,每一个渲染元素会被分到一个图层中,每个图层又会被加载到GPU形成渲染纹理。GPU中的transform是不会触发重绘的,这一点非常类似3D绘图功能。**最终这些使用tranform的图层都会由独立的合成器进程进行处理**。 65 | 66 | 总结: 67 | 68 | **CSS3 transform创建了一个新的复合图层**,可以被GPU直接用来执行transform,从而不触发浏览器的重绘来达到加速的目的 69 | 70 | 以下情况会创建一个独立的复合图层: 71 | 72 | - 3D或者CSS transform 73 | - ``和``标签 74 | - CSS filters 75 | - 元素覆盖时,比如用了z-index属性 76 | 77 | #### 如何硬件加速 78 | 79 | 以下CSS属性可以触发硬件加速: 80 | 81 | - transform 82 | - opacity 83 | - filter 84 | - will-change:告知浏览器哪一个属性即将变化 85 | - 还可以通过transform的3D属性强制开始GPU加速 86 | 87 | ```css 88 | transform:translateZ(0); 89 | transform:rotateZ(360deg); 90 | ``` 91 | 92 | **使用硬件加速的注意事项:** 93 | 94 | - 不能让每个元素都启用硬件加速,这样会占用很大的内存,使页面有很强的卡顿感, 95 | - GPU渲染会影响字体的抗锯齿效果,这是因为GPU和CPU具有不同的渲染机制,即使最终硬件加速停止了,文本还是会在动画期间显示得很模糊。 -------------------------------------------------------------------------------- /CSS/CSS模块化.md: -------------------------------------------------------------------------------- 1 | ## CSS 模块化 2 | 3 | ### vue中style标签中设置scoped的原理 4 | 5 | 这个局部样式是通过PostCSS给组件中所有的DOM添加了一个独一无二的动态属性,然后通过CSS属性选择器来选择组件中的DOM 6 | 7 | ### CSS预处理 8 | 9 | #### 优点 10 | 11 | - 用一种专门的编程语言,进行Web页面样式设计,然后再编译成正常的CSS文件,以便项目使用。 12 | - CSS更加简洁、适应性更强,更易于代码的维护 13 | 14 | #### 基本语法 15 | 16 | Less的基本语法和CSS差不多,SASS和Stylus都可以利用缩进代替花括号,并且空格有重要的意义。 17 | 18 | ```css 19 | - less&scss; 20 | ul{ 21 | list-style:none; 22 | } 23 | -sass 24 | ul 25 | list-style:none 26 | - stylus: 27 | ul 28 | list-style none 29 | ``` 30 | 31 | #### 变量 32 | 33 | ```css 34 | -less&scss; 35 | @orange:#feb914; 36 | header{ 37 | background-color:@orange; 38 | } 39 | - sass 40 | $orange:#feb914; 41 | header 42 | background-color:$orange; 43 | - stylus 44 | bgorange=#feb914; 45 | header 46 | background-color bgorange 47 | ``` 48 | 49 | #### 变量作用域 50 | 51 | ```css 52 | - less: less中素有变量的计算,都是以这个变量最后一次被定义的值为准,这个行为叫懒加载 53 | 54 | @size:40px; 55 | .content{ 56 | width:@size; 57 | } 58 | @size:60px; 59 | .container{ 60 | width:@size; 61 | } 62 | 63 | =>编译输出 64 | .content{ 65 | width:60px; 66 | } 67 | .container{ 68 | width:60px; 69 | } 70 | 71 | -sass stylus 72 | $size:40px; 73 | .content{ 74 | width:$size; 75 | } 76 | $size:60px; 77 | .container{ 78 | width:$size; 79 | } 80 | =>编译输出 81 | .content{ 82 | width:40px; 83 | } 84 | .container{ 85 | width:60px; 86 | } 87 | ``` 88 | 89 | #### 总结 90 | 91 | - sass和lessy语法严谨,Stylus相对自由,因为Less更像原生的CSS,所以可能学起来更加容易 92 | - sass和compass、stylus和nib都是好朋友 93 | - sass和stylus都具有类语言的逻辑方式处理:条件、循环等;less需要通过when等关键词模拟这些功能,这方面less比不上sass和stylus 94 | - less在丰富性及特色上都不及sass和stylus,如果不是bootstrap引入了less,可能不会这样被广泛应用。 -------------------------------------------------------------------------------- /CSS/Flex.md: -------------------------------------------------------------------------------- 1 | # Felx 2 | 3 | 提供一些参考文章: 4 | 5 | [A Complete Guide to Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) 6 | 7 | [A Visual Guide to CSS3 Flexbox Properties](https://scotch.io/tutorials/a-visual-guide-to-css3-flexbox-properties) 8 | 9 | [阮一峰Flex布局教程:语法篇](http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html) 10 | 11 | 以下内容是对上面的笔记方便记忆: 12 | 13 | ## 什么是 Flex ? 14 | 15 | Flex 是 Flexible Box 的缩写,意为“弹性布局”,用来为盒状模型提供最的灵活性。 16 | 17 | **任何一个容器都可以指定为 Flex 布局**。 18 | 19 | 注意:**设置为 Flex 布局后,子元素的 float 、clear 和 vertical-align 属性将失效。** 20 | 21 | ## 1、基本概念 22 | 23 | 采用 Flex 布局的元素,称为 **Flex 容器**(Flex Container),简称“容器”。它的所有子元素自动成为容器成员,称为 **Flex 项目**(Flex Item),简称“项目”。 24 | 25 | [![img](https://camo.githubusercontent.com/4a62f4e4c2c48901fe2e18f0937f52a0f872dedb/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313030342e706e67)](https://camo.githubusercontent.com/4a62f4e4c2c48901fe2e18f0937f52a0f872dedb/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313030342e706e67) 26 | 27 | 容器默认存在两根轴: 28 | 29 | - `水平的主轴(main axis)`:主轴开始位置叫做 `main start`,结束位置叫做 `main end` 30 | - `垂直的交叉轴(cross axis)`:交叉轴开始位置叫做 `cross start`,结束位置叫做 `cross end` 31 | 32 | 项目默认沿主轴排列。单个项目占据的主轴空间叫做 `main size`,占据的交叉轴空间叫 `cross size` 33 | 34 | ## 2、容器的属性 35 | 36 | 有以下 6 种: 37 | 38 | - `flex-direction` 39 | - `flex-wrap` 40 | - `flex-flow` 41 | - `justify-content` 42 | - `align-items` 43 | - `align-content` 44 | 45 | ### `flex-direction` 46 | 47 | **flex-direction 属性决定主轴的方向(即项目排列的方向)。** 48 | 49 | 它可能有 4 个值: 50 | 51 | - `row`(默认值):主轴为水平方向,起点在左端。 52 | - `row-reverse`:主轴为水平方向,起点在右端。 53 | - `column`:主轴为垂直方向,起点在上沿。 54 | - `column-reverse`:主轴为垂直方向,起点在下沿。 55 | 56 | [![img](https://camo.githubusercontent.com/bb8b00a8353d931a32a422edc2f8b525cc510f1a/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313030352e706e67)](https://camo.githubusercontent.com/bb8b00a8353d931a32a422edc2f8b525cc510f1a/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313030352e706e67) 57 | 58 | ### `flex-wrap` 59 | 60 | **flex-wrap 属性定义,如果一条轴线排不下,如何换行。** 61 | 62 | - `nowrap`(默认值):不换行。 [![img](https://camo.githubusercontent.com/1cbaf6a9d67c91e0d7e4cb23af07a5a1e373eb52/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313030372e706e67)](https://camo.githubusercontent.com/1cbaf6a9d67c91e0d7e4cb23af07a5a1e373eb52/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313030372e706e67) 63 | - `wrap`:换行,第一行在上方。 [![img](https://camo.githubusercontent.com/50a1c2251a33ecccc8dd708e1067f5f9e5d9221d/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313030382e6a7067)](https://camo.githubusercontent.com/50a1c2251a33ecccc8dd708e1067f5f9e5d9221d/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313030382e6a7067) 64 | - `wrap-reverse`:换行,第一行在下方。 [![img](https://camo.githubusercontent.com/c2406b1a4ed44723e9ad223a82b2012131e7f26a/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313030392e6a7067)](https://camo.githubusercontent.com/c2406b1a4ed44723e9ad223a82b2012131e7f26a/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313030392e6a7067) 65 | 66 | ### `flex-flow` 67 | 68 | **flex-flow 属性是 flex-direction 属性和 flex-wrap 属性的简写形式,默认值是 row nowrap**。 69 | 70 | ### `justify-content` 71 | 72 | **justify-content 属性定义了 项目 在 主轴 上的对齐方式**。 73 | 74 | 它可能有 5 个值,具体对齐方式与轴的方向有关。下面假设主轴为从左到右。 75 | 76 | - `flex-start`(默认值):左对齐。 77 | - `flex-end`:右对齐。 78 | - `center`:居中。 79 | - `space-between`:两端对齐,项目之间的间隔要相等。 80 | - `space-around`:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。 81 | 82 | [![img](https://camo.githubusercontent.com/87d2aa8c9fca63bc1c5fc380826ff5fc39f2e791/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313031302e706e67)](https://camo.githubusercontent.com/87d2aa8c9fca63bc1c5fc380826ff5fc39f2e791/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313031302e706e67) 83 | 84 | ### `align-items` 85 | 86 | **align-items 属性定义了 项目 在 交叉轴 上的对齐方式**。 87 | 88 | 它可能有 5 个值,具体的对齐方式与交叉轴的方向有关,下面假设交叉轴从上到下。 89 | 90 | - `flex-start`:交叉轴的起点对齐。 91 | - `flex-end`:交叉轴的终点对齐。 92 | - `center`:交叉轴的中点对齐。 93 | - `baseline`:项目的第一行文字的基线对齐。 94 | - `stretch`(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。 95 | 96 | [![img](https://camo.githubusercontent.com/c392addaa2ccda4d0630cd749e60602236628c1d/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313031312e706e67)](https://camo.githubusercontent.com/c392addaa2ccda4d0630cd749e60602236628c1d/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313031312e706e67) 97 | 98 | ### `align-content` 99 | 100 | **align-content 属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用**。 101 | 102 | - `flex-start`:与交叉轴的起点对齐。 103 | - `flex-end`:与交叉轴的终点对齐。 104 | - `center`:与交叉轴的中点对齐。 105 | - `space-between`:与交叉轴两端对齐,轴线之间的间隔平均分布。 106 | - `space-around`:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。 107 | - `stretch`(默认值):轴线占满整个交叉轴。 108 | 109 | [![img](https://camo.githubusercontent.com/28fc09d0c51c347805ed3d4e8b537c68cd0da4f3/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313031322e706e67)](https://camo.githubusercontent.com/28fc09d0c51c347805ed3d4e8b537c68cd0da4f3/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313031322e706e67) 110 | 111 | ## 3、项目的属性 112 | 113 | 有以下 6 种: 114 | 115 | - `order` 116 | - `flex-grow` 117 | - `flex-shrink` 118 | - `flex-basis` 119 | - `flex` 120 | - `align-self` 121 | 122 | ### `order` 123 | 124 | **order 属性定义项目的排列顺序。数值越小,排列越靠前,默认为 0。** 125 | 126 | [![img](https://camo.githubusercontent.com/7db3f23ff9754b52512c64a932bd0ed0930dd6c0/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313031332e706e67)](https://camo.githubusercontent.com/7db3f23ff9754b52512c64a932bd0ed0930dd6c0/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313031332e706e67) 127 | 128 | ### `flex-grow` 129 | 130 | **flex-grow 属性定义项目的 放大 比例。默认为 0,即如果存在剩余空间,也不放大。** 131 | 132 | [![img](https://camo.githubusercontent.com/5c63ac877d7bb5f8d6e9b6752ad0cd157fd00ab5/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313031342e706e67)](https://camo.githubusercontent.com/5c63ac877d7bb5f8d6e9b6752ad0cd157fd00ab5/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313031342e706e67) 133 | 134 | 如果所有项目的 `flex-grow` 属性都为 1,则它们将等分剩余空间(如果有的话)。如果一个项目的 `flex-grow` 属性为 2,其他项目都为 1,则前者占据的剩余空间将比其他项多一倍。 135 | 136 | ### `flex-shrink` 137 | 138 | **flex-shrink 属性定义了项目的 缩小 比例。默认为 1,即如果空间不足,该项目将缩小。** 139 | 140 | [![img](https://camo.githubusercontent.com/1b8b5084cf53b4cf0f7a341fe645a89c21ba20c4/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313031352e6a7067)](https://camo.githubusercontent.com/1b8b5084cf53b4cf0f7a341fe645a89c21ba20c4/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313031352e6a7067) 141 | 142 | 如果所有项目的 `flex-shrink` 属性都为 1,当空间不足时,都将等比例缩小。如果一个项目的 `flex-shrink` 属性为 0,其他项目都为 1,则空间不足时,前者不缩小。 143 | 144 | 负值对该属性无效。 145 | 146 | ### `flex-basis` 147 | 148 | **flex-basis 属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为 auto,即项目的本来大小。** 149 | 150 | 它可以设为跟 `width` 或 `height` 属性一样的值(比如 350px ),则项目将占据固定空间。 151 | 152 | ### `flex` 153 | 154 | **flex 属性是 flex-grow, flex-shrink 和 flex-basis 的简写,默认值为0 1 auto。后两个属性可选。** 155 | 156 | 该属性有两个快捷值:`auto` (`1 1 auto`) 和 `none` (`0 0 auto`)。 157 | 158 | 建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。 159 | 160 | ### `align-self` 161 | 162 | **align-self 属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。** 163 | 164 | [![img](https://camo.githubusercontent.com/7ddd3d434df1aaa8fd86f22e3f066c4ec3801656/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313031362e706e67)](https://camo.githubusercontent.com/7ddd3d434df1aaa8fd86f22e3f066c4ec3801656/687474703a2f2f7777772e7275616e796966656e672e636f6d2f626c6f67696d672f61737365742f323031352f6267323031353037313031362e706e67) 165 | 166 | 该属性可能取6个值,除了`auto`,其他都与 `align-items` 属性完全一致。 -------------------------------------------------------------------------------- /CSS/垂直居中.md: -------------------------------------------------------------------------------- 1 | # 垂直居中 2 | 3 | ## 1、利用行高 line-height 4 | 5 | ```html 6 |
垂直居中
7 | ``` 8 | 9 | ```css 10 | .box { 11 | width: 100px; 12 | height: 100px; 13 | background: #FEE; 14 | line-height: 100px; 15 | } 16 | ``` 17 | 18 | ## 2、利用内边距padding 19 | 20 | ```html 21 |
垂直居中
22 | ``` 23 | 24 | ```css 25 | .box { 26 | width: 100px; 27 | background: #FEE; 28 | padding: 50px 0; 29 | } 30 | ``` 31 | 32 | ## 3、Table(display:table/teble-cell+vertical-align:middle) 33 | 34 | ```html 35 |
36 |
垂直居中
37 |
38 | ``` 39 | 40 | ```css 41 | .container { 42 | width: 100px; 43 | height: 100px; 44 | background: #FEE; 45 | display: table; 46 | } 47 | .box { 48 | display: table-cell; 49 | vertical-align: middle; 50 | } 51 | ``` 52 | 53 | ## 4、绝对相对定位(position+top:50%) 54 | 55 | ```html 56 |
57 |
垂直居中
58 |
59 | ``` 60 | 61 | ```css 62 | .container { 63 | width: 100px; 64 | height: 100px; 65 | background: #FEE; 66 | position: relative; 67 | } 68 | .box { 69 | position: absolute; 70 | top: 50%; 71 | transform: translateY(-50%); 72 | } 73 | ``` 74 | 75 | ## 5、Flex(display:flex+align-items:center) 76 | 77 | ``` 78 |
垂直居中
79 | ``` 80 | 81 | ```css 82 | .box { 83 | width: 100px; 84 | height: 100px; 85 | background: #FEE; 86 | display: flex; 87 | align-items: center; 88 | } 89 | ``` 90 | 91 | -------------------------------------------------------------------------------- /CSS/布局.md: -------------------------------------------------------------------------------- 1 | # 布局 2 | 3 | ## 1 table布局 4 | 5 | table 的特性决定了它非常适合用来做布局,并且表格中的内容可以自动居中,这是之前用的特别多的一种布局方式。 6 | 7 | ```css 8 | .container{ 9 | height:200px; 10 | width: 200px; 11 | } 12 | .left{ 13 | background-color: red 14 | } 15 | .right{ 16 | background-color: green 17 | } 18 | ``` 19 | 20 | ```html 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | ``` 30 | 31 | [效果预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/Layout/table布局.html) 32 | 33 | 还加入了 `display:table;dispaly:table-cell` 来支持 table布局。 34 | 35 | ```html 36 | 47 | 48 |
49 |
50 |
51 |
52 | ``` 53 | 54 | 缺点: 55 | 56 | - table 比其它 html 标记占更多的字节(造成下载时间延迟,占用服务器更多流量资源) 57 | - table 会阻挡浏览器渲染引擎的渲染顺序。(会延迟页面的生成速度,让用户等待更久的时间) 58 | 59 | 但是某些情况下,当采用其他方式不能很好的达到自己的效果时,采用 table 布局能适应当前场景。 60 | 61 | ## 2 Flex布局 62 | 63 | 在进行这个布局之前,需要先知道盒子模型,同时还需要知道display和position两个属性。 64 | 65 | 盒子模型就不赘述了,详细内容可以看[这里](https://github.com/YiiChitty/FrontEndLearning/blob/master/CSS/CSS.md) 66 | 67 | 简单说一下display和position两个属性: 68 | 69 | display : 70 | 71 | - block(元素表现为块级元素,有固定宽高,独占一行) 72 | - inline(元素表现为行内元素,不能设置宽高) 73 | - inline-block (对外表现为行内元素,对内表现为块级元素) 74 | 75 | position 有如下几个值: 76 | 77 | - static(默认情况,存在文档流当中) 78 | - relative(根据元素本身原来所应该处的位置偏移,不会改变布局的计算) 79 | - absolute(绝对定位,脱离文档流,不会对别的元素造成影响,相对的是父级最近的 relative 或者 absolute 定位元素) 80 | - fixed(绝对定位,脱离文档流,相对于的是屏幕,就是那些浮动的广告那样,怎么拉都固定在同一个位置,而 absolute 元素离开屏幕就看不见了) 81 | 82 | position 的层叠是按顺序层叠的,不过可以通过设置 z-index 来改变层叠顺序,只有 relative,absolute,fixed 可以设置 z-index。 83 | 84 | 85 | 86 | 现在进入正题,flexbox布局。 87 | 88 | 即弹性盒子布局,它的特点是盒子本来就是并列的,只需要指定宽度即可。来看一个经典的三栏布局的例子。 89 | 90 | ```css 91 | .container{ 92 | height:200px; 93 | width: 200px; 94 | display: flex 95 | } 96 | .left{ 97 | background-color: red; 98 | flex: 1; 99 | } 100 | .middle{ 101 | background-color: yellow; 102 | flex: 1; 103 | } 104 | .right{ 105 | background-color: green; 106 | flex: 1; 107 | } 108 | ``` 109 | 110 | ```html 111 |
112 |
113 |
114 |
115 |
116 | ``` 117 | 118 | [效果预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/Layout/flexbox布局.html) 119 | 120 | 有时候可能需要两边定宽,中间自适应。那么可以这样写: 121 | 122 | ```css 123 | .left{ 124 | background-color: red; 125 | width:20px; 126 | } 127 | .middle{ 128 | background-color: yellow; 129 | flex: 1; 130 | } 131 | .right{ 132 | background-color: green; 133 | width:20px; 134 | } 135 | ``` 136 | 137 | 但是 flexbox 布局方式目前浏览器的支持不是太好,有一些兼容性的问题,但是是未来布局的趋势。 138 | 139 | 关于Flex布局的更多内容可以: 140 | 141 | [Flex 布局教程:语法篇](http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html) 142 | [flex布局案例](http://www.ruanyifeng.com/blog/2015/07/flex-examples.html) 143 | 144 | ## 3 float布局 145 | 146 | float 布局应该是目前各大网站用的最多的一种布局方式了。 147 | 148 | 在继续这个布局方式之前,需要了解什么是浮动: 149 | 150 | 浮动元素是脱离文档流的,但不脱离文本流(差不多就是word的文本环绕) 151 | 152 | 特点如下: 153 | 154 | - 对自身的影响 : 155 | - float 元素可以形成块,如 span 元素。可以让行内元素也拥有宽和高,因为块级元素具有宽高 156 | - 浮动元素的位置尽量靠上 157 | - 尽量靠左(float:left)或右(float:right),如果那一行满足不了浮动元素的宽度要求,则元素会往下掉 158 | - 对兄弟元素的影响 159 | - 不影响其他块级元素的位置,影响其他块级元素的文本 160 | - 上面贴非 float 元素 161 | - 旁边贴 float 元素或者边框 162 | - 对父级元素的影响 163 | - 从布局上 “消失” 164 | - 高度塌陷 165 | 166 | ### 高度塌陷 167 | 168 | ```css 169 | *{ 170 | margin: 0; 171 | padding: 0; 172 | } 173 | .container{ 174 | width: 200px; 175 | background-color:red; 176 | } 177 | .left{ 178 | background-color: yellow; 179 | float: left; 180 | height: 50px; 181 | width:50px; 182 | } 183 | .right{ 184 | background-color: yellow; 185 | float: right; 186 | height: 50px; 187 | width:50px; 188 | } 189 | ``` 190 | 191 | ```html 192 |
193 | float 194 | 我是字 195 | float 196 |
197 |
198 | ``` 199 | 200 | [效果预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/Layout/float高度塌陷.html) 201 | 202 | 可以看出,两个 float 元素虽然包含在第一个 container 中,但是却超出了第一个 container 的范围,在文档流中,父元素的高度默认是被子元素撑开的,也就是子元素多高,父元素就多高。 203 | 204 | 但是当为子元素设置浮动以后,子元素会完全脱离文档流,此时将会导致子元素无法撑起父元素的高度,导致父元素的高度塌陷。 205 | 206 | **解决方法:** 207 | 208 | 1.父元素设置 overflow: auto 或者 overflow: hidden 209 | 210 | 2.添加after伪类 211 | 212 | ```css 213 | .container::after{ 214 | content:''; 215 | clear:both; 216 | display:block; 217 | visibility:hidden; 218 | height:0; 219 | } 220 | ``` 221 | 222 | ### 两栏布局 223 | 224 | ```css 225 | *{ 226 | margin: 0; 227 | padding: 0; 228 | } 229 | .container{ 230 | width: 400px; 231 | height: 200px; 232 | } 233 | 234 | .left{ 235 | background-color: yellow; 236 | float: left; 237 | height: 100%; 238 | width:100px; 239 | } 240 | .right{ 241 | background-color: red; 242 | margin-left: 100px; 243 | height:100%; 244 | } 245 | ``` 246 | 247 | ```html 248 |
249 |
250 |
251 |
252 | ``` 253 | 254 | [效果预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/Layout/float浮动两栏布局.html) 255 | 256 | 上面代码中最重要的是 `margin-left: 100px;`,这一句将浮动元素的位置空了出来,所以右边栏里面的元素不会影响到浮动的 div。 257 | 258 | 这就是浮动布局的基本思想。 259 | 260 | ### 三栏布局 261 | 262 | 思路主要是左边一个浮动元素,右边一个浮动元素。这里有个Tips,中间的元素要写在最后,因为中间元素假设有块级元素的话,浮动元素会把块级元素的位置空出来,这就会影响右边浮动元素的定位。 263 | 264 | ```css 265 | *{ 266 | margin: 0; 267 | padding: 0; 268 | } 269 | .container{ 270 | width: 400px; 271 | height: 200px; 272 | } 273 | 274 | .left{ 275 | background-color: yellow; 276 | float: left; 277 | height: 100%; 278 | width:100px; 279 | } 280 | .right{ 281 | background-color: green; 282 | float: right; 283 | height: 100%; 284 | width:100px; 285 | } 286 | .middle{ 287 | background-color: red; 288 | margin-left: 100px; 289 | margin-right: 100px; 290 | height:100%; 291 | } 292 | ``` 293 | 294 | ```html 295 |
296 |
297 |
298 |
299 |
300 | ``` 301 | 302 | [效果预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/Layout/float浮动三栏布局.html) 303 | 304 | ## 4 响应式布局 305 | 306 | ### meta 标签 307 | 最简单的处理方式是加上一个 meta 标签: 308 | 309 | ```html 310 | 311 | ``` 312 | 313 | 其中,width = device-width 这一句的意思是让页面的宽度等于屏幕的宽度。 314 | 315 | ### 使用 rem 316 | 317 | rem 指的是 html 元素的 font-size,html 元素的 font-size 默认是 16px,所以 1 rem = 16px;然后根据 rem 来计算各个元素的宽高,然后配合 media query 就可以实现自适应。 318 | 319 | ### media query 320 | 321 | css2 允许用户根据特定的 media 类型定制样式,基本语法如下 322 | 323 | ```css 324 | @media screen and (max-width: 360px) { 325 | html { font-size: 12px; } 326 | } 327 | ``` 328 | 329 | 意思就是: 当屏幕的宽度小于等于 360 px 的时候 html 的字体大小为 12 px. 330 | 331 | **需要注意的是范围大的要放在上面,范围小的放在下面。** 332 | 333 | 假设有两个样式,一个适应 360px 以下,一个适应 640px 以下,如果 360px 的放在上面,但是小于 360px 同样满足小于 640px,这就不是我们想要的结果了,所以范围大的需要放在上面。 334 | 335 | ## 总结 336 | 337 | 这里只是简单的介绍了一下 css 的各种布局,其实还有很多,比如浮动布局还包括圣杯布局,双飞翼布局等。 338 | 339 | 关于这一部分我将在下一节三栏布局中用具体案例的方式写出来。 -------------------------------------------------------------------------------- /CSS/水平居中.md: -------------------------------------------------------------------------------- 1 | # 水平居中 2 | 3 | ## 1、外边距margin 4 | 5 | ```html 6 |
水平居中
7 | ``` 8 | 9 | ```css 10 | .box { 11 | width: 100px; 12 | height: 100px; 13 | background: #FCC; 14 | margin: 0 auto; 15 | } 16 | ``` 17 | 18 | ## 2、行内块(display: inline-block+父元素text-align:center) 19 | 20 | ```html 21 |
22 |
水平居中
23 |
24 | ``` 25 | 26 | ```css 27 | .container { 28 | text-align: center; 29 | } 30 | .box { 31 | width: 100px; 32 | height: 100px; 33 | background: #FCC; 34 | display: inline-block; 35 | } 36 | ``` 37 | 38 | ## 3、绝对定位(position: absolute+left:50%) 39 | 40 | ```html 41 |
水平居中
42 | ``` 43 | 44 | ```css 45 | .box { 46 | width: 100px; 47 | height: 100px; 48 | background: #FCC; 49 | position: absolute; 50 | left: 50%; 51 | transform: translateX(-50%); 52 | } 53 | ``` 54 | 55 | ## 4、Flex(父元素 display: flex+justify-content: center) 56 | 57 | ```html 58 |
59 |
水平居中
60 |
61 | ``` 62 | 63 | ```css 64 | .container { 65 | display: flex; 66 | justify-content: center; 67 | } 68 | .box { 69 | width: 100px; 70 | height: 100px; 71 | background: #FCC; 72 | } 73 | ``` 74 | 75 | -------------------------------------------------------------------------------- /CSS/清除浮动的方法.md: -------------------------------------------------------------------------------- 1 | ## 清除浮动的方法 2 | 3 | 首先浮动的问题是:在一个容器里,有两个浮动子元素。因为浮动定位是不属于正常页面流的,它是独立定位的,所以只含有浮动元素的父容器,在显示时不考虑子元素的位置,所以显示出来父容器像是个空的一样。 4 | 5 | 解决方案: 6 | 7 | 1.把父元素一起浮动,但是这样不好,会影响后面的元素定位 8 | 9 | 2.给父容器加上overflow:hidden。 10 | 11 | 加上之后,形成BFC,需要计算超出的大小来隐藏,所以父容器会撑开放入子元素,同时计算浮动的子元素。 12 | 13 | 但是一旦子元素大小超过父容器大小就会显示异常。 14 | 15 | 3.在浮动元素后面添加一个不浮动的空元素。 16 | 17 | 父容器必须考虑浮动子元素的位置,子元素出现在浮动元素后面,所以显示出来就正常了,但是需要添加额外的html标签,这违背了语义化的原则。 18 | 19 | 4.利用伪元素:after。 20 | 21 | 伪元素能在父容器尾部自动创建一个子元素,这个原理同3是一样的,可以把它设置为height:0不显示,clear:both,display:block保证空白字符不浮动。 22 | 23 | (但是:after不支持IE6,只需要添加上zoom:1,这个指标能激活父元素的haslayout属性,让父元素拥有自己的布局 -------------------------------------------------------------------------------- /CSS/用7种方式实现三栏布局.md: -------------------------------------------------------------------------------- 1 | # 用7种方式实现三栏布局 2 | 3 | 这一部分,用7钟不同的方式实现了三栏布局,可以帮助我们快速了解CSS布局的技巧。不过知道可以怎么实现,仅仅算是入门,具体是什么原理还有很长的路要走。 4 | 5 | ## 1.浮动布局 6 | 7 | 之前在[布局](https://github.com/YiiChitty/FrontEndLearning/blob/master/CSS/布局.md)已经讲过思路,写过实现了,这里就不再多说了。 8 | 9 | 记得计算中间框的区域margin加上边框的width即可。 10 | 11 | ```html 12 |
13 |
left
14 |
right
15 |
main
16 |
17 | ``` 18 | 19 | ```css 20 | .col { 21 | min-height: 100px; 22 | background: #eee; 23 | border: 1px solid #666; 24 | } 25 | .left { 26 | float: left; 27 | width: 100px; 28 | } 29 | .right { 30 | float: right; 31 | width: 100px; 32 | } 33 | .main { 34 | margin: 0 102px; 35 | } 36 | ``` 37 | 38 | [效果预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/ThreeColumnLayout/01-Float.html) 39 | 40 | ## 2.绝对定位 41 | 42 | ```html 43 |
44 |
left
45 |
right
46 |
main
47 |
48 | ``` 49 | 50 | ```css 51 | .container { 52 | position: relative; 53 | } 54 | .col { 55 | min-height: 100px; 56 | background: #eee; 57 | border: 1px solid #666; 58 | } 59 | .left, .right { 60 | position: absolute; 61 | top: 0; 62 | } 63 | .left { 64 | left: 0; 65 | width: 100px; 66 | } 67 | .right { 68 | right: 0; 69 | width: 100px; 70 | } 71 | .main { 72 | margin: 0 102px; 73 | } 74 | ``` 75 | 76 | 看看和上面的区别在哪里: 77 | 78 | 父元素添加了`position: relative`;子元素添加了`position: absolute;`,然后分别设置了left、right=0 79 | 80 | 通过相对绝对定位的方式实现了三栏布局。 81 | 82 | [效果预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/ThreeColumnLayout/02-Absolute.html) 83 | 84 | ## 3.BFC 85 | 86 | ```html 87 |
88 |
left
89 |
right
90 |
main
91 |
92 | ``` 93 | 94 | ```css 95 | .col { 96 | min-height: 100px; 97 | background: #eee; 98 | border: 1px solid #666; 99 | } 100 | .left { 101 | float: left; 102 | width: 100px; 103 | } 104 | .right { 105 | float: right; 106 | width: 100px; 107 | } 108 | .main { 109 | overflow: hidden; 110 | } 111 | ``` 112 | 113 | 和浮动布局的区别就在于.main使用`overflow: hidden;`触发了BFC。 114 | 115 | [效果预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/ThreeColumnLayout/03-BFC.html) 116 | 117 | ## 4.Flex 118 | 119 | 这个原理已经在[布局](https://github.com/YiiChitty/FrontEndLearning/blob/master/CSS/布局.md)说过了,这里就不再多说了。 120 | 121 | 父元素`display:flex`,中间区域记得`flex:1`就好。 122 | 123 | ```html 124 |
125 |
left
126 |
main
127 |
right
128 |
129 | ``` 130 | 131 | ```css 132 | .container { 133 | display: flex; 134 | } 135 | .col { 136 | min-height: 100px; 137 | background: #eee; 138 | border: 1px solid #666; 139 | } 140 | .left { 141 | width: 100px; 142 | } 143 | .main { 144 | flex: 1; 145 | } 146 | .right { 147 | width: 100px; 148 | } 149 | ``` 150 | 151 | [效果预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/ThreeColumnLayout/04-Flex.html) 152 | 153 | ## 5.table布局 154 | 155 | 之前也说了,就直接上代码了。 156 | 157 | 注意修改display为table和table-cell就行。 158 | 159 | ```html 160 |
161 |
left
162 |
main
163 |
right
164 |
165 | ``` 166 | 167 | ```css 168 | .container{ 169 | display:table; 170 | width: 100%; 171 | min-height: 100px; 172 | } 173 | .col { 174 | display: table-cell; 175 | background: #eee; 176 | border: 1px solid #666; 177 | } 178 | .left { 179 | width: 100px; 180 | } 181 | .right { 182 | width: 100px; 183 | } 184 | ``` 185 | 186 | [效果预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/ThreeColumnLayout/05-Table.html) 187 | 188 | ## 6. 圣杯布局 189 | 190 | 圣杯布局有两个重要的点: 191 | 192 | - 中间的main宽度可以自适应 193 | 194 | - main要放在文档流前面,这样可以保证页面主题内容先被加载 195 | 196 | 这里需要注意的地方: 197 | 198 | 一是` margin-left: -100px;`和`margin-left: -100%;` 199 | 200 | 因为main的宽度是100%,把right和left都挤下去了,我们可以利用边距让他们回到中间位置。 201 | 202 | 二是`position: relative;` 203 | 204 | 完成上一步之后,main的两侧会被right和left遮挡住,用相对定位把他们放到合适的位置上去。 205 | 206 | ```html 207 |
208 |
main
209 |
left
210 |
right
211 |
212 | ``` 213 | 214 | ```css 215 | .container { 216 | margin: 0 100px; 217 | } 218 | .col { 219 | min-height: 100px; 220 | float: left; 221 | } 222 | .main { 223 | width: 100%; 224 | background: #666; 225 | } 226 | .left { 227 | width: 100px; 228 | position: relative; 229 | left: -100px; 230 | margin-left: -100%; 231 | background: #999; 232 | } 233 | .right { 234 | width: 100px; 235 | position: relative; 236 | right: -100px; 237 | margin-left: -100px; 238 | background: #333; 239 | } 240 | ``` 241 | 242 | [效果预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/ThreeColumnLayout/06-Grail.html) 243 | 244 | ## 7.双飞翼布局 245 | 246 | 由于圣杯布局将right和left设置成了相对定位,这样的话,我们以后想使用绝对定位的时候就很不方便扩展,而双飞翼布局解决了这个问题。 247 | 248 | 双飞翼在left和right模块中又加了一个元素,然后使用margin来改变新加元素的位置,这个就避免了圣杯布局的定位问题。 249 | 250 | ```html 251 |
252 |
253 |
doubleFly main
254 |
255 |
left
256 |
right
257 |
258 | ``` 259 | 260 | ```css 261 | .container { 262 | width: 100%; 263 | float: left; 264 | } 265 | .col { 266 | min-height: 100px; 267 | } 268 | .main { 269 | margin: 0 100px; 270 | background: #666; 271 | } 272 | .left { 273 | width: 100px; 274 | float: left; 275 | margin-left: -100%; 276 | } 277 | .right { 278 | width: 100px; 279 | float: right; 280 | margin-left: -100px; 281 | } 282 | ``` 283 | 284 | [效果预览](http://htmlpreview.github.io/?https://github.com/YiiChitty/CSSWorld/blob/master/ThreeColumnLayout/07-DoubleFly.html) -------------------------------------------------------------------------------- /CSS/自适应布局方式.md: -------------------------------------------------------------------------------- 1 | ## 静态布局 2 | 3 | 传统web设计,元素尺寸一律用px作为单位 4 | 5 | 特点:不管浏览器尺寸具体是多少,网页布局始终按照最初写代码时的布局来显示。 6 | 7 | 一般都使用min-width定宽,小于这个宽度就会出现滚动条,大于就内容居中加背景。 8 | 9 | 设计方法: 10 | 11 | PC端居中布局所有样式绝对宽高,设计一个layout,在屏幕宽高有调整时,使用横向和竖向的滚动条来查阅被遮掩的部分。 12 | 13 | 移动设备另外建立,单独设计一个布局,使用不同的域名如wap或m 14 | 15 | 16 | 17 | **在移动端开发中采用静态布局的两种方式:** 18 | 19 |  (1)在viewport meta标签上设置width=320,页面的各个元素也采用px作为单位。通过用JS动态修改标签的initial-scale使得页面等比缩放,从而刚好占满整个屏幕。(见[前端开发-web app 变革之rem](https://link.zhihu.com/?target=http%3A//www.520ued.com/article/549125815f85b6b44ca20b2b)) 20 | 21 |  (2)设在viewport meta标签上设置content"width=640,user-scalable=no,页面的各个元素也采用px作为单位。由于640px超出了手机宽度,浏览器会自动缩小页面至刚好全屏。(具体见[content"width=640,user-scalable=no" 然后再进行固定尺寸的px设计? - 前端开发](https://www.zhihu.com/question/32090605)) 22 | 23 | 24 | 25 | ## 流式布局 26 | 27 | 页面元素的宽度按照屏幕分辨率进行适配调整,但整体布局不变。 28 | 29 | 网页中主要的划分区域的尺寸使用百分数(搭配min-*、max-*属性使用),例如,设置网页主体的宽度为80%,min-width为960px。图片也作类似处理(width:100%, max-width一般设定为图片本身的尺寸,防止被拉伸而失真)。 30 | 31 | 布局特点:屏幕分辨率变化时,页面里元素的大小会变化而但布局不变。【这就导致如果屏幕太大或者太小都会导致元素无法正常显示】 32 | 33 | 设计方法:使用%百分比定义宽度,高度大都是用px来固定住,可以根据可视区域 (viewport) 和父元素的实时尺寸进行调整,尽可能的适应各种分辨率。往往配合 max-width/min-width 等属性控制尺寸流动范围以免过大或者过小影响阅读。 34 | 35 | **这种布局方式在Web前端开发的早期历史上,用来应对不同尺寸的PC屏幕**(那时屏幕尺寸的差异不会太大),**在当今的移动端开发也是常用布局方式**,但**缺点明显**:**主要的问题**是如果屏幕尺度跨度太大,那么在相对其原始设计而言过小或过大的屏幕上不能正常显示。因为宽度使用%百分比定义,但是高度和文字大小等大都是用px来固定,所以在大屏幕的手机下显示效果会变成有些页面元素宽度被拉的很长,但是高度、文字大小还是和原来一样(即,这些东西无法变得“流式”),显示非常不协调。 36 | 37 | 38 | 39 | ## 自适应布局 40 | 41 | 分别为不同的屏幕分辨率定义布局,即创建多个静态布局,每个静态布局对应一个屏幕分辨率范围。改变屏幕分辨率可以切换不同的静态局部(页面元素位置发生改变),但在每个静态布局中,页面元素不随窗口大小的调整发生变化。可以把自适应布局看作是静态布局的一个系列。 42 | 43 | 布局特点:屏幕分辨率变化时,页面里面元素的位置会变化而大小不会变化。 44 | 45 | 设计方法:使用 @media 媒体查询给不同尺寸和介质的设备切换不同的样式。在优秀的响应范围设计下可以给适配范围内的设备最好的体验,在同一个设备下实际还是固定的布局。 46 | 47 | 48 | 49 | ## 响应式布局 50 | 51 | 响应式设计的目标是确保一个页面在所有终端上(各种尺寸的PC、手机、手表、冰箱的Web浏览器等等)都能显示出令人满意的效果,对CSS编写者而言,在实现上不拘泥于具体手法,但通常是糅合了流式布局+弹性布局,再搭配媒体查询技术使用。 52 | 53 | 分别为不同的屏幕分辨率定义布局,同时,在每个布局中,应用流式布局的理念,即页面元素宽度随着窗口调整而自动适配。即:创建多个流体式布局,分别对应一个屏幕分辨率范围。可以把响应式布局看作是流式布局和自适应布局设计理念的融合。 54 | 55 | 布局特点:每个屏幕分辨率下面会有一个布局样式,即元素位置和大小都会变。 56 | 57 | 媒体查询+流式布局。通常使用 @media 媒体查询 和网格系统 (Grid System) 配合相对布局单位进行布局,实际上就是综合响应式、流动等上述技术通过 CSS 给单一网页不同设备返回不同样式的技术统称。 58 | 59 | 优点:适应pc和移动端,如果足够耐心,效果完美 60 | 61 | 缺点:(1)媒体查询是有限的,也就是可以枚举出来的,只能适应主流的宽高。(2)要匹配足够多的屏幕大小,工作量不小,设计也需要多个版本。 62 | 63 | ```html 64 | 65 | 66 | ``` 67 | 68 | 如何实现响应式布局:[折腾响应式布局设计](http://caibaojian.com/356.html),[应运而生的web页面响应布局](http://www.zhangxinxu.com/wordpress/2011/09/页面响应布局/) 69 | 70 | ## 弹性布局 71 | 72 | 参考:[流布局与响应式网页设计有什么区别?](https://www.zhihu.com/question/21679928) 73 | 74 | 这类布局的特点是,**包裹文字的各元素的尺寸采用em/rem做单位,而页面的主要划分区域的尺寸仍使用百分数或px做单位(同「流式布局」或「静态/固定布局」)**。**早期浏览器不支持整个页面按比例缩放**,仅支持网页内文字尺寸的放大,这种情况下。使用em/rem做单位,可以使包裹文字的元素随着文字的缩放而缩放。 75 | 76 | 浏览器的默认字体高度一般为`16px`,即1em:16px,但是 1:16 的比例不方便计算,为了使单位em/rem更直观,CSS编写者常常将页面跟节点字体设为62.5%,比如选择用rem控制字体时,先需要设置根节点html的字体大小,因为浏览器默认字体大小16px*62.5%=10px。这样1rem便是10px,方便了计算。 77 | 78 | **为什么一般多是 html{font-size:62.5%;} 而不是 html{font-size:10px;}呢?** 79 | 80 | 因为有些浏览器默认的不是16px,或者用户修改了浏览器默认的字体大小(因浏览器分辨率大小,视力,习惯等因素)。如果我们将其设置为10px,一定会影响在这些浏览器上的效果,所以最好用绝大多数用户默认的16作为基数 * 62.5% 得到我们需要的10px。 81 | 82 | **rem,em区别:** 83 | 84 | rem,em都是顺应不同网页字体大小展现而产生的。其中,em是相对其父元素,在实际应用中相对而言会带来很多不便;而rem是始终相对于html大小,即页面根元素。 85 | 86 | 使用 em 或 rem 单位进行相对布局,相对%百分比更加灵活,同时可以支持浏览器的字体大小调整和缩放等的正常显示,因为em是相对父级元素的原因没有得到推广。 87 | 88 | **rem与em、px的区别:** 89 | px:像素,比较精确的单位,但不好做响应式布局 90 | em:以父节点font-size大小为参考点,标准不统一,容易造成混乱 91 | REM支持的浏览器:Mozilla Firefox 3.6+、Apple Safari 5+、Google Chrome、IE9+和Opera11+。IE6-8无法支持。 -------------------------------------------------------------------------------- /HTML/HTML.md: -------------------------------------------------------------------------------- 1 | # HTML 2 | 3 |
4 | 5 | ## HTML和XHTML 6 | HTML格式比较松散,XHTML基于XML,语法严格标准,其元素必须正确地嵌套,元素必须关闭、标签必须小写、必须有根元素等。 7 | 8 | ## DOCTYPE作用?严格模式和混杂模式如何区分?有何意义? 9 | 10 | 11 | - 声明叫文件类型定义(DTD),位于文档中最前面,作用是为了告知浏览器应该用哪种文档类型规范来解析文档。 12 | 13 | 14 | 15 | 16 | - 严格模式(标准模式),浏览器按照W3C标准来解析;混杂模式,向后兼容的解析方法,浏览器用自己的方式解析代码。 17 | 18 | 19 | 20 | - 如何区分?
用DTD来判断
严格格式DTD——严格模式;
有URL的过渡DTD——严格模式,没有URL的过渡DTD——混杂模式;
DTD不存在/格式不对——混杂模式;
HTML5没有严格和混杂之分 21 | 22 | - 区分的意义
严格模式的排版和js运行模式以浏览器支持的最高标准运行。如果只存在严格模式,那么很多旧网站站点无法工作。 23 | 24 | ## 为什么HTML5只需要写`` 25 | 26 | HTML5不基于SGML(标准通用标记语言),因此不需要对DTD进行引用,但是需要doctype来规范浏览器的行为。 27 | 28 | ## HTML5有哪些新特性 29 | 30 | - **语义化标签**
31 | 8组:header、nav、footer、section、aside、artice、detailes、summary、dialog(对话框) 32 | - **智能表单**
33 | 1.input输入类型增多
34 | color(颜色选取)、date、datetime(UTC时间)、datetime-local(日期时间无时区)、email、month、number、range(一定范围内数字值)、search、tel(电话号码)、time、url、week
35 | 2.新增表单元素
36 | datalist(输入域选项列表)keygen(验证用户)、output(不同类型输出) 37 | 3.新增表单属性 38 | placehoder(提示语)、required(boolean,不能为空)、pattern(正则)、min/max、step(合法数字间隔)、height/width(image高宽)、autofocus(boolean,自动获取焦点)、mutiple(boolean,多选) 39 | 40 | - **音频和视频**
41 | `