- Display: none 会让元素从渲染树中消失, 不占据任何空间. visibility: hidden 不会让元素消失, 仍然占据渲染空间只是内容不可见
- Display: none 是非继承属性, 子孙节点的不可见原因为父节点没有在渲染树中渲染导致. visibility: hidden 是继承属性, 子孙属性的不可见是由于继承了父级的 hidden. 如果设置 visibility: visible 仍然可以展示出来
- 修改 display 属性会触发子组件的回流而修改 visibility: hidden只会触发子组件的重绘
- 读屏器会读取 visibility: hidden的内容, 但是无法读取 display: none 的元素
GET 和 POST 的区别
- 参数位置, GET 请求参数通过 url 传递, post 放在 request body 中
- 大小限制, 限于浏览器 和 nginx 对 url 长度的限制, get 的参数也会受到限制; eg: 当初在百家号我把质量检测接口搞挂的情况, 因为每次质量检测需要上传富文本中的所有内容. 我把 POST 接口改成了 GET
- 缓存性, get 请求会被浏览器主动缓存, post 不会, 除非手动设置
- 从表面上看 POST 似乎比 GET 更加安全. 因为普通用户看不到请求参数. 但是实际上想看的用户你是拦不住的
- GET请求只能进行url编码,而POST支持多种编码方式
- 从后端角度看, 接收 GET 请求参数直接同步处理即可. 但是想要接收 POST 请求参数的话就需要异步监听 data 事件 => 请求体的上传是流式的
- GET 请求参数会被完整的保留在浏览器历史记录中 POST 不会
- GET url 地址可以被存入书签, POST 不可以
综上, 看上去 GET 和 POST 天差地别, 但是实际上…根据 图解 HTTP .两者的请求报文完全一致🤔
=== vs ==
两者的区别
- === 为恒等符, 当两边的变量类型相等的时候进行对比, 值相等返回 true 不相等则返回 false
- == 为等值符, 两边变量类型相同时直接比较是否相等, 否则会进行转化
转化规则
- 如果一个是 null 一个是 undefined, 相等
- 如果一个是字符串一个是数字, 把字符串转化成数字再比较
- 如果一个是Boolean 那么把布尔值转化成数字再比较
- 如果一个是对象, 另外一个是数字 or 字符串. 把对象转成原始值在比较
- 其他类型的都不相等
对象转原始值其实就是调用其Symbol.toPrimitive, 你可以改写对象的这个方法参考: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive
默认情况下大多是优先调用自身的 valueOf 方法. 只有 Date 对象除外, 会优先调用 toString 方法
三栏布局
- 浮动布局, 两端分别设置 float: left | float: right
- 绝对定位布局, 三个盒子分别设置绝对定位
- flex布局, 两边盒子设置宽度, 中间盒子设置flex: 1 实现宽度自适应
- table 布局, 父级盒子设置 display: table, 三个子盒子分别设置 display: table-cell. 然后左右两个盒子分别设置宽度即可
- 网格布局, 父级盒子设置 display: grid; grid-template-columns: 300px auto 300px;
清除浮动的方法
- 结尾添加空标签 clear: both
- 父级设置高度
- 父级设置 display: table
- 父级设置 overflow: hidden | auto (同时需要设置 width 或者 zoom = 1, 且不能设置 height 靠浏览器自行检测即可)
- 父级也设置浮动
- 父级元素添加伪元素 :after {clear: both}