一些琐碎的前端知识点

如何去除inline-block的间隙

描述:在html中,如果有几个inline-block的元素并排出现,同时他们之间有空格或者换行,那么在页面展示中就会出现若干像素的间隙。html代码如下:

// li是inline-block元素
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
</ul>

那么有什么办法解决呢?
1.html中移除空格和换行

<ul>
    <li>1</li
    ><li>2</li
    ><li>3</li>
</ul>

或者

<ul>
    <li>1
    <li>2
    <li>3</li>
</ul>

当然这个方法的最大问题就是破坏了html的排版,不推荐

2.使用margin负值

ul li{
    display: inline-block;
    margin-left: -4px;
}

但是,inline-block的间隙在不同浏览器下的大小是不一致的,如图:


不同浏览器下的间隙大小

因此这个方法不适合大规模使用

3.使用font-size:0

ul{
    font-size:0;
}
li{
    font-size:12px;
}

这个方法是最普遍的

4.使用letter-spacing或word-spacing

ul{
    letter-spacing:-3px;
}
li{
    letter-spacing:0;
}

这个方法也很最普遍

CSS有哪些选择器

CSS主要有四种选择器:

  • id选择器
  • 类选择器
  • 标签选择器
  • 伪类选择器

基于以上四种可以组合成其他形式的选择器,比如:

  • 后代选择器: 父代名 后代名 { 属性名:属性值; }
  • 子代选择器: 父代名>子代名 { 属性名:属性值; }
  • 群组选择器: #name1, .name2, #name div { 属性名:属性值; }

原生ajax

var xhr
if(window.XMLHttpRequest){
    xhr = new XMLHttpRequest()
}else if(window.ActiveXObject){
    xhr = new ActiveXObject('Microsoft.XMLHTTP')
}
xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
        if(xhr.status == 200){
            // ...
        }else{
            // ...
        }
    }
}
// true -> async
xhr.open('GET', url, true)
// if POST, data in send
xhr.send(null)

实现上拉加载,下拉刷新

要实现这个功能的关键在于页面需要监听touchstarttouchmovetouchend事件,即:

// window 或 某个元素
window.addEventListner('touchmove', functinon(e){
  var touch = e.targetTouches[0]
  var x = touch.pageX
  var y = touch.pageY
  // 依据xy来决定是否执行什么事件
})

网页性能优化有哪些呢?

其实有很多,雅虎为我们总结了性能优化的34黄金法则,可以戳这里
能答出八条左右就够了。

  • 减少网络请求
  • 使用CDN
  • Gzip压缩传输文件
  • 添加Expires or Cache-Control头部
  • 样式文件放入head标签中
  • 脚本放在body标签底部
  • 避免CSS表达式
  • 使用外部js或css文件(缓存)
  • 压缩js或css文件
  • ...

a链接target

<a href="javascript:void 0;" target="_blank">链接</a>

在Firefox浏览器和IE浏览器下,点击链接后仍然会新开一个空页面。而在其他浏览器下则不会跳转。如果禁止跳转,则需要执行:

e.preventDefault()

如果写了javascript:void 0;就去掉target="_blank"

钩子函数/程序

钩子实际上是一个处理消息的程序段,每当特定的消息或数据发出时,在没有到达目的程序前,钩子会先获得消息或数据,即钩子会先获得控制权。这时钩子程序可以加工处理数据,也可以不作任何处理继续传递消息,还可以强制结束消息的传递。

input与textarea的区别

在form表单中,inputtextarea是常见的输入文本信息的输入框。他们在功能上有很多相同地方,但是他们的最重要区别是:input无法处理自动换行,而textarea可以。即当输入的内容超过input的宽度时,它不会换行,而是继续在一行中输入。因此input不能存储换行符,textarea可以存储换行符。所以这决定了他们的应用场景,通常对于输入较短的内容时使用input,而需要输入大段的或需要存储换行符时,使用textarea。

表单中的input和textarea
Post提交后对数据的encode

其他不同点:
1.input标签是自闭合的,textarea则需要成对出现
2.input标签的value值放在里面,如<input name="age" value="28" id="" />
textarea标签的内容则是写在标签之间的<textarea>我是一段文本</textarea>

HTML可编辑属性contenteditable

今天无意中看到一个面试题:使用div来模拟textarea的功能。乍看感觉有点匪夷所思,之前一直以为表单元素才是可以编辑,难道div也可以编辑吗?原来在HTML5中提供一个全局的属性:contenteditable。当这个属性出现在一个标签上时,浏览器会修改元素的部件以允许编辑。面试题考察的就是对H5新特性的使用度。
张鑫旭的一篇博文 - div模拟textarea文本域轻松实现高度自适应就讲到了这个问题

字号与行距

用一张图解释两个事物:

字号与行距

一般而言,页面上设置字体大小以后,图中橙色线间距也就是字体大小了。但有些字体不是这样的,它们会比字体大小多出一些。原因是什么呢?
这需要从字体设计说起,先看一个字体的一些参数:
关键参数

其中ascender到descender的距离就是font-size的大小。在字体设计中,有一个设计参数Units Per Em,一般为了计算比率方便,设计师会把它定位1000unit,如下图所示:
image.png

那么一般ascender到descender的距离为1000才是合理,但是有时候设计师就会设计的比1000大,相应,它就会被撑开。
比如,ascender - descender = 1200font-size: 20px,那么它的实际大小是1200/1000 * 20 = 24px

字体的大小问题,就可以解释了页面上有的元素莫名其妙被撑开了。
原文地址

<==================华丽的分割线========================>

Blob对象

一个 Blob对象表示一个不可变的, 原始数据的类似文件对象。Blob表示的数据不一定是一个JavaScript原生格式。 File 接口基于Blob,继承 blob功能并将其扩展为支持用户系统上的文件。

定义上说File对象的基础是Blob对象,即接受Blob对象的APIs也被列在 File文档中。

从Blob中读取内容的唯一方法是使用 FileReader。以下代码将 Blob 的内容作为类型数组读取:

var reader = new FileReader();
reader.addEventListener("loadend", function() {
   // reader.result contains the contents of blob as a typed array
});
reader.readAsArrayBuffer(blob);

<==================华丽的分割线========================>

解释器执行代码时的违描述

1.寻找调用函数的代码
2.在执行函数代码前,创建执行上下文
3.进入创建阶段

  • 初始化作用域链
  • 创建变量对象
    创建参数对象,检查参数的上下文,初始化其名称和值并创建一个引用拷贝
  • 扫描上下文中的函数声明
    对于每个被发现的函数,在变量对象中创建一个和函数名同名的属性,这是函数在内存中的引用
    如果函数名已经存在,引用会被覆盖
  • 扫描上下文中的变量声明
    对于每个被发现的变量声明,在变量对象中创建一个同名属性并初始化至为undefined
    如果变量名在变量对象中已经存在,什么都不做,继续扫描

4.确定上下文中的"this"
5.即获/代买执行阶段

  • 执行/在上下文中解释函数代码,并在代码逐行执行时给变量赋值

看个例子:

function foo(i) {
    var a = 'hello';
    var b = function privateB() {

    };
    function c() {

    }
}

foo(22);

在调用foo(22),创建阶段看起来像是这样:

fooExecutionContext = {
    scopeChain: { ... },
    variableObject: {
        arguments: {
            0: 22,
            length: 1
        },
        i: 22,
        c: pointer to function c()
        a: undefined,
        b: undefined
    },
    this: { ... }
}

你可以发现, 创建阶段 掌管着属性名的定义,而不是给它们赋值,不过参数除外。 一旦 创建阶段 完成之后,执行流就会进入函数中。 在函数执行完之后,激活 / 代码 执行阶段 看起来像是这样:

fooExecutionContext = {
    scopeChain: { ... },
    variableObject: {
        arguments: {
            0: 22,
            length: 1
        },
        i: 22,
        c: pointer to function c()
        a: 'hello',
        b: pointer to function privateB()
    },
    this: { ... }
}

<==================华丽的分割线========================>

localStorage的一些用法

原文地址:http://mp.weixin.qq.com/s/vy7pRk97T7SN7Jc-uI_smQ
1.存储一些持久化的数据(基本用法)
2.缓存静态文件(比较复杂,不太推荐)
3.同源窗口通信(同源窗口监听storage事件等)
4.作为前端DB的存储介质
5.表单自动持久化

<==================华丽的分割线========================>

new关键词干了些什么

1.声明一个中间对象;
2.将该中间对象的原型指向构造函数的原型;
3.将构造函数的this,指向该中间对象;
4.返回该中间对象,即返回实例对象。

伪代码

// 先一本正经的创建一个构造函数,其实该函数与普通函数并无区别
var Person = function(name, age) {
    this.name = name;
    this.age = age;
    this.getName = function() {
        return this.name;
    }
}

// 将构造函数以参数形式传入
function New(func) {

    // 声明一个中间对象,该对象为最终返回的实例
    var res = {};
    if (func.prototype !== null) {

        // 将实例的原型指向构造函数的原型
        res.__proto__ = func.prototype;
    }

    // ret为构造函数执行的结果,这里通过apply,将构造函数内部的this指向修改为指向res,即为实例对象
    var ret = func.apply(res, Array.prototype.slice.call(arguments, 1));

    // 当我们在构造函数中明确指定了返回对象时,那么new的执行结果就是该返回对象
    if ((typeof ret === "object" || typeof ret === "function") && ret !== null) {
        return ret;
    }

    // 如果没有明确指定返回对象,则默认返回res,这个res就是实例对象
    return res;
}

// 通过new声明创建实例,这里的p1,实际接收的正是new中返回的res
var p1 = New(Person, 'tom', 20);
console.log(p1.getName());

// 当然,这里也可以判断出实例的类型了
console.log(p1 instanceof Person); // true

<==================华丽的分割线========================>

ES6箭头函数

  • 不绑定自己的this、arguments、super或new.target
  • 不绑定arguments,即在箭头函数体中无法通过arguments读取到自己的参数,它仅仅是最近封闭范围内引用相同的名称
  • 箭头函数没有prototype属性
  • 箭头函数中,this
    是根据当前的词法作用域来决定的,就是说,箭头函数会继承外层函数调用的this
    绑定(无论this绑定到什么)

为了有意外事情发生,请忘记箭头函数有this和arguments

<==================华丽的分割线========================>

void

void运算符 对给定的表达式进行求值,然后返回underfined
主要用途:
1.返回undefiend
经常在JS代码中获得全局变量undefined,就可以用void(0)

void(0) === undefined

2.Javascript URIs
当用户点击一个以javascriot:URI时,浏览器会对冒号后面的代码求值,然后把求值结果显示在页面上,这时页面基本上是一大片空白,这通常不是我们想要的。只有当返回结果是undefined时,浏览器才不会做这件傻事。于是我们用void(0)来实现这个需求。

<a href="javascript:void(0);"></a>

//推荐使用, 少几个字符嘛
<a href="javascript:;"></a>

<==================华丽的分割线========================>

RESTful架构

Representational State Transfer
1.每个URI定位一种资源;
2.客户端与服务器之间以某种表现形式传递资源;
3.客户端通过HTTP的四个动词(GET,POST,PUT,DELETE)对服务器端资源进行操作,实现表现层状态转化

符合以上标准的架构可以认为是RESTful架构

误区:
1.由于URI是用于定位一种资源,可以认为是资源的唯一标识,因此设计URI时,不应该出现动词;
2.对资源的限定条件,应该以search形式追加到URI中,如:api.xxx.com/imgs?size=1000&limit=10
3.对资源表现层的限定,也可以在请求报文头部信息中说明:

accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

<==================华丽的分割线========================>

attribute 与 property

attribute 与 property 都可以叫“特性”,也都可以叫“属性”

区别:
从 HTML 到 DOM 元素,一种是声明式的语言,一种是命令式语言。attribute 是直接收集 HTML 中的属性转为 js 对象,对象的 value 最接近原生态,也就是 HTML 标记里面的样子;property 也是转为 js 对象,但是转化的过程中会对 value 做一些处理,将 value 转为对 js 来说更有意义的值。
如:

<input type="checkbox" checked="checked" />

elem.getAttribute("checked”) // “checked”,原生态的值
elem.checked // true,对 js 来说更有意义的值

<==================华丽的分割线========================>

babel转es6至es5在IE8下运行有bug

关于default的问题:
由于 IE8 中不支持 default 做 key,这个暂时无解。
不过你暂时可以这样,不使用 export default,改用传统的 module.exports =。
引用时使用 import 或 require 均可

<==================华丽的分割线========================>

es5-shim 与 es5-sham的区别

shim: ES5中有的方法可以通过其他旧的JS代码模拟出来,那么shim的作用就是用ES3的代码去实现ES5中才有API。
如数组中的一些方法就可以完美模拟,(forEach, indexOf, some等)

sham: 当然有些ES5的API用ES3代码不能完美模拟出来,因此sham尽量模拟出来,起码不会有致命错误。但是最后结果对不对,那就管不着了。
如Object中的一些方法,如Object.creat, Object.defineProperty.

具体有哪些可以访问这里

那么引申出另一个问题,shim与polyfill有什么区别呢?
shim在英文中意思是硬垫片(铁的或者木头的),而polyfill在英文中意思是软垫片(棉花或聚酯类)
引申到JS中:
shim在旧浏览器中以强硬的手段模拟行为,比如jQuery的ajax,就是将XHR和ActiveXObject整合一起,这样保证在浏览器中请求行为是一致的。因此shim不会遵循标准,而是自己实现的
polyfill则是在旧浏览器中使用ActiveXObject模拟出window.XMLHttpRequest,尽量保持和标准一致

持续更新中...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 原文: https://github.com/ecomfe/spec/blob/master/javascript...
    zock阅读 3,343评论 2 36
  • 美国costco第二大超市要来中国了 中国是一个很大的市场,世界各国的人们都可以来投资、创业。不仅带来了新的思想、...
    子画画阅读 2,072评论 3 0
  • 今天读书读到香菱学诗一章,不禁感叹她就是这本书中最闪亮的女子,富贵小姐从丢失到贩卖,期间受尽痛苦折磨自不必说,然而...
    蝴蝶王妃阅读 348评论 0 5