如果还想做 PC 端页面的响应式适配,也就是让页面在不同的分辨率拥有不同的样式,除了类似 Bootstrap 中的“十二栅格”,还有就是媒体查询了,可以使用 CSS 中的媒体查询功能,来匹配不同宽度页面下的样式,例如:
1 2 3 4 5
@media all and(max-width: 768px) { /* 以下样式在所有设备中最大支持到宽度为768px,超过便失效 */ body { font: bold 12px/1.6'微软雅黑'; } }
媒体查询是非常好用的,但是缺点是如果支持的分辨率太多,那就需要写很多的样式才行,比较麻烦。
如果是以小屏设备(主要是手机)为主,但是手机分辨率太多,这时可以使用 em 单位或 rem 单位。这两个长度单位会根据设置好的与像素的比例,在不同的页面宽度中,保持相同比例的像素大小。em 单位比较繁琐,因为它的大小是基于父元素文字大小的,如果层级过多,将会涉及大量的计算,一般不推荐使用;而 rem 的大小,是基于根元素的文字大小,这就比较统一且好算,一般将首要的支持设备页面中(或设计图的大小),根元素文字大小设置为 100px 是最好用的了,不设置为 10px 可以避免很多麻烦哟!
!function (n) { var e = n.document, t = e.documentElement, o = "orientationchange"in n ? "orientationchange" : "resize", a = function () { var n = t.clientWidth || 360; t.style.fontSize = n / 360 * 100 + "px"; }; if (e.addEventListener) { n.addEventListener(o, a, !1); e.addEventListener("DOMContentLoaded", a, !1); } }(window);
浏览器需要知道这个 URL 中包含的域名对应的服务器 IP,那么首先要对域名进行 DNS 解析:浏览器对自己的 DNS 缓存、操作系统的 DNS 缓存以及操作系统的 hosts 文件逐个进行搜索,看看有没有这域名对应的 IP 地址,有便停止搜索,没有便通知操作系统发送一个 DNS 请求到本地的 DNS 服务器,DNS 服务器将解析的 IP 地址返回给操作系统,操作系统缓存一份,然后给浏览器,浏览器也缓存一份,现在浏览器得到了域名对应的 IP 地址。
得到 IP 后,浏览器便通知主机(你的电脑)开始与服务器通过 TCP 协议建立连接,这个过程分三步,又称为“三次握手”:
window.NodeUp = function (nodeOrSelector) { var nodes = {length: 0}; if (typeof nodeOrSelector === 'string') { nodeOrSelector = document.querySelectorAll(nodeOrSelector); for (var i = 0; i < nodeOrSelector.length; i++) { nodes[i] = nodeOrSelector[i]; nodes.length++; } } elseif(nodeOrSelector instanceof Node) { nodes[0] = nodeOrSelector; nodes.length++; } nodes.addClass = function (classes) { var isArr = Array.isArray(classes); for (var i = 0; i < nodes.length; i++) { if (!isArr) { nodes[i].classList.add(classes); } else { for (var j = 0; j < classes.length; j++) { nodes[i].classList.add(classes[j]); } } } }; nodes.setText = function (text) { if (text) { if (!(typeof text === 'string')) { return; } for (var i = 0; i < nodes.length; i++) { nodes[i].textContent = text; } } else { var str; for (var j = 0; j < nodes.length; j++) { str += nodes[j].textContent; } return str; } } return nodes; };
window.$ = NodeUp;
上面的简单例子中,如果把 NodeUp 改成 jQuery,可以吗?当然……参数接收一个字符串选择器或者 DOM 对象,就会返回一个新的对象,这个新对象函数中已经被添加了新的属性和方法;当传入某个参数使其实例化后,这个实例对象,就可以使用这些新属性和方法了。
如果简化了代码可能会觉得哪里不对,其实是因为忽略了实例化时传入参数的过程,例如下面的简化例子:
1 2 3 4 5 6 7 8 9 10 11 12 13
window.NodeUp = function (node) { return { next: function () { return node.nextSibling; }, addClass: function (class) { node.classList.add(class); } } }
var nodeUp = NodeUp(testObj); nodeUp.addClass('test');
上面代码中的 NodeUp 返回的是一个拥有两个方法的对象,那么这个对象是包装后的 DOM 对象吗?不是。当 NodeUp 实例化时,不管有没有参数传入,实例化对象都可以使用这两个方法;只不过这两个方法又依赖于传进来的参数,也就是需要一个 DOM 对象,所以实例化后,就看起来好像是传入的这个 DOM 对象拥有了这两个方法,其实并不是,只是通过参数来告诉函数,调用这两个方法的时候,要施加给谁;而前面较为复杂的那段代码,才是真正的把方法添加给了包装后的 DOM 对象。要想证明这点很简单,上个例子中的对象可以剥离出 DOM 对象,而这个例子中的对象是不行的。