Skip to content

菜鸟教程

1、 viewport

<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
  • width: 设置viewport宽度,为一个正整数,或字符串 device-width

  • device-width: 设备宽度

  • height: 设置viewport高度,一般设置了宽度,会自动解析出高度,可以不用设置

  • initial-scale: 默认缩放比例(初始缩放比例),为一个数字,可以带小数

  • minimum-scale: 允许用户最小缩放比例,为一个数字,可以带小数

  • maximum-scale: 允许用户最大缩放比例,为一个数字,可以带小数

  • user-scalable: 是否允许手动缩放

延伸提问:怎样处理 移动端 1px 被渲染成 2px 问题?

1、局部处理

meta 标签中的 viewport 属性 ,initial-scale 设置为 1

rem 按照设计稿标准走,外加利用 transfrome 的 scale(0.5) 缩小一倍即可;

2、全局处理

meta 标签中的 viewport 属性 ,initial-scale 设置为 0.5

rem 按照设计稿标准走即可


2、跨域的几种方式

首先了解下浏览器的同源策略

同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSRF等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。 那么怎样解决跨域问题的呢?

1 通过jsonp跨域,原生实现:

<script>
var script = document.createElement('script');
script.type = 'text/javascript';
// 传参并指定回调执行函数为onBack
script.src = 'http://www.....:8080/login?user=admin&callback=onBack';
document.head.appendChild(script);
// 回调执行函数
function onBack(res) {
    alert(JSON.stringify(res));
}
</script>

2、document.domain + iframe 跨域

此方案仅限主域相同,子域不同的跨域应用场景。

1.)父窗口:(http://www.domain.com/a.html)

<iframe id="iframe" src="http://child.domain.com/b.html"></iframe>
<script>
document.domain = 'domain.com';
var user = 'admin';
</script>
2.)子窗口:(http://child.domain.com/b.html)
<script>
document.domain = 'domain.com';
// 获取父窗口中变量
alert('get js data from parent ---> ' + window.parent.user);
</script>
弊端:请看下面渲染加载优化

3、nginx 代理跨域

4、nodejs 中间件代理跨域

5、后端在头部信息里面设置安全域名

3、渲染优化

1.禁止使用iframe(阻塞父文档onload事件) - iframe会阻塞主页面的Onload事件; - 搜索引擎的检索程序无法解读这种页面,不利于SEO; - iframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载。 使用 iframe 之前需要考虑这两个缺点。如果需要使用 iframe,最好是通过 javascript 动态给 iframe 添加 src 属性值,这样可以绕开以上两个问题。

2.禁止使用gif图片实现loading效果(降低CPU消耗,提升渲染性能);

3、使用CSS3代码代替JS动画(尽可能避免重绘重排以及回流);

4、对于一些小图标,可以使用base64位编码,以减少网络请求。但不建议大图使用,比较耗费CPU;小图标优势在于: - 1.减少HTTP请求; - 2.避免文件跨域; - 3.修改及时生效;

5、页面头部的 会阻塞页面;(因为 Renderer进程中 JS线程和渲染线程是互斥的);

6、页面头部 会阻塞页面;(因为 Renderer进程中 JS线程和渲染线程是互斥的);

7、页面中空的 href 和 src 会阻塞页面其他资源的加载 (阻塞下载进程);

8、网页Gzip,CDN托管,data缓存 ,图片服务器;

9、前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数

10、用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。

11、当需要设置的样式很多时设置className而不是直接操作style。

12、少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。

13、避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。

14、图片预加载,将样式表放在顶部,将脚本放在底部 加上时间戳。

15、 避免在页面的主体布局中使用table,table要等其中的内容完全下载之后才会显示出来,显示比div+css布局慢。

对普通的网站有一个统一的思路,就是尽量向前端优化、减少数据库操作、减少磁盘IO。

向前端优化指的是,在不影响功能和体验的情况下,能在浏览器执行的不要在服务端执行,能在缓存服务器上直接返回的不要到应用服务器,程序能直接取得的结果不要到外部取得,本机内能取得的数据不要到远程取,内存能取到的不要到磁盘取,缓存中有的不要去数据库查询。

减少数据库操作指减少更新次数、缓存结果减少查询次数、将数据库执行的操作尽可能的让你的程序完成(例如join查询)

减少磁盘IO指尽量不使用文件系统作为缓存、减少读写文件次数等。

程序优化永远要优化慢的部分,换语言是无法"优化"的。

4、事件的各个阶段

1:捕获阶段 ---> 2:目标阶段 ---> 3:冒泡阶段
document   ---> target目标 ----> document
由此,addEventListener 的第三个参数设置为 true 和 false 的区别已经非常清晰了: - true 表示该元素在事件的"捕获阶段"(由外往内传递时)响应事件; - false 表示该元素在事件的"冒泡阶段"(由内向外传递时)响应事件。

6、箭头函数

语法比函数表达式更短,并且不绑定自己的 this,arguments,super 或 new.target。这些函数表达式最适合用于非方法函数,并且它们不能用作构造函数。

15、实现多行文本溢出显示...

效果: img 实现方法:

display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
适用范围: 因使用了WebKit的CSS扩展属性,该方法适用于WebKit浏览器及移动端; 注: 1、-webkit-line-clamp 用来限制在一个块元素显示的文本的行数。 为了实现该效果,它需要组合其他的WebKit属性。常见结合属性: 2、display: -webkit-box; 必须结合的属性,将对象作为弹性伸缩盒子模型显示 。 3、-webkit-box-orient 必须结合的属性,设置或检索伸缩盒对象的子元素的排列方式 。 如果你觉着这样还不够美观, 那么就接着往下看效果: img 这样 是不是你想要的呢? 实现方法:
div {
  position: relative;
  line-height: 20px;
  max-height: 40px;
  overflow: hidden;
}
div:after {
  content: "..."; position: absolute; bottom: 0; right: 0; padding-left: 40px;
  background: -webkit-linear-gradient(left, transparent, #fff 55%);
  background: -o-linear-gradient(right, transparent, #fff 55%);
  background: -moz-linear-gradient(right, transparent, #fff 55%);
  background: linear-gradient(to right, transparent, #fff 55%);
}
不要只顾着吃,要注意胃口,此方法有个弊端 那就是 【未超出行的情况下也会出现省略号】 ,这样会不会很挫!!! 没办法,只能结合JS 进行优化该方法了。 注: - 1、将height设置为line-height的整数倍,防止超出的文字露出。 - 2、给p::after添加渐变背景可避免文字只显示一半。 - 3、由于ie6-7不显示content内容,所以要添加标签兼容ie6-7(如:…);兼容ie8需要将::after替换成:after。

17、盒子垂直水平居中

这个问题好像面试必问的吔!反正我是必问的,哈哈!!! 其实无关多少种实现思路,只要你能实现就可以! 提供4种方法: - 1、定位 盒子宽高已知, position: absolute; left: 50%; top: 50%; margin-left:-自身一半宽度; margin-top: -自身一半高度; - 2、table-cell布局 父级 display: table-cell; vertical-align: middle; 子级 margin: 0 auto; - 3、定位 + transform ; 适用于 子盒子 宽高不定时; (这里是本人常用方法)

position: relative / absolute;
/*top和left偏移各为50%*/
   top: 50%;
   left: 50%;
/*translate(-50%,-50%) 偏移自身的宽和高的-50%*/
transform: translate(-50%, -50%); 注意这里启动了3D硬件加速哦 会增加耗电量的 (至于何是3D加速 请看浏览器进程与线程篇)
- 4、flex 布局
父级: 
/*flex 布局*/
display: flex;
/*实现垂直居中*/
align-items: center;
/*实现水平居中*/
justify-content: center;
再加一种水平方向上居中 :margin-left : 50% ; transform: translateX(-50%);


Last update: December 12, 2023