网站软件开发好学吗吗?怎么学?

网页设计怎么学?有前途吗_百度知道
网页设计怎么学?有前途吗
我有更好的答案
要学这么多东西啊?。学习到一定程度之后。(以前经常看见有人:另外一类东西叫CMS就是网站内容管理系统,一套网站管理系统,根据选择的语言找一款对应的好上手的IDE环境就可以了,高手们经常炫耀说只要&记事本&quot。根据你自己的需要去选择去学习吧,看个人能力了.囧当然,你还需要一个网页开发工具,还是匿了.,形成一套自己的开发流程,这样才能有饭吃..是英文的;后台指的是动态网页+数据库方面的内容主要实现网页与用户的交互功能;以前还有一个方向叫做RIA当时主要用Flash来开发动态效果丰富的交互界面web应用程序,这样做事情就不会手忙脚乱了。总之,选择了这条道路就要有长期抗战的准备,几乎天天都在技术进步和更新。乱写一气,精华帖子比较多?目前中国国情就是这样,一个人要身兼数职,对初学者绝对是精华了,高手跳过此步)2.CSND这里学习氛围挺浓,高手深藏不漏哦问问题经常能得到很多回复。如果学前台设计,那就要到专业的PS或AI论坛学习了,国内著名的几个设计论坛都可以去混混,多看看别人的东西;这里是比较权威的网页学习网站,但是,开了PS开了DW开了Flash开了数据库管理系统开了web应用开发环境真叫手忙脚乱啊)也许看过以后感觉很囧,直接在后台写文章,做一套模板前台就能生成整套网站,作为应用级别的,这种来得最快,人家把知识全装到脑子里面了,仅供参考吧,看看主流的一些开发流程!再者就是收集素材,日积月累吧,别小看收集素材,也是提高审美的一种手段;当然你如果是写web程序的,收集别人的经典代码、教程也是自我积累的好方法!确定一个方向以后开始安排学习!(作为一个全面的web人才,各个方面都可以学一些,这要根据你选择的方向有针对性的挑选,不能只是看看,一定要亲手操作操作,积累再积累,到了一定程度你就会爆发了呵呵,那个方面多少都要会一点。忘记了一点,同时你也可以,经常浏览论坛看看别人遇到哪些问题;貌似随着Ajax的出现打破了,RIA有了新的发展方向。本人了解的东西比较少。国外都是每个人学一样,有人专门做平面设计然后有人专门做成符合标准的DIV+CSS网页然后有人专门做数据库再有人专门做web程序国内这样专业分工的公司可不多!很重要的一点就是:加入专业论坛,基础中的基础HTML,别小看这个东西,很多做网页的人都没有认真仔细学习过HTML这个要学仔细。HTML之后建议系统的了解一下CSS这个在目前是前台开发非常重要的一块。&#47,努力+加油,一定不能手懒,别人写了一个教程,各个语言都有经典的教程和书籍。语言学习的同时要学非常重要的一块,建议不要贪多,选一个方向深入学习,积累的一定程度以后,可以横向扩展学习其他方面的一些东西,这样才会可持续发展!)然后开始从基础学起,你可玩不了这么高级的。语言的学习就因人而异了,每个人的基础程度不同,自己总结一下学习过的软件和知识,上面这么说可能很不全面,如果是做前台,PS肯定要学然后比较大众的是Dreamweaver和Flash如果你是搞web应用程序开发的,但是作为刚开始入门,就是页面做的漂不漂亮,然后是符合web标准:前台设计目前比较多指的是平面方面的设计,有问题可以问问网友,检验检验你自己是否能解决这类问题,对自己的经验积累和提高很有帮助。简单推荐几个学习的地方:1.蓝色理想(老牌基地了;就足够了,入门级别的人千万别这么玩:数据库~~~这个.没什么说的了需要有一个明确的学习路线也就是类似提纲的东西很多人都是这边学一点那边学习一点学了很久都是皮毛上面的毛首先了解一个网页设计的几个方向,自己选一个方向作为自己努力的目标粗浅说一下个人的看法
其实哪个行业做精了都是一样的,总会有一些人说这饱和了 那个饱和了,可那个行业不是也没消失不是,所以按照自己的想法去做,总会有你想要的结果。
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。3,958被浏览522,006分享邀请回答ASP.NET,JSP、Python)等语言,前端开发工程师也需要掌握。前端开发的入门门槛其实很低,与服务器端语言先慢后快的学习曲线相比,前端开发的学习曲线是先快后慢。HTML 甚至不是一门语言,他仅仅是简单的标记语言!CSS 只是无类型的样式修饰语言。当然可以勉强算作弱类型语言。Javascript 的基础部分相对来说不难,入手还算快。也正因为如此,前端开发领域有很多自学成“才”的同行,但大多数人都停留在会用的阶段,因为后面的学习曲线越来越陡峭,每前进一步都很难。Web前端技术有一些江湖气,知识点过于琐碎,技术价值观的博弈也难分伯仲,即全局的系统的知识结构并未成体系,这些因素也客观上影响了“正统“前端技术的沉淀!而且各种“奇技淫巧”被滥用,前端技术知识的传承也过于泛泛,新人难看清时局把握主次。因此,前端技术领域,为自己觅得一个靠谱的师兄,重要性要盖过项目、团队、公司、甚至薪水。另一方面,正如前面所说,前端开发是个非常新的职业,对一些规范和最佳实践的研究都处于探索阶段。总有新的灵感和技术不时闪现出来,例如CSS sprite、负边距布局、栅格布局等;各种JavaScript框架层出不穷,为整个前端开发领域注入了巨大的活力;浏览器大战也越来越白热化,跨浏览器兼容方案依然是五花八门。为了满足“高可维护性”的需要,需要更深入、更系统地去掌握前端知识,这样才可能创建一个好的前端架构,保证代码的质量。随着手持设备的迅猛发展,带动了 HTML5行业标准的快速发展。web领域的技术,大概有10年都没有大的更新了!现在市场很需要优秀的、高级的前端工程师。一方面是因为这是一个比较新的细分行业,而且前端程序员大都自学一部分,知识结构不系统;另一方面,大学里面没有这种课程,最最重要的是:北大青鸟这类培训机构也没有专门的前端工程师的培训课程!!吴亮在《JavaScript 王者归来》第一张的序里面说:大多数程序员认为 Javascript 过于简陋,只适合一些网页上面花哨的表现,所以不愿花费精力去学习,或者以为不学习就能掌握。实际上,一门语言是否脚本语言,往往是她的设计目标决定,简单与复杂并不是区分脚本语言和非脚本语言的标准。事实上,在脚本语言里面,Javascript 属于相当复杂的一门语言,他的复杂度即使放在非脚本语言中来衡量,也是一门相当复杂的语言!Javascript 的复杂度不逊色于 Perl 和 Python!如何学习前端知识? 我们生活在一个充满规则的宇宙里面。社会秩序按照规则运行,计算机语言几乎全部是规则的集合。计算机前辈们定义规则,规则约束我们,我们用规则控制数据。大部分时候,对数据的合理控制,来自于你对规则的掌握。学习 HTML,CSS 应该先跟着书仔细、扎实的学一遍。然后就需要做大量的练习,做各种常规的、奇怪的、大量的布局练习来捆固、理解自己的知识。而学习 Javascript 首先要知道这门语言可以做什么,不能做什么,擅长做什么,不擅长做什么!如果你只想当一个普通的前端程序员,你只需要记住大部分 Javascript 函数,做一些练习就可以了。如果你想当深入了解Javascript,你需要了解 Javascript 的原理,机制。需要知道他们的本源,需要深刻了解 Javascript 基于对象的本质。还需要 深刻了解 浏览器宿主 下 的 Javascript 的行为、特性。因为历史原因,Javascript一直不被重视,有点像被收养的一般! 所以他有很多缺点,各个宿主环境下的行为不统一、内存溢出问题、执行效率低下等问题。作为一个优秀的前端工程师还需要深入了解、以及学会处理 Javascript 的这些缺陷。那么一名优秀的、甚至卓越的 前端开发工程师的具备什么条件?首先,优秀的Web前端开发工程师要在知识体系上既要有广度和深度!做到这两点,其实很难。所以很多大公司即使出高薪也很难招聘到理想的前端开发工程师。技术非黑即白,只有对和错,而技巧则见仁见智。在以前,会一点Photoshop和Dreamweaver的操作,就可以制作网页。现在,只掌握这些已经远远不够了。无论是开发难度上,还是开发方式上,现在的网页制作都更接近传统的网站后台开发,所以现在不再叫网页制作,而是叫Web前端开发。Web前端开发在产品开发环节中的作用变得越来越重要,而且需要专业的前端工程师才能做好。Web前端开发是一项很特殊的工作,涵盖的知识面非常广,既有具体的技术,又有抽象的理念。简单地说,它的主要职能就是把网站的界面更好地呈现给用户。其次,优秀的Web前端开发工程师应该具备快速学习能力。Web发展的很快,甚至可以说这些技术几乎每天都在变化!如果没有快速学习能力,就跟不上Web发展的步伐。前端工程师必须不断提升自己,不断学习新技术、新模式;仅仅依靠今天的知识无法适应未来。Web的明天与今天必将有天壤之别,而前端工程师的工作就是要搞清楚如何通过自己的Web应用程序来体现这种翻天覆地的变化。说到这里,我想起了一个大师说过的一句话:对于新手来说,新技术就是新技术。对于一个高手来说,新技术不过是就技术的延伸。再者,优秀的前端工程师需要具备良好的沟通能力,因为前端工程师至少都要满足四类客户的需求。1、产品经理。这些是负责策划应用程序的一群人。他们会想出很多新鲜的、奇怪的、甚至是不可是实现的应用。一般来说,产品经理都追求丰富的功能。2、UI设计师。这些人负责应用程序的视觉设计和交互模拟。他们关心的是用户对什么敏感、交互的一贯性以及整体的好用性。一般来说,UI设计师于流畅靓丽、但并不容易实现的用户界面,而且他们经常不满前端工程师造成 1px 的误差。3、项目经理。这些人负责实际地运行和维护应用程序。项目管理的主要关注点,无外乎正常运行时间、应用程序始终正常可用的时间、性能和截止日期。项目经理追求的目标往往是尽量保持事情的简单化,以及不在升级更新时引入新问题。4、最终用户。指的是应用程序的主要消费者。尽管前端工程师不会经常与最终用户打交道,但他们的反馈意见至关重要。最终用户要求最多的就是对个人有用的功能,以及竞争性产品所具备的功能。Yahoo 公司 ,YUI 的开发工程师 Nicholas C. Zakas 认为:前端工程师是计算机科学职业领域中最复杂的一个工种。绝大多数传统的编程思想已经不适用了,为了在多种平台中使用,多种技术都借鉴了大量软科学的知识和理念。成为优秀前端工程师所要具备的专业技术,涉及到广阔而复杂的领域,这些领域又会因为你最终必须服务的各方的介入而变得更加复杂。专业技术可能会引领你进入成为前端工程师的大门,但只有运用该技术创造的应用程序以及你跟他人并肩协同的能力,才会真正让你变得优秀。————————————关于书籍:HTML、CSS 类别书籍,都是大同小异,在当当网、卓越网搜索一下很多推荐。如果感觉学的差不多了,可以关注一下《CSS禅意花园》,这个很有影响力。Javascript 的书籍 推荐看老外写的,国内很多 Javascript 书籍的作者对 Javascript 语言了解的都不是很透彻。这里推荐几本 Javascript 书籍:初级读物:《JavaScript高级程序设计》:一本非常完整的经典入门书籍,被誉为JavaScript圣经之一,详解的非常详细,最新版第三版已经发布了,建议购买。《JavaScript王者归来》百度的一个Web开发项目经理写的,作为初学者准备的入门级教程也不错。中级读物:《JavaScript权威指南》:另外一本JavaScript圣经,讲解的也非常详细,属于中级读物,建议购买。《JavaScript.The.Good.Parts》:Yahoo大牛,JavaScript精神领袖Douglas Crockford的大作,虽然才100多页,但是字字珠玑啊!强烈建议阅读。《高性能JavaScript》:《JavaScript高级程序设计》作者Nicholas C. Zakas的又一大作。《Eloquent JavaScript》:这本书才200多页,非常短小,通过几个非常经典的例子(艾米丽姨妈的猫、悲惨的隐士、模拟生态圈、推箱子游戏等等)来介绍JavaScript方方面面的知识和应用方法。高级读物:《JavaScript Patterns 》:书中介绍到了各种经典的模式,如构造函数、单例、工厂等等,值得学习。《Pro.JavaScript.Design.Patterns》:Apress出版社讲解JavaScript设计模式的书,非常不错。《Developing JavaScript Web Applications》:构建富应用的好书,针对MVC模式有较为深入的讲解,同时也对一些流程的库进行了讲解。《Developing Large Web Applications》:不仅有JavaScript方面的介绍,还有CSS、HTML方面的介绍,但是介绍的内容却都非常不错,真正考虑到了一个大型的Web程序下,如何进行JavaScript架构设计,值得一读。要做优秀的前端工程师,还需要继续努力:《高性能网站建设指南》、《Yahoo工程师的网站性能优化的建议》、“YSLOW”性能优化建议、《网站重构》、《Web开发敏捷之道》、“ jQuery 库”、“前端框架”、“HTML5”、“CSS3”。。。 这些都要深入研究!万事开头难!如果你能到这个境界,剩下的路自己就可以走下去了。人们常说:不想当裁缝的司机,不是个好厨师。如果单纯只是学习前端编程语言、而不懂后端编程语言(PHP、,JSP、Python),也不能算作是优秀的前端工程师。在成为一个优秀的前端工程师的道路上,充满了汗水和辛劳。61418 条评论分享收藏感谢收起douban.com/note/512945304/,欢迎建议====================================0基础怎样开始学习做网站?目标读者:完全0基础的人,Rails Girls,想了解技术的同学,产品新人大多数教学, 都太有条理了。先讲概念,
HTML是什么,CSS是什么,HTTP请求是什么....但是一次性听到这么多陌生的概念,很容易晕的。过于抽象了,所以试着写一篇以例子为导向,而不是以概念为导向的介绍,来帮助大家入门Ruby on RailsRuby on Rails是做什么的?做网站的,你知道什么是网站(淘宝,知乎..),Rails能做这些,就行了1. 网站-&网页-&按钮我们要做的是什么?是网站,那么就直接以知乎为例好了这样一个网站,是怎么和“代码”,Rails联系起来的呢?这个太复杂了,我们不如只看他的首页(上图)就拿这个页面来说,他是有3部分构成的,HTML,CSS,JS。不过这样说,依然没有什么用我们只拿出其中的一个按钮,来解释这个概念我应该怎么来写代码,来实现这个按钮?这个时候,就要用到HTML了,代码如此:& button class="sign-button submit" type="submit"&注册知乎&/button&写好以后,生成的就是按钮了(如图)"靠,可是这也差得太远了吧?这两个怎么能是一个东西呢!!",你可能会想但是他的功能,是不是都是一样的呢?(就是点击)这个时候,就用到CSS了。(不要在意代码具体什么意思,知道这是CSS就行了)(至于JS,可以以后再说)上
面想说的就是,我们看到的网页,都是用HTML,CSS,JS写的:HTML来说明这个内容是什么,CSS来让这个内容变好看(How it
looks)。这里说的是按钮,其实,网页上的所有这些文字,标题等等都是这样,都是HTML+CSS+JS写的,如下图的头像,链接等等再举个例子,上面的指向某个问题的链接纯粹的HTML,以及加上CSS来改变他的样子之后小结一下,上面介绍了什么是HTML,CSS,(JS)[如果有任何问题,可以直接提问]2. 难道要重复写很多遍吗?再看知乎里面的“发现”页面,一条一条的“回答”这些“回答“的结构,都是相似的。那是不是,我们的代码就要这样一条一条的写下去呢...?显然,这太麻烦了,所以要用到循环,也就是用编程语言(e.g. Ruby)来做 (e.g for loop )或者,想根据用户登录/未登录的状态,来调整页面的内容这里,知乎对于未登录的用户,会有登录的按钮;登录的用户,则显示消息,头像等等。这就用到了编程的东西(if else判断)[if else, for loop,这些应该还能理解吧?]3. 怎么实现注册功能?上面,我们讲到了看到的网站是如何由代码构成的不过,写到这里,你可能还在想,这不拖拖拽拽就行了吗?e.g. Dreamwaver, front page等软件确实如此。不过,我们怎么实现“用户注册”的功能呢?这个时候,就不仅仅是”循环“、”判断“了。显然,这时候,要涉及到更多更为复杂的逻辑。这个时候,就要用到Rails了,我们要用他来实现——注册、登录的功能,发帖的功能,提问的功能,点赞的功能等等等。所以,Rails(PHP, Python等等)就是用来实现这些“功能的”。这里不再举例子了,因为太复杂,只提几个问题,让大家思考一下,拿论坛发帖子来说:我们怎么实现“创建”一个帖子的功能?又怎么“修改”,怎么“删除”?这下,应该能感到这些功能的复杂了。不过,现在依然不用深究,只要知道Rails是用来处理这些复杂逻辑的东西,就行了(此外,我们有这么多用户的数据,帖子的数据,点赞的数据,就又牵扯到数据库了)。4.
小结到这里,我们主要介绍了:(1) 什么是HTML + CSS +JS (显示网页)(2) 什么是Ruby on Rails (复杂的逻辑功能)前面的,就是我们所说的前端,后者,就是常称的后端如果你下次还有疑问的话,不妨顺着这个思路理一理:(1) “网页是由什么构成的?”(2) “怎么实现注册的过程?”(3) “网站上有这么多数据,怎么保存?”“可是我想要设计一个很漂亮的网站诶.....”,那个是设计师做的对于一个网页来说,设计师决定这个按钮的颜色,阴影,怎样才好看而前端工程师(HTML CSS JS),来负责用代码实现这些东西(写具体的代码)比如设计师说,希望这个按钮是蓝色的,那么工程师就根据这个要求写具体的代码:button {color:blue}
对于小的创业团队来说,可能最开始就直接写代码做完了,不会有专职的设计师5. 那么,我接下来该怎么学习Rails呢?好了,写到这里,应该基本了解什么是Rails了(其实主要介绍的是前端),接下来的问题可能就是:那我应该怎么学会Rails,来自己做网站呢?不过我先写这么多了,如果有足够的人需要的话,再继续写吧注:原标题为Rails in Plain Language,即用浅显的语言,告诉准备学习Rails的同学们,Rails到底是什么。不过本文实际上并没有谈到Rails是什么,更多的写的是前端。因为大多数0基础的同学,并不理解这些,所以先了解一下,我觉得会有帮助。38654 条评论分享收藏感谢收起新手怎么学习网站建设?
稿源:邵连虎博客
大家都知道,想要在网络上发展最好有个网站。可是,自己不会做网站就得找网络公司做,一个得上千,上万的。虽然也有便宜的,但是,网站感觉放在别人那里不放心,还是自己会建站才方便。可是,新手如何学习网站建设呢?
只要做过网站或者想做网站的朋友,我相信大家都想过学习网站建设。可是,还有好多人认为不可能,他们以为网站建设不好学,没有几年的时间是学不好的,而且有的还是上专业的电脑学校学习。其实,这些朋友都想多了。
我开始做网络的时候,看人家都有网站,自己也想当上一名骄傲的站长。可是,那个时候啥也不懂,只有找别人给制作网站。我当时弄了一个营销软件站,一个打码网站。网站做好后,人家就不理我了,有些问题都解决不了。
让别人来做网站,什么信息都是在别人的手里的,你的网站说被人关了就关了了。虽然大多数网络公司不会这样,但是难免会有特殊情况。如果你想长久做网站,你做了几年的网站万一哪天被关了怎么办呢?所以,大家要想长久当站长,最好自己学习网站制作的技术。
我当时想学建站的技术,就在百度搜索一些建站的教程,还自学过编程,什么语言等。可是,这些东西看了糊里糊涂的,最后也坚持不了几天就放弃了。从那后,我就一直想去专业的学校去学习建站技术,当一名IT人员。可是,我们邳州本地没有教的,只有去徐州。
那个时候自己身上没钱,也没钱去学习,我当时就想,先去徐州打工,一边上班一边学习。想是这样想的,后来,有一次和妈吵架,我气的还是跑徐州去了,呆了半天又回来了,还是没有学习。最后,我还是被迫去上班了。业余的时间做网络,开始自学网站建设。
说实话,开始学习建站的时候,啥都听不懂,什么空间,什么域名解析的不明白是啥意思。而且,当时也没有系统的教程,都是这一个教程,那一个教程的。当时可能也有培训的,不过得上千块钱才可以的,我是舍不得花这么多钱学习的。的以,我只有靠自己自学了,自己找一些建站的教程。
当时也巧,找到伟哥的视频教程,他也是卖空间的,我也就买了一个空间。当时伟哥是利为汇的讲师,还自己卖空间。看了伟哥的视频教程,感觉伟哥这人挺好的,所以也买了他的空间。我看了伟哥的教程,再加上其他的教程,三天的时间建立了自己的一个网站。当时,只是建立好,很简单的一些网站。
三天的时间是什么概念,我当时感觉到建站非常的神奇,只需要买几个东西弄下就可以出来一个网站了,也没有像别人说的,得设计网页,得懂代码这些知识。那个时候,我爱上了建站,我就开始用这个空间,找各种各样的源码测试,学习。可以说,当时光是测试我就把所有的网站类型都给做了一遍,只是为了学习。
自学建站一个多月后,我就开始承接建站的业务了。因为我知道,不实践是没有用的,只有要实践中学习才可以的。当时的自己啥了不懂,可是,为了把建站技术学了,我也硬着头皮去给别人做网站。当时建站价格非常便宜,做一个才二三百元,一个才挣一百元,有的做了几天。虽然挣的少,但是却可以学习到建站知识也值得了。
当时做的都是一些打码的网站,非常的简单。后来,我想自己做个论坛玩玩,哪知道花60元买的一个还是免费的DZ程序。既然是免费的,我就让那人教我建设论坛,手把手的教我。自从做了论坛,我才发现我建站知识懂的太少了,好多东西我都不会。看到那人弄论坛,我感觉他非常厉害,啥都懂。做个论坛,跟他学习到很多建站的技巧,非常感谢那人。
五年的时间过去了,想想自己这五年来自学建站的经历真的不容易。没有人教我,没有人指导我,告诉我到底应该怎么一步一步地去学习,所以,我才走了这么多的弯路。而且,在建站的过程中遇到过千千万万个问题,也都是花钱找人帮忙解决的。真的,如果我被一个问题难住了,我的建站生涯早就到头了。正是因为自己肯学,肯钻石,肯解决问题地有今天,才可以想建什么网站就建什么网站。
对于新朋友,如果你也想学习网站建设可以像我一样,自学,可是会浪费很多时间,走很多弯路。其实,最好的办法就是可以加入一些网站建设培训。虽然花钱,但是学习的快一些。
最后,我想和大家说的是,网站建设真的没有大家想的这么简单,不是学会了一些知识就可以建站了。建站,最主要的是学会解决问题的能力。一些基础的知识学会了,我们就需要不断的实践,不断的去解决新问题。不可能遇到点问题就去找别人,这样,你是走不了多远的。什么都得靠自己,如果你已决定,开始学习网站建设吧。
文章:113篇人气:31579
邵连虎,一个自媒体人,专注于互联网创业者及站长,电商,微商方面的研究,各大站长网都有自己的个人专栏。
本网页浏览已超过3分钟,点击关闭或灰色背景,即可回到网页从零学习前端开发从零学习前端开发良心干货、暖心教程、真心分享关注专栏更多前端开发{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\u002Fpay.zhihu.com\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&title&:&从零学习前端开发·目录&,&author&:&yubolun&,&content&:&\u003Ch2\u003E目录\u003C\u002Fh2\u003E\u003Col\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& class=\&internal\&\u003E从零学习前端开发·HTML\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F2F\& class=\&internal\&\u003E从零学习前端开发·CSS\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& class=\&internal\&\u003E从零学习前端开发·JavaScript\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cbr\u003E\u003Cp\u003E从今天开始\u003Cb\u003EiCode\u003C\u002Fb\u003E将会陆续分享一系列有关前端开发的学习资源,整体的内容可以参考:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cblockquote\u003E\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& class=\&internal\&\u003E前端学习路径\u003C\u002Fa\u003E\u003C\u002Fblockquote\u003E\u003Cp\u003E从零学习前端开发系列将会就路径中的每一个知识点再分享更多的资源链接供大家学习,感兴趣的同学们可以将这篇文章加入你的收藏夹,我会在这里同步更新整合所有分享的目录,方便大家随时查阅。\u003C\u002Fp\u003E\u003Cp\u003E每次分享的主要内容包括:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E\u003Cb\u003E推荐书目\u003Cbr\u003E\u003C\u002Fb\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cb\u003E在线课程\u003Cbr\u003E\u003C\u002Fb\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cb\u003E视频教程\u003Cbr\u003E\u003C\u002Fb\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cb\u003E应用推荐\u003Cbr\u003E\u003C\u002Fb\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cb\u003E标准文档\u003Cbr\u003E\u003C\u002Fb\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cb\u003E实践项目\u003C\u002Fb\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E所有的推荐并不一定都要看完,选择自己感兴趣的即可。踏实学习,慢慢积累。推荐中会有相当一部分纯英文的资源,实话实说,英文的教程质量普遍要高于中文教程。\u003C\u002Fp\u003E\u003Cp\u003E总的来说,通过互联网不管学习什么,最好先掌握三样技能:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E英语\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002Fquestion\u002F\& class=\&internal\&\u003E你有什么相见恨晚的英语学习方法\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002Fquestion\u002F\& class=\&internal\&\u003E怎样才能从英语很糟糕的人变成英语很厉害的人\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002Fquestion\u002F\& class=\&internal\&\u003E学习英语给你带来了哪些机会\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fchrome.google.com\u002Fwebstore\u002Fdetail\u002Fgoogle-translate\u002Faapbdbdomjkkjkaonfhkkikfgjllcleb\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EChrome Google 翻译插件,网页划词翻译\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cli\u003E使用搜索引擎\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002Fquestion\u002F\& class=\&internal\&\u003E如何高效地使用搜索引擎\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fwww.jianshu.com\u002Fp\u002Ff35cbc4abe0d\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E编程初学者如何使用搜索引擎\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002Fquestion\u002F\& class=\&internal\&\u003E如何用好Google等搜索引擎\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cli\u003Ekexue上网(知乎不鼓励分享这些内容,需要的自行百度)\u003C\u002Fli\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fgoogle.yubolun.com\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EGoogle Hosts 替换系统hosts文件上谷歌\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003C\u002Ful\u003E\u003Cp\u003E学习使你快乐,编程改变人生\u003C\u002Fp\u003E\u003Cp\u003E最后祝大家学习开心~\u003C\u002Fp\u003E&,&updated&:new Date(&T08:06:59.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:11,&likeCount&:150,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\u002Fpic1.zhimg.com\u002Fafd4014aaed1f0b167ccff_r.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&前端开发&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&前端入门&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&column&:{&slug&:&icode&,&name&:&从零学习前端开发&},&sourceUrl&:&&,&pageCommentsCount&:11,&snapshotUrl&:&&,&publishedTime&:&T16:06:59+08:00&,&url&:&\u002Fp\u002F&,&summary&:&目录\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& data-title=\&从零学习前端开发·HTML\& class=\&\& data-editable=\&true\&\u003E从零学习前端开发·HTML\u003C\u002Fa\u003E \u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F2F\& class=\&\& data-editable=\&true\& data-title=\&从零学习前端开发·CSS\&\u003E从零学习前端开发·CSS\u003C\u002Fa\u003E \u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& class=\&\& data-editable=\&true\& data-title=\&从零学习前端开发·JavaScript - 从零学习前端开发 - 知乎专栏\&\u003E从零学习前端开发·JavaScript\u003C\u002Fa\u003E 从今天开始\u003Cb\u003EiCode\u003C\u002Fb\u003E将会陆续分享一系列有关前端开发的学习资源,整体的内容可以参考: \u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& class=\&\& data-editable=\&true\& data-title=\&前端学习路径\&\u003E前端学习路径\u003C\u002Fa\u003E从零学习前端开发系列将会就路径中的每一个知识点再分享更多的资源链接供大…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentsCount&:11,&likesCount&:150},&&:{&title&:&如何设置 CSS 的外边距和内填充(附布局小技巧)&,&author&:&liangzr&,&content&:&\u003Cblockquote\u003E\u003Cp\u003E原文链接:\u003Ca href=\&https:\u002F\u002Fwww.sitepoint.com\u002Fset-css-margins-padding-cool-layout-tricks\u002F\& data-title=\&How to Set CSS Margins and Padding (And Cool Layout Tricks)\& class=\&\& data-editable=\&true\&\u003EHow to Set CSS Margins and Padding (And Cool Layout Tricks)\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E作者:\u003Ca href=\&http:\u002F\u002FBaljeet%20Rathi,%20Author%20at%20SitePoint\& data-title=\&Baljeet Rathi\& class=\&\& data-editable=\&true\&\u003EBaljeet Rathi\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E译者:\u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fliangzr\u002Factivities\& data-editable=\&true\& data-title=\&砺剑 - 知乎\& class=\&\&\u003Eliangzr\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E转载请注明出处。 \u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Cbr\u003E\u003Cp\u003E刚接触 CSS 时,外边距(margin)和内填充(padding)属性总是让我感到困惑。他们似乎非常相似,并在某些情况下产生的效果是一样的。\u003C\u002Fp\u003E\n\u003Cp\u003E在本文中,您将了解到 CSS 外边距与内填充的差异,以及它们是如何影响网页各个元素之间的空间。我们还将讨论外边距的收缩,使用不同的尺寸单位来创建响应式网站,并总结一些有关内外边距的布局小技巧。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E盒模型 \u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E在 CSS 中以\u003Cb\u003E矩形盒子\u003C\u002Fb\u003E来描述一个元素,这个盒子的尺寸由元素的以下属性决定:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E内容 (content)\u003C\u002Fli\u003E\u003Cli\u003E内填充 (padding)\u003C\u002Fli\u003E\u003Cli\u003E边框 (border)\u003C\u002Fli\u003E\u003Cli\u003E外边距 (margin)\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cimg src=\&v2-53c5a697d3a8c48cc1ec3af03b4246b5.jpg\& data-rawwidth=\&800\& data-rawheight=\&533\&\u003E\u003Cblockquote\u003E下面将用属性名如 padding 而不是内填充来描述这些属性\u003C\u002Fblockquote\u003E\u003Cp\u003E从图中可以看到,元素的 padding 是从\u003Cb\u003E content \u003C\u002Fb\u003E的\u003Cb\u003E外边缘\u003C\u002Fb\u003E延伸到\u003Cb\u003E border \u003C\u002Fb\u003E的\u003Cb\u003E内边缘\u003C\u002Fb\u003E。这个属性主要用来控制元素的 border 和他们 content 之间的距离。应用在一个元素上的\u003Cb\u003E padding \u003C\u002Fb\u003E会影响它在网页上的尺寸,而不会影响不同元素之间的距离。\u003C\u002Fp\u003E\u003Cp\u003E当你想要增加或减少元素之间的距离时,应该用 margin 属性,margin 不会影响元素的大小。\u003C\u002Fp\u003E\u003Cp\u003E元素的盒子有个很重要的点你应该记住,网页上所有盒子的尺寸取决于正在使用的盒模型,有两种不同的盒模型:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003EW3C 盒模型\u003C\u002Fli\u003E\u003Cli\u003E传统盒模型\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fcodepen.io\u002FSitePoint\u002Fpen\u002FEmjXWe\& data-editable=\&true\& data-title=\&Codepen 在线演示:Choosing a Box Model\& class=\&\&\u003ECodepen 在线演示:Choosing a Box Model\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003EHTML\u003C\u002Fp\u003E\u003Ccode lang=\&html\&\u003E&h2&W3C Box Model&\u002Fh2&\n&div class=\&wt-model\&&&\u002Fdiv&\n&h2 class=\&sheading\&&Traditional Box Model&\u002Fh2&\n&div class=\&tr-model\&&&\u002Fdiv&\n\u003C\u002Fcode\u003E\u003Cp\u003ECSS\u003C\u002Fp\u003E\u003Ccode lang=\&css\&\u003Ebody {\n
font-family: L\n
margin: 2\n
font-size: 1.4\n}\n\nh2 {\n
font-size: 1.1\n}\n\n.sheading {\n
margin-top: 60\n}\n\ndiv {\n
background:\n
height: 100\n
width: 400\n
padding: 30\n
border: 25\n}\n\n.wt-model {\n
box-sizing: content-\n}\n\n.tr-model {\n
box-sizing: border-\n}\u003C\u002Fcode\u003E\u003Cp\u003E结果\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&v2-ff1e592af8bf05cb6d31200.png\& data-rawwidth=\&524\& data-rawheight=\&546\&\u003EW3C 盒模型认为元素的宽度(width)等于元素的 content,而不包括它的 padding 和 border, padding 和 border 被添加到元素的外层而无论元素本身有多大,这可能会让你的页面产生一些不可预测的后果。\u003C\u002Fp\u003E\u003Cp\u003E例如,我们有一个 width 和 height 都为 200px、padding 为 10px 以及 border 为 2px 的盒子。浏览器并不简单认为它就是个 200px 大小的盒子,相反,浏览器计算出的最终 width 为 224px: 200(width) + 2(左 border) + 10(左 padding) + 10(右 padding) + 2(右 border) = 224px. 因为这个元素是一个完美的正方形,它的 height 也同样被计算为 224px.\u003C\u002Fp\u003E\u003Cp\u003E再来看另一种,传统盒模型认为元素的 width 等于元素的 content、padding 和 border 之和。在布局时,这意味着如果你的盒子 width 为 200px ,浏览器会计算出它要显示的最终 width 就是 200px,它包括了 padding 和 border。这会产生更可预测的结果,并更容易使用。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&v2-6f728c4ed1d272cc46b0d0ee757e253d.png\& data-rawwidth=\&600\& data-rawheight=\&480\&\u003E默认情况下,所有浏览器都使用 W3C 盒模型。你可以通过设置 box-sizing 属性的值为 content-box(W3C 盒模型)或 border-box(传统盒模型)来选择指定的盒模型。传统的盒模型更直观,是 Web 开发人员中最流行的做法。\u003C\u002Fp\u003E\u003Cp\u003E以下代码可以让你的项目遵循传统盒模型:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ccode lang=\&css\&\u003Ehtml {\n
box-sizing: border-\n}\n\n*, *:before, *:after {\n
box-sizing:\n} \u003C\u002Fcode\u003E\u003Cp\u003E如果你想更深入的了解,可以尝试下 Guy Roluledge 这个有趣的\u003Ca href=\&http:\u002F\u002Fguyroutledge.github.io\u002Fbox-model\u002F\& data-title=\&互动演示\& class=\&\& data-editable=\&true\&\u003E互动演示\u003C\u002Fa\u003E。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E设置 Margins 和 Paddings\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E你可以通过设置 padding-top、padding-right、padding-bottom 和 padding-left 来控制元素四个边的 padding,你还可以使用 padding 简写属性。\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E只有1 个值时,padding 应用于四个边:\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Ccode lang=\&css\&\u003E\u002F* 应用于四个边 *\u002F\npadding: 1\u003C\u002Fcode\u003E\u003Cul\u003E\u003Cli\u003E如果有 2 个值,第一个值确定顶部和底部的 padding,第二个值确定左侧和右侧的 padding:\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Ccode lang=\&css\&\u003E\u002F* 垂直方向| 水平方向*\u002F\npadding: 5% 10%;\u003C\u002Fcode\u003E\u003Cul\u003E\u003Cli\u003E如果有 3 个值,则分别顺序为顶部、水平方向以及底部:\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Ccode lang=\&css\&\u003E\u002F* 顶部| 水平方向| 底部*\u002F\npadding: 1em 2em 2 \u003C\u002Fcode\u003E\u003Cul\u003E\u003Cli\u003E如果有 4 个值时,则顺序为顶部、右侧、底部、左侧:\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Ccode lang=\&css\&\u003E\u002F* 顶部| 右边| 底部| 左边*\u002F\npadding: 2px 1em 0 1\u003C\u002Fcode\u003E\u003Cp\u003E在下面的演示中,橙色背景表示不同元素的 content 区域,border 和 content 之间的白色区域表示每个元素的 padding:\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fcodepen.io\u002FSitePoint\u002Fpen\u002FXRbggY\& class=\&\& data-editable=\&true\& data-title=\&Codpen 在线演示:Setting Paddings\&\u003ECodpen 在线演示:Setting Paddings\u003C\u002Fa\u003E\u003Cbr\u003E\u003Cimg src=\&v2-8383caad9e9edc.png\& data-rawwidth=\&599\& data-rawheight=\&930\&\u003E同理你可以用类似 padding 的方法控制元素四个边的 margin 值。\u003C\u002Fp\u003E\u003Ccode lang=\&css\&\u003E\u002F* 应用于四个边 *\u002F\nmargin: 10\n\n\u002F* 垂直方向| 水平方向*\u002F\nmargin: 2em 4\n\n\u002F* 顶部| 水平方向| 底部*\u002F\nmargin: 2em auto 2\n\n\u002F* 顶部| 右边| 底部| 左边*\u002F\nmargin: 10px 10% 2em 15%;\u003C\u002Fcode\u003E\u003Ch2\u003E\u003Cb\u003E注意事项\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E在使用 padding 和 margin 时,最好不要使用绝对单位(比如 px),这些单位不会自适应字体大小和屏幕的变化。\u003C\u002Fp\u003E\u003Cp\u003E假设你将一个元素的 width 设置为 50%,margin 为 15px。在父元素 width 为 1200px 时(子元素 width 的百分值根据父元素的 width 来确定大小),子元素的 width 为 600px,边距为 15p。然而在 769px 时,子元素的 width 将是 384px,但它的 margin 还是 15px。\u003C\u002Fp\u003E\u003Cp\u003E在这个例子中,元素的宽度改变了 36%,但它的边缘并没有随之改变。多数情况下这不算个大问题,但是使用百分比设置 margin 可以对你的网页有更好的控制,你可以让一切属性随比例变化,而不是忽略掉 margin 和 padding。\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fcodepen.io\u002FSitePoint\u002Fpen\u002FzwGzdJ\& class=\&\& data-editable=\&true\& data-title=\&Codepen在线演示:Setting Margins as Percentage\&\u003ECodepen 在线演示:Setting Margins as Percentage\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E同样你可能希望为网页上的文字元素添加 padding。通常你也会希望 padding 值能与字体大小成比例,绝对单位是无法实现的。但是如果用 em 单位来指定 padding,它就能根据字体大小而改变。\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fcodepen.io\u002FSitePoint\u002Fpen\u002FGmJEOp\& data-editable=\&true\& data-title=\&Right Units for Margins and Padding\& class=\&\&\u003ECodepen 在线演示:Right Units for Margins and Padding\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E浏览器如何计算不同单位的 Margin 和 Padding\u003C\u002Fb\u003E\u003C\u002Fh2\u003E浏览器计算 margin 和 padding 的方式和元素不同。\u003Cp\u003E任何使用百分比来设置的 margin 和 padding 都是根据包含它的元素(父元素)的尺寸来计算的。意思就是说当父元素 width 为 100px 时,5% 的 padding 就是 5px,当父元素为 1000px 时,它就是 50px。同理顶部和底部也是如此。\u003C\u002Fp\u003E\u003Cp\u003E在使用 em 作为单位时,margin 和 padding 的计算是根据元素字体的大小。在前面的 Codepen 演示中,应用于底部的三个文本元素的 padding 都是 1em,然而由于字体大小不同,每次的 padding 也是不同的。\u003C\u002Fp\u003E\u003Cp\u003E另外还有 4 种基于浏览器视窗(viewport)的单位如 vw、vh、vmin 和 vmax。这时 margin 和 padding 的计算是基于 viewport 的。比如 viewport 的 width 为 500px 时,5vw 的 padding 等同于 25px,10vw 就是 50px。你可以在 SitePoint 上的 \u003Ca href=\&https:\u002F\u002Fwww.sitepoint.com\u002Fcss-viewport-units-quick-start\u002F\& class=\&\& data-editable=\&true\& data-title=\&CSS Viewport Units: A Quick Start\&\u003ECSS Viewport Units: A Quick Start\u003C\u002Fa\u003E 文章中了解更多。\u003C\u002Fp\u003E\u003Cp\u003E作为一个初学者,了解这些不同的单位如何工作可以帮助你快速了解为了 HTML 元素的 padding 和 margin 根据父元素的大小、字体大小甚至是浏览器视窗而改变,这能让你更好的控制页面布局。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E处理 Margin \u003C\u002Fb\u003E\u003Cstrong\u003E塌陷\u003C\u002Fstrong\u003E\u003C\u002Fh2\u003E\u003Cp\u003E在某些情况下,两个元素顶部和底部的 margin 会合并成一个,这种现在叫 margin \u003Cstrong\u003E塌陷\u003C\u002Fstrong\u003E。\u003C\u002Fp\u003E\u003Cp\u003E假设你有两个并排的同级元素,如果第一个元素的 margin-bottom 设置为 40px,而第二个元素的 margin-top 设置为 25px,则最终两个元素之间的间距不会是 65px。实际值将取值较大者,也就是 40px。\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fcodepen.io\u002FSitePoint\u002Fpen\u002FaWOwVQ\& class=\&\& data-editable=\&true\& data-title=\&Codepen 在线演示:Collapsing Margins - Adjacent Siblings\&\u003ECodepen 在线演示:Collapsing Margins - Adjacent Siblings\u003C\u002Fa\u003E \u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E同样,margin 也可以在父元素与第一个\u002F最后一个元素之间发生塌陷。这会在没有 border、padding 以及内联元素来分离父子元素的对应 margin 时触发。在这种情况下,如果父元素没有 padding 或 border,则子元素的 margin 看起来像从父元素里溢出来一样。\u003C\u002Fp\u003E\u003Cp\u003E避免这种情况的一种方法是在父元素和边缘和子元素的边缘增加一个障碍,可以使用 border 或 padding 来实现。演示如下:\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fcodepen.io\u002FSitePoint\u002Fpen\u002FpPJwpd\& class=\&\& data-editable=\&true\& data-title=\&Codepen 在线演示:Collapsing Margins - Parent and First Child\&\u003ECodepen 在线演示:Collapsing Margins - Parent and First Child\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E在 margin 为负的情况下,margin 塌陷的最终值为最大正值 margin 和最小负值 margin 之和。\u003C\u002Fp\u003E\u003Cp\u003E你可以阅读 Adam Roberts 的 \u003Ca href=\&https:\u002F\u002Fwww.sitepoint.com\u002Fweb-foundations\u002Fcollapsing-margins\u002F\& data-editable=\&true\& data-title=\&Collapsing Margins\& class=\&\&\u003ECollapsing Margins\u003C\u002Fa\u003E 了解更多。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003EMargin 和 Padding 的有趣小技巧\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E有些时候,你可以使用 CSS margin 和 padding 来解决许多布局问题。如下面几个例子:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E子元素居中\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E在块级元素中,margin 可以很容易的实现水平居中。你需要做的就是设置 margin-left 和 margin-right 属性为 auto。\u003C\u002Fp\u003E\u003Ccode lang=\&css\&\u003E.child {\n
margin: 10\n}\u003C\u002Fcode\u003E\u003Cp\u003E在下面的演示中,你可以看到三个父元素:第一个被设置为块级元素,第二个为内联块元素,第三个是浮动在右侧的块级元素。 \u003C\u002Fp\u003E\u003Cimg src=\&v2-6de0d43cc54.png\& data-rawwidth=\&860\& data-rawheight=\&879\&\u003E\u003Cp\u003E\u003Cb\u003E维持图片比\u003C\u002Fb\u003E例\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E一般情况下,网页上的图片并没有固定的宽高比。如果你一定要让所有的图片都有相同的宽高比,CSS 可以帮助你实现。\u003C\u002Fp\u003E\u003Cp\u003E这个小技巧就是将父元素的 height 值设置为 0,并且设置 padding-top 值设置为想要实现的宽高比。\u003C\u002Fp\u003E\u003Cp\u003E例如,实现 16 : 9 的宽高比可以设置:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Epadding: 56.25% 0 0 0\u003C\u002Fcode\u003E\u003Cp\u003E这个 56.25% 是能过 16 \u002F 9 计算得出的,可以计算百分比来实现你需要的比例。\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fcodepen.io\u002FSitePoint\u002Fpen\u002FOmVgvR\& data-editable=\&true\& data-title=\&Codepen 在线演示:Maintaining Image Aspect Ratio\& class=\&\&\u003ECodepen 在线演示:Maintaining Image Aspect Ratio\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&v2-f7c1d4ffbbb3.png\& data-rawwidth=\&527\& data-rawheight=\&406\&\u003E你可以阅读 Craig Buckler 的 \u003Ca href=\&https:\u002F\u002Fwww.sitepoint.com\u002Fmaintain-image-aspect-ratios-responsive-web-design\u002F\& class=\&\& data-editable=\&true\& data-title=\&aspect ratios in responsive web design\&\u003E How to Maintain Image Aspect Ratios in Responsive Web Design\u003C\u002Fa\u003E 了解更多。\u003C\u002Fp\u003E\u003Cp\u003E关于 margin 和 padding 还有更高级的技巧,比如创建\u003Ca href=\&https:\u002F\u002Fcss-tricks.com\u002Ffull-width-containers-limited-width-parents\u002F\& data-title=\&在有限宽度和父元素中创建全宽的子容器\& class=\&\& data-editable=\&true\&\u003E在有限宽度和父元素中创建全宽的子容器\u003C\u002Fa\u003E,或是\u003Ca href=\&https:\u002F\u002Fcss-tricks.com\u002Fspacing-the-bottom-of-modules\u002F\& data-title=\&在页面上不同模块的底部添加一致的间距\& class=\&\& data-editable=\&true\&\u003E在页面上不同模块的底部添加一致的间距\u003C\u002Fa\u003E。你可以考虑学习这些内容来进阶你的 CSS 水平。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E结论\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E如果你刚刚接触 CSS,希望本教程可以帮你了解 margin 和 padding 之间的差异。你应该学会使用简写语法以及以适当的单位设置 margin 和 padding。在最后一节,我提到了一些布局小技巧,并指出了更多的资源以了解更多。\u003C\u002Fp\u003E\u003Ch2\u003E相关学习资源链接\u003C\u002Fh2\u003E\u003Col\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fdeveloper.mozilla.org\u002Fzh-CN\u002Fdocs\u002FWeb\u002FCSS\u002FCSS_Box_Model\& class=\&\& data-editable=\&true\& data-title=\&CSS 盒模型\&\u003ECSS 盒模型\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fcss-tricks.com\u002F\& class=\&\& data-editable=\&true\& data-title=\&CSS-Tricks\&\u003ECSS-Tricks\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E&,&updated&:new Date(&T03:41:34.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:8,&likeCount&:62,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T11:41:34+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-bbe9c2f201b605d025622e_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:8,&likesCount&:62},&&:{&title&:&2017最火 Web 技术栈,都有谁在用,以及你应该学什么?&,&author&:&yubolun&,&content&:&\u003Cblockquote\u003E\u003Cp\u003E作者:\u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fyubolun\& data-editable=\&true\& data-title=\&余博伦\&\u003E余博伦\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E转载请提前沟通并注明出处\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Cp\u003E这几天陆续有同学问我:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E大公司一般使用什么服务器操作系统?\u003C\u002Fli\u003E\u003Cli\u003E现在React\u002FVue这些框架这么火,到底都有谁在用?\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E空口无凭,我们还是拿数据来说话,本文所有统计结果都来自 \u003Ca href=\&https:\u002F\u002Fwappalyzer.com\u002F\& data-editable=\&true\& data-title=\&Wappalyzer\&\u003EWappalyzer\u003C\u002Fa\u003E.\u003C\u002Fp\u003E\u003Ch2\u003EJavaScript 框架\u003C\u002Fh2\u003E\u003Cimg data-rawwidth=\&1177\& data-rawheight=\&1001\& src=\&v2-fb7c64a303dfbfd237578.png\&\u003E\u003Cp\u003E最火的依旧是 \u003Ca href=\&https:\u002F\u002Fjquery.com\u002F\& data-editable=\&true\& data-title=\&jQuery\&\u003EjQuery\u003C\u002Fa\u003E, 并且以52%的比例占据着绝对的统治地位。目前流行的三大框架 React\u002FVue\u002FAngular 唯一上榜的是 React.\u003C\u002Fp\u003E\u003Cp\u003E使用 React 的站点超过了使用 Vue 站点两位数(前者有1,600,000+,后者49,000+)。\u003C\u002Fp\u003E\u003Cp\u003E国内使用 React 最大的站点是 \u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002F\& data-editable=\&true\& data-title=\&知乎\&\u003E知乎\u003C\u002Fa\u003E 还有 \u003Ca href=\&https:\u002F\u002Fwww.airbnbchina.cn\u002F\& data-editable=\&true\& data-title=\&Airbnb爱彼迎\&\u003EAirbnb爱彼迎\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E使用 Vue 最大的站点是 \u003Ca href=\&http:\u002F\u002Fwww.jianshu.com\u002F\& data-editable=\&true\& data-title=\&简书\&\u003E简书\u003C\u002Fa\u003E 和 \u003Ca href=\&http:\u002F\u002Fwww.oschina.net\u002F\& data-editable=\&true\& data-title=\&开源中国\&\u003E开源中国\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Ch2\u003EWeb 框架\u003C\u002Fh2\u003E\u003Cimg data-rawwidth=\&1172\& data-rawheight=\&997\& src=\&v2-80c0b207bc7c1ddd422f0fae.png\&\u003E\u003Ch3\u003ECSS 框架\u003C\u002Fh3\u003E\u003Cp\u003E毫无疑问,\u003Ca href=\&http:\u002F\u002Fgetbootstrap.com\u002F\& data-editable=\&true\& data-title=\&Twitter Bootstrap\&\u003ETwitter Bootstrap\u003C\u002Fa\u003E 仍然占据着统治地位。\u003C\u002Fp\u003E\u003Ch3\u003E后端框架\u003C\u002Fh3\u003E\u003Cp\u003E比较火的有:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fwww.codeigniter.com\u002F\& data-editable=\&true\& data-title=\&CodeIgniter\&\u003ECodeIgniter\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fexpressjs.com\u002F\& data-editable=\&true\& data-title=\&Express\&\u003EExpress\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Ca href=\&https:\u002F\u002Flaravel.com\u002F\& data-editable=\&true\& data-title=\&Laravel\& class=\&\&\u003ELaravel\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Ful\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Ch2\u003E后端语言\u003C\u002Fh2\u003E\u003Cimg data-rawwidth=\&1173\& data-rawheight=\&753\& src=\&v2-9c51f08e52f4166f9cde4c.png\&\u003E\u003Cp\u003EPHP 以80%的占有率鄙视了一切(所以说 PHP 是全世界最好的语言)。不过令人感动的是 Node.js 也上榜了,而且排得还挺靠前,证明 Node.js 不是玩笑,是真的可以用的。\u003C\u002Fp\u003E\u003Cp\u003E然后国内使用 PHP 最大的网站的是 \u003Ca href=\&https:\u002F\u002Fwww.baidu.com\u002Findex.php\& data-editable=\&true\& data-title=\&百度\&\u003E百度\u003C\u002Fa\u003E。\u003C\u002Fp\u003E\u003Ch2\u003EWeb 服务器\u003C\u002Fh2\u003E\u003Cimg data-rawwidth=\&1174\& data-rawheight=\&828\& src=\&v2-f8edf37d7cd.png\&\u003E\u003Cp\u003E最火的是 Apache 和 Nginx.\u003C\u002Fp\u003E\u003Ch2\u003E服务器操作系统\u003C\u002Fh2\u003E\u003Cimg data-rawwidth=\&1171\& data-rawheight=\&735\& src=\&v2-f963deadadf66.png\&\u003E\u003Cp\u003E事实证明,还是带图形界面的赢了,Windows Server 占据了43.2%的份额。接下来是最友好的 Ubuntu,之后是不差钱企业爱用的 UNIX,可选的还有 Debian 和 CentOS 等。\u003C\u002Fp\u003E\u003Ch2\u003E数据库\u003C\u002Fh2\u003E\u003Cimg data-rawwidth=\&1176\& data-rawheight=\&745\& src=\&v2-9fda6a27cace.png\&\u003E\u003Cp\u003E这个也没有什么悬念,MySQL 仍然领导着一切;不过移动端的发展也让 Firebase 火了起来;MongoDB 虽然有着这样那样的问题,还是有挺多人在用的。\u003C\u002Fp\u003E\u003Ch2\u003E总结\u003C\u002Fh2\u003E\u003Cp\u003E综上所述,我们得出了最火的Web技术栈:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fjquery.com\u002F\& data-editable=\&true\& data-title=\&jQuery\&\u003EjQuery\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&http:\u002F\u002Fgetbootstrap.com\u002F\& data-editable=\&true\& data-title=\&Bootstrap\&\u003EBootstrap\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fwww.codeigniter.com\u002F\& data-editable=\&true\& data-title=\&CodeIgniter\&\u003ECodeIgniter\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fwww.microsoft.com\u002Fzh-cn\u002Fcloud-platform\u002Fwindows-server\& data-editable=\&true\& data-title=\&Windows Server\&\u003EWindows Server\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fwww.mysql.com\u002F\& data-editable=\&true\& data-title=\&MySQL\&\u003EMySQL\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Ca href=\&http:\u002F\u002Fphp.net\u002F\& data-editable=\&true\& data-title=\&PHP\& class=\&\&\u003EPHP\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Ful\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cstrong\u003EP.S.\u003C\u002Fstrong\u003E 这样来看,只会jQuery和Bootstrap还是有希望找到工作的。不过想要参与新产品研发而不是切页面就得好好学学新的框架了。\u003Cbr\u003E\u003Cp\u003E不过我个人还是想推荐一些值得学习的技术:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Ffacebook.github.io\u002Freact\u002F\& data-editable=\&true\& data-title=\&React\&\u003EReact\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fcn.vuejs.org\u002F\& data-editable=\&true\& data-title=\&Vue\&\u003EVue\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fsemantic-ui.com\u002F\& data-editable=\&true\& data-title=\&Semantic UI\&\u003ESemantic UI\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fexpressjs.com\u002F\& data-editable=\&true\& data-title=\&Express\&\u003EExpress\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Flaravel.com\u002F\& data-editable=\&true\& data-title=\&Laravel\&\u003ELaravel\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fwww.ubuntu.com\u002Fdownload\u002Fserver\& data-editable=\&true\& data-title=\&Ubuntu Server\&\u003EUbuntu Server\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fwww.mongodb.com\u002F\& data-editable=\&true\& data-title=\&MongoDB\&\u003EMongoDB\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Ffirebase.google.com\u002F\& data-editable=\&true\& data-title=\&Firebase\&\u003EFirebase\u003C\u002Fa\u003E \u003C\u002Fli\u003E\u003Ca href=\&https:\u002F\u002Fnodejs.org\u002Fzh-cn\u002F\& data-editable=\&true\& data-title=\&NodeJS\& class=\&\&\u003ENodeJS\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Ful\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Ch2\u003E数据来源\u003C\u002Fh2\u003E\u003Ca href=\&https:\u002F\u002Fwappalyzer.com\u002F\& data-editable=\&true\& data-title=\&Wappalyzer\& class=\&\&\u003EWappalyzer\u003C\u002Fa\u003E\u003Cbr\u003E\u003Cp\u003E有任何问题,或者好的意见或建议欢迎在评论区参与讨论。\u003C\u002Fp\u003E\u003Cp\u003E欢迎加入 \u003Ca href=\&https:\u002F\u002Fjq.qq.com\u002F?_wv=1027&k=499z8iL\& data-editable=\&true\& data-title=\&专栏QQ群维\& class=\&\&\u003E本专栏QQ群\u003C\u002Fa\u003E 一起交流学习。QQ群号码:\u003Ca href=\&tel:\&\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E更加欢迎将你的原创或翻译的技术文章投稿至本专栏。\u003C\u002Fp\u003E\u003Cp\u003E如果你的英文还算不错,也可以选择加入本专栏的 \u003Ca href=\&https:\u002F\u002Fgithub.com\u002Fdiscountry\u002Fwait-for-translate\& data-editable=\&true\& data-title=\&优秀英文技术文章翻译计划\&\u003E优秀英文技术文章翻译计划\u003C\u002Fa\u003E\u003C\u002Fp\u003E&,&updated&:new Date(&T16:43:16.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:34,&likeCount&:183,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T00:43:16+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-4a9c4e6959ffcd7d0b01aaf9e8c0845a_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:34,&likesCount&:183},&&:{&title&:&JavaScript函数的多种写法&,&author&:&liubara&,&content&:&\u003Cblockquote\u003E\u003Cp\u003E原文链接:\u003Ca href=\&https:\u002F\u002Fbocoup.com\u002Fblog\u002Fthe-many-faces-of-functions-in-javascript\& data-title=\&The Many Faces of Functions in JavaScript\& class=\&\&\u003EThe Many Faces of Functions in JavaScript\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E作者:\u003Ca href=\&https:\u002F\u002Fbocoup.com\u002Fabout\u002Fbocouper\u002Fleo-balter\&\u003ELeo Balter\u003C\u002Fa\u003E and \u003Ca href=\&https:\u002F\u002Fbocoup.com\u002Fabout\u002Fbocouper\u002Frick-waldron\& data-title=\&Rick Waldron\& class=\&\&\u003ERick Waldron\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E译者:\u003Ca href=\&https:\u002F\u002FLiubara.github.io\&\u003ELiubara\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E本文已获得作者授权,转载请注明出处。\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Cp\u003E如果你曾与JavaScript代码打过交道,你应该会很熟悉如何定义和调用函数,但是你真的知道有多少种定义函数的方法吗?对于编写和维护测试\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Ftc39\u002Ftest262\&\u003ETest262\u003C\u002Fa\u003E(浏览器JavaScript标准测试)来说,这是一个十分常见的挑战,尤其是当一个新特性出现且与现有的函数语法有关联,或者扩展了现有函数的API时。有必要确保新的或被提议的语法和API是有效的,且对语言中的每一个现有变体都是有效的。\u003C\u002Fp\u003E\u003Cp\u003E本文内容是对JavaScript中已经存在的函数语法格式的概述说明。本文档不包括类声明和表达式,因为这些形式生成的对象不是“可调用的”,对于本文来说,我们只关注生成“可调用的”函数对象的格式。此外,这篇文章也不包括参数列表(包括默认参数、解构,或者尾逗号),因为这些话题足够再写一篇文章了。\u003C\u002Fp\u003E\u003Cp\u003E\u003Ci\u003E译者注:类声明、默认参数、解构和尾逗号是ES6\u002F7的新特性~~不妨碍看这篇文章哈\u003C\u002Fi\u003E\u003C\u002Fp\u003E\u003Ch2\u003E旧方法\u003C\u002Fh2\u003E\u003Ch2\u003E函数声明和表达式\u003C\u002Fh2\u003E\u003Cp\u003E大家都知道,最广泛应用也是最早的函数定义形式就是函数声明和函数表达式。前者是最初设计的一部分(1995)并出现在\u003Ca href=\&https:\u002F\u002Fwww.ecma-international.org\u002Fpublications\u002Ffiles\u002FECMA-ST-ARCH\u002FECMA-262,%201st%20edition,%20June%201997.pdf\& data-title=\&第一个版本的规范(1997年)\& class=\&\&\u003E第一个版本的规范(1997年)\u003C\u002Fa\u003E中,后者是在\u003Ca href=\&https:\u002F\u002Fwww.ecma-international.org\u002Fpublications\u002Ffiles\u002FECMA-ST-ARCH\u002FECMA-262,%203rd%20edition,%20December%201999.pdf\& data-title=\&第三个版本(1999)\& class=\&\&\u003E第三个版本(1999年)\u003C\u002Fa\u003E引入的。我们可以从这些规范中提取三种不同的定义形式:\u003C\u002Fp\u003E\u003Ccode lang=\&js\&\u003E\u002F\u002F 函数声明\nfunction BindingIdentifier() {}\n\n\u002F\u002F 命名函数表达式\n\u002F\u002F (BindingIdentifier对函数外部不可访问)\n(function BindingIdentifier() {}); \n\n\u002F\u002F 匿名函数表达式\n(function() {});\u003C\u002Fcode\u003E\u003Cp\u003E要注意的是匿名函数表达式可能仍然有一个“名称”,Mike Pennisi在这篇文章\u003Ca href=\&https:\u002F\u002Fbocoup.com\u002Fblog\u002Fwhats-in-a-function-name\&\u003EWhat's in a Function Name?\u003C\u002Fa\u003E中解释得很清楚。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003EFunction\u003C\u002Fb\u003E构造器\u003C\u002Fh2\u003E\u003Cp\u003E当我们在讨论一种语言的“函数API”的时候,就已经开始讨论\u003Cb\u003EFunction\u003C\u002Fb\u003E构造器。在考虑最初的语言设计时,函数声明的语法形式可以被解释为函数构造器的API的“文字”形式。\u003Cb\u003EFunction\u003C\u002Fb\u003E构造器为定义函数提供了一种方法:通过N个字符串参数指定函数参数和函数主体,(如下面的例子)最后一个字符串参数始终是函数主体(需要指出的是,这是一种动态求值形式,会有潜在的安全风险)。对于大多数情况来说,这种形式并不适合,因此它的使用非常稀少——但是自从第一个版本的ECMAScript以来,它就一直存在在JavaScript中了。\u003C\u002Fp\u003E\u003Ccode lang=\&js\&\u003Enew Function('x', 'y', 'return x *');\u003C\u002Fcode\u003E\u003Ch2\u003E新方法\u003C\u002Fh2\u003E\u003Cp\u003E自从\u003Ca href=\&https:\u002F\u002Fwww.ecma-international.org\u002Fecma-262\u002F6.0\u002Findex.html\&\u003EESC\u002Fa\u003E推出以来,已经引入了几种新的语法形式。这些形式的变化是巨大的!\u003C\u002Fp\u003E\u003Ch2\u003Enot-so-anonymous函数声明\u003C\u002Fh2\u003E\u003Cp\u003E这是一种新的匿名函数声明形式,如果你曾用过ES Modules,应该清楚这种语法。虽然它可能看起来与匿名函数表达式非常相似,\u003Ca href=\&https:\u002F\u002Ftc39.github.io\u002Fecma262\u002F#sec-function-definitions-static-semantics-boundnames\& data-title=\&但它实际上有一个默认名称,即“default”\& class=\&\&\u003E但它实际上有一个默认名称,即“\u003Ci\u003Edefault\u003C\u002Fi\u003E”\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Ccode lang=\&js\&\u003E\u002F\u002F not-so-anonymous 函数声明\nexport default function() {}\u003C\u002Fcode\u003E\u003Cp\u003E顺便说一下,这个“名称”(指“default”)本身并不是有效的标识符,并且没有绑定在该匿名函数上。\u003C\u002Fp\u003E\u003Ch2\u003E方法定义\u003C\u002Fh2\u003E\u003Cp\u003E对于下面这个例子,大家应该能很快发现它定义了匿名和命名函数表达式作为属性的值。注意,这些不是不同的语法形式。它们是之前讨论过的函数表达式的示例,是在初始对象时编写的。这种形式最初是在ES3中引入的。\u003C\u002Fp\u003E\u003Ccode lang=\&js\&\u003Elet object = {\n
propertyName: function() {},\n};\nlet object = {\n
\u002F\u002F (BindingIdentifier在这个函数中不可访问)\n
propertyName: function BindingIdentifier() {},\n};\u003C\u002Fcode\u003E\u003Cp\u003E在ES5中引入了访问器属性定义:\u003C\u002Fp\u003E\u003Ccode lang=\&js\&\u003Elet object = {\n
get propertyName() {},\n
set propertyName(value) {},\n};\u003C\u002Fcode\u003E\u003Cp\u003E从ES2015开始,JavaScript提供了一个简单的语法来定义方法,这种语法包括文字属性名称和计算属性名称形式,以及访问器形式:\u003C\u002Fp\u003E\u003Ccode lang=\&js\&\u003Elet object = {\n
propertyName() {},\n
[\&computedName\&]() {},\n
get [\&computedAccessorName\&]() {},\n
set [\&computedAccessorName\&](value) {},\n};\u003C\u002Fcode\u003E\u003Cp\u003E我们还可以使用这些新形式作为类声明和表达式中的原型方法的定义:\u003C\u002Fp\u003E\u003Ccode lang=\&js\&\u003E\u002F\u002F 类声明\nclass C {\n
methodName() {}\n
[\&computedName\&]() {}\n
get [\&computedAccessorName\&]() {}\n
set [\&computedAccessorName\&](value) {}\n}\n\n\u002F\u002F 类表达式\nlet C = class {\n
methodName() {}\n
[\&computedName\&]() {}\n
get [\&computedAccessorName\&]() {}\n
set [\&computedAccessorName\&](value) {}\n};\u003C\u002Fcode\u003E\u003Cp\u003E和定义静态方法:\u003C\u002Fp\u003E\u003Ccode lang=\&js\&\u003E\u002F\u002F 类声明\nclass C {\n
static methodName() {}\n
static [\&computedName\&]() {}\n
static get [\&computedAccessorName\&]() {}\n
static set [\&computedAccessorName\&](value) {}\n}\n\n\u002F\u002F 类表达式\nlet C = class {\n
static methodName() {}\n
static [\&computedName\&]() {}\n
static get [\&computedAccessorName\&]() {}\n
static set [\&computedAccessorName\&](value) {}\n};\u003C\u002Fcode\u003E\u003Ch2\u003E箭头函数\u003C\u002Fh2\u003E\u003Cp\u003E作为ES2015最具争议性的函数之一,箭头函数已经变得众所周知且无处不在。箭头函数语法是这样定义的,它为函数声明提供了两种不同的格式:赋值表达式(箭头后面没有跟“{”大括号时为赋值表达式)和函数体(代码中包括0到多个语句时为函数体)。这个语法还允许在描述单个参数时不加圆括号,然而0个或一个以上参数需要加圆括号。这些语法结构允许箭头函数拥有多种书写形式:\u003C\u002Fp\u003E\u003Ccode lang=\&js\&\u003E\u002F\u002F 木有参数的赋值表达式\n(() =& 2 ** 2);\n\n\u002F\u002F 单个参数,忽略括号的赋值表达式\n(x =& x ** 2);\n\n\u002F\u002F 单个参数,忽略括号且直接跟函数体\n(x =& { return x ** 2; });\n\n\u002F\u002F 括起来的参数列表和赋值表达式\n((x, y) =& x ** y);\u003C\u002Fcode\u003E\u003Cp\u003E在上面所示的最后一种形式中,参数被描述为一个\u003Cb\u003E括起来的参数列表\u003C\u002Fb\u003E,因为它们被包装在括号内。这提供了一种语法来标记参数列表或特殊的解构模式,就像\u003Cb\u003E({ x })= & x\u003C\u002Fb\u003E。\u003C\u002Fp\u003E\u003Cp\u003E未被括起来的形式——也就是没有圆括号的形式——即在箭头函数只能表现为只用一个标识符名称作为参数的形式。当箭头函数在异步函数或生成器中定义时,这个标识符名称需要以\u003Cb\u003Eawait\u003C\u002Fb\u003E或\u003Cb\u003Eyeild\u003C\u002Fb\u003E作为前缀定义。但这是我们在箭头函数中能得到的最大程度的不用括号括起来参数列表的情况。\u003C\u002Fp\u003E\u003Cp\u003E箭头函数可以(也经常)出现在初始化值或属性定义的赋值中,上面所示的箭头函数表达式已经包括了这种情况,如下面的例子所示:\u003C\u002Fp\u003E\u003Ccode lang=\&js\&\u003Elet foo = x =& x ** 2;\n\nlet object = {\n
propertyName: x =& x ** 2\n};\u003C\u002Fcode\u003E\u003Ch2\u003E生成器\u003C\u002Fh2\u003E\u003Cp\u003E生成器有一种特殊的语法,除了箭头函数和定义setter \u002F getter方法的时候不能添加之外,可以被添加在其他所有语法形式中。我们可以用其生成函数声明、表达式、定义,甚至构造函数。让我们把它们列出来:\u003C\u002Fp\u003E\u003Ccode lang=\&js\&\u003E\u002F\u002F 生成器声明\nfunction *BindingIdentifer() {}\n\n\u002F\u002F 另一种 not-so-anonymous 生成器声明\nexport default function *() {}\n\n\u002F\u002F 命名生成器表达式\n\u002F\u002F (BindingIdentifier 对函数外部不可访问)\n(function *BindingIdentifier() {});\n\n\u002F\u002F 匿名生成器表达式\n(function *() {});\n\n\u002F\u002F 方法定义\nlet object = {\n
*methodName() {},\n
*[\&computedName\&]() {},\n};\n\n\u002F\u002F 类声明中的方法定义\nclass C {\n
*methodName() {}\n
*[\&computedName\&]() {}\n}\n\n\u002F\u002F 类声明中的静态方法定义\nclass C {\n
static *methodName() {}\n
static *[\&computedName\&]() {}\n}\n\n\u002F\u002F 类表达式中的方法定义\nlet C = class {\n
*methodName() {}\n
*[\&computedName\&]() {}\n};\n\n\u002F\u002F 类表达式中的静态方法定义\nlet C = class {\n
static *methodName() {}\n
static *[\&computedName\&]() {}\n};\u003C\u002Fcode\u003E\u003Ch2\u003EESC\u002Fh2\u003E\u003Ch2\u003E异步函数\u003C\u002Fh2\u003E\u003Cp\u003E经历了几年的发展,异步函数将于2017年6月发布ES2017的EcmaScript语言规范的第8版引入。尽管如此,许多开发人员已经使用了这个特性,这要归功于\u003Ca href=\&https:\u002F\u002Fbabeljs.io\u002F\&\u003EBabel\u003C\u002Fa\u003E的早期实现支持!\u003C\u002Fp\u003E\u003Cp\u003EAsync函数语法为描述异步操作提供了一种干净而统一的方式。调用时,Async函数对象将返回一个Promise对象,这个对象将在异步函数返回时被解析。当包含一个\u003Cb\u003Eawait\u003C\u002Fb\u003E表达式时,异步函数可能暂停函数的执行,然后将其用作异步函数的返回值。\u003C\u002Fp\u003E\u003Cp\u003E它的语法和我们从其他形式中所知道的一样:\u003C\u002Fp\u003E\u003Ccode lang=\&js\&\u003E\u002F\u002F 异步函数声明\nasync function BindingIdentifier() { \u002F**\u002F }\n\n\u002F\u002F not-so-anonymous 异步函数声明\nexport default async function() { \u002F**\u002F }\n\n\u002F\u002F 命名异步函数表达式\n\u002F\u002F (BindingIdentifier is not accessible outside of this function)\n(async function BindingIdentifier() {});\n\n\u002F\u002F 匿名异步函数表达式\n(async function() {});\n\n\u002F\u002F 异步方法\nlet object = {\n
async methodName() {},\n
async [\&computedName\&]() {},\n};\n\n\u002F\u002F 类声明中的异步方法\nclass C {\n
async methodName() {}\n
async [\&computedName\&]() {}\n}\n\n\u002F\u002F 类声明中的静态异步方法\nclass C {\n
static async methodName() {}\n
static async [\&computedName\&]() {}\n}\n\n\u002F\u002F 类声明中的异步方法\nlet C = class {\n
async methodName() {}\n
async [\&computedName\&]() {}\n};\n\n\u002F\u002F 类表达式中的异步方法\nlet C = class {\n
static async methodName() {}\n
static async [\&computedName\&]() {}\n};\u003C\u002Fcode\u003E\u003Ch2\u003E异步箭头函数\u003C\u002Fh2\u003E\u003Cp\u003E\u003Cb\u003Easync\u003C\u002Fb\u003E和\u003Cb\u003Eawait\u003C\u002Fb\u003E并不局限于普通的声明和表达式形式,它们也可以用于箭头函数:\u003C\u002Fp\u003E\u003Ccode lang=\&js\&\u003E\u002F\u002F 单个参数的赋值表达式\n(async x =& x ** 2);\n\n\u002F\u002F 单个参数的函数体\n(async x =& { return x ** 2; });\n\n\u002F\u002F 括起来的参数列表后跟赋值表达式\n(async (x, y) =& x ** y);\n\n\u002F\u002F 括起来的参数列表后跟函数体\n(async (x, y) =& { return x ** });\u003C\u002Fcode\u003E\u003Ch2\u003E继续更新的ESC\u002Fh2\u003E\u003Ch2\u003E异步生成器 \u003Cb\u003EAsync Generators\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E在接下来的ES017中,\u003Cb\u003Easync\u003C\u002Fb\u003E和\u003Cb\u003Eawait\u003C\u002Fb\u003E关键字将被扩展以支持新的异步生成器形式。这个特性的进展可以通过\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Ftc39\u002Fproposal-async-iteration\& data-title=\&proposal’s github repository\& class=\&\&\u003Eproposal’s github repository\u003C\u002Fa\u003E进行跟踪。您可能已经猜到,这是\u003Cb\u003Easync\u003C\u002Fb\u003E、\u003Cb\u003Eawait\u003C\u002Fb\u003E和现有的生成器声明和生成器表达式语法的组合。调用时,异步生成器返回一个迭代器,它的\u003Cb\u003Enext()\u003C\u002Fb\u003E方法返回Promise对象然后用迭代器对象解析,而不是直接返回迭代器对象。\u003C\u002Fp\u003E\u003Cp\u003E可以在许多地方发现异步生成器,你可能已经生成器函数中见到它了。\u003C\u002Fp\u003E\u003Ccode lang=\&js\&\u003E\u002F\u002F 异步生成器声明\nasync function *BindingIdentifier() { \u002F**\u002F }\n\n\u002F\u002F not-so-anonymous 异步生成器声明\nexport default async function *() {}\n\n\u002F\u002F 异步生成器表达式\n\u002F\u002F (BindingIdentifier在函数外部不可访问)\n(async function *BindingIdentifier() {});\n\n\u002F\u002F 匿名函数表达式\n(async function *() {});\n\n\u002F\u002F 方法定义\nlet object = {\n
async *propertyName() {},\n
async *[\&computedName\&]() {},\n};\n\n\n\u002F\u002F 类声明中的原型方法定义\nclass C {\n
async *propertyName() {}\n
async *[\&computedName\&]() {}\n}\n\n\u002F\u002F 类表达式中的原型方法定义\nlet C = class {\n
async *propertyName() {}\n
async *[\&computedName\&]() {}\n};\n\n\u002F\u002F 类声明中的静态方法定义\nclass C {\n
static async *propertyName() {}\n
static async *[\&computedName\&]() {}\n}\n\n\u002F\u002F 类表达式中的静态方法定义\nlet C = class {\n
static async *propertyName() {}\n
static async *[\&computedName\&]() {}\n};\u003C\u002Fcode\u003E\u003Ch2\u003E复杂的挑战\u003C\u002Fh2\u003E\u003Cp\u003E每个函数语法格式不仅对学习和使用是挑战,而且对JS运行时间和Test262的实现和维护也是一个挑战。当引入新的语法形式时,Test262必须与所有相关的语法规则一起测试该新形式。例如,将默认参数语法的测试形式限制在简单的函数声明形式中,并假设在其他格式下该语法也正常起作用是不明智的。每一个语法规则都必须经过测试,将这些测试任务分配给一个人是不合理的。所以导致了测试生成工具的设计和实现。测试生成工具提供了一种确保能够覆盖(函数格式的多少)更详尽的方法。\u003C\u002Fp\u003E\u003Cp\u003E这个项目现在包含了一系列由不同的测试用例和模板组成的\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Ftc39\u002Ftest262\u002Ftree\u002Fmaster\u002Fsrc\&\u003E源文件\u003C\u002Fa\u003E,例如,\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Ftc39\u002Ftest262\u002Ftree\u002Fmaster\u002Fsrc\u002Farguments\&\u003E如何检查每个函数格式的参数\u003C\u002Fa\u003E,或者\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Ftc39\u002Ftest262\u002Ftree\u002Fmaster\u002Fsrc\u002Ffunction-forms\&\u003E函数格式测试\u003C\u002Fa\u003E,甚至更多超出范围的函数形式,在这些函数形式中,\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Ftc39\u002Ftest262\u002Ftree\u002Fmaster\u002Fsrc\u002Fdstr-binding\&\u003E解构绑定\u003C\u002Fa\u003E和\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Ftc39\u002Ftest262\u002Ftree\u002Fmaster\u002Fsrc\u002Fdstr-assignment\&\u003E解构赋值\u003C\u002Fa\u003E都是适用的。\u003C\u002Fp\u003E\u003Cp\u003E尽管它可能导致密集的和长时间的发送请求,但是覆盖率总是会提高,而且可能\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Ftc39\u002Ftest262\u002Fpull\u002F651\&\u0}

我要回帖

更多关于 java软件开发好学吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信