Python爬虫入门教程-5100-27270图片爬取

获取待爬取页面今天继续爬取一个网站,http://www.27270.com/ent/meinvtupian/ 这个网站具备反爬,so我们下载的代码有些地方处理的也不是很到位,大家重点学习思路,有啥建议可以在评论的地方跟我说说。 为了以后的网络请求操作方向,我们这次简单的进行一些代码的封装操作。 在这里你可以先去安装一个叫做 retrying 的模块 pip install retrying这个模块的具体使用,自己去百度吧。嘿嘿哒~ 在这里我使用了一个随机产生user_agent的方法 import requestsfrom retrying import retryimport randomimport datetimeclass R: def __init__(self,method="get",params=None,headers=None,cookies=None): # do something def get_headers(self): user_agent_list = [ \ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1" \ "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11", \ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6", \ "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6", \ "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1", \ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5", \ "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5", \ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", \ "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", \ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", \ "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", \ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", \ "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", \ "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3", \ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24", \ "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24" ] UserAgent = random.choice(user_agent_list) headers = {'User-Agent': UserAgent} return headers #other coderetrying 最简单的使用就是给你想不断重试的方法加上 装饰器 @retry ...

May 23, 2019 · 4 min · jiezi

语义化标签以及常用标签

_版权声明:本文为博主原创文章,转载请注明出处。_#1 一开始接触到页面这个东西,毫无疑问大家首页看到的是html这玩意。我对html有了初步的认识是在我大二上数据结构这门课程的时候老师讲课之余就给我们讲讲深度学习,网页设计之类的简单知识。自从那以后就断断续续在W3school以及MDN学习它,以下内容是对之前的学习做个较为简单的总结。???? 常用标签html标签又称为html元素,html元素分为行内(内联)元素、行内块级元素以及块级元素。 行内元素的特点 这些行内元素本身的属性display:inline,而行内块级元素则为display:inline-block;和其他行内元素从左到右在一行显示,给它设置的宽高值无效,但可以设置内外边距的值(左右有效,上下无效)行内元素的宽高是由本身内容的大小决定(文字、图片等)行内元素只能容纳文本或者其他内联元素,不要在行内元素嵌套块级元素常见的行内元素“span” 标签,通常用于放一些文字和icon图标之类作为内敛容器等”script“ 标签,常用于引入外部文件,嵌入代码等“a” 标签,常用于超链接,锚点等方面“img” 标签,用于引入外部图像文件“br” 标签用于换行“input” 标签,用于表单控件“button" 标签,页面按钮”label“ 标签,通常结合input来使用,相当命名标签“select” 标签,选项标签”textarea“ 标签, 文本区域“i” 标签,呈现斜体文本,此外许多框架用它制作页面小图标等“b" 标签,加粗文本,新的标准出来不推荐使用“em” 标签,用于将文本进行强调”strong“ 标签, 用于将文本进行强调加粗“big” 标签, 大字体文本”small“ 标签, 小字体文本 常见的行内块级元素 行内块级元素的特征 不自动换行,如果超出父元素(不为行内元素)width则换行可以设置宽高在一行内从左到右依次排列在HTML5中,开发者可以自定义标签,在任意定义标签中,设置display:block属性即可变为块级元素,display:inline就为行内元素,display:inline-block则为行内块级。绝大多数标签都是可以互相转换的。 常见的块级元素块级元素的特征 可以设置宽高,内外边距等可以内嵌其他元素(不管是块级的内联的还是行内块级的元素)独占每个块级元素默认一行,可以自动换行,默认排列方式为从上至下div - 常用块级容易,也是 css layout 的主要标签p - 段落标签主要用于文章段落,多行文字方面ul - 无序列表ol - 有序列表form - 交互表单h1~h6 标题标签hr - 水平分割线dl - 定义列表address - 地址blockquote - 块引用center - 举中对齐块, 等等其他不常用的标签HTML5中新增常见的标签以及其语义化(以下顺序不分先后)header ???? 页眉(网页(部分区域)的头部 顶部 导航区域等等) 块级元素nav ???? 导航链接部分 块级元素section ???? 标签定义网页中的区域(部分)。比如章节、页眉、页脚或文档中的其他部分。块级元素article ???? 内容是引用其他地方的。一个区域中的,另外一部分内容;块级元素aside ???? 和article 是一起使用;是辅助 article 区域的内容。也可以理解为整个网页的 辅助区域footer ???? 页脚(网页(部分区域)的底部|版权区域等等) 块级元素audio ???? 播放声音文件,比如音乐或其它音频流 行内元素video ???? 播放视频文件,比如电影或其它视频流 行内元素canvas ???? 定义图形,比如图表和其他图像 有着默认宽高 行内元素hgroup 给标题分组,为标题或者子标题进行分组 块级元素figure 对多个元素进行组合 块级元素figcaption 定义 figure 元素的标题 块级元素output 定义输出的一些类型。details 定义元素的细节command 定义命令按钮summary 为 details 元素定义可见的标题mark 主要用来在视觉上向用户呈现那些需要突出的文字 高亮字体meter ???? 标签定义度量衡。仅用于已知最大和最小值的度量。必须定义度量的范围,既可以在元素的文本中,也可以在 min/max 属性中定义。progress 定义任何类型的任务的进度 标签运行中的进程。可以使用 标签来显示 JavaScript 中耗费时间的函数的进程time ???? 定义日期或时间,或者两者 行内元素datalist ???? 定义可选数据的列表。与 input 元素配合使用,就可以制作出输入值的下拉列表 行内元素embed 定义嵌入的内容,比如插件。用来插入各种多媒体,格式可以是MIDI、MP3等 行内元素 有默认宽高keygen 定义生成密钥source ???? 为媒介元素(比如 video 和 audio)指定多个播放格式与编码,浏览器会自动选择第一个可以识别的格式 行内元素 ...

May 22, 2019 · 1 min · jiezi

个人小程序接入支付解决方案

现状现在如果产品要接入支付,支付宝和微信都规定必须公司才能申请,对个人而言就没办法了。注册和维护一个公司的成本很高,还涉及到财务会计、纳税等,最后如果不需要了注销公司也会很麻烦。这对于刚起步的产品,或者个人开发者而言成本都很高。 解决方案那个人还有办法签约微信和支付宝的原生支付接口吗?有!XorPay.com 是微信和支付宝的支付服务商,可以代个人签约微信支付接口 和 支付宝当面付接口,支持 native / jsapi / 收银台 / 当面付 / h5 支付方式,资金由微信、支付宝官方结算,安全可靠。 接下来就介绍一下个人小程序接入支付的具体步骤。 第一步,注册 XorPay.com 提交资料签约微信和支付宝,开通接口第二步,参考小程序demo 或者 按文档对接XorPay 有现成可用的小程序demo代码,GitHub 链接 当然你可以按文档自己对接,小程序文档 最终效果如下: 在 app.json 中添加: "navigateToMiniProgramAppIdList": [ "wx6eeed4ca124a1abf" ]小程序跳转代码: wx.navigateToMiniProgram({ appId: 'wx6eeed4ca124a1abf', path: 'pages/index/index', extraData: { 'aid': '1', #aid 'name': 'XorPay充值', 'pay_type': 'jsapi', 'price': '0.02', 'order_id': 'm-5', 'notify_url': 'https://abc.com/notify', 'sign': md5.hexMD5('XorPay充值' + 'jsapi' + '0.02' + 'm-5' + 'https://abc.com/notify' + 'app secret'), }, envVersion: 'develop', fail(res) { wx.showToast({ title: res.errMsg, icon: 'none', }); }, success(res) { wx.showToast({ title: 'ok', icon: 'none', }); }, });支付成功或者取消,会跳回你的小程序,并携带参数: ...

May 22, 2019 · 1 min · jiezi

从Google-V8引擎剖析Promise实现

从Google V8引擎剖析Promise实现 本文阅读的源码为Google V8 Engine v3.29.45,此版本的promise实现为js版本,在后续版本Google继续对其实现进行了处理。引入了es6语法等,在7.X版本迭代后,逐渐迭代成了C版本实现。 贴上源码地址:https://chromium.googlesource... 大家自觉传送。 代码中所有类似%functionName的函数均是C语言实现的运行时函数。 Define variables首先定义了将要在JS作用域使用了一些变量,提高了编译器的效率。 var IsPromise;var PromiseCreate;var PromiseResolve;var PromiseReject;var PromiseChain;var PromiseCatch;var PromiseThen;var PromiseHasRejectHandler;随后定义了一些全局私有变量供给和C语音交互,用于维护Promise的状态和进行Debug。 var promiseStatus = GLOBAL_PRIVATE("Promise#status");var promiseValue = GLOBAL_PRIVATE("Promise#value");var promiseOnResolve = GLOBAL_PRIVATE("Promise#onResolve");var promiseOnReject = GLOBAL_PRIVATE("Promise#onReject");var promiseRaw = GLOBAL_PRIVATE("Promise#raw");var promiseDebug = GLOBAL_PRIVATE("Promise#debug");var lastMicrotaskId = 0;其中GLOBAL_PRIVATE是python进行实现的,运用python的宏定义(macro)来定义调用了C语言的CreateGlobalPrivateOwnSymbol方法。 macro GLOBAL_PRIVATE(name) = (%CreateGlobalPrivateOwnSymbol(name));随后运用了一个自执行的匿名函数进行闭包逻辑。 (function() { // 主逻辑})();在闭包逻辑的最后,在promise原型上挂载了三个方法:chain,then,catch。在promise对象上挂载了all,race等六个方法。将Promise对象注册到了global。 %AddNamedProperty(global, 'Promise', $Promise, DONT_ENUM);InstallFunctions($Promise, DONT_ENUM, [ "defer", PromiseDeferred, "accept", PromiseResolved, "reject", PromiseRejected, "all", PromiseAll, "race", PromiseOne, "resolve", PromiseCast]);InstallFunctions($Promise.prototype, DONT_ENUM, [ "chain", PromiseChain, "then", PromiseThen, "catch", PromiseCatch]);Start from constructorvar $Promise = function Promise(resolver) { // 如果传入参数为全局promiseRaw变量的时候return if (resolver === promiseRaw) return; // 如果当前函数不是构造函数的化,抛出错误这不是一个promise if (!%_IsConstructCall()) throw MakeTypeError('not_a_promise', [this]); // 如果传入参数不是一个函数的话,抛出错误,传入参数不是一个function if (!IS_SPEC_FUNCTION(resolver)) throw MakeTypeError('resolver_not_a_function', [resolver]); var promise = PromiseInit(this); try { // debug相关忽略 %DebugPushPromise(promise); resolver(function(x) { PromiseResolve(promise, x) }, function(r) { PromiseReject(promise, r) }); } catch (e) { // 报错之后走到错误处理函数 PromiseReject(promise, e); } finally { // debug相关忽略 %DebugPopPromise(); }}构造函数在做完额外的异常和参数判断后,进入主逻辑调用PromiseInit方法初始化promise,随后调用了resolver方法,传入了两个默认的处理函数。在promise在内部被调用时(PromiseDeferred方法被调用时)会实例化$promise,将默认方法return回去,使得创建的promise示例具有resolve和reject方法。 ...

May 22, 2019 · 4 min · jiezi

ES6入门之对象的扩展

1. 属性的简洁表示法在ES6中 允许直接写入变量和函数,作为对象的属性和方法,使得代码的书写更为简洁。const f = 'a'const b = {f}b // {f: 'a'}等同于const b = {f: f}在ES6中允许在对象内直接写变量,这时候属性名为变量名,属性值就是变量值 function u(x, y){ return {x, y}}// ====function u(x, y){ return {x: x, y: y }}u(1, 2) // {x:1, y: 2}或者一下写法:function o() { const x = 1; const x = 2; return {x, y}}o() // {x:1, y:2}2. 属性名表达式在JavaScript中属性名的表达式的方法有两种,一种 直接用标识符作为属性名,第二种用表达式作为属性名。第二种写的时候表达式要放在方括号之内//一obj.foo = true//二obj['a' + 'bc'] = 123//三let t = 'm'let obj = { [t]: true, ['a' + 'bc']: 123}表达式还可以用来定义方法名(注意:属性名表达式不能和简洁表示法同时使用) ...

May 22, 2019 · 2 min · jiezi

前端开发如何学习后端全栈零基础入门

这是一个2019年你成为前端,后端或全栈开发者的进阶指南: 1、你不需要学习所有的技术成为一个web开发者 2、这个指南只是通过简单分类列出了技术选项 3、我将从我的经验和参考中给出建议 4、首选我们会介绍通用的知识, 最后介绍2019年的Web的一些趋势最后,如果大家如果在自学遇到困难,想找一个前端的学习环境,可以加入我们的前端学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题。 1、基础前端开发者 1.1 HTML & CSS 最基础的知识: 语义化的HTML元素基础的CSS语法Flexbox & GridCSS变量浏览器开发者工具1.2 响应式布局 响应式设计将不再是网页的加分项, 而是必须的 设置viewport非固定宽度媒体查询使用 rem 替代 px移动优先,柱状显示1.3 基础的部署工作 学会如何部署一个静态网站到服务器 注册一个域名(NameCheap, Google Domains)管理共享主机或虚拟机(Inmotion, Hostgator, Bluehost)FTP, SFTP 文件上传(Filezilla, Cyberduck)静态页面托管(Netlify, Github Pages)1.4 SASS预处理器 虽然不是必须的, 但是推荐去学, 基础知识的掌握很简单 结构化CSS变量嵌套样式表Minxins & 函数继承1.5 原生JavaScript语法 imageimage不使用任何框架和库区学习原生的JS语法 数据类型, 函数, 条件判断, 循环, 凑总府DOM操作和事件JSONFetchES6+(箭头函数, Promise, async/await, 解构)1.6 满足了基本的前端开发者的条件 imageimage构建静态站点构建UI布局(拿到设计图能够使用HTML/CSS还原)添加一些交互功能部署和维护网站现在能找到最低水平的Web开发工作, 但是这是远远不够的.... 2、一个成熟的前端开发者 2.1 HTML & CSS框架 ...

May 22, 2019 · 2 min · jiezi

在线er图流程图visio代替软件

流程图是一种比较常见的图表,无论是在日常工作中还是生活中都随处可见。如果你是初入职场的新人,可能需要接触到一些简单的工作流程、会议流程图;如果你是产品经理、项目管理者或是软件开发师,更是需要经常接触到这类图表。流程图作为一种使用率非常高的图表,在商业中被誉为项目的基石。 想要成为一名优秀的职场人士,掌握和熟练使用流程图,是一项必备的技能。曾经的某一天,你学会用Word绘制流程图,但为了对齐连接线,差点气到吐血。现在,你需要一款专业的流程图绘制工具,来拯救你的小宇宙! 「亿图图示」是一款专业的图形图表设计软件,它可用于绘制全系列的流程图。一点也不夸张的说,亿图图示绘制流程图速度远高于Word绘图,让原本需要画1小时的流程图,只需10分钟即可完成。毕竟,专业的才是高效的。 与Word机械化的手动绘图方式不同,亿图图示更显智能,特别是以下几点功能尤为突出: 1、具备齐全的流程图符号,拖入画布即可; 2、搭载智能浮动按钮,可实现一键添加或修改符号; 3、画布智能识别连接点,和强迫症说再见; 4、双击符号,即可输入文本; 5、多套主题样式一键替换,所见即所得。 使用亿图图示绘制流程图,无论图有多难、多复杂,都可以被分解为简单的6个步骤。在软件里完成绘图后,流程图可以被导出为PDF、Ofiice以及PNG等格式。如果你想让作品进行在线分享,可以选择单独生成网页地址,这样你的同事、好友不用下载,网页在线或者手机扫一扫就能查看文档。 如果说亿图的哪一项功能更受欢迎,那么它的符号库应是当仁不让。据悉,亿图软件公司设计了一万多个矢量符号,使用的时候,可以直接从软件的左侧符号库中搜索获取。在符号库流程图这一分类下,内置了数据、判断、文档等上百个流程图符号。丰富的符号,专业的图形,帮助我们有效绘图,减少错误率,办公效率只增不减。 基本流程图符号素材: 亿图图示还提供了多样化的模板例子,除了流程图,还涉及思维导图、信息图、商业图表、组织架构图、拓扑图、电路图等等。现成的例子,可供我们参考和使用,这对于新手而言,无疑是加速学习、绘图的好办法。 流程图的运用领域很广很杂,或许曾经我们面对它的时候,是捶胸顿足、是不知所措,但如今学会使用亿图图示画专业的流程图之后,就再也不用担心。

May 22, 2019 · 1 min · jiezi

css绘制各种形状图形第二版

虽然我们现在大都使用字体图标或者svg图片,似乎使用 CSS 来做图标意义不是很大,但怎么实现这些图标用到的一些技巧及思路是很值得我们的学习。一、实心圆 .circle { width: 120px; height: 120px; background: #8BC34A; border-radius: 100%;}二、圆环(空心圆) .ring { width: 100px; height: 100px; border: 10px solid #8BC34A; border-radius: 100%;}三、椭圆 .ellipsis { width: 200px; height: 120px; background: #8BC34A; border-radius: 100px/60px;}四、半圆 .top-semicircle { width: 120px; height: 60px; background: #8BC34A; border-radius: 60px 60px 0px 0px;}.right-semicircle { width: 60px; height: 120px; background: #8BC34A; border-radius: 0 60px 60px 0;}.bottom-semicircle { width: 120px; height: 60px; background: #8BC34A; border-radius: 0 0 60px 60px;}.left-semicircle { width: 60px; height: 120px; background: #8BC34A; border-radius: 60px 0 0 60px;}五、四分之一圆(扇形) ...

May 22, 2019 · 4 min · jiezi

基于HTML5转换PDF的电子书阅读插件

基于HTML5转换PDF的电子书阅读插件html5部分项目一般都是以pdf.js插件阅读PDF文件,但存在阅读体验不理想的情况,所以参考手机上的电子书阅读器,使用国外的链接描述http://fliphtml5.com制作电子书示例。 完整代码已上传git,标题搜索即可。 插件功能强大,缩略图,鼠标翻页,放大缩小都可以,部分配置代码config.js如下 var bookConfig = { appName:'flippdf', totalPageCount : 0, largePageWidth : 1080, largePageHeight : 1440, normalPath : "files/page/", largePath : "files/large/", thumbPath : "files/thumb/", ToolBarsSettings:"", TitleBar:"", appLogoLinkURL:"", bookTitle:"FLIPBUILDER", bookDescription:"", ButtonsBar:"", ShareButton:"", ThumbnailsButton:"", ThumbnailsButtonVisible:"Hide", ZoomButton:"", ZoomButtonVisible:"No", FlashDisplaySettings:"", MainBgConfig:"", bgBeginColor:"#cccccc", bgEndColor:"#eeeeee", bgMRotation:45, pageBackgroundColor:"#FFFFFF", flipshortcutbutton:"Hide", BookMargins:"", topMargin:10, bottomMargin:10, leftMargin:10, rightMargin:10, HTMLControlSettings:"", linkconfig:"", LinkDownColor:"#808080", LinkAlpha:0.5, OpenWindow:"_Blank", BookMarkButtonVisible:'False', productName : 'Demo created by Flip PDF', homePage : 'http://www.html5.com/', isFlipPdf : "False", TableOfContentButtonVisible:"False", searchTextJS:'javascript/search_config.js', searchPositionJS:undefined};java部分maven引入 ...

May 22, 2019 · 2 min · jiezi

canvas-绘制

第一次接触canvas是做毕设的时候,在实现登录页时候用了canvas增添一些样式,那时候学的很浅显,是时候来认真了解一下这个canvas。(相关知识来源于MDN) canvas初了解canvas是个HTML5新增的标签,<canvas>标签很像<img>标签,而<canvas> 标签只有两个属性—— width 和 height。当没有设置宽度和高度的时候,canvas会初始化宽度为300像素和高度为150像素。需要注意的是,canvas的高宽不可以用css设置,那会扭曲的,而且一些老的浏览器版本都不支持canvas。 不支持咋么办?这非常简单:只需要在<canvas>标签中提供替换内容。不支持<canvas>的浏览器将会忽略容器并在其中渲染后备内容。而支持<canvas>的浏览器将会忽略在容器中包含的内容,并且只是正常渲染canvas。 你可以这样 <canvas id="canvas">alternative content for browsers without canvas support</canvas>也可以这样 <canvas id="clock" width="150" height="150"> <img src="替换内容.png" width="150" height="150" alt="替换图片"/></canvas>这里可以发现,以上两段代码中canvas的宽高属性设置,可以直接在标签中设置属性值,也可以在JS中设置,没错,canvas是基于JS绘制的。 基本用法先来代码,有个宏观了解 <canvas id="canvas"> alternative content for browsers without canvas support</canvas><script> var canvas = document.getElementById("canvas"); canvas.width = 1024; canvas.height = 500; var context = canvas.getContext("2d"); ...</script><canvas>元素创造了一个固定大小的画布,它公开了一个或多个渲染上下文,其可以用来绘制和处理要展示的内容。我们将会将注意力放在2D渲染上下文中。其他种类的上下文也许提供了不同种类的渲染方式;比如,WebGL使用了基于OpenGL ES的3D上下文。canvas起初是空白的。为了展示,首先脚本需要找到渲染上下文,然后在它的上面绘制。<canvas>元素有一个叫做 getContext()的方法,这个方法是用来获得渲染上下文和它的绘画功能。getContext()只有一个参数,上下文的格式。 JS部分代码的第一行通过使用 document.getElementById() 方法来为<canvas>元素得到DOM对象。一旦有了元素对象,你可以通过使用它的 getContext() 方法来访问绘画上下文。 至此,全都是一些前期准备工作,我们获取了DOM节点,获取到执行的上下文环境,现在就开始绘制图形。然而绘制之前还需要了解一个知识点,因为canvas的绘制都是基于坐标的,那就需要了解什么是画布栅格以及坐标空间。 canvas元素默认被网格所覆盖。通常来说网格中的一个单元相当于canvas元素中的一像素。栅格的起点为左上角(坐标为(0,0))。所有元素的位置都相对于原点定位。所以图中蓝色方形左上角的坐标为距离左边(X轴)x像素,距离上边(Y轴)y像素(坐标为(x,y))。具体如下图 好,让我们来绘制一个三角形,老样子先来JS代码,再具体分析 var canvas=document.getElementById("canvas");canvas.width=1024;canvas.height=500;var context=canvas.getContext("2d");context.moveTo(100,100); context.lineTo(400,400); context.lineTo(100,400);context.lineTo(100,100);context.lineWidth=2; context.strokeStyle="#058";context.fillStyle="rgb(2,100,30)"; context.stroke();context.fill();代码前四行是准备工作,就不赘述了。图形的绘制都是基于执行的上下文,我们绘制的三角形的起点使用了moveTo方法,定在(100,100)这个位置,lineTo()方法是绘制直线,也接受坐标值两个参数。例子中的意思就是从(100,100)到(400,400)画一条直线,再从(400,400)到(100,400),最终再回到(100,100),这样就形成一个回路构成一个三角形。 其实,说已经构成了三角形是不严谨的,我们只是先确定了坐标,还没有真正的完整绘制。这里可以设置线条的宽度和颜色,使用stroke() 方法实现图形轮廓的绘制,代码中还有一个fill() 方法,它是用于填充所绘制的图形,当然需要先设置一下填充的颜色。 通过canvas的简单操作,我们就很轻易的绘制了一个三角形。这就是canvas很基础的知识了,掌握这些就可以尝试着画一些矩形、多边形、不规则图形,圆、椭圆,目前似乎还很难实现,这就需要继续学习呀。 绘制矩形绘制一个矩形的边框:strokeRect(x,y,width,height) 绘制一个填充的矩形:fillRect(x,y,width,height) 清除指定矩形区域,让清除部分完全透明:clearRect(x,y,width,height) var canvas = document.getElementById("canvas");canvas.width = 500;canvas.height = 500;var ctx = canvas.getContext("2d");ctx.beginPath();ctx.strokeRect(50, 50, 50, 50);ctx.closePath();ctx.beginPath();ctx.fillRect(150, 50, 50, 50);ctx.closePath();ctx.beginPath();ctx.fillRect(250, 50, 50, 50);ctx.clearRect(265, 65, 20, 20);ctx.closePath();绘制出来的图形是这样的 ...

May 22, 2019 · 1 min · jiezi

重学前端学习笔记二十二选择器的机制

笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com。一、引言本文讲一讲选择器的几个机制:选择器的组合、选择器的优先级和伪元素。二、选择器的组合2.1、选择器列表选择器列表:用逗号分隔的复杂选择器序列;复杂选择器则是用空格、大于号、波浪线等符号连接的复合选择器;复合选择器则是连写的简单选择器组合。2.2、优先级第一优先级 无连接符号第二优先级 空格~+>||第三优先级 ,2.3、复杂选择器的连接符号空格:表示选中所有符合条件的后代节点。(后代)>:表示选中符合条件的子节点。(子代)~:表示选中所有符合条件的后继节点,后继节点即跟当前节点具有同一个父元素,并出现在它之后的节点。(后继)+:表示选中符合条件的直接后继节点,直接后继节点即 nextSlibling。(直接后继)||:表示选中对应列中符合条件的单元格。(列选择器)三、选择器的优先级CSS 标准用一个三元组 (a, b, c) 来构成一个复杂选择器的优先级。CSS 建议用一个足够大的进制,获取“ a-b-c ”来表示选择器优先级。// base 是一个"足够大"的正整数specificity = base * base * a + base * b + cid 选择器的数目记为 a伪类选择器和 class 选择器的数目记为 b伪元素选择器和标签选择器数目记为 c“*” 不影响优先级。注意:行内属性的优先级永远高于 CSS 规则,浏览器提供了一个口子就是添加!important。该优先级会高于行内属性。同一优先级的选择器遵循后面的覆盖前面的原则。 四、伪元素伪元素本身不单单是一种选择规则,它还是一种机制。::first-line::first-letter::before::after4.1、::first-line 和 ::first-letter代码测试连接:https://codepen.io/pen/1、::first-line <p>kaimo is good boy.but sometime not.</p>p::first-line { text-transform: uppercase} 注意:排版后显示的第一行字母变为大写。跟 HTML 代码中的换行无关。 2、::first-letter p::first-letter { text-transform: uppercase; font-size:2em; float:left;} 3、::first-line必须出现在最内层的块级元素内。 <div> <p id="a">kaimo is good boy.</p> <p>but sometime not.</p></div>div>p#a { color: green;}div::first-line { color: hotpink;} ...

May 21, 2019 · 1 min · jiezi

DOMContentLoaded与load的区别

DOMContentLoaded与load的区别 DOM 文档的加载步骤解析HTML结构加载外部脚本和样式表文件解析并执行脚本构建 HTML DOM模型 // DOMContentLoaded加载外部资源文件(image等)页面渲染完成 // loadDOMContentLoaded (对应 jQuery 中的 $(document).ready())MDN: 当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像和子框架的完成加载load (对应 jQuery 中的 $(document).load())页面上所有的资源(图片,音频,视频等)被加载以后才会触发load事件。所以 load 所需要的时间必然大于等于 DOMContentLoaded 所需要的时间。HTML 页面的生命周期主要有三个重要的事件DOMContentLoaded, DOM已经构建好,可以对DOM节点进行操作document.addEventListener('DOMContentLoaded', cb)load,所有资源加载完毕,可以对资源进行一系列操作,比如获取图片宽高等~window.onload = function() {}beforeunload/unload(基本不会用到),当浏览器窗口关闭或者刷新时,会触发beforeunload事件。当前页面不会直接关闭,可以点击确定按钮关闭或刷新,也可以取消关闭或刷新。我们可以检查用户是否保存了修改,并提示他是否确定离开当前页面window.onbeforeunload = function() { return "There are unsaved changes. Leave now?";} 相关知识点:document.readyState

May 21, 2019 · 1 min · jiezi

Python爬虫入门教程-3100-美空网数据爬取

1.美空网数据-简介从今天开始,我们尝试用2篇博客的内容量,搞定一个网站叫做“美空网”网址为:http://www.moko.cc/, 这个网站我分析了一下,我们要爬取的图片在 下面这个网址 http://www.moko.cc/post/13020...然后在去分析一下,我需要找到一个图片列表页面是最好的,作为一个勤劳的爬虫coder,我找到了这个页面 http://www.moko.cc/post/da39d...列表页面被我找到了,貌似没有分页,这就简单多了,但是刚想要爬,就翻车了,我发现一个严重的问题。 http://www.moko.cc/post/==da3... 我要做的是一个自动化的爬虫,但是我发现,出问题了,上面那个黄色背景的位置是啥? ID,昵称,个性首页,这个必须要搞定。 我接下来随机的找了一些图片列表页,试图找到规律到底是啥? http://www.moko.cc/post/978c7...http://www.moko.cc/post/junda...http://www.moko.cc/post/slavi.........没什么问题,发现规律了 http://www.moko.cc/post/==个... 这就有点意思了,我要是能找到尽量多的昵称,不就能拼接出来我想要得所有地址了吗 开干!!! 手段,全站乱点,找入口,找切入点,找是否有API .... .... 结果没找着 下面的一些备选方案 趴这个页面,发现只有 20页 http://www.moko.cc/channels/p... 每页48个模特,20页。那么也才960人啊,完全覆盖不到尽可能多的用户。 接着又找到 http://www.moko.cc/catalog/in... 这个页面 确认了一下眼神,以为发现问题了,结果 哎呀,还么有权限,谁有权限,可以跟我交流一下,一时激动,差点去下载他们的APP,然后进行抓包去。 上面两条路,都不好弄,接下来继续找路子。 无意中,我看到了一丝曙光 关注名单,点进去 哈哈哈,OK了,这不就是,我要找到的东西吗? 不多说了,爬虫走起,测试一下他是否有反扒机制。 我找到了一个关注的人比较多的页面,1500多个人 http://www.moko.cc/subscribe/... 然后又是一波分析操作 2.美空网数据- 爬虫数据存储确定了爬虫的目标,接下来,我做了两件事情,看一下,是否对你也有帮助 确定数据存储在哪里?最后我选择了MongoDB用正则表达式去分析网页数据对此,我们需要安装一下MongoDB,安装的办法肯定是官网教程啦! https://docs.mongodb.com/mast...如果官方文档没有帮助你安装成功。 那么我推荐下面这篇博客 https://www.cnblogs.com/hacky...安装MongoDB出现如下结果 恭喜你安装成功了。 接下来,你要学习的是 关于mongodb用户权限的管理 http://www.cnblogs.com/shiyiw...mongodb索引的创建 https://blog.csdn.net/salmone...别问为啥我不重新写一遍,懒呗~~~ 况且这些资料太多了,互联网大把大把的。 一些我经常用的mongdb的命令 链接 mongo --port <端口号>选择数据库 use admin 展示当前数据库 db 当前数据库授权 db.auth("用户名","密码")查看数据库 show dbs查看数据库中的列名 show collections 创建列 db.createCollection("列名")创建索引 db.col.ensureIndex({"列名字":1},{"unique":true})展示所有索引 db.col.getIndexes()删除索引 db.col.dropIndex("索引名字") 查找数据 db.列名.find()查询数据总条数 db.列名.find().count() 上面基本是我最常用的了,我们下面实际操作一把。 ...

May 21, 2019 · 6 min · jiezi

Python爬虫入门教程-4100-美空网未登录图片爬取

简介上一篇写的时间有点长了,接下来继续把美空网的爬虫写完,这套教程中编写的爬虫在实际的工作中可能并不能给你增加多少有价值的技术点,因为它只是一套入门的教程,老鸟你自动绕过就可以了,或者带带我也行。 爬虫分析首先,我们已经爬取到了N多的用户个人主页,我通过链接拼接获取到了 http://www.moko.cc/post/da39d... 在这个页面中,咱们要找几个核心的关键点,发现平面拍摄点击进入的是图片列表页面。接下来开始代码走起。 获取所有列表页面我通过上篇博客已经获取到了70000(实际测试50000+)用户数据,读取到python中。 这个地方,我使用了一个比较好用的python库pandas,大家如果不熟悉,先模仿我的代码就可以了,我把注释都写完整。 import pandas as pd# 用户图片列表页模板user_list_url = "http://www.moko.cc/post/{}/list.html"# 存放所有用户的列表页user_profiles = []def read_data(): # pandas从csv里面读取数据 df = pd.read_csv("./moko70000.csv") #文件在本文末尾可以下载 # 去掉昵称重复的数据 df = df.drop_duplicates(["nikename"]) # 按照粉丝数目进行降序 profiles = df.sort_values("follows", ascending=False)["profile"] for i in profiles: # 拼接链接 user_profiles.append(user_list_url.format(i))if __name__ == '__main__': read_data() print(user_profiles)数据已经拿到,接下来我们需要获取图片列表页面,找一下规律,看到重点的信息如下所示,找对位置,就是正则表达式的事情了。 快速的编写一个正则表达式<p class="title"><a hidefocus="ture".*?href="(.*?)" class="mwC u">.*?\((\d+?)\)</a></p> 引入re,requests模块 import requestsimport re# 获取图片列表页面def get_img_list_page(): # 固定一个地址,方便测试 test_url = "http://www.moko.cc/post/da39db43246047c79dcaef44c201492d/list.html" response = requests.get(test_url,headers=headers,timeout=3) page_text = response.text pattern = re.compile('<p class="title"><a hidefocus="ture".*?href="(.*?)" class="mwC u">.*?\((\d+?)\)</a></p>') # 获取page_list page_list = pattern.findall(page_text)运行得到结果 ...

May 21, 2019 · 2 min · jiezi

JavaScript高级程序设计第3版读书笔记-第11章-DOM拓展

尽管DOM作为API已经非常完善了,但为了实现更多功能,仍然会有一些标准或专有的拓展。2008年之前,浏览器中几乎所有的拓展都是专有的,此后W3C着手将一些已经成为事实标准的专有拓展标准化,并写入规范中。对DOM的两个主要拓展是Selectors API (选择API)和HTML5。这两个拓展都源自开发社区,而将某些常见做啊及API标准化,一直是众望所归。选择符APIjQuery的核心就是通过CSS选择符查询DOM文档取得元素的引用,从而抛开了getElementById() 和 gettElementByTagName()。Selectors API 是又W3C发起制定的一个标准,致力于让浏览器原生支持CSS查询。所有实现这一功能的JavaScript库都会写一个基础的CSS解析器,然后再使用已有的DOM方法查询文档并找到匹配的节点。而把这个功能变成原生API之后,解析和树查询操作可以在浏览器内部通过编译后的代码完成,极大改善了性能。querySelector()方法querySelector()方法接收一个CSS选择符,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,返回null。// 取得body元素var body = document.querySelector("body");// 取得ID为“myDiv”的元素var myDiv = document.querySelector("#myDiv");// 取得类为"selected"的第一个元素var selected = document.querySelector(".selected");// 取得类为"button"的第一个图像元素var selected = document.querySelector("img.button");如果传入了不支持的选择符,会抛出错误。querySelectorAll()方法和上面类似,但返回的不仅仅是匹配的第一个元素,而是一个NodeList的实例,如果没有匹配,NodeList就是空的。// 取得某div中所有em元素var ems = document.getElementById("myDiv").querySelectorAll("em");// 取得类为“selected”的所有元素var selected = document.querySelectorAll(".selected");// 取得所有p元素中的所有strong元素var strongs = document.querySelectorAll("p strong");取得返回NodeList中的每一个元素,可以使用item()方法,也可以使用方括号语法。matchesSelector()方法Selector API Level2 规范为Element类型新增了一个matchesSelector()方法。接收一个参数,即CSS选择符,如果调用元素与该选择符匹配返回true,否则返回false。截止2011年年中,还没有浏览器支持该方法,不过有一些实验性的实现。因此如果你想使用这个方法,最好编写一个包装函数:function matchesSelector(element, selector) { if (element.matchesSelecotr) { return element.matchesSelecotr(selector) } else if (element.msMatchesSelecotr) { return element.msMatchesSelecotr(selector) } else if (element.mozMatchesSelecotr) { return element.mozMatchesSelecotr(selector) } else if (element.webkitMatchesSelecotr) { return element.webkitMatchesSelecotr(selector) } else { throw new Error("Not supported."); }}元素遍历对于元素间的空格,IE9及之前版本不会返回文本节点,而其他所有浏览器都会返回文本节点。为了弥补这一差异,而又同时保持DOM规范不变,Element Traversal 规范新定义了一组属性。 ...

May 21, 2019 · 3 min · jiezi

Python爬虫入门教程-2100-妹子图网站爬取

妹子图网站----前言从今天开始就要撸起袖子,直接写Python爬虫了,学习语言最好的办法就是有目的的进行,所以,接下来我将用10+篇的博客,写爬图片这一件事情。希望可以做好。 为了写好爬虫,我们需要准备一个火狐浏览器,还需要准备抓包工具,抓包工具,我使用的是CentOS自带的tcpdump,加上wireshark ,这两款软件的安装和使用,建议你还是学习一下,后面我们应该会用到。 妹子图网站---- 网络请求模块requestsPython中的大量开源的模块使得编码变的特别简单,我们写爬虫第一个要了解的模块就是requests。 妹子图网站---- 安装requests打开终端:使用命令 pip3 install requests等待安装完毕即可使用 接下来在终端中键入如下命令 # mkdir demo # cd demo# touch down.py上面的linux命令是 创建一个名称为demo的文件夹,之后创建一个down.py文件,你也可以使用GUI工具,像操作windows一样,右键创建各种文件。 为了提高在linux上的开发效率,我们需要安装一个visual studio code 的开发工具 对于怎么安装vscode,参考官方的https://code.visualstudio.com... 有详细的说明。 对于centos则如下: sudo rpm --import https://packages.microsoft.com/keys/microsoft.ascsudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'然后用yum命令安装 yum check-updatesudo yum install code安装成功之后,在你的CentOS中会出现如下画面 接着说我们上面的操作 ,因为我们这边是用gnome图形界面,所以后面的有些操作,我直接用windows的操作风格讲解了 打开软件>文件>打开文件>找到我们刚刚创建的down.py文件 之后,在VSCODE里面输入 import requests #导入模块def run(): #声明一个run方法 print("跑码文件") #打印内容if __name__ == "__main__": #主程序入口 run() #调用上面的run方法 tips:本教程不是Python3的基础入门课,所以有些编码基础,默认你懂,比如Python没有分号结尾,需要对齐格式。我会尽量把注释写的完整 按键盘上的ctrl+s保存文件,如果提示权限不足,那么按照提示输入密码即可 通过终端进入demo目录,然后输入 ...

May 21, 2019 · 4 min · jiezi

探索webpack运行时

前言本篇文章建议亲自动手尝试. 最近研究了 webpack 运行时源码, 在这篇文章中记录了我的探索 webpack 这个复杂的玩具方式, 并且以图形的形式将 webpack 运行时的流程给记录的下来. 我们讨论的是什么这篇文章主要记录的是 webpack 在将文件打包后是如何在浏览器中加载以及解析的流程. 手段webpack 实在是太复杂的了, 为了避免额外的干扰, 我使用最小化实例的方式来进行探究 webpack 是如何加载和解析模块文件的. 具体的手段:首先准备几个非常简单的 js 文件, 其次准备其对应的 webpack 配置文件, 逐一测试后观察其输出, 阅读其源码, 然后得出结论. 简单总结webpack 的运行时在解析同步模块的时候就和 nodejs 规则如出一辙. 什么意思, 每一个模块在运行前都会被一个函数进行包裹: (function (module, exports, __webpack_require__) { // do something})看起来和 nodejs 一样, 作用起来也一致, 这里的当前模块的导出模块和导入模块就是: exports_webpack_require_而当一个模块被需要的时候, webpack 就会执行这个函数获取其对应的 exports对象. 注意:我们需要的是模块执行完成后的 exports 对象而不是这个模块函数. 在 webpack 中我们可以使用 ESM 规范和 commonjs 规范来加载模块, 无论使用哪种规范, 实际上都可以被这种方式来包裹起来, 因为这两种常见的方式中都存在着相同的导入导出的概念, 所以 webpack 将这两种形式进行了统一包装消除了差异. ...

May 21, 2019 · 3 min · jiezi

重学前端学习笔记二十try里面放returnfinally还会执行吗

笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com。一、引言本文讲一讲 JavaScript 语句。 二、Completion 类型// return 执行了但是没有立即返回,而是先执行了finallyfunction kaimo(){ try{ return 0; } catch(err) { console.log(err) } finally { console.log("a") }}console.log(kaimo()); // a 0// finally 中的 return 覆盖了 try 中的 return。function kaimo(){ try{ return 0; } catch(err) { console.log(err) } finally { return 1; }}console.log(kaimo()); // 12.1、Completion RecordCompletion Record 用于描述异常、跳出等语句执行过程。表示一个语句执行完之后的结果,它有三个字段。[[type]]:表示完成的类型,有 break、continue、return、throw、normal 几种类型[[value]]:表示语句的返回值,如果语句没有,则是 empty[[target]]:表示语句的目标,通常是一个 JavaScript 标签JavaScript 使用 Completion Record 类型,控制语句执行的过程。 三、普通语句在 JavaScript 中,把不带控制能力的语句称为普通语句。种类可以参考引言的图片。1、这些语句在执行时,从前到后顺次执行(这里先忽略 var 和函数声明的预处理机制),没有任何分支或者重复执行逻辑。 2、普通语句执行后,会得到 [[type]] 为 normal 的 Completion Record,JavaScript 引擎遇到这样的 Completion Record,会继续执行下一条语句。 ...

May 19, 2019 · 1 min · jiezi

前端开发会被淘汰吗

在前段时间,有个团队做了个移动端的APP,发布了,据称可以直接生成网页效果,于是有很多人一下子慌了。于是就有不少人来问,“手机APP都可以直接生成网页了,直接就取代了前端开发工程师一部分的工作了,以后APP发展越来越厉害,前端开发的应用空间会不会更小,是不是意味着以后会淘汰掉前端?”、“网页现在那么容易就能做出来了,前端开发是不是饱和了,是不是现在企业都不用前端开发工程师了?”...云云。 那么,前端开发工程师知道会被淘汰掉吗? 答案,当然不会。 提出这些问题的人,多数都是有以下问题: 1.大部分人对前端开发工程师的误解 一个图形界面转换网页的APP的发布就人那么多人出现恐慌,只能说明一点,就是很多人对前端开发的认识还不够清晰,不够明确。真正的前端开发不是机械的傻瓜式网站生成就能替代的,在这个前端开发飞速发展的互联网时代,如果你还认为前端开发还是以前的切图切网页的,那你就大错特错了。从下面这条招聘信息就可以看到企业对现在前端开发技术人员的要求: 光是看岗位职责就知道了,前端开发并非APP傻瓜式生成代码那么简单,一个图形转换网页怎么可能影响前端开发这个行业呢?大家还是太小看前端开发工程师的工作了。 2.行业内大量的技术不精的人造成市场饱和假象前端开发入门学习门槛低,很多人认为HTML、CSS、JavaScript是很简单就掌握的东西,以为在网上看点乱七八糟的教程,随便看看书,用HTML、CSS做个网页布局就可以入门了,那么基本每个人,只要花点时间,就能入门前端了,就可以称为前端开发工程师了。许多人就是这样,想着可以拿到高薪,赶紧快速入门,这种想法其实没有错。但是看点基础,随便学点东西,不深入,只会一点点皮毛就不再深入拓展,这样的大量前端开发涌入前端市场,公司对专业的前端开发需求依然是只增不减的。 目前两年来,移动互联网不断发展,前端开发技术也是在不断进步的,前端应用市场有没有广泛了,前端开发正在走向工程化发展,无论是大小公司,对前端开发的需求都是越来越大的了。但是无论怎么发展,整体市场是不会饱和的,只会低端饱和,高端缺人。在未来,专业的前端开发工程师才是企业争夺的香饽饽。而被淘汰的不是前端开发,而是技术落后和技术不过关的开发者。 就像10年前你说flash动画,说前端开发熟悉的IE6 bug,只要你可以说出大概,能说出来这个专业名称,并且可以搞定开发显示和其他浏览器兼容问题,就可以了。 但是10年后的今天,你再拿出了就不合适了。 3.那么前端开发工程师的未来路在何方? 随着前端开发技术发展,移动端应用、小程序、H5游戏的出现。前端开发应用场景不断拓展。走向更专业和工程化的发展。 在以后,互联网的大量工作将会需要前端开发来完成: l 播放器/游戏:H5代替Flash,如Web Audio、Web Video、Canvasl 日常办公软件(复杂应用,并且慢慢从桌面程序演化为Web):Office、Email、文档管理、产品设计、项目管理、代码编辑器l 大数据/AI配套软件(复杂应用,并且慢慢从桌面程序演化为Web):需要大量的后台系统来做数据分析/机器学习l 容器/小程序:支付宝/微信/钉钉容器,各种行业功能小程序(拥有大量原生APP功能的APP成为互联网新趋势)l 产品信息展示类网站(炫酷应用):各种智能设备官网、大企业官网 互联网的飞速发展过后,以后会走向平稳,不合格的滥竽充数的开发者会逐渐被淘汰,一边是前端开发在未来有着巨大的发展前景和优势,另一边则是互联网企业日益提高的需求门槛。 但是国内很多院校都没有开设相关的专业和课程,那么如果我是一名在校学生,我想成为一名专业前端开发工程师应该怎么办?如何才能提升自己的专业能力,增强自身的竞争力,获得更大的优势呢?前端开发在走向专业化发展,在行业中优势越来越明显,那么我想转行成为一名成功的前端开发工程师,我应该怎么学习呢?怎样才能有效的提高学习和工作效率呢?其实前端技术更新是挺快的,但是技术不管怎么更新,怎么发展,都离不开基础的知识,把基础的内容学好,面向多终端开发,响应式开发掌握好,基础打牢了,在高深的内容都是可以迎刃而解的。

May 18, 2019 · 1 min · jiezi

重学前端学习笔记十九JavaScript中的函数

笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com。一、函数1.1、普通函数用 function 关键字定义的函数。function kaimo(){ // code}1.2、箭头函数用 => 运算符定义的函数。const kaimo = () => { // code}1.3、方法在 class 中定义的函数。class KK { kaimo(){ //code }}1.4、生成器函数用 function* 定义的函数。这种声明方式会定义一个生成器函数 (generator function),它返回一个 Generator 对象。function* kaimo(){ // code}1.5、类用 class 定义的类,实际上也是函数。class KK { constructor(){ //code }}1.6、异步函数普通函数、箭头函数和生成器函数加上 async 关键字。async function kaimo(){ // code}const kaimo = async () => { // code}async function kaimo*(){ // code}二、this关键字this 是执行上下文中很重要的一个组成部分。同一个函数调用方式不同,得到的 this 值也不2.1、普通函数情况下function showThis(){ console.log(this);}var o = { showThis: showThis}showThis(); // globalo.showThis(); // o普通函数的 this 值由调用它所使用的引用决定。获取函数的表达式,返回的是一个 Reference 类型。Reference 类型由两部分组成:一个对象和一个属性值。上面代码里 o.showThis 产生的 Reference 类型,即由对象 o 和属性showThis构成。 ...

May 18, 2019 · 2 min · jiezi

5G时代服务器如何管理

轰轰烈烈的5G时代拉开帷幕了,对于服务器运维人员来说,有新的市场就有新的领域,将因为5G的加入不一样了.所有的大数据,AI智能,工业4.0都建立在云服务器的管理配置下,只有好的一体化容器化的服务器支撑,才有刚需市场和人群,唯有新的设备或软件产生,才有市场和时代的进步.如果现在今天你还在运用古老的方式管理云服务器,有点过时而失去效率了.互联网大趋势就是带宽加大,硬件不断进步,2019年年中由于AMD在服务器处理器上开始布局7nm,服务器硬件将会实现非常便宜现象,不像现在被intel牢牢把控,一家独大,现在市场上一个intel 金牌服务器处理器便宜的一万人民币,贵的一万美金一颗,更不要考虑铂金或更高级的处理器,不过这样的时代将会过去,我们将迎来一个使用云端服务器就像菜市场买菜的时代.硬件一旦便宜,带宽资源加大,软件和服务将迎来新的变革和时代.服务商在这个十字路口就是最直接的受益者,最终的盈利和爆发,将是使用这些新技术的公司和个人.对于管理服务器,现在传统还在一个单机化操作,没有云端概念,被不少站长推上神坛的宝塔和WDCP这两个linux面板,都是属于古老的单机管理模式,而不是云端不是SAAS,只是一个古老的单机服务器软件,运维市场的进步是进步者和先驱者的,对于未来新的取代者来了,依托于平台SAAS化的旗鱼云梯,在这个新旧交替的阶段出生了,她将是运维云服务器市场的一把利剑.唯有新的变革方式,才是进步的标准,移动端下的管理服务器模式,将打破只能够通过传统pc的一种方式,新的设备新的环境,将诞生新的先驱者走上神坛.旗鱼云梯我预言将是新时代linux云端管理面板的领头羊,将是批量化集群化的代表,各种运维新方式和新模式将会诞生,收益的必然是使用者.总结:新的云服务器管理市场变化了,方式的变化将带来变革,旗鱼云梯将是个人和企业管理云服务器的一个极品工具.

May 18, 2019 · 1 min · jiezi

小猿圈Web之前端学习应具体掌握哪些内容

学习不能好高骛远,须一步一个脚印;进步不能一步登天,须一步一级台阶。 一、就业前景 Web前端就业前景分析 大数据直观显示,Web前端开发依然值得大家选择的职业。目前各个企业对于这块的人才稀缺量比较大,可以说这块是有市场的,和其他的行业相比它还没有达到饱和状态,所以说这方面的岗位也是很好就业的。 二、学习内容 对于想学习web前端的同学来说,不知道该学哪些,从哪里着手,按照什么顺序学习,这是很多新同学普遍会遇到的问题,目前国内大学课程里面,很少单独开web前端这门课程,但是网上有很多免费的视频去学习!怎么才能更好的去学习,怎么学才能熟练使用ps切图、熟练掌握html+css布局等,都是值得好好去思考的,掌握正确方向才能进行更深入的学习、实践并且勤加练习!Web前端主要学习哪些内容呢? 第一阶段:前端页面重构:PC端网站布局、HTML5+CSS3基础项目、WebAPP页面布局; 第二阶段:JavaScript高级程序设计:原生JavaScript交互功能开发、面向对象开发与ES5/ES6、JavaScript工具库自主研发; 第三阶段:PC端全栈项目开发:jQuery经典特效交互开发、HTTP协议,Ajxa进阶与后端开发、前端工程化与模块化应用、PC端网站开发、PC端管理信息系统前端开发; 第四阶段:移动端项目开发:Touch端项目、微信场景项目、应用Vue.js开发WebApp项目、应用Ionic开发WebApp项目、应用React.js开发WebApp; 第五阶段:混合(Hybrid)开发:各类混合应用开发; 第六阶段:NodeJS全栈开发:WebApp后端系统开发。 如果你对前端开发感兴趣,那么请利用好你的课余或业余时间时间来学习这些技能,一旦你掌握了这些技能以后,进入web前端行业不是问题,当然,学习方法和学习技巧是十分重要的,如果你现在没有系统的学习方法,建议你在小猿圈上学习,个人感觉很不错,想要学习前端的,抓紧时间学起来吧,时间就是金钱,而且机会不等人,加油吧~

May 16, 2019 · 1 min · jiezi

小猿圈Web之前端开发学习路线及建议

人生在勤,不索何获。——张衡 很多人已经下定决心学习前端开发,但是学习很盲目,没有一个明确的目标,导致学了很长时间效果也没有很明显,最终放弃了,这个结果是我们最不想看到的结果,那么学习路线就十分重要了,好的学习路线对学习会引向成功之路,事半功倍,所以要明确,我该走哪个方向,我该学习什么,我怎么学习才会更好,下面小编说一下,web前端的学习路线,和针对学习路线有什么好的建议给你们。 第一阶段:HTML的学习 超文本标记语言(HyperText Mark-up Language 简称HTML)是一个网页的骨架,无论是静态网页还是动态网页,最终返回到浏览器端的都是HTML代码,浏览器将HTML代码解释渲染后呈现给用户。因 此,我们必须掌握HTML的基本结构和常用标记及属性。 HTML 的学习是一个记忆和理解的过程,在学习过程中可以借助Dreamweaver的“拆分”视图辅助学习。在“设计”视图中看效果,在“代码”视图中学本质, 将各种视图的优势发挥到极致,这种对照学习的方法弥补了单纯识记HTML标签和属性的枯燥乏味,想必对各位初学的宝宝们来说必定是极好的! 在学习了HTML之后,我们只是掌握了各种“原材料”的制作方法,要想盖一幢楼房就还需要把这些“原材料”按照我们设计的方案组合布局在一起并进行一些样式的美化。 第二个阶段:CSS的学习 CSS是英文Cascading Style Sheets的缩写,叫做层叠样式表,是能够真正做到网页表现与内容分离的一种样式设计语言。相对于传统HTML的表现而言其样式是可以复用的,这样就极大地提高了我们开发的速度,降低了维护的成本。 同时CSS中的盒子模型、相对布局、绝对布局等能够实现对网页中各对象的位置排版进行像素级的精确控制。通过此阶段的学习,我们就可以顺利完成“一幢楼房”的建设。 “楼房”建设完成之后,我们可以交给用户使用,但是如果想让用户获得更佳的体验,我们还可以对“楼房”进行更深一步的“装修”,让它看起来更“豪华”一些。 第三个阶段:javascript的学习 JavaScript是一种在客户端广泛使用的脚步语言,在JavaScript当中为我们提供了一些内置函数、对象和DOM操作,借助这些内容我们可以来实现一些客户端的特效、验证、交互等,使我们的页面看起来不那么呆板,给人眼前一亮的体验。 此时,也许你还沉浸在JavaScript给你带来的惊喜之中,但你的项目经理却突然对你大吼道 “这个效果在××浏览器下不兼容,重新搞……” “不兼容?”瞬间石化了有木有? “我擦,坑爹啊!那可是花了我一个晚上写了几百行代码搞定的啊,吐血了都!” JavaScript的兼容性和复杂性有时候的确让我们头疼,还好有“大神”帮我们做了封装。 第四个阶段:jQUery的学习 jQuery 是一个免费、开源的轻量级的JavaScript库,并且兼容各种浏览器(jQuery2.0及后续版本放弃了对IE6/7/8浏览器的支持),同时现在有很多基于jQuery的插件可供选择,这样在我们实现一些丰富的动态效果时更方便快捷,大大节省了我们开发的时间,提高了开发速度,这也充分体现了其 write less,do more的核心宗旨。这个Feel倍儿爽!有么有? “豪华大楼”至此拔地而起,但是每天这样日复一日,年复一年的盖楼,好繁琐!能不能将大楼里面每一个单独部件模块化,当需要盖楼时就像堆积木一样组合在一起,这样岂不是爽歪歪?可以实现吗?答案是肯定的。 这种思想在Web前端开发中也是适合的,于是乎就出现了各种前端框架,在这里推荐给大家的是Bootstrap。 Bootstrap是Twitter推出的一个开源的用于前端开发的工具包,是一个CSS/HTML框架,并且支持响应式布局。一经推出后颇受欢迎,一直是github上的热门开源项目。 在项目开发过程中,我们可以借助Bootstrap提供的CSS样式、组件、JavaScript插件等快速的完成页面布局和样式设置,然后再有针对性的微调样式,这样基于框架进行开发大大缩短了开发周期。站在巨人的肩膀上就是爽! 建议: 首先,任何技术实际都是从零基础开始的,不管是直接学习还是通过相近经历转行。所以不需要因零基础担心。 其次,一定要做好准备:一项技术的学习,意味着你各方面资源不同程度的消耗——时间、工具、资金,甚至融入相关交流圈子的准备。在这个准备过程中,最好是带有一个强硬的目标:“我要在一个月内达到能够实现XXX的水平”或者“我一定要在2周内把XXX项目完成”。如果没有这个规划,一般人都会越来越懒惰,最终放弃。 然后,选准一个或多个老师。这个老师,可以是一个页面,一本书,也可以是一个真实的人。对于前端这块来说,个人的理解是读十本书不如写一个页面,而我本人也是实实在在地硬着头皮一个标签一个标签百度出来的。只有在实际去写的时候,才会出现各种问题,只有在凭自己的思考来解决这些问题的时候,才会得到非常深刻的印象,把相关知识真正转变为自己的。 学习路线和学习方法决定一个人掌握一门技能的效率,有的人几个月,有的人几年也不一定可以掌握,小编希望看到我的文章后有一个明确的方向,学习的方法,然后在定一个目标,逐渐去实现它,这样的学习才是最有效率的学习,希望你在前端的道路上越走越远,可以关注小编成为好朋友,小编也从那个阶段过来的,可以相互学习,相互进步!

May 16, 2019 · 1 min · jiezi

call-apply-与-bind-实例详解

call() , apply() 与 bind() 详解我们知道可以用call(), apply() 和 bind()这三个函数都是用来完成函数调用,并且设置this指向。 call()和apply()是 ECMAScript3 标准引入,而bind()函数则是在 ECMAScript 5 引入。 这边文章会用几个小例子来回忆一下他们之间有什么不一样。 用法call()和apply() 会立即调用函数, 而bind()只会返回一个函数引用,当后面真正调用返回的函数的时候,函数里面的this将会指向给bind()函数传入的参数,并在调用新函数时,将给定参数列表作为原函数的参数序列的前若干项, 所以 bind()函数非常适合在事件回调的时候修改this 指向, 有React 经验的朋友应该会有更深的感受。 call()var dist = 'Beijing';function greet(name, hometown) { var word = `Welcome ${name} from ${hometown} to ${this.dist}!` console.log(word);}var obj1 = { dist: 'Chengdu'};greet.call(obj1, "Tom", "Dallas"); // Welcome Tom from Dallas to Chengdu!greet("Jerry", "Houston"); // Welcome Jerry from Houston to Beijing!因为greet.call(obj) 传入了obj1作为第一个参数,所以在 greet()函数执行时, this指向 obj1。其余的参数就将作为参数传给greet()函数。当没有使用call()而直接调用greet()时, this指向 window对象. ...

May 16, 2019 · 2 min · jiezi

待实践的解决方案微信浏览器长按粘贴不好使

做时间岛的时候有一种类型是集体产品第一个人认养了会生成一个码,这个人把码分享给别人,后面的人通过这个码来认养这个集体产品 这个码我们决定显示在订单页面和支付页面,但是由于码是纯数字构成,不方便记忆,所以需要有一个一键复制的功能 这个好办,引入一个插件就行了,忘记叫啥了,后面找到了再补上 然后页面里就这么写就行了 <div class="duration-item" v-show="detail.identifyCode"><span class="name">下单识别码:</span><span>{{detail.identifyCode}} <button class="copy" v-clipboard:copy="detail.identifyCode" v-clipboard:success="onCopy" v-clipboard:error="onError">一键复制</button></span></div>

May 16, 2019 · 1 min · jiezi

重学前端学习笔记十七Promise里的代码为什么比setTimeout先执行

笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com。一、引言一个 JavaScript 引擎会常驻于内存中,它等待着 宿主 把 JavaScript 代码或者函数传递给它执行。1、ES3版本以及之前,JavaScript 本身还没有异步执行代码的能力,宿主环境传递给 JavaScript 引擎,然后按顺序执行,由宿主发起任务。 2、ES5之后,JavaScript 引入了 Promise,不需要浏览器的安排,JavaScript 引擎本身也可以发起任务。 3、采纳JSC引擎术语,把宿主发起的任务称为宏观任务,把JavaScript引擎发起的任务称为微观任务。 二、宏观和微观任务JavaScript 引擎等待宿主环境分配宏观任务,在 Node 术语中,把这个部分称为事件循环。1、用伪代码来表示:跑在独立线程中的循环 while(TRUE) { r = wait(); execute(r);}2、整个循环做的事情基本上就是反复 等待 - 执行,这里的执行过程,其实都是一个宏观任务。可以大致理解为:宏观任务的队列就相当于时间循环。 3、在宏观任务中,JavaScript 的 Promise 还会产生异步代码,JavaScript 必须保证这些异步代码在一个宏观任务中完成,因此,每个宏观任务中又包含了一个微观任务队列:如下图所示 例如:Promise 永远在队列尾部添加微观任务。setTimeout 等宿主 API,则会添加宏观任务。 三、PromiseJavaScript 语言提供的一种标准化的异步管理方式,当进行 io、等待或者其它异步操作的函数,不返回真实结果,而返回一个承诺,函数的调用方可以在合适的时机,选择等待这个承诺兑现。3.1、基本用法示例 function sleep(duration) { return new Promise(function(resolve, reject) { setTimeout(resolve,duration); }) } sleep(1000).then( ()=> console.log("finished"));Promise 的 then 回调是一个异步的执行过程。 3.2、Promise 函数中的执行顺序 var r = new Promise(function(resolve, reject){ console.log("a"); resolve() }); r.then(() => console.log("c")); console.log("b") // 输出顺序:a b c3.3、setTimeout 混用的 Promise var r = new Promise(function(resolve, reject){ console.log("a"); resolve() }); setTimeout(()=>console.log("d"), 0) r.then(() => console.log("c")); console.log("b") // 输出顺序:a b c dPromise 产生的是 JavaScript 引擎内部的微任务,而 setTimeout 是浏览器 API,它产生宏任务。所以d 必定在 c 之后输出。 ...

May 16, 2019 · 2 min · jiezi

Grid布局-一键布局尝试总结

Gird布局是什么?Grid(网格) 布局使我们能够比以往任何时候都可以更灵活构建和控制自定义网格 ; 能够将网页分成具有简单属性的行和列来完成我们需要的网格布局 Gird布局 撸完后是什么样子? 进入你的第一个Grid布局HTML 代码:box父元素,内部包含6个子元素 items <div class="box"> <div class="item1">1</div> <div class="item2">2</div> <div class="item3">3</div> <div class="item4">4</div> <div class="item5">5</div> <div class="item6">6</div></div>要把box变成 grid(网格),只简单地把display 属性设置为 grid 即可: .box{ display:grid;}当然现在的上图和grid没什么关系,但是请记住“她”最后的样子~~ 为了使其成为二维的网格容器,我们需要定义列和行:创建3行(columns)2列(rows) CSS代码 -> .box{ display: grid; grid-template-columns: 50px 50px 50px; grid-template-rows: 20px 20px;}grid-template-columns 创建列;创建几列就在后面写几个值;grid-template-rows 创建行;创建几行就在后面写几个值;结果: 为了确保能正确理解这些值与网格外观之间的关系,请看一下这个例子。 CSS代码 .box{ display: grid; grid-template-columns: 150px 50px 10px; grid-template-rows: 50px 30px;}请尝试理解上面的代码,思考一下以上代码会产生怎样的布局。 这是上面代码的布局的结果:是不是非常好理解,使用起来也非常简单是不是? 深入探究推荐参考: 5分钟学会CSS Grid布局如何使用 CSS Grid 快速而又灵活的布局CSS Grid 布局完全指南(图解 Grid 详细教程)

May 15, 2019 · 1 min · jiezi

新手入门HTML5开发你必须先搞懂这6个问题

凭借着跨平台,实时更新,无需安装,易于分发等众多优点,HTML5受到越来越多企业的青睐。而凭借着入门相对简单的优势,很多人编程初学者都选择学习HTML5。但对于初学者来说,学习HTML5之前,会有很多疑问。搞懂这些疑问,我们才能更好的学习。本文小编整理了初学者学HTML5之前,你必须先搞懂这6个问题!最后,如果大家如果在自学遇到困难,想找一个前端的学习环境,可以加入我们的前端学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题。 问题一:什么是HTML5? 回答:HTML5是对HTML标准的第五次修订,目前仍未完工。其主要的目标是将互联网语义化,以便更好地被人类和机器阅读,并同时提供更好地支持各种媒体的嵌入。HTML5 的语法是向后兼容的。 但论及HTML5时,大部分开发者所指的并不仅仅是这个新标准,而是(如Jeremy Keith 说)doing anything cool (on the web)做这些“酷”的东西需要用到的技术和标准,除了HTML5标准外,还包括CSS3的一些新属性,以及一些新的API。 WHATWG在18年一月份宣布(至少对于WHATWG 来说),HTML5将是HTML的最后一个版本号,HTML从此成为了一个不断在更新和变化的活标准。 问题二:HTML5的发展前景? 回答:HTML5技术日趋成熟,越来越多的行业巨头正不断向HTML5示好。除苹果、微软、黑莓之外,谷歌的Youtube已部分使用HTML5。支持HTML5的浏览器包括Firefox(火狐浏览器),IE9及其更高版本,Chrome(谷歌浏览器),safari,Opera等;国内的傲游浏览器(Maxthon),以及基于IE或Chromium(Chrome的工程版或称实验版)所推出的360浏览器、搜狗浏览器、QQ浏览器、猎豹浏览器等国产浏览器同样具备支持。 HTML5是WEB的未来,HTML5不仅在PC端,更是在移动端上也有广泛的应用。 据统计2013年全球有10亿手机浏览器支持HTML5,同时HTML Web开发者数量将达到200万。HTML5将成为未来5-10年内,移动互联网领域的主宰者。HTML5的未来十分光明,值得我们去学习。 问题三:HTML5好就业吗? 截至2016年6月,我国网民规模达7.10亿,手机网民规模达6.56亿,通过手机上网的用户远远高于电脑端。从手机与电脑上网的使用率来看,移动互联已经成为了我们生活当中不可或缺的部分,未来移动互联网在很大程度上将会取代传统互联网,发展前期十分好。 HTML5作为移动互联网主流前端开发语言,其发展前景也十分可观。越来越多的技术岗位人才出现了稀缺状态,HTML5开发工程师基本已经成为了每家互联网公司不可缺少的人才,目前国内移动端HTML5人才空缺严重。 问题四:HTML5好学吗?零基础能学会吗? 回答:HTML5相对于后台和开发而言比较简单。所见即所得,不需要太多的算法与逻辑。这也是很多零基础小白首选HTML5的原因。 问题五:学了HTML5能做什么工作? 回答:学完HTML5后,你可以从事web前端开发工程师、HTML5开发工程师、web APP开发工程师、JavaScript开发工程师等工作。 问题六:学习HTML5有学历和专业的限制吗? 回答:学HTML5对专业、学历没有特定的要求。有学习意愿的人都可以去学。 以上就是小编整理的初学HTML5应先了解的6个问题。搞清楚了这几个关键问题,再学习HTML5是不是安心了许多?不管是自学也好,培训也罢。大家只要树立明确的学习目标,制定合理的学习规划,全力以赴去学习。学好HTML5没有想象中的那么难! 不管学习什么内容,基础是很重要的,学习HTML5技术也是一样的,技术知识打牢,多看多问多敲代码。相信坚持就可以学会这门高薪的技术。

May 15, 2019 · 1 min · jiezi

重学前端学习笔记十六HTML元信息类标签

笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com。一、什么是元信息类标签元信息,是指描述自身的信息。元信息类标签,就是 HTML 用于描述文档自身的一类标签。二、head 标签作为盛放其它语义类标签的容器使用。2.1、注意1、head 标签规定了自身必须是 html 标签中的第一个标签,它的内容必须包含一个 title,并且最多只能包含一个 base。 2、如果文档作为 iframe,或者有其他方式指定了文档标题时,可以允许不包含 title 标签。 三、title 标签title 标签表示文档的标题,title 应该完整地概括整个网页内容的。四、base 标签base 标签作用是给页面上所有的 URL 相对地址提供一个基础。<html> <head> <base href="https://time.geekbang.org" target="_blank"/> </head> <body> <a href="">极客时间</a> </body></html>上面的代码里面a标签的属性href没有值,但是当你点击极客时间,它就会新开一个页面打开base标签里的href。 五、meta 标签meta 标签是一组键值对,它是一种通用的元信息表示标签。5.1、具有 charset 属性的 metaHTML5开始 meta标签新增 charset 属性的 meta 标签无需再有 name 和 content。charset 型 meta 标签非常关键,它描述了 HTML 文档自身的编码形式。建议放在 head 的第一个。 <html> <head> <meta charset="UTF-8">……5.2、具有 http-equiv 属性的 meta具有 http-equiv 属性的 meta 标签,表示执行一个命令,可以不需要 name 属性。<meta http-equiv="content-type" content="text/html; charset=UTF-8">其他命令: content-language:指定内容的语言default-style:指定默认样式表refresh:刷新set-cookie:模拟 http 头 set-cookie,设置 cookiex-ua-compatible:模拟 http 头 x-ua-compatible,声明 ua 兼容性content-security-policy:模拟 http 头 content-security-policy,声明内容安全策略5.3、name 为 viewport 的 meta<meta name="viewport" content="width=500, initial-scale=1">width:页面宽度,可以取值具体的数字,也可以是 device-width,表示跟设备宽度相等。height:页面高度,可以取值具体的数字,也可以是 device-height,表示跟设备高度相等。initial-scale:初始缩放比例minimum-scale:最小缩放比例maximum-scale:最大缩放比例user-scalable:是否允许用户缩放做好了移动端适配的网页,应该把用户缩放功能禁止掉,宽度设为设备宽度 ...

May 15, 2019 · 1 min · jiezi

微信浏览器中video播放视频踩坑总结

video属性介绍iOS的属性playsinlineOn iPhone, video playsinline elements will now be allowed to play inline, and will not automatically enter fullscreen mode when playback begins.video elements without playsinline attributes will continue to require fullscreen mode for playback on iPhone.When exiting fullscreen with a pinch gesture, video elements without playsinline will continue to play inline.来源-webkit官网-New video policiesfor iOS iOS设置了这个属性就不会自动全屏了,但是Android微信和QQ有腾讯的限制,仍旧会自动全屏。 腾讯X5属性x5-video-player-type启用H5同层播放器 H5同层播放器:DOM可以浮在video上面 非H5同层播放器:video元素在最上层( 微信里会有腾讯的广告 ) x5-video-player-fullscreen全屏方式 视频播放时将会进入到全屏模式如果不申明此属性,页面得到视口区域为原始视口大小(视频未播放前),比如在微信里,会有一个常驻的标题栏,如果不声明此属性,这个标题栏高度不会给页面,播放时会平均分为两块(上下黑块) 来源-腾讯浏览服务-H5同层播放器接入规范 相关CSSobject-fit: 控制视频填充方式object-position: 控制视频显示位置 问题全面屏适配x5-video-player-fullscreen="true"视频会铺满屏幕,但是H5同层播放器的顶部栏位置在刘海下面。因此刘海位置的视频不会被顶部栏遮盖。 ...

May 14, 2019 · 1 min · jiezi

Nodejs新手必须知道的4个JavaScript概念

如果只需要知道一种编程语言就可以构建一个全栈的应用程序,是不是特别了不起?Ryan Dahl为了把这个想法成为现实,创造了node.js。Node.js是建立在Chrome强劲的V8 JavaScript引擎上的服务器端框架。虽然最初是用C++编写的,但是应用程序通过JavaScript运行。 这样一来,问题就解决了。一种语言就可以统治一切。而且,在整个应用程序中你只需要使用这一种语言。所以,我们需要深刻了解node.js。这就是本文的主题。 下面这四个基本概念是你想要掌握node.js所必需的。我会尽可能长话短说向大家介绍它们。 1.非阻塞或异步I/O由于Node.js是一种服务器端框架,所以它的一个主要工作就是处理浏览器请求。在传统的I/O系统中,当前请求只有当先前请求的响应(HTML页面)已到达才会发出。这就是为什么它被称为阻塞I/O。服务器阻塞其他请求是为了处理当前的请求,而这会导致浏览器的等待。 Node.js不遵循I/O的这个原则。如果一个请求需要花费较长时间,那么Node.js会发送请求到事件循环(event loop)中,并继续在调用栈(call stack)中处理下一个请求。一旦未决请求完成处理,它就会告诉Node.js,并将响应渲染在浏览器上。 用一个虚拟的例子来理解这一点: 阻塞I / O // take order for table 1 and wait...var order1 = orderBlocking(['Coke', 'Iced Tea']);// once order is ready, take order back to table.serveOrder(order1);// once order is delivered, move on to another table.// take order for table 2 and wait...var order2 = orderBlocking(['Coke', 'Water']);// once order is ready, take order back to table.serveOrder(order2);// once order is delivered, move on to another table.// take order for table 3 and wait...var order3 = orderBlocking(['Iced Tea', 'Water']);// once order is ready, take order back to table.serveOrder(order3);// once order is delivered, move on to another table.在这个餐厅例子中,服务员给出菜单,等待订单完成,然后再回到餐桌根据菜单上菜。在当前客户点菜时,服务员就在旁边等待,不接受其他客户的菜单。 ...

May 14, 2019 · 2 min · jiezi

word如何快速画流程图Word生成流程图

作为一名优秀的系统分析员,在平时的软件开发和方案总体设计中往往需要绘制各种各样的流程图,像数据流程图、工作流程图、系统流程图等等。其中常用的也很重要的就是系统流程图了,它是系统分析员在计算机事务处理应用进行系统分析时常用的一种描述方法。可以理解为描绘系统物理模型的传统工具,它描述了计算机事务处理中从数据输入开始到获得输出为止各个处理工序的逻辑过程。 流程图绘制软件选择在流程图的绘制过程中,选择一款优秀的流程图绘制软件往往能带来事半功倍的效果,亿图就是这样一款实用的绘图软件。为什么这么说?因为一款优秀的流程图绘制软件往往具有以下三个特点,而亿图图示正好拥有这些特点。 1、操作简单 现在市面上很多的流程图绘制软件操作都过于繁琐,有时候连一个符号都需要重复画好几遍,导致绘图效率低下。而亿图流程图绘制软件采用的是拖曳式绘图方式,只需要用鼠标简单移动一下,即可轻松完成绘图。 2、功能丰富 亿图流程图软件不但自带丰富精美的模板和符号素材供我们免费使用,而且还支持对图形素材进行各种美化设置,功能之强大只有你想不到,没有它做不到。 3、兼容多种文件格式 亿图软件不仅可以导出PDF、 Word、 PPT、Excel、 图片、 HTML、Visio、SVG等文件格式,还可以导出Visio所不支持的格式,如PS&EPS等等。 系统流程图绘制步骤在选择好绘图工具以后,接下来我们就要开始准备画流程图了。 1、打开亿图图示软件,选择新建—流程图—创建空白文档进入画布,也可以选择自己喜欢的流程图模板点击进入。 2、进入之后我们可以左侧面板选择想要的图形素材,用鼠标点击或拖动它到图表区域中。 3、选择完之后双击图形可以在里面输入文本内容。输入完成后可以在右侧面板中自由更改图形线条颜色、粗细等样式。 4、重复以上步骤很快就可以将流程图画出来了,之后我们可以将画好的系统流程图进行保存或者导出发送。点击菜单栏上的文件按钮返回到软件新建界面,然后选择导出,选择需要导出的格式点击确定即可保存。 想要了解更多精美流程图的绘制技巧及方法请访问:如何画出精美的流程图?流程图制作软件使用技巧

May 14, 2019 · 1 min · jiezi

提升-Nodejs-应用性能的-5-个技巧

Node.js是全球领先的用JavaScript——世界上最流行的编程语言创建服务器应用程序的工具。提供web服务器和应用服务器的功能,Node.js被认为是各种以微服务为基础的开发和交付的关键工具。 Node.js可以替代或增强Java和.NET用于后端应用程序的开发。 Node.js是单线程的,并且使用非阻塞I / O,允许它扩展并支持数以万计的并行操作。它和NGINX共享这些架构特性,并解决C10K问题——支持超过10000个并发连接——NGINX也可以解决并行操作问题。 Node.js以它的高性能和高开发效率享誉全球。 那么,哪里会出问题呢? Node.js有一些薄弱环节和漏洞,这些薄弱环节和漏洞会使得基于Node的系统容易出现性能不佳,甚至崩溃的现象。尤其是当基于Node.js的web应用程序碰到访问量高速增长的时候,问题就会出现得更加频繁。 此外,Node.js是用于创建和运行产生核心可变网页内容逻辑的强大工具。但它在服务静态内容——例如图像和JavaScript文件——以及平衡多个服务器上的负载这些方面还没那么强大。 为了最有效地使用Node.js,你需要缓存静态内容,代理和平衡多个应用程序服务器负载,并管理客户端、Node.js和助手——如运行Socket.IO的服务器——之间的端口竞争。 NGINX可用于解决这些问题,从而使得它成为了一个Node.js性能优化的伟大工具。 使用这些技巧可以提高Node.js应用性能: 实现反向代理服务器缓存静态文件多服务器的负载均衡代理WebSocket连接实现SSL / TLS和HTTP / 2注:Node.js应用性能的快速解决办法是修改你的Node.js配置,以充分利用现代多核服务器的优势。你也可以读一读另一篇关于如何让Node.js生成单独子进程的文章。 1.实现反向代理服务器我们在NGINX.Inc的时候,如果看到有应用程序服务器直接接触传入的访问流量,用于高性能网站核心的时候,总会不自觉地有点担忧。这包括许多基于WordPress的网站,也包括Node.js网站。 Node.js专为可扩展性而设计,它比大多数应用服务器更易于扩展,它的web服务器端可以处理好大量的访问流量。但是web服务并不是Node.js存在的理由——Node.js并不是因为这个目的而被构建的。 如果你有一个大流量网站,提高应用程序性能的第一步是在你的Node.js服务器前放一个反向代理服务器。这样可以保护Node.js服务器直接接触外部访问流量,还能让你灵活使用多个应用程序服务器,平衡负载服务器,缓存内容。 在现有的服务器设置前放NGINX作为一个反向代理服务器,是NGINX的核心用例,全世界各地已经有数以千万计的网站实施了。 使用NGINX作为Node.js的反向代理服务器还有一些特定的优势,其中包括: 简化操作权限和端口分配更有效地服务于静态图像(见第二个小窍门)成功管理Node.js崩溃的情况减轻DoS攻击注意:这些教程介绍了如何使用NGINX作为在Ubuntu 14.04或CentOS环境中的反向代理服务器,而且可以总览NGINX置于node.js之前的整体情况。 2.缓存静态文件随着基于Node.js的网站的使用量的增长,服务器的压力开始越来越大。这时候你要做这两件事情: 充分利用Node.js服务器。使得添加应用程序服务器和负载均衡变得容易。这其实是很容易做到的。一开始就实施NGINX作为反向代理服务器,就像第一点技巧中所描述的那样。这样就能轻易实现高速缓存、负载平衡(如果有多个Node.js服务器的话)等。 针对Modulus,一个应用程序容器平台,有一篇非常有用的关于利用NGINX增压Node.js应用程序性能的文章。由于Node.js都是靠自己完成所有的工作的,所以我们的网站平均每秒只能服务将近900个请求。使用NGINX作为反向代理服务器,提供静态内容,一个站点每秒可服务超过1600个请求——性能提升了近2倍。 性能的提升能让你有时间采取额外措施以适应进访问量的增长,如审查(或提高)网站设计,优化程序代码,部署更多的应用程序服务器。 以下配置代码适用运行于Modulus的网站: server { listen 80; server_name static-test-47242.onmodulus.net; root /mnt/app; index index.html index.htm; location /static/ { try_files $uri $uri/ =404; } location /api/ { proxy_pass http://node-test-45750.onmodulus.net; }}例如,在Nginx位置块中,你可能不想要缓存某些内容。例如,你通常不会想要缓存博客平台的管理界面的。以下就是禁用[或免除]缓存Ghost管理界面的配置代码: location ~ ^/(?:ghost|signout) { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_pass http://ghost_upstream; add_header Cache-Control "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0"; }缓存NGINX服务器上的静态文件可以显著减轻Node.js应用程序服务器的负载,让它能够达到更佳性能。 ...

May 14, 2019 · 2 min · jiezi

web容器如何自适应视口大小

前言在前端生涯上,经常会遇到需要容器自适应视口高度这种情况,本文将介绍我能想到的解决这个问题的方案。基础知识html元素的高度默认是auto(被内容自动撑开),宽度默认是100%(等于浏览器可视区域宽度),没有margin和padding; body元素的高度默认是auto,宽度默认是100%,有margin而没有padding; 若想让一个块元素(如div)的高度与屏幕高度自适应,始终充满屏幕,需要从html层开始层层添加height=100%,而又因为html,body元素的width默认就是100%,因此在里面的div 设定width=100%时就能和屏幕等宽。 方法一:继承父元素高度给html、body标签添加css属性height=100%,然后在需要撑满高度的容器添加css属性height=100%,如下: <html> <body> <div class="example"> </div> </body> <html> html{ height:100%;//让html的高度等于屏幕 } body{ height:100%; margin:0; } .example{ width: 100%; height:100%; background:rgb(55, 137, 243); }注意:添加类名.example的元素必须是块级元素而且需要是body的直接子元素,也就是要设置height=100%,其父元素必须有高度 方法二:使用绝对定位(absolute)给需要撑满的容器添加绝对定位(absolute),然后设置top、left、right、bottom分别为0,如下: <html> <body> <div class="example"> </div> </body> <html> .example{ position: absolute; top:0; left:0; bottom:0; right:0; background:rgb(55, 137, 243); }注意:若目标元素的父级元素没有设置过相对定位(relative)或绝对定位(absolute),那么目标元素将相对于html定位,html不需要设置宽高;否则相对于其设置过相对定位(relative)或绝对定位(absolute)的父级元素定位,且其父级元素必须有宽度和高度,如下: <html> <body> <div class="example2"> <span class="example"></span> </div> </body> <html> .example2{ position: relative; width:100%; height:100px; } .example{ position: absolute; top:0; left:0; bottom:0; right:0; background:rgb(55, 137, 243); }方法三:使用固定定位(fixed)给需要撑满的容器添加绝对定位(absolute),然后设置top、left、right、bottom分别为0,如下: ...

May 14, 2019 · 1 min · jiezi

canvas塔防游戏

声明该DEMO素材取自于猫狗大战,只用于学习交流目的使用,如果冒犯了权益请联系删除; 项目概述一款横板塔防游戏,制作的很粗糙,不使用任何现有框架,只是DEMO水平;目前实现了:关卡加载人物选择士兵点选攻击、点数计算暂停、over功能尚未解决士兵资源配置冷却和消耗英雄升级下一关功能特效bugBoss血量问题士兵位置计算问题项目预览试玩地址游戏地址项目截图

May 14, 2019 · 1 min · jiezi

关于微信授权后底部白条问题

最近在做关于微信公众号H5页面开发,发现了一个微信“恶心”的底部白条,严重影响了用户的体验。查阅了很多资料,本人项目使用了vue单页面开发,页面间调整直接使用this.$router.replace的做法可以很完美地解决微信底部白底的问题。项目中涉及到了通过微信授权的方式进行获取用户信息以及实现用户的自动登录功能,然而以为this.$router.replace做法可以完美不留底部白底的时候,竟然出现了“恶心”的底部白条。思考问题所在:当进入了Html页面后会向后台请求授权,授权后页面将重定向,此时将会出现一个底部白条,不管你如何操作,“顽固”白条依然存在。处理问题的考虑:是否能够不进入html的情况下先行进行授权处理,授权处理完毕后才进入html页面(就是在此之前不进入html页面)参考公众号开发的授权过程:微信授权的其中一种方式(授权地址):scope为snsapi_basehttps://open.weixin.qq.com/co...把redirect_uri中写入需要微信授权后重定向的页面,这样一来,通过上面的授权地址,点击后会先到微信授权,授权成功后才会进行我们设置在redirect_uri中的页面,此时并未出现任何的白条至此,授权完成后导致的底部白条不再出现。

May 14, 2019 · 1 min · jiezi

前端利用pdfobjectjs处理pdf文件

插件说明插件pdfobject.js官方链接:https://pdfobject.com/ 插件引入a、创建盒子,可以对个盒子example1通过style添加样式 <style>.pdfobject-container { height: 30rem; border: 1rem solid rgba(0,0,0,.1);}</style><div id="example1"></div>b、引入插件 <script src="js/pdfobject.min.js"></script><script> PDFObject.embed( "/pdf/sample-3pp.pdf", "#example1" );</script>初始化配置PDFObject.embed(url [string], target [mixed], options [object]) a、url [string]即为pdf的链接;b、target [mixed] 指定dom节点;c、options [object]初始化配置选项 page(初始化的时候跳转到第几页)id(给嵌入元素一个id值)width(嵌入元素的宽度)height(嵌入元素的高度)fallbackLink(回调链接,在浏览器不支持的情况下,给与一段提示文字和文件下载链接)pdfOpenParams(允许使用adobe开放参数)开放接口view: 基本参数: Fit FitH FitH, top FitV FitV, left FitB FitBH FitBH, top FitBV FitBV, left 至此不在一一介绍:请查看文档https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/pdf_open_parameters.pdfPDFJS_URL(pdf.js的展示页面链接)forcePDFJS(是否允许整合pdf.js,true为允许)参考链接:1、https://pdfobject.com/2、pdf官方开放接口: https://www.adobe.com/content...3、https://blog.csdn.net/badgirl...

May 14, 2019 · 1 min · jiezi

jQuery源码解析之width

一、在讲之前,先弄清 boxSizing 属性(1)box-sizing 是默认值 "content-box" <body><script src="jQuery.js"></script><div id="pTwo" style="width: 55px; border:1px red solid;">这是divTwo</div><script> $("#pTwo").width() //55</script></body>$().width()的值是 55 (2)box-sizing 是 "border-box" <div id="pTwo" style="width: 55px; box-sizing: border-box; border:1px red solid;">这是divTwo</div>$().width()的值是 53 因为 border-box 是包括 border、padding、content 的,而 content-box 只包括 content。可想而知,jQuery的$().width() 中也包含了对 borderBox 的判断。 注意下div标签的默认值 二、$().width()作用:获取目标元素的宽度 源码: //源码7033行 //$.each(obj,callback(index,item){}) jQuery.each( [ "height", "width" ], function( i, dimension ) { //i:0 dimension:height //i:1 dimension:width //cssHooks是用来定义style方法的 jQuery.cssHooks[ dimension ] = { //读 //$().width() //参数:elem:目标DOM元素/computed:true/extra:"content" get: function( elem, computed, extra ) { console.log(elem, computed, extra,'extra7040') if ( computed ) { // 某些元素是有尺寸的信息的,如果我们隐式地显示它们,前提是它必须有一个display值 // Certain elements can have dimension info if we invisibly show them // but it must have a current display style that would benefit // 上面这句话的意思是,某个元素用display:none,将它从页面上去掉了,此时是获取不到它的宽度的 // 如果要获取它的宽度的话,需要隐式地显示它们,比如display:absolute,visible:hidden // 然后再去获取它的宽度 // block:false // none:true // rdisplayswap的作用是检测 none和table开头的 return rdisplayswap.test( jQuery.css( elem, "display" ) ) && // 兼容性的考虑,直接看 getWidthOrHeight // Support: Safari 8+ // Table columns in Safari have non-zero offsetWidth & zero // getBoundingClientRect().width unless display is changed. // Support: IE <=11 only // Running getBoundingClientRect on a disconnected node // in IE throws an error. // display为none的话,elem.getBoundingClientRect().width=0 // elem.getClientRects() 返回CSS边框的集合 // https://developer.mozilla.org/zh-CN/docs/Web/API/Element/getClientRects ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? swap( elem, cssShow, function() { return getWidthOrHeight( elem, dimension, extra ); } ) : //$().width()情况 //dimension:width/extra:"content" getWidthOrHeight( elem, dimension, extra ); } }, };} );解析:(1)box-sizing 是默认值,并且 display 不为 none① rdisplayswap作用:检测目标元素的display属性的值 是否为none或以table开头 ...

May 13, 2019 · 9 min · jiezi

免费前端学习一对一师徒计划

不管你上学在读,还是已经参加工作的,只要你有学习的动力,都可以参加这个免费的一对一学习计划。 无论你是零基础,还是有一些基础,或是想要提高自己,那么我都和你,一对一,免费的,从你需要的地方,开始讲起。 这样最大的好处在于,真正的实现了课程的定制化,“你是什么样的程度,你就有什么样的课程”。 也就是说,此计划中的每个人的课程,都是不同的,没有固定的课程。 学习范围: html、css;JavaScript、es6;react、node、vue小、中、大实例开发思路、代码全局记忆、业务逻辑- 更多 学习方式: 将每个知识点,拆分为单个模块。学完一个模块,完成开发。通过考核,才能进入下一个模块。<!--  报名之后, 我会与你,进行深入的沟通, 然后为你量身订制课程模块体系, 可以根据你自己的情况,选择相应的起点模块。  --> 学习方式: 1、视频一对一; 2、学习时间提前预约; 3、作业、批改、指导... 教到什么程度嘛,这要看你能接受到什么程度。也许有的同学来几次就不参加了也说不定呢。毕竟人都是有惰性的。 这个计划也是我对于以后发展路线的一次新的探索,你可以理解为这是另一种形式的前端免费公开课,只不过是只讲给你一个人听。 先尽力做好吧,然后根据实际运行情况再调整。 报名方式: 扫下方二维码加我微信,- 加我时注明:【一对一】 最后, 这个计划是不要钱的;也不任何押金;来,去,自由;

May 13, 2019 · 1 min · jiezi

重学前端学习笔记十四浏览器工作解析四

笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com。一、概括本文主要聊聊浏览器是怎样确定每一个元素的位置的二、基本概念2.1、排版浏览器把排版的内容(文字、图片、图形、表格等等)确定它们位置的过程,叫作排版。浏览器最基本的排版方案是正常流排版。2.2、盒模型浏览器又可以支持元素和文字的混排(元素被定义为占据长方形的区域),还允许边框、边距和留白,这个就是所谓的盒模型。2.2.1、绝对定位元素绝对定位元素把自身从正常流抽出,直接由 top 和 left 等属性确定自身的位置,不参加排版计算,也不影响其它元素。完全跟正常流无关的一种独立排版模式。2.2.2、浮动元素浮动元素则是使得自己在正常流的位置向左或者向右移动到边界,并且占据一块排版空间。 float 元素非常特别,浏览器对 float 的处理是先排入正常流,再移动到排版宽度的最左 / 最右(主轴的最前和最后)。三、正常流文字排版3.1、字体解析库(freetype)来自freetype的两张图片关于获取某个特定的文字相关信息: 纵向版本: advance:每一个文字排布后在主轴上的前进距离。 3.2、css属性影响除了字体提供的字形本身包含的信息,文字排版还受到一些 CSS 属性影响,如 line-height、letter-spacing、word-spacing 等。display 值为 inline 的元素中的文字排版时会被直接排入文字流中,inline 元素主轴方向的 margin 属性和 border 属性也会被计算进排版前进距离当中。即使没有元素包裹,混合书写方向的文字也可以形成一个盒结构,在排版时,遇到这样的双向文字盒,会先排完盒内再排盒外。 四、正常流中的盒多数 display 属性都可以分成两部分:内部的排版和是否 inline,带有 inline- 前缀的盒,被称作行内级盒。vertical-align 属性决定了盒在交叉轴方向的位置,也会影响实际行高。浏览器对行的排版,一般是先行内布局,再确定行的位置,根据行的位置计算出行内盒和文字的排版位置。块级盒比较简单,它总是单独占据一整行,计算出交叉轴方向的高度即可。五、其他排版比如: flex 排版,支持了 flex 属性,flex 属性将每一行排版后的剩余空间平均分配给主轴方向的 width/height 属性。浏览器支持的每一种排版方式,都是按照对应的标准来实现的。 个人总结大漠老师在这篇文章下留言说:“文档流和排版是最难的部分!” 看来下次要看看flex的一些东西了。。。

May 13, 2019 · 1 min · jiezi

js点击复制按钮实现内容拷贝

使用api:document.execCommand() 实现方式: 1、定义输入框 2、定义方法 3、复制按钮绑定步骤二方法 注意:1:document.execCommand(“copy”)只执行输入框中的内容的复制2:此方法移动端ios不好使,安卓侧可用。有一定浏览器要求3:最好事先定义input框,若在方法中直接创建易导致复制的内容不能动态变化

May 13, 2019 · 1 min · jiezi

那些容易被忽视Nodejs-面试题

如果你希望找一份有关Node.js的工作,但又不知道从哪里入手考察自己对Node.js的掌握程度。 本文就提供了这样的一份Node.js面试题列表,通过考察Node.js编程中的一些主要细节, 来帮助你评估你对于Node.js开发的掌握程度。 在进入正文之前,需要提前声明两点: 这些问题只是Node.js知识体系的一个局部,并不能完全考察被面试者的实际开发能力。对现实世界开发中遇到的问题,需要的是随机应变与团队合作,所以你可以尝试结对编程。Node.js面试题列表什么是错误优先的回调函数?你如何避免回调地狱?你如何用Node来监听80端口?什么是事件循环?什么工具可以用来保证一致的风格?运算错误与程序员错误的区别?为什么npm是有用的?什么是stub?举个使用场景?什么是测试金字塔?当我们谈到HTTP API时,我们如何实施它?你最喜欢的HTTP框架,并说明原因?现在,我们依次来解答这些问题吧。 什么是错误优先的回调函数?错误优先的回调函数用于传递错误和数据。第一个参数始终应该是一个错误对象, 用于检查程序是否发生了错误。其余的参数用于传递数据。例如: fs.readFile(filePath, function(err, data) { if (err) { //handle the error } // use the data object});解析:这个题目的主要作用在于检查被面试者对于Node中异步操作的一些基本知识的掌握。 如何避免回调地狱你可以有如下几个方法: 模块化:将回调函数分割为独立的函数使用Promises使用yield来计算生成器或Promise解析:这个问题有很多种答案,取决你使用的场景,例如ES6, ES7,或者一些控制流库。 在Node中你如何监听80端口这题有陷阱!在类Unix系统中你不应该尝试监听80端口,因为这需要超级用户权限, 因此不建议让你的应用监听这个端口。 目前,如果你想让你的应用一定要监听80端口,可以这么做:让你的Node应用监听大于1024的端口, 然后在它前面在使用一层方向代理(例如nginx)。 解释:这个问题用于检查被面试者是否有实际运行Node应用的经验。 什么是事件循环Node只运行在一个单一线程上,至少从Node.js开发者的角度是这样的。在底层, Node是通过libuv来实现多线程的。 Libuv库负责Node API的执行。它将不同的任务分配给不同的线程,形成一个事件循环, 以异步的方式将任务的执行结果返回给V8引擎。可以简单用下面这张图来表示。 每一个I/O都需要一个回调函数——一旦执行完便推到事件循环上用于执行。 解释:这用于检查Node.js的底层知识,例如什么是libuv,它的作用是什么。 给大家推荐一个技术交流学习圈,里面概括移动应用网站开发,css,html,webpack,vue node angular以及面试资源等。获取资料对web开发技术感兴趣的同学,可以加入交流圈????????????1007317281,不管你是小白还是大牛都欢迎,还有大牛整理的一套高效率学习路线和教程与您免费分享,同时每天更新视频资料。 哪些工具可以用来确保一致性的风格你可以有如下的工具: JSLintJSHintESLintJSCS- 推荐在团队开发中,这些工具对于编写代码非常的有帮助,能够帮助强制执行给定的风格指南, 并且通过静态分析捕获常见的错误。 解析:用于检查被面试者是否有大型项目开发经验。 运算错误与程序员错误的区别运算错误并不是bug,这是和系统相关的问题,例如请求超时或者硬件故障。而程序员错误就是所谓的bug。 解析:这个题目和Node关系并不大,用于考察面试者的基础知识。 为什么npm包管理器有帮助This command locks down the versions of a package’s dependencies so that you can control exactly which versions of each dependency will be used when your package is installed. – npmjs.com在你开发Node应用时npm会非常的有用,它可以帮你确定你的依赖的具体的版本号。 ...

May 13, 2019 · 1 min · jiezi

从零入门系列1Sprint-Boot-程序结构设计说明

【从零入门系列-1】Sprint Boot 程序结构设计说明文章系列【从零入门系列】Sprint Boot 之 Hello World设计效果图页面展示 增 删 改 查 搜索 页面程序结构图书馆结构分布图 1-WEB bootstrapbootstrap-table2-后台程序 控制层:前端路由和后端处理关系处理数据服务层:自定义对数据库的访问操作方法数据访问层:实现通用的数据库访问功能,SpringData的JPA方案数据实体层:定义数据库表的属性方法3-数据库 Book表:名字,作者,封面 说明程序的主要结构比较简单,主要难点在于初次接触很多东西理解不到位,各个层次间的交互链路以及Java基础薄弱,使得中间会有磕磕碰碰,且即使完成了整个项目,也不确定其中实现方案或者编码是否不合理。 但,先做出来再说,其他问题等以后熟练了再慢慢改进。 结束语本章预先提供了项目实际效果图以及项目的整体结构设计,后续文章会根据本篇章设计依次实现各个模块,请持续关注。

May 13, 2019 · 1 min · jiezi

IE9以下不支持HTML5的解决方案

我们可以使用 Sjoerd Visscher 创建的 "HTML5 Enabling JavaScript", " shiv" 来解决该问题: <!--[if lt IE 9]> <script src="https://apps.bdimg.com/libs/html5shiv/3.7/html5shiv.min.js"</script><![endif]-->以上代码是一个注释,作用是在 IE 浏览器的版本小于 IE9 时将读取 html5.js 文件,并解析它,且引用代码必须放在<head>元素中,因为 IE 浏览器在解析 HTML5 新元素时需要先加载该文件。

May 13, 2019 · 1 min · jiezi

2019年最热门的JavaScript开源项目

我们一起来看看在GitHub上最受程序员欢迎的JavaScript项目有哪些: 1libpku https://github.com/lib-pku/li... Star 15820 该项目是由一名北大在读大学生整理创建的北京大学课程资料,涉及的课程领域从专业课到公选课,政治课、英语课、通选课等,甚至连历年考试的试卷都有了,查阅更多项目详情可点击:《我在GitHub上找到了北大的计算机课程资料》最后,如果大家如果在自学遇到困难,想找一个前端的学习环境,可以加入我们的前端学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题。 2Awesome-Design-Tools https://github.com/LisaDziuba... Star 14894 2019年4月最热门的JavaScript开源项目 本项目收集了许多很棒的设计工具,诸如动画工具、AR、字体工具、渐变工具、代码工具等等 3vue https://github.com/vuejs/vue Star 137160 Vue.js 是构建 Web 界面的 JavaScript 库,提供数据驱动的组件,还有简单灵活的 API,使得 MVVM 更简单。主要特性: ● 可扩展的数据绑定 ● 将普通的 JS 对象作为 model ● 简洁明了的 API ● 组件化 UI 构建 ● 配合别的库使用 4svelte https://github.com/sveltejs/s... Star 12842 Svelte 是一个前端 UI 框架。具有以下特性: 解决网站的臃肿危机。Svelte 将你的模板变成快速、轻量级的 vanilla JavaScript。简单易用。使用你掌握的语言,从可组合、易写的模块中构建应用。快速而又坚固。编译时静态分析确保浏览器不再需要更多的工作。5You-Dont-Need-jQuery https://github.com/nefe/You-D... Star 18024 本项目总结了大部分 jQuery API 替代的方法,暂时只支持 IE10+ 以上浏览器。6react https://github.com/facebook/r... Star 12891 React是Facebook开发的用于构建用户界面的JavaScript库,现已为很多公司所用,因为它采用了一种不同的方式来构建应用:借助于React,开发者可以将应用分解为彼此解耦的独立组件,这样就可以独立维护并迭代各种组件了。 ...

May 13, 2019 · 1 min · jiezi

WiFi模块Demo新手教程图文详解模块使用教程

第一步我们需要在开发控制台创建一个Native App应用以及添模块的准备工作: 按照下图步骤 输入完点创建完成之后 最好点击添加按钮之后返回看看你是否添加了需要的模块,添加完模块之后在点击自定义的 然后云端操作就完成 接下来我们把云端代码拉取到本地 通过svn拉取本地 使用开发工具直接打开拉取到本地的代码进行开发; 如果你们使用的是官网工具apicloud-studio-2.exe那么请看下面的链接教程把代码拉取到本地: https://docs.apicloud.com/Dev... 拉取代码成功之后在工具的结构: 然后我们再打开Wi-Fi文档 https://docs.apicloud.com/Cli... 这个路径其实直接在模块对应点击模块名字就能进入到模块文档的 ,每个模块都有这个; ios需要特别注意文档里面提示需要添加的文件: <!DOCTYPE HTML><html><head> <meta charset="UTF-8"><meta name="viewport" content="maximum-scale=1.0, minimum-scale=1.0, user-scalable=0, initial-scale=1.0, width=device-width" /><meta name="format-detection" content="telephone=no, email=no, date=no, address=no"><title>wifi_frm</title><link rel="stylesheet" type="text/css" href="../css/api.css" /><link rel="stylesheet" type="text/css" href="../css/box.css" /><style media="screen"> <style>html, body { background-color: #ededed; } .list-item { margin-top: 1px; padding: 15px 10px; font-size: 14px; line-height: 180%; position: relative; background-color: #fff; } .list-item:after { content: " "; position: absolute; z-index: 77; left: 0; top: 0; width: 200%; height: 200%; border-bottom: 1px solid #d4d4d4; -webkit-transform-origin: 0 0; transform-origin: 0 0; -webkit-transform: scale(.5, .5); transform: scale(.5, .5); } .left { padding: 0px 10px; line-height: 220%; color: #333; } .list-item .title { padding: 0px 10px; line-height: 220%; color: #333; position: relative; z-index: 88; } .list-item .right { position: relative; z-index: 99; } .list-item .right .state { display: inline-block; vertical-align: middle; border-radius: 20px; width: 38px; height: 21px; text-align: center; line-height: 20px; font-size: 12px; color: #fff; } .list-item .right .open { background-color: #00acff; } .list-item .right .open::after { content: " "; float: right; margin-top: 1px; margin-right: 1px; width: 19px; height: 19px; border-radius: 50%; background-color: #fff; box-shadow: 0px 0px 1px 1px #d4d4d4; -webkit-transition: all 0.2s linear; transition: all 0.2s linear; } .list-item .right .close { background-color: #ededed; } .list-item .right .close::after { content: " "; float: left; margin-top: 1px; margin-left: 1px; width: 19px; height: 19px; border-radius: 50%; background-color: #fff; box-shadow: 0px 0px 1px 1px #d4d4d4; -webkit-transition: all 0.2s linear; transition: all 0.2s linear; } .center { text-align: center; } .list-item .active { color: #00acff }</style></head><body> ...

May 13, 2019 · 3 min · jiezi

解决ios下的视频的最后一桢问题

问题描述在ios系统下的safari、wechat、以及其他浏览器,在播放部分m3u8的时候,最后一桢的画面会被系统移出,也就是视觉效果在视频播放结束的时候会黑屏,并不是全部的视频都会这样,目前发现最后片段时时长小于.5的最后的画面会被系统移出,未找到相关的文档描述,目前针对该场景做了个polyfill 方案将视频的最后一桢作为视频的背景图片,这样在视频播放结束画面被移走时就会展示背景图片,反之有视频画面的时候背景就会被覆盖。具体实现获取视频的最后一桢图片 a.技术能力:在前端中可以通过canvas对video进行绘图截取video的当前画面。b.问题:但是无法做到截取video任一桢的功能,只能时视频播放哪里截取到哪里,相当于对视频进行截图。c.探索:监听video的ended事件,但是当ended发生时,画面已经被系统移出了。d.解决:监听video的timeupdate事件,当currentTime距duration小于1s的时候,开始截取当前的视频桢,这样在ended之前的画面就是视频的最后一桢。将获取的视频最后一桢图片替换为video的背景图片视频截取图片function video2Base64 (video: HTMLVideoElement) { let dataURL = '', canvas = document.createElement("canvas"); if (video.videoWidth !== 0) { canvas.width = video.videoWidth; canvas.height = video.videoHeight; (canvas.getContext("2d") as CanvasDrawImage).drawImage(video, 0, 0, canvas.width, canvas.height); //绘制canvas dataURL = canvas.toDataURL('image/jpeg'); //转换为base64 // 将截取的视频图片设置为视频的背景 video.setAttribute("style", `background-image: url(${dataURL}); background-size: contain; background-position: center;background-repeat: no-repeat;`); }}

May 13, 2019 · 1 min · jiezi

Grid布局简介

Grid 布局是网站设计的基础,CSS Grid 是创建网格布局最强大和最简单的工具。 轻松使用 Grid 布局提高开发效率,对复杂的网页结构布局更加灵活。 一、概述Grid 将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。网格是一组相交的水平线和垂直线,它定义了网格的列和行。我们可以将网格元素放置在与这些行和列相关的位置上。 我们比较熟悉的比如说坐标轴,坐标点;如果你看到上面这样一个网格首先想到是这不就是被淘汰的表格吗,表格之所以被淘汰最主要在性能方面,然而我们不得不承认表格对于整个网页的布局来说有一定的便利性。那么现在的网格布局就可以把表格里面的一些较好的方便的东西抽出来,然后把性能方面较差的地方去掉,所以说网格布局会成为将来互联网企业的一个热潮是有原因的。 网格布局的优势固定的位置和弹性的轨道的大小你可以使用固定的轨道尺寸创建网格,比如使用像素单位。你也可以使用比如百分比或者专门为此目的创建的新单位 fr来创建有弹性尺寸的网格。 元素位置你可以使用行号、行名或者标定一个网格区域来精确定位元素。网格同时还使用一种算法来控制未给出明确网格位置的元素。 创建额外的轨道来包含元素可以使用网格布局定义一个显式网格,但是根据规范它会处理你加在网格外面的内容,当必要时它会自动增加行和列,它会尽可能多的容纳所有的列。 对齐控制网格包含对齐特点,以便我们可以控制一旦放置到网格区域中的物体对齐,以及整个网格如何对齐。 控制重叠内容多个元素可以放置在网格单元格中,或者区域可以部分地彼此重叠。然后可以CSS中的z-index属性来控制重叠区域显示的优先级。 Grid vs FlexboxGrid 布局与 Flex布局有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。Flex布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局。Grid布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以看作是二维布局。Grid布局远比Flex布局强大。不是说Grid布局取代Flex布局,实际上他俩可以很好的配合使用。 浏览器兼容二、重要术语网格容器(Grid Container)元素应用display:grid;,它是其所有网格项的父元素。 <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div></div>把 container 元素变成一个 grid(网格),只要把其 display 设置为 grid。 CSS代码: .container { display:grid;}网格项(Grid Item)网格容器的子元素,下面的item元素是网格项。 <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div></div>网格线(Grid Line)组成网格项的分界线。记住:网格线仅仅是我们在定义网格容器的时候就产生的,跟我们的网格项没有直接的关联。网格线是我们在定义网格容器的时候伴随出来的虚拟的概念,也就是说在实际的HTML中是找不到这些线的。 网格轨道(Grid Track)两个相邻的网格线之间为网格轨道。网格轨道的特点是一定会顶到容器的边缘。网格轨道必然跟网格项没有关联。 网格单元(Grid Cell)两个相邻的列网格线和两个相邻的行网格线组成的是网格单元。 网格区域(Grid Area)4个网格线包围的总空间。 三、容器中的属性1、dislpay属性display:grid | inline-grid | subgrid;将元素定义为grid container,并为其内容建立新的网格格式化上下文(grid formatting context)。 <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div></div>.container { display:grid | inline-grid | subgrid;}grid:生成块级网格。inline-grid:生成行内网格。subgrid:如果网格容器本身是网格项(嵌套网格容器),此属性用来继承其父网格容器的列、行大小。注意当元素设置了网格布局,column、float、clear、vertical-align属性无效。display:subgrid;目前所有浏览器都不兼容。 ...

May 13, 2019 · 4 min · jiezi

前端培训初级阶段场景实战20190509聊天框发送框

前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。 初级阶段已经完结,之后会针对之前提到过的内容,对实际场景进行分享。正好前段时间我不是一直在加班做聊天的功能嘛。今天我们就来说一说其中遇到的东西。 我们要讲什么?contentEditableNode 与 Element插入功能(表情、截图等等)粘贴功能拖入功能测试地址-测试下面的特性 关键词文字换行图片input√××textarea√√×contentEditable√√√contentEditable你会说这东西我知道,给元素加上就可以编辑内容。老铁,这么简单当然不行了。 当你按下Enter/Return键在可编辑区域中创建一个新的文本行时,不同主流浏览器对此有不同处理(Firefox 插入、IE/Opera将使用<p>、 Chrome/Safari 将使用 <div>)css 也可以支持同样的功能-webkit-user-modify,值有 inherit(继承);initial(默认);read-only(只读);read-write(读写);read-write-plaintext-only(读写、非富文本);unset(未设置);当一个属性定义了unset值,如果该属性是默认继承属性,该值等同于inherit,如果该属性是非继承属性,该值等同于initial同上 contentEditable 属性支持的也不是逻辑值。plaintext-only 就是其中最亮的仔。最早还是在张鑫旭大佬-小tip: 如何让contenteditable元素只能输入纯文本哪里看的到的当然我们用的还是富文本的样式。因为我们里面需要表情 Node 与 ElementNodeNode 是一个接口,许多 DOM API 对象的类型会从这个接口继承。它允许我们使用相似的方式对待这些不同类型的对象;比如, 继承同一组方法,或者用同样的方式测试。以下接口都从 Node 继承其方法和属性:Document, Element, Attr, CharacterData (which Text, Comment, and CDATASection inherit), ProcessingInstruction, DocumentFragment, DocumentType, Notation, Entity, EntityReference-----------------https://developer.mozilla.org...Node.nodeName返回一个包含该节点名字的DOMString。节点的名字的结构和节点类型不同。HTMLElement 的名字跟它所关联的标签对应,比如 HTMLAudioElement 对应的是 'audio'Text 节点对应 '#text'。Document 节点对应 '#document'。Node.nodeType NameValuestatusELEMENT_NODE1 ATTRIBUTE_NODE2warnTEXT_NODE3 CDATA_SECTION_NODE4 ENTITY_REFERENCE_NODE5warnENTITY_NODE6warnPROCESSING_INSTRUCTION_NODE7 COMMENT_NODE8 DOCUMENT_NODE9 DOCUMENT_TYPE_NODE10 DOCUMENT_FRAGMENT_NODE11 NOTATION_NODE12warn上面两个属于比较重要的 ElementElement是非常通用的基类,所有 Document对象下的对象都继承它. 这个接口描述了所有相同种类的元素所普遍具有的方法和属性。 这些继承自Element并且增加了一些额外功能的接口描述了具体的行为. 例如, HTMLElement 接口是所有HTML元素的基础接口, 而 SVGElement 接口是所有SVG元素的基本接口.大多数功能在类的层次中进一步制定.在web以外的语言,像 XUL 可以通过 XULElement 接口, 同样也实现了Element接口.Node 与 Element 差别Node 中是会包含文本节点的。比如Text。而 Element 包含的都是标签节点。 ...

May 13, 2019 · 1 min · jiezi

基于-HTML5-WebGL-的挖掘机-3D-可视化应用

前言在工业互联网以及物联网的影响下,人们对于机械的管理,机械的可视化,机械的操作可视化提出了更高的要求。如何在一个系统中完整的显示机械的运行情况,机械的运行轨迹,或者机械的机械动作显得尤为的重要,因为这会帮助一个不了解这个机械的小白可以直观的了解机械的运行情况,以及机械的所有可能发生的动作,对于三一或者其它国内国外重工机械的公司能够有一个更好的展示或者推广。挖掘机,又称挖掘机械(excavating machinery),从近几年工程机械的发展来看,挖掘机的发展相对较快,挖掘机已经成为工程建设中最主要的工程机械之一。所以该系统实现了对挖掘机的 3D 可视化,在传统行业一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,而且都是 2D 面板部分数据的监控,从后台获取数据前台显示数据,但是对于挖掘机本身来说,挖掘机的模型,挖掘机的动作,挖掘机的运行可视化却是更让人眼前一亮的,所以该系统对于挖机的 3D 模型做出了动作的可视化,大体包括以下几个方面: 前进后退 -- 用户可以通过键盘 wasd 实现前后左右,或者点击 2D 界面 WASD 来实现挖机的前进后退。机身旋转 -- 用户可以通过键盘左右键实现机身的旋转,或者点击 2D 界面 < > 来实现挖机机身的旋转。大臂旋转 -- 用户可点击 2D 界面第一个滑块部分实现大臂的旋转。小臂旋转 -- 用户可点击 2D 界面第二个滑块部分实现小臂的旋转。挖斗挖掘 -- 用户可点击 2D 界面第三个滑块部分实现挖斗部分的旋转挖掘。挖机动画 -- 用户可点击 2D 界面铲子图标,点击之后系统会把挖机本身几个动画做一个串联展示。本篇文章通过对挖掘机可视化场景的搭建,挖机机械动作代码的实现进行阐述,帮助我们了解如何使用 HT 实现一个挖掘机的可视化。 预览地址:基于 HTML5 WebGL 的挖掘机 3D 可视化应用 http://www.hightopo.com/demo/... 界面效果预览挖机机械运动效果 通过上面 gif 图片可以看出挖掘机的几个主要动作。 挖机挖斗运动效果 滑动页面的第三个滑杆控制挖斗的旋转挖掘。 挖机机身运动 通过上面 gif 图片可以看出挖掘机的前进后退以及机身旋转几个运动。 场景搭建该 3D 场景中所有形状都是用 HT 内部的墙面工具进行构建,通过设置墙面透明属性 shape3d.transparent 为 true 以及对构建出的墙面进行贴图来构造出场景中的类似建筑的显示效果,具体的样式可以参考 HT 的 风格手册,场景效果: ...

May 13, 2019 · 3 min · jiezi

周刊3三年大厂面试官十道前端面试题欢迎挑战

前言在两家大厂工作了6年,当了3年的前端面试官,把一些较难的面试题与答案汇总在我的Github中。希望对大家有所帮助,助力大家进入自己理想的企业。 项目地址是:https://github.com/airuikun/W...希望大家不要看到题目就直接看答案,还是希望先自己进行思考,在思考的过程中,会有意想不到的收获。 面试题挑战我把下面每道题的难度高低,和对标的职级,都写上去了,大家可以参考一下,但不是唯一评判标准。 第 1 题:请设计一个攻击服务器的策略难度:阿里p5 ~ p7、腾讯t21 ~ t31我提供几个常见的策略吧 前段时间很火的一个例子,伪造虚假npm包 + nodejs版本的payloadnodejs的反序列化攻击其实你多关注知乎或者一些前端热点,都会发现有很多很多的这种攻击和漏洞的case讲解,但是有没有一些很难并且大家都没想到过的策略和思路呢? 欢迎展现自己的实力和创意 如果你有好的想法或答案,欢迎在这题目对应的github下留言:https://github.com/airuikun/W... 第 2 题:请写一个正则,去除掉html标签字符串里的所有属性,并保留src和href两种属性难度:阿里p6+ ~ p7、腾讯t23 ~ t31这题目简单的理解就是,写一个正则表达式,将字符串'正则'转化成'正则'。 当然,真正包含一个网页的html的字符串要比这个复杂。 而且,google里关于这个问题的前三篇文章答案,都存在严重的问题,随便写几个case都是满足不了的。 正则的问题,很多前端人员都停留在如何用正则去判断一个数字是不是手机号,一段字符串是不是邮箱,说实话,这都没用到正则知识体系的十分之一 在一些工程项目难题上,如果正则使用到位,真的是一行正则可以抵1000行代码。 建议有能力的小伙伴,可以玩一下这题。 如果你有好的答案或想法,欢迎在这题目对应的github下留言:https://github.com/airuikun/W... 第 3 题:react项目中的JSX里,onChange={this.func.bind(this)}的写法,为什么要比非bind的func = () => {}的写法效率高 请解释其中的原理难度:阿里p5 ~ p6、腾讯t21 ~ t22这题考察了函数在内存块占用执行和调度等,和对bind的深层理解。 欢迎挑战 如果你有好的想法或答案,欢迎在这题目对应的github下留言言:https://github.com/airuikun/W... 第 4 题:十万条数据插入数据库,怎么去优化和处理高并发情况下的DB插入难度:阿里p6+ ~ p7+、腾讯t23 ~ t32这种题,你懂的,逼格高,亮瞎眼,大厂太爱考了。 不过装逼归装逼,有能力并且真真正正处理过这些高并发情况的FE,这题是他们一个很好的展现机会。 以前我的mentor,用nodejs实现了高并发的智能容灾,我至今记忆犹新,并且他也收获了那年的高绩效。 来玩一下? 欢迎挑战,如果你有好的想法或答案,欢迎在这题目对应的github下留言:https://github.com/airuikun/W... 第 5 题:解释一下在js里,0.1+0.2为什么等于0.30000000000000004,如何通过代码解决这个问题?难度:阿里p5 ~ p6、腾讯t21 ~ t22第二问我给个简单的思路吧:将浮点数转换为整数来进行计算。 答案不唯一,欢迎提供更好的idea 欢迎挑战,如果你有好的想法或答案,欢迎在这题目对应的github下留言言:https://github.com/airuikun/W... 第 6 题:设计一个策略和方法,实现在https的前端项目里进行http请求难度:阿里p6 ~ p6+、腾讯p22 ~ t23欢迎挑战,如果你有好的想法或答案,欢迎在这题目对应的github下留言言:https://github.com/airuikun/W... ...

May 13, 2019 · 1 min · jiezi

浏览器元素尺寸与位置查询指南

前言这篇文章主要介绍了有关浏览器中获取坐标以及尺寸的几种途径,算是比较全的一篇文章了. 在浏览器中获取元素的坐标以及尺寸是非常容易的,有非常多种方式来完成这些需求,但是杂乱的API和很多兼容处理导致了浏览器中没有直接的方式来获取我们想要的结果. 仔细想想这个问题,为什么浏览器并没有直接提供一个简单的属性就告诉你浏览器窗口的大小,或者一个元素的宽高. 就拿div元素来举例,我们有很多的问题影响到了元素宽高: border 是否纳入宽高的计算?padding 是否纳入宽高的计算?magin 是否纳入宽高的计算?box-sizing:border-box; 时候该如何计算?父元素使用了overflow:hidden;把我们的元素裁剪了,这时候的宽高该如何计算?元素使用了overflow出现了滚动条此时该如何计算?而如果要获取一个浏览器窗口的大小,你还要面对我们到底是要获取哪个大小? 屏幕大小?浏览窗口大小?浏览区域大小?是否包含滚动条?当然最终你还要面临一个兼容问题,致我们敬爱的IE浏览器,不过本文可不探讨浏览器之间的差异.不过本文的涉及到的内容应该在IE9以上都是可以正常使用的(不过建议你还是查下can i use 或者MDN). 浏览器部分浏览器的宽高计算主要通过window对象来完成. 这个对象上提供了几个关键属性: window.innerWidthwindow.innerHeightwindow.outerWidthwindow.outerHeight用人类语言来描述这几个属性就是. 属性名称人类解释innerWidth获取页面可视区域的宽度包括右侧的滚动条(如果有的话).所谓的可视区域就是HTML页面的内容区域不包括浏览器自身的ui所占用的空间(地址栏和菜单栏等).innerHeight获取页面可视区域的高度包括底部的滚动条(如果有的话).解释同上.outerWidth获取浏览器窗口宽度.outerHeight获取浏览器窗口高度.友情出演windows画图: 注意:单位均为px. 注意:滚动条并不视为浏览器的ui中的内容,而是视为内容区域的一部分,右侧默认的滚动条的宽度包含在window.innerWidth中,但是不属于html元素和html下的任何元素. 元素部分属性属性名称人类解释element.clientWidth元素内容区域宽度+padding的宽度,如果宽度溢出且裁剪那么不包含被裁剪掉的部分.element.scrollWidth当子元素宽度溢出,这里提供的是子元素的宽度包括溢出的部分,大小计算和clientWidth一样.element.offsetWidth相当于计算边框宽度的clientWidth,宽度计算为content+padding+border.element.clientHeight元素内容区域高度+padding的高度,如果高度溢出且裁剪那么不包含被裁剪掉的部分.element.scrollHeight当子元素高度溢出,这里提供的是子元素的高度包括溢出的部分,大小计算和clientHeight一样.element.offsetHeight相当于计算边框高度的clientHeight,高度计算为content+padding+border.element.clientLeft元素左边框的宽度element.scrollLeft计算较为复杂,看后续详解element.offsetLeft计算比较复杂,看下面详解element.clientTop元素上边框的宽度element.scrollTop计算较为复杂,看后续详解element.offsetTop计算比较复杂,看下面详解滚动条的规律无论是横向滚动条还是纵向滚动条,对于测量clientXXX这个单位来说是不包括滚动条的宽(高)的. 例如在下面这张图中我们进行测量父元素(黑色区域)的clientWidth结果和子元素(红色区域)的clientWidth的大小是一样的. 不过需要注意的是,一旦出现了滚动条对于clientWidth来说就意味着宽度减小(高度同理). 注意:图片所指的宽度是clientWidth API名称是否包含滚动条大小offsetXXX包含clientXXX不包含scrollXXX不包含所以在margin:0;padding:0;border-width:0;情况下offsetWidth - clientWidth=滚动条的宽度. 通过这种方式我求出了chrome浏览器滚动条大小是17px整,但是不要忘记这些API只会返回整数. 注意:scrollXXX对于滚动条计算的规则和clientXXX表现一致. 含有box-sizing:border-box的计算请记住,对于clientXXX来说,元素的大小就是padding+content. 而使用border-box后元素的表现就是padding和border的修改就不会影响到元素的大小. 此时width是多少clientWidth就是多少,height同理. 但是不要忘记了边框不参与clientXXX的计算,所以border的修改并不会影响元素的宽高变化,那么那么当border变大,对应的clientXXX就变小. 一个元素设置了border-box: box{ width:100px; padding:20px; border:20px solid; box-sizing:border-box;}此时clientWidth= 100px - 20px*2(左右边框的宽度) = 60px 由于offsetXXX的计算是包含border的大小的,所以如果一个元素设置了border-box那么offsetWidth就等于元素的width大小,因为border被限制到了width中. offsetTop和offsetLeft子元素的offsetWidth|height是相对于父元素内容区域(padding+content)左侧和顶部的偏移量. 这个两个是相对值,是要求出向对于父级使用定位情况下来进行计算的,这个父元素可以通过HTMLElement.offsetParent来获取到. 例如:父级使用absolute或者relative. 注意:后文提出的父元素都指的是使用了相对定位的父元素. 注意:以上都是对于块级元素所描述的,对于行内元素或者td等元素相对的父元素不尽相同,这里不考虑这些情况,详情可以查看上方的链接. 情况1 在子元素使用了绝对定位的情况下,父元素无法干预子元素,所以子元素的scrollLeft就是left+margin-left. 情况2 第二种情况就是父元素和子元素都使用了相对定位,而相对定位是不脱离文档流的,那么父元素的padding-left就会影响到子元素的scrollLeft属性. 在线实例 注意:貌似offsetTop和Left在不同浏览器下有不同计算值,会带来兼容性问题,这里就不展开了,有兴趣的读者可以去查阅相关资料. scrollTop和scrollLeft首先scrollTop和scrollLeft是一对可读写的属性,这意味着你可以获取他的值也可以设置它从而控制滚动的距离. 注意:scrollTop|scrollLeft是用在含有滚动区域的元素上(图中黑色边框的元素),而不是被滚动的元素上测量,被滚动的元素scrollTop永远是0. 简单理解:在垂直方向上含有滚动条的元素的内容区域的顶部(padding+content)相对于自身顶部边框的底部向上移动的距离(水平方向同理). 就是scrollTop的大小(图中超出去的部分). 元素方法getBoundingClientRect关于这个方法建议阅读MDN的指南.当然你也可以选择听我瞎扯几句. 这个api是ie首先提出(早在ie4时候就有了)的这也是ie对web开发的贡献之一. 调用这个api会返回一个DOMRect对象,这个对象多次易名,不过没有变化过基本概念. ...

May 12, 2019 · 1 min · jiezi

Nodejs

本demo是使用express+mySql制作一个简单的链接sql项目前准备安装node.js http://nodejs.cn/安装express http://www.expressjs.com.cn/安装Mysql https://www.mysql.com/项目结构初始化第一步:首先新建express站点,这些我们新建的项目名称是expres sql,如果小伙伴们不知道express的这些指令,可以通过express –help查看(插一句,在这之前确保已经安装了 express)第二步:进入到这个项目目录 cd sql第三步:安装依赖 npm install第四步:启动这个项目* & npm start,这里如果你安装了pm2,也可以使用pm2启动第五步:命令行会提示在哪个端口监听,如果想改默认端口号,在bin文件夹下面的www文件进行修改第六步:打开浏览器进行查看 localhost:3000(默认) 至于文件夹里面的目是用express 生成的 http://www.expressjs.com.cn/首页页面+功能实现关于系统中和用户的相关路由配置都写的routes文件夹下面的item.js中 注意: app.js文件中引入了routes中的item.js,var item = require('./routes/item');并且使用app.use()将应用挂载到app应用上app.use(‘/item’, itemRouter);所以在访问item这个路径时就要变成/users/item新建html页面 <!DOCTYPE html><html><head> <title></title></head><body></body></html><script src="https://cdn.bootcss.com/jquer...;></script> <script> $(function(){ $.ajax({ url:"http://localhost:3000/item/list", type:'post', dataType:'json', success:function(e){ for(var i in e){ $('body').append("<h1>"+"<a href='id.html?id="+e[i].id+"'>"+e[i].name+"</a>"+"</h1>"+"<p>"+e[i].content+"</p>") } } }) })</script>现在通过在自己电脑输入http://localhost:3000/routes文件夹下item.js下面输入注册的路由var express=require('express');//引入express 模块var router=express.Router(); //路由var mysql= require('mysql');//引入mysql模块var connection=mysql.createConnection({ //链接数据库池 host:'localhost', user:'root',//用户名 password:'123456'//密码 在配置mysql 的时候设置}); router.post('/list',function(req,res,next){ res.header('Access-Control-Allow-Origin','*') ;connection.query('SELECT * FROM baobei.list_table', function(err, rows, fields) {res.send(rows)});}) ...

May 11, 2019 · 1 min · jiezi

网页制作用什么软件制作网页的常用软件工具分享

Dreamweaver Adobe Dreamweaver,简称“DW”,中文名称“梦想编织者”,最初为美国公司开发,2005年被Adobe公司收购。Dreamweaver是一款有着强大网页排版的软件,我们可以快速直接的进行各种页面的设计排版。我们可以通过特有的行为、模板。时间轴等技术,快速地创建各种具有专业水平的网页,而且不需要编写任何代码。推荐下小编的前端学习群;545227155,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2019最新的前端和0基础入门教程,欢迎初学和进阶中的小伙伴。每天晚上20:00都会开直播给大家分享前端知识和路线方法,群里会不定期更新最新的教程和学习方法(进群送2019前端学习教程),大家都是学习前端的,或是转行,或是大学生,还有工作中想提升自己能力的前端党,如果你是正在学习前端的小伙伴可以加入学习。最后祝所有程序员都能够走上人生巅峰,让代码将梦想照进现实,非常适合新手学习,有不懂的问题可以随时问我,工作不忙的时候希望可以给大家解惑还有一款软件:Font Page,它是微软公司出品的一款入门级的网页制作软件,使用起来是很简单方便的,只要你会使用Word就能做出网页,它和Dreamweaver这款软件相比,更容易上手操作。 网页制作用什么软件?制作网页的常用软件工具分享 静态网页和动态网页 网页一般分文静态网页和动态网页,因为Web服务器的处理方式不同,以下是它们的分别: 1、静态网页 标准的静态网页是HTML文件,文件名的后缀为.html或.htm,里面可以包含HTML标记、包含文本、客户机等控件。 静态网页的特点如下: (1)除非是网页设计者修改了网页的内容,不然网页内容是不会发生变化的。 (2)静态的网页设计是不能与浏览网页用户之间发生交互的。因为他们的信息流向是单向的,是从服务器直接到浏览器的,服务器不能根据用户的选择调整返回给我们内容。 网页制作用什么软件?制作网页的常用软件工具分享 2、动态网页 比起静态网页,动态网页的制作相对来说就比较麻烦了,需要用到很多专门的动态网页设计语言,比如PHP、JSP、ASP等。 动态网页的特点如下: (1)动态网页有个最大的优点就是可以大大降低网站维护量的工作,因为动态网页的基础是以数据库技术为基础的。 (2)动态网页采用的技术可以实现更多我们需要的功能,比如:用户的登录注册、查询搜索、管理用户等等。 (3)动态网页和静态网页之间最大的不同就是动态网页不是存在于服务器上面的网页文件,它是只有用户请求的时候才返回的一个完整的网页。 网页制作用什么软件?制作网页的常用软件工具分享 交互式动态网页实现技术 1、ASP ASP是Active Server Pages的缩写,意思是通用网关接口。它的功能非常强大,其应用程序很容易开发,也很容易修改,所以好评如潮,现在也是时下动态网页开发技术中最为流行的技术之一。 有一部分的人觉得ASP有些类似于HTML、脚本与CGI的结合,但是ASP的运行效率比较高,而且Asp的功能要强于很多其他的交互式动态网页技术。 2、PHP PHP是超文本预处理器,和ASP类似,是HTML的一种内嵌式的语言,是一种比较广泛应用的动态网页开发技术它独特的语法里也混合了C语言,Java等新语法,执行速度也相比其他的要快,从很多性能上来看,它与ASP技术是并驾齐驱的,它们都有很不错的表现。 网页制作用什么软件?制作网页的常用软件工具分享 3、JSP JSP技术与ASP技术非常相似,两者都是在HTML代码中嵌入某种脚本并由语言引擎执行程序代码,他们都是面向服务器的技术,客户端浏览器不需要任何附加软件的支持。 两者的不同之处就是ASP使用的编程语言是VBScript之类的脚本程序,而JSP使用的是Java。 好了,关于制作网页的常用软件工具就先暂时介绍到这,如果你还有什么推荐的可以给我留言,大家一起学习一起进步一起成长。

May 11, 2019 · 1 min · jiezi

匿名函数以及闭包内部this指向函数调用模式的问题

网上看到一句话,匿名函数的执行是具有全局性的,那怎么具有的全局性呢?闭包内部this的指向是window,为什么指向了window呢?下面通过js函数调用模式和部分案例分析了为什么确实如此1.js函数调用的模式1.方法调用模式和函数调用模式如果一个函数被设置为一个对象的属性,则称它为一个方法。当通过对象对其进行调用时,即this的方法调用模式。在方法调用模式下,函数中的this指向该函数所属的对象。当一个函数并非对象的属性,而是直接作为函数进行调用时,为函数调用模式。此模式来调用函数的时候,this绑定的是全局对象。这是语言设计的一个错误。倘若语言设计正确,那么当内部函数被调用时,this应该仍然绑定到外部函数的this变量。这个设计错误的后果就是方法不能利用内部函数来帮助它工作,因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权var obj = { val : 1, show : function(){alert(this.val);},//方法调用模式 outFunc : function(){ function innerFunc(){ console.log(this); } innerFunc(); //函数调用模式 }};obj.innerFunc();//在严格模式下,console.log(this)中的this为undefined,//否则,console.log(this)中的this为全局对象(浏览器中为window)//下文讲解为什么2.构造器调用模式当以new来调用一个函数时,即构造器模式。当使用new调用时,发生这些事情:创建一个连接到该函数prototype的新对象将this绑定到创建的新对象上函数结束时,如果没有返回其它对象,就返回this,即新创建的对象。 var quo=function(string){ this.status=string; } quo.prototype.get_status=function(){ return this.status; } var qq=new quo("aaa"); alert(qq.get_status());3.上下文调用模式(call,apply)var myobject={};var sum = function(a,b){ return a+b;};var sum2 = sum.call(myobject,10,30); //var sum2 = sum.apply(myobject,[10,30]); alert(sum2);2.闭包和匿名函数案例分析(这两种都是函数调用模式) var person = { name :'one', sayOne:function () {//方法调用模式 console.log(this.name) }, sayTwo:function () {//函数调用模式 return function () { console.log(this.name) } }, wrap: function(){//函数调用模式,匿名函数的执行环境具有全局性的由来 (function (){ console.log(this.name) })() } } person.sayOne()//one sayOne调用者是person对象,所以this指向person;(方法调用模式) person.sayTwo()()//window 返回的匿名函数在全局执行所以是window(函数调用模式) person.wrap()//window 语言就是这样设计的,也是匿名函数具有全局性的由来(函数调用模式)3.事件监听内部调用方法案例分析 var div=document.getElementById("one"); function f2(){ console.log(this) } div.onclick =function () { console.log(this)//one那个节点 f2()//window(函数调用模式) }4.综合应用:函数节流案例分析1.throttle函数的执行环境具有全局性,内部this通常是指向window的,然后返回一个匿名函数。2.返回的匿名函数绑定了事件,this指向监听的元素(document)3.fn其实与上面返回匿名函数形成了闭包,且fn也其实是一个匿名函数,匿名函数的执行具有全局性,fn内部this应该指向window4这里用apply修正this指向,使fn内部的this重新指向document ...

May 11, 2019 · 1 min · jiezi

display-flex布局下使用‘whitespace-nowrap导致的问题

需求:在item中实现布局预期效果为:左侧一个正圆形的用户头像,右侧的上方为该用户昵称、下方为个性签名(单行显示,超出实际能显示的最大宽度则用‘...’代替)。如图: 代码:wxml布局: <view class="member-item"> <image class="avatar" src=""></image> <view class="info"> <view class="name">姓名</view> <view class="signature">这个人很懒,什么都没写。这个人很懒,什么都没写。</view> </view> </view>wxss样式:.member-item { margin-top: 1px; padding: 15rpx 30rpx; display: flex; flex-direction: row; background-color: white; width: auto;} .avatar { background-color: whitesmoke; width: 96rpx; height: 96rpx; border-radius: 50%;}.info { display: flex; flex-direction: column; margin-left: 30rpx; flex: 1;}.name { font-size: 30rpx; color: #333; line-height: 48rpx;}.signature { font-size: 28rpx; color: #888; line-height: 48rpx; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}效果: 问题:为了自适应屏幕大小,这里父布局采用flex,展示个性签名的view对应的class为signature,其中我通过“overflow: hidden; text-overflow: ellipsis; white-space: nowrap;”来实现单行显示,超出实际能显示的最大宽度则用‘...’代替的效果。但是在实际效果如上图所示,当内容超出实际可显示宽度时,挤压推出左侧布局以显示signature中的内容,导致左侧布局的变形甚至被挤出。 ...

May 11, 2019 · 1 min · jiezi

CSS里的BFC和IFC的用法

一、BFCBlock Formatting Contexts (BFC,块级格式化上下文),就是 一个块级元素 的渲染显示规则。 (可以把 BFC 理解为一个封闭的大箱子,容器里面的子元素不会影响到外面的元素)。1、BFC的布局规则例如以下: ①.内部的盒子会在垂直方向,一个个地放置。 ②.盒子垂直方向的距离由margin决定,属于同一个BFC的两个相邻Box的上下margin会发生重叠。 ③.每一个元素的左边,与包括的盒子的左边相接触,即使存在浮动也是如此。 ④.BFC的区域不会与float重叠。 ⑤.BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。 ⑥.计算BFC的高度时,浮动元素也參与计算。 2、介绍过了BFC的布局规范,再来说说哪些元素会触发BFC。 只要元素满足下面任一条件即可触发 BFC 特性 ①.根元素。 ②.float的属性不为none。 ③.position为absolute或fixed。 ④.display为inline-block;table-cell;table-caption;flex。 ⑤.overflow不为visible。 3、接下来说说BFC的作用和原理 ①、解决margin重叠问题 ②、解决浮动高度塌陷问题 ③、解决侵占浮动元素的问题 首先看看自适应两栏布局我们先定义两个div: <div class="aside"></div> <div class="main"></div> 4、然后定义css: div { width:300px;} .aside { width: 100px; height: 150px; float: left; background: black;} .main { height:200px; background-color:red;} 效果图例如以下: 这正满足了规范的第三条: 每一个元素的左边,与包括的盒子的左边相接触。即使存在浮动也是如此。 所以假设我们须要将黑色区域撑到红色的左边。就须要利用规范的第四条:BFC的区域不会与float重叠。 也就是说我们须要创造BFC区域。我们通过将红色区域的overflow设为hidden来触发BFC: .main { overflow:hidden; height:200px; background-color:red;} 效果例如以下: 5、接下来看看清除内部浮动 **首先是父div套子div**<div class="parent"> <div class="child"></div></div> ...

May 11, 2019 · 1 min · jiezi

css-flexbox-布局练习

最近复习了一下 flexbox 布局的使用,写了一个布局调试的页面,希望能帮到大家 flexbox 布局练习 https://changk99.github.io/fl...

May 10, 2019 · 1 min · jiezi

移动端使用swiperiscrollfastClick安卓触摸swiper会触发点击事件

这两天做H5页面,使用swiper+iscroll+fastClick,并没有用swiper提供的tap和click事件,自己在元素上bind,因为回调函数是统一处理,就没用swiper,后面发现即使是使用了swiper提供的,也是会有问题,本人用的ios设备,做完一切流畅,但是提交给测试确发现安卓有个问题,如题。 swiper v4.5.0 研究了一下swiper源码,发现初始化的时候会给容器注册一个click事件 这里是用来判断用户当前是否触发touchmove事件,如果是touchmove那么就阻止所有bind元素的click事件,这个逻辑没错啊,于是继续在模拟器中调试。 打了各种断点调试,发现swiper绑定的touchend中代码逻辑执行顺序在两个客户端中是不一样的,神奇。 如上图,ios中先执行了onClick方法,后执行Utils.nextTick的回调;android则相反,先执行nextTick的回调;然后看了下,swiper是怎么封装的回调Utils.nextTick ??? 好像没问题啊,eventLoop执行顺序对的啊。难道是安卓上setTimeout和event执行顺序异于其他浏览器。 敲段代码测试一下(注意,下面这段代码直接用浏览器打开,执行顺序是相同的,但是,找个容器去挂载,比如tomcat,执行顺序的问题就出来了): <!DOCTYPE html><html><head> <title>touchend-click-setTimeout</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no,target-densitydpi = medium-dpi"> <meta name="format-detection" content="telephone=no"> <meta name="apple-touch-fullscreen" content="YES"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <link rel="stylesheet" type="text/css" href="./lib/swiper.css" /> <link rel="stylesheet" type="text/css" href="./lib/pullToRefresh.css" /> <style> body,html{ padding: 0; margin: 0; border: 0; } .btn{ height: 50px; line-height: 50px; text-align: center; background: #ccc; color: #fff; width: 200px; margin: 0 auto; } </style></head><body> <section id="wrapper"> <ul style="background:#F3F4F6;"> <div class="btn">touchend-btn</div> </ul> </section></body><script type="text/javascript" src="./lib/jquery.min.js"></script><!-- <script type="text/javascript" src="./lib/fastclick.js"></script><script type="text/javascript" src="./lib/iscroll.js"></script><script type="text/javascript" src="./lib/pullToRefresh.js"></script><script type="text/javascript" src="./lib/swiper.js"></script><script type="text/javascript" src="./lib/vconsole.min.js"></script> --><script> // 原生默认的执行顺序: // ios执行顺序: touchstart -> touchend -> click -> setTimeout // android执行顺序: touchstart -> touchend -> setTimeout -> click // FastClick.attach(document.body); // refresher.init({ // id: "wrapper", // pullDownAction: function () { // }, // pullUpAction: function () { } // }); $('.btn').on('touchstart',function(){ console.log('touchstart'); }); $('.btn').on('touchmove',function(){ console.log('touchmove'); }); $('.btn').on('touchend',function(){ console.log('touchend'); setTimeout(function(){ console.log('touchend:setTimeout'); },0); }); $('.btn').on('click',function(){ console.log('click'); });</script></html>结果如下ios执行顺序: touchstart -> touchend -> click -> setTimeoutandroid执行顺序: touchstart -> touchend -> setTimeout -> click ...

May 10, 2019 · 1 min · jiezi

彻底理解zindex看完还是只会无厘头的设置9999你打我

今天写代码用antd-mobile的checkbox时候,想在内容文本后面添加一个icon,并且需要对这个icon绑定事件,发现绑定之后怎么也点不中,调试发现原来被层层嵌套的dom元素盖住了,肯定是z-index在作祟。可是按照我之前对z-index的了解(自信满满)却怎么也不能把他由“被盖住”改成“盖住别人”,在一通“盲改”代码之后,终于“盖住”其他dom元素了。然而心里总是在想难道之前自己对z-index的认知有问题么,抱着这样的心态决定重新去学习,下面进入正文 90%的前端开发对z-index的认知其实我想说大部分前端开发是不重视css的,也就导致了对css的很多属性认知都是表面的,这其中z-index就是最典型的一个,下面列举的错误认知还请大家对号入座: z-index值越大越“靠近我们” -- 最初级的认知要搭配position: absolute | relative | fixed 使用才有用呢 -- 稍微进阶一些的认知比较两个兄弟节点谁更“靠近我们”,要看他们的同级父元素的比较呢。-- 可能是大部分前端的终极认知了例如下面的例子:要比较div1-1-1 和 div2-1 是要看div1 和 div2 的比较结果呢 <div class="div1"> <div> <div class="div1-1-1" /> </div></div><div class="div2"> <div class="div2-1" /></div>如果以上三个大家都中枪了,没关系,看完这篇文章你就永远告别了,在遇到z-index的问题再也不会“盲改,乱试”了 三个概念 -- 层叠上下文、层叠水平、层叠顺序层叠上下文(stacking context) 看到上下文这个关键词,我想大家应该会有一点概念,没错就是context。和你们认识的那个BFC、IFC里面的上下文是一个意思,其实我想说css世界里面看到context或者XXX上下文其实都是同一个意思,完全可以理解为自成一派,在自己的小世界里面随便折腾,不受其他的context影响。当然,这个context是可以被其他context包含同时也可以包含其他context层叠水平(stacking level) 层叠水平决定了在同一个层叠上下文中元素在Z轴上的显示顺序。 页面中的所有元素(普通元素和层叠上下文元素)都有层叠水平。然而对普通元素的层叠水平探讨只局限在层叠上下文元素中。 注:大家千万不要把层叠水平和z-index混为一谈,尽管某些情况下z-index确实可以影响层叠水平,但是也只局限于具有层叠上下文的元素,而层叠水平是所有元素都存在的层叠顺序(stacking order) 层叠顺序表示发生层叠时有着特定的垂直显示顺序(规则)。 即:网上这张很流行的规则 关于这张图有一些补充: 位于最下面的background/border特指层叠上下文元素的边框和背景色。每一个层叠顺序规则仅适用当前层叠上下文元素的小世界 inline水平盒子指的是包括inline/inline-block/inline-table元素的层叠顺序,他们都是同级别的 单纯从层叠水平上看,实际上z-index:0和auto是可以看成一样的,但是在层叠上下文领域有着根本性的差异 深入了解层叠上下文特性层叠上下文的层叠水平要比普通元素高 层叠上下文可以阻断元素的混合模式 层叠上下文可以嵌套,内部层叠上下文及其所有子元素均受制于外部的层叠上下文 每个层叠上下文和兄弟元素独立,也就是说,当进行层叠变化或者渲染的时候,只需要考虑后代元素 每个层叠上下文是自成体系的,当元素发生层叠的时候,整个元素被认为是在父层叠上下文的层叠顺序中 如何创建根元素 (HTML) z-index 值不为 "auto"的 绝对/相对定位(在firefox/ie浏览器下position: fixed也是可以的) 一个 z-index 值不为 "auto"的 flex 项目 (flex item),即:父元素 display: flex|inline-flex opacity 属性值小于 1 的元素(参考 the specification for opacity) transform 属性值不为 "none"的元素 mix-blend-mode 属性值不为 "normal"的元素 filter值不为“none”的元素 perspective值不为“none”的元素 isolation 属性被设置为 "isolate"的元素 position: fixed 在 will-change 中指定了任意 CSS 属性,即便你没有直接指定这些属性的值(参考这篇文章) -webkit-overflow-scrolling 属性被设置 "touch"的元素 ...

May 10, 2019 · 1 min · jiezi

JS函数的递归和闭包的注意要点

JavaScript函数表达式——“函数的递归和闭包”的注意要点 函数表达式的基本概念name属性和函数提升首先,name属性,通过这个属性可以访问到给函数指定的名字。(非标准的属性)如: function People(){};console.log(People.name); //People其次,函数声明提升,意味着可以把函数声明放在调用它的语句后面。如: sayHi(); //调用函数function sayHi(){ //声明函数    console.log("Hi");} //不会报错使用函数表达式则不可以: sayHi();var sayHi = function(){    console.log("Hi");} //报错创建函数的两种方式,一个是函数声明(如第一种方式);一个是函数表达式(如第二种方式)。第二种函数创建方式创建的函数叫“匿名函数”或“拉姆达函数”,因为function 关键字后面没有标识符。 函数提升的常见错误需要注意的是,作为对比,下面的两种代码中,第一个是错误的(会导致各浏览器出现不同的问题);第二个才使正确的。代码如下: var condition = true;if (condition){    function sayHI(){        console.log("hi")    } //欢迎加入前端全栈开发交流圈一起学习交流:1007317281    sayHI(); //"hello"}else{    function sayHI(){        console.log("hello")    }    sayHI();}报错 var condition = false;var sayHi;if(condition){    sayHi = function(){        console.log("hi")    }; //欢迎加入前端全栈开发交流圈一起学习交流:1007317281    sayHi();}else{    sayHi = function(){        console.log("hello")    };    sayHi(); //hello}没有错误 var condition = true;if(condition){    var sayHi = function(){        console.log("hi")    };    sayHi(); //hi}else{    var sayHi = function(){        console.log("hello")    };    sayHi(); //hello}这里也不会出现问题。出现上面问题的根源就是函数提升,就是函数声明和函数表达式之间的区别所导致的。 给大家推荐一个技术交流学习圈,里面概括移动应用网站开发,css,html,webpack,vue node angular以及面试资源等。获取资料对web开发技术感兴趣的同学,可以加入交流圈????????????1007317281,不管你是小白还是大牛都欢迎,还有大牛整理的一套高效率学习路线和教程与您免费分享,同时每天更新视频资料。 函数的递归递归函数就是在一个函数通过名字调用自身的情况下构成的。如: function factorial(num){    if(num <= 1){        return 1;    }else{        return num * factorial(num - 1);    } //欢迎加入前端全栈开发交流圈一起学习交流:1007317281}    console.log(factorial(4)); //24 4*3*2*1但是,函数里面包含了函数自身所以,在应该使用arguments.callee来解决该问题。如: ...

May 10, 2019 · 3 min · jiezi

受控组件和非受控组件强力一波

受控组件其值由React控制的输入表单元素称为“受控组件”。class NameForm extends React.Component { constructor(props) { super(props); this.state = {value: ''}; this.handleChange = this.handleChange.bind(this); this.handleSubmit = this.handleSubmit.bind(this); } handleChange(event) { this.setState({value: event.target.value}); } handleSubmit(event) { alert('A name was submitted: ' + this.state.value); event.preventDefault(); } render() { return ( <form onSubmit={this.handleSubmit}> <label> Name: <input type="text" value={this.state.value} onChange={this.handleChange} /> </label> <input type="submit" value="Submit" /> </form> ); }}通过绑定onChange实现了类似双向绑定理解:首先input的显示的值受value={this.state.value}控制,输入时通过onChange函数回调,将新接受的值设置回this.state.value,从而再作用到组件的显示,形成了双向绑定的感觉 非受控组件在大多数情况下,我们推荐使用 受控组件 来实现表单。 在受控组件中,表单数据由 React 组件处理。如果让表单数据由 DOM 处理时,替代方案为使用非受控组件。默认值 defaultValue在 React 的生命周期中,表单元素上的 value 属性将会覆盖 DOM 中的值。使用非受控组件时,通常你希望 React 可以为其指定初始值,但不再控制后续更新。要解决这个问题,你可以指定一个 defaultValue 属性而不是 value。 ...

May 10, 2019 · 2 min · jiezi

Vue-keepAlive-数据缓存工具实现返回上一个页面浏览的位置

需求分析背景:1.数据列表页,滚动加载数据;2.多条数据情况下,点击某一条,进入详细页进行编辑(修改,删除)操作;3.保存返回上一页; 在上面的情况下,想要保持在上次浏览位置,并且保持数据是最新的; 解决办法1.原始的办法:在点击详情页的时候,记住浏览位置,传递参数或者存到本地缓存,然后在详情页操作完毕后,返回的时候,路由守卫可以判断,是否详情页跳转回来的,然后让页面滚动到上次记录的位置; 思路是这样,实际操作很麻烦;2.推荐办法:使用vue动态组件keep-alive,搭配路由守卫函数beforeRouteLeave,以及activated钩子函数; 对于钩子函数执行顺序,以及作用详细说明,请参考vue组件的生命周期 步骤详解我的步骤是按照开发思路进行的,场景就是从商品列表页——>商品详细页——>商品列表(数据缓存);开发之前看到网上好多人都是在路由文件里面配置meta:{keepAlive:true}但我觉得没有必要,因为列表页不是一直需要缓存数据的,假如从首页进入,则不需要,所以就在路由守卫函数中判断是否需要缓存数据即可; 以下代码,使用list.vue代表列表页;detail.vue代表详细页; 场景1:点击返回,判断路由跳转的是否是需要缓存的列表页: detail.vue beforeRouteLeave (to, from, next) { if (to.name === 'M2mBoard') { to.meta.keepAlive = true } next() }由于keepAlive是vue2.0中内置组件,所以设置页面路由meta.keepAlive = true即可缓存数据,路由跳转是利用函数this.$router.go(-1);就可以显示在上次浏览的记录位置; 场景2:编辑详细页数据,回到列表页,则需要将修改的数据保存到本地,然后在列表页的缓存数据中,更改显示即可: detail.vue beforeRouteLeave (to, from, next) { if (to.name === 'M2mBoard') { to.meta.keepAlive = true } if (this.isChange) { let changeData = { inquiryNo: this.inquiry.inquiryNo, inquiryTitle: this.inquiry.inquiryTitle } window.sessionStorage.setItem('changeData', JSON.stringify(changeData)) } to.meta.isChange = this.isChange next() }列表页中判断一下,是否需要修改数据: list.vue activated () { if (this.$route.meta.isChange) { let changeData = JSON.parse(window.sessionStorage.getItem('changeData')) this.list.forEach(item => { if (item.inquiryNo === changeData.inquiryNo) { item.inquiryTitle = changeData.inquiryTitle } }) } }activated 钩子函数,在keep-alive组件激活时自动执行,判断如果需要修改,从本地取出数据,循环列表数据,找出需要修改的那一条,进行显示数据的修改(因为是临时修改,所以只修改显示的参数即可); ...

May 10, 2019 · 1 min · jiezi

React的ref是啥强力一波

React ref理解:通过指定ref获得你想操作的元素,然后进行修改 string 使用方法<input ref="myInput" />var input = this.refs.myInput;var inputValue = input.value;var inputRect = input.getBoundingClientRect();ref作为回调函数的方式去使用class Input extends Component { constructor(props){ super(props); } focus = () => { this.textInput.focus(); } render(){ return ( <div> <input ref={(input) => { this.textInput = input }} /> </div> ) }}input参数是哪来的回调函数将接收当前的DOM元素作为参数,然后存储一个指向这个DOM元素的引用。那么在示例代码中,我们已经把input元素存储在了this.textInput中,在focus函数中直接使用原生DOM API实现focus聚焦。回调函数什么时候被调用答案是当组件挂载后和卸载后,以及ref属性本身发生变化时,回调函数就会被调用。不能在无状态组件中使用ref原因很简单,因为ref引用的是组件的实例,而无状态组件准确的说是个函数组件(Functional Component),没有实例。理解:class组件-对象组件-有实例 无状态组件-函数组件-无实例 上代码: function MyFunctionalComponent() { return <input />;}class Parent extends React.Component { render() { return ( <MyFunctionalComponent ref={(input) => { this.textInput = input; }} /> ); }}父组件的ref回调函数可以使用子组件的DOM。function CustomTextInput(props) { return ( <div> <input ref={props.inputRef} /> </div> );}class Parent extends React.Component { render() { return ( <CustomTextInput inputRef={el => this.inputElement = el} /> ); }}原理就是父组件把ref的回调函数当做inputRefprops传递给子组件,然后子组件<CustomTextInput>把这个函数和当前的DOM绑定,最终的结果是父组件<Parent>的this.inputElement存储的DOM是子组件<CustomTextInput>中的input。同样的道理,如果A组件是B组件的父组件,B组件是C组件的父组件,那么可用上面的方法,让A组件拿到C组件的DOM。 ...

May 10, 2019 · 1 min · jiezi

浅谈小程序运行机制

写作背景接触小程序有一段时间了,总得来说小程序开发门槛比较低,但其中基本的运行机制和原理还是要懂的。“比如我在面试的时候问到一个关于小程序的问题,问小程序有window对象吗?他说有吧”,但其实是没有的。感觉他并没有了解小程序底层的一些东西,归根结底来说应该只能算会使用这个工具,但并不明白其中的道理。 小程序与普通网页开发是有很大差别的,这就要从它的技术架构底层去剖析了。还有比如习惯Vue,react开发的开发者会吐槽小程序新建页面的繁琐,page必须由多个文件组成、组件化支持不完善、每次更改 data 里的数据都得setData、没有像Vue方便的watch监听、不能操作Dom,对于复杂性场景不太好,之前不支持npm,不支持sass,less预编译处理语言。 “有的人说小程序就像被阉割的Vue”,哈哈当然了,他们从设计的出发点就不同,咱也得理解小程序设计的初衷,通过它的使用场景,它为什么采用这种技术架构,这种技术架构有什么好处,相信在你了解完这些之后,就会理解了。下面我会从以下几个角度去分析小程序的运行机制和它的整体技术架构。 了解小程序的由来在小程序没有出来之前,最初微信WebView逐渐成为移动web重要入口,微信发布了一整套网页开发工具包,称之为 JS-SDK,给所有的 Web 开发者打开了一扇全新的窗户,让所有开发者都可以使用到微信的原生能力,去完成一些之前做不到或者难以做到的事情。 但JS-SDK 的模式并没有解决使用移动网页遇到的体验不良的问题,比如受限于设备性能和网络速度,会出现白屏的可能。因此又设计了一个增强版JS-SDK,也就是“微信 Web 资源离线存储”,但在复杂的页面上依然会出现白屏的问题,原因表现在页面切换的生硬和点击的迟滞感。这个时候需要一个 JS-SDK 所处理不了的,使用户体验更好的一个系统,小程序应运而生。 快速的加载更强大的能力原生的体验易用且安全的微信数据开放高效和简单的开发小程序与普通网页开发的区别小程序的开发同普通的网页开发相比有很大的相似性,小程序的主要开发语言也是 JavaScript,但是二者还是有些差别的。 普通网页开发可以使用各种浏览器提供的 DOM API,进行 DOM 操作,小程序的逻辑层和渲染层是分开的,逻辑层运行在 JSCore 中,并没有一个完整浏览器对象,因而缺少相关的DOM API和BOM API。普通网页开发渲染线程和脚本线程是互斥的,这也是为什么长时间的脚本运行可能会导致页面失去响应,而在小程序中,二者是分开的,分别运行在不同的线程中。网页开发者在开发网页的时候,只需要使用到浏览器,并且搭配上一些辅助工具或者编辑器即可。小程序的开发则有所不同,需要经过申请小程序帐号、安装小程序开发者工具、配置项目等等过程方可完成。小程序的执行环境 小程序架构一、技术选型一般来说,渲染界面的技术有三种: 用纯客户端原生技术来渲染用纯 Web 技术来渲染用客户端原生技术与 Web 技术结合的混合技术(简称 Hybrid 技术)来渲染通过以下几个方面分析,小程序采用哪种技术方案 开发门槛:Web 门槛低,Native 也有像 RN 这样的框架支持体验:Native 体验比 Web 要好太多,Hybrid 在一定程度上比 Web 接近原生体验版本更新:Web 支持在线更新,Native 则需要打包到微信一起审核发布管控和安全:Web 可跳转或是改变页面内容,存在一些不可控因素和安全风险由于小程序的宿主环境是微信,如果用纯客户端原生技术来编写小程序,那么小程序代码每次都需要与微信代码一起发版,这种方式肯定是不行的。 所以需要像web技术那样,有一份随时可更新的资源包放在云端,通过下载到本地,动态执行后即可渲染出界面。如果用纯web技术来渲染小程序,在一些复杂的交互上可能会面临一些性能问题,这是因为在web技术中,UI渲染跟JavaScript的脚本执行都在一个单线程中执行,这就容易导致一些逻辑任务抢占UI渲染的资源。 所以最终采用了两者结合起来的Hybrid 技术来渲染小程序,可以用一种近似web的方式来开发,并且可以实现在线更新代码,同时引入组件也有以下好处: 扩展 Web 的能力。比如像输入框组件(input, textarea)有更好地控制键盘的能力体验更好,同时也减轻 WebView 的渲染工作绕过 setData、数据通信和重渲染流程,使渲染性能更好用客户端原生渲染内置一些复杂组件,可以提供更好的性能二、双线程模型小程序的渲染层和逻辑层分别由 2 个线程管理:视图层的界面使用了 WebView 进行渲染,逻辑层采用 JsCore 线程运行 JS脚本。 ...

May 10, 2019 · 1 min · jiezi

移动端的textoverflow多行文本溢出显示省略号…

大家应该都知道用text-overflow:ellipsis属性来实现单行文本的溢出显示省略号(…)。当然部分浏览器还需要加宽度width属性。 overflow: hidden;text-overflow: ellipsis;white-space: nowrap;但是这个属性并不支持多行文本溢出显示省略号,这里根据应用场景介绍几个方法来实现这样的效果。 WebKit浏览器或移动端的页面在WebKit浏览器或移动端(绝大部分是WebKit内核的浏览器)的页面实现比较简单,可以直接使用WebKit的CSS扩展属性(WebKit是私有属性)-webkit-line-clamp ;注意:这是一个 不规范的属性(unsupported WebKit property),它没有出现在 CSS 规范草案中。-webkit-line-clamp用来限制在一个块元素显示的文本的行数。 为了实现该效果,它需要组合其他的WebKit属性。常见结合属性: display: -webkit-box; 必须结合的属性 ,将对象作为弹性伸缩盒子模型显示 。-webkit-box-orient 必须结合的属性 ,设置或检索伸缩盒对象的子元素的排列方式 。text-overflow: ellipsis;,可以用来多行文本的情况下,用省略号“…”隐藏超出范围的文本 。overflow : hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;这个属性比较合适WebKit浏览器或移动端(绝大部分是WebKit内核的)浏览器。具体例子可以查看http://www.css88.com/webkit/-webkit-line-clamp/ 跨浏览器兼容的方案比较靠谱简单的做法就是设置相对定位的容器高度,用包含省略号(…)的元素模拟实现;例如: p { position:relative; line-height:1.4em; /* 3 times the line-height to show 3 lines */ height:4.2em; overflow:hidden;}p::after { content:"..."; font-weight:bold; position:absolute; bottom:0; right:0; padding:0 20px 1px 45px; background:url(http://www.css88.com/wp-content/uploads/2014/09/ellipsis_bg.png) repeat-y;}这里注意几点: height高度真好是line-height的3倍;结束的省略好用了半透明的png做了减淡的效果,或者设置背景颜色;IE6-7不显示content内容,所以要兼容IE6-7可以是在内容中加入一个标签,比如用<span class="line-clamp">...</span>去模拟;要支持IE8,需要将::after替换成:after;JavaScript 方案用js也可以根据上面的思路去模拟,实现也很简单,推荐几个做类似工作的成熟小工具: 1.Clamp.js下载及文档地址:https://github.com/josephschmitt/Clamp.js使用也非常简单: var module = document.getElementById("clamp-this-module");$clamp(module, {clamp: 3});2.jQuery插件-jQuery.dotdotdot这个使用起来也很方便: ...

May 9, 2019 · 1 min · jiezi

一篇文章带你搞懂JS对象的自我销毁

在日常的JS组件开发中,往往会有一些较为复杂的DOM操作及事件监听,尤其是在处理UI层面的widgets时候更为明显。常常会花很多精力在对象的init上,而当组件需要被移除时则仅仅是把所在DOM草草的remove掉就算完事儿。 当然,绝大多数情况这样处理并没有什么不妥,因为事件监听时仅仅局限于所属的DOM自身,移除DOM后,只要对象的外部引用不再维系,相关的内存占用很快就会被当作垃圾回收掉(本文不讨论低版本 IE 内存回收的 BUG)。 其实个人在构建组件(对象)的时候是比较习惯于添加自定义方法destroy,用来手动销毁对象内部的一些引用。也就是今天要说的仅靠移除DOM并不能达到销毁对象的几种情况。 当你的组件出现下面几种情况时需要特别注意。 一: DOM事件监听越界常规情况下,一个组件需要监听的仅仅是自身的DOM内的事件。偶尔也会有另一种情况,对象不得不操作自身之外的DOM。 拿常见的瀑布流组件为例,除了自身事件,还要监听页面的滚动、浏览器尺寸重置等事件。因此当瀑布流组件需要被移除时,简单的移除自身DOM并不能完整销毁组件对页面的影响。 下面是常规做法的例子: //定义瀑布流组件function WaterFall(node){ this.node = node; window.addEventListener('scroll',function(){ //do sth console.log('scrolling'); });}//实例化一个瀑布流组件var node_content = document.getElementById('xxx');new WaterFall(node_content);//移除瀑布流组件所属的DOMnode_content.parentNode.removeChild(node_content);上面的例子很明显,移除DOM后遗留的事件监听还在,回调内对组件的引用会导致整个组件常驻内存无法被回收,直至页面卸载。 不过你可能会说,在移除DOM时顺手解除下事件绑定就 OK 啦。事实确实如此,但是如果操作的具体细节让调用者实现就有点儿麻keng烦die了。因此我们需要提供一个destroy接口让调用者去解除对窗口滚动等事件的监听。 //定义瀑布流组件function WaterFall(node){ this.node = node; this._scrollListenner = function(){ //do sth console.log('scrolling'); }; window.addEventListener('scroll',this._scrollListenner);} //欢迎加入前端全栈开发交流圈一起学习交流:1007317281WaterFall.prototype.destroy = function(){ window.removeEventListener('scroll',this._scrollListenner); this.node.parentNode.removeChild(this.node);};//实例化一个瀑布流组件var myWaterFall = new WaterFall(document.getElementById('xxx'));//注销瀑布流组件myWaterFall.destroy();给大家推荐一个技术交流学习圈,里面概括移动应用网站开发,css,html,webpack,vue node angular以及面试资源等。获取资料????????????对web开发技术感兴趣的同学,可以加入????????????交流圈????????????,不管你是小白还是大牛都欢迎,还有大牛整理的一套高效率学习路线和教程与您免费分享,同时每天更新视频资料。 二:JS 生命周期过长一部分场景下,某段 JS 会在整个生命周期中反复被调用。比如轮播图自动播放,倒计时时钟的重绘。无论是使用setInterval不断调取,或者是 setTimeout递归延时。这两者在对象自身DOM被移除时同样不会随之被清除。因此也需要对象在被销毁时手动解除定时器。 //定义倒计时组件function Countdown(node){ this.node = node; this._timerId = setInterval(function(){ //do sth console.log('recount'); },500);} //欢迎加入前端全栈开发交流圈一起学习交流:1007317281Countdown.prototype.destroy = function(){ clearInterval(this._timerId); this.node.parentNode.removeChild(this.node);};//实例化一个倒计时组件var myCountdown = new Countdown(document.getElementById('yyy'));//注销倒计时组件myCountdown.destroy();三:DOM 之外的异步事件比较常见的情形就是 ajax。当一个请求结束之前对象被销毁,ajax 返回后的操作无需继续进行。也有一定风险因为 dom 已被移除导致操作报错。 ...

May 9, 2019 · 1 min · jiezi

BFC块级格式上下文详解

1.BFC简要定义BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,它规定了内部如何布局,是决定块盒子的布局及浮动相互影响范围的一个区域,并且与这个区域外部毫不相干。 2.BFC创建方式根元素或其它包含它的元素;浮动 (元素的float不为none);绝对定位元素 (元素的position为absolute或fixed);行内块inline-blocks(元素的 display: inline-block);表格单元格(元素的display: table-cell,HTML表格单元格默认属性);overflow的值不为visible的元素;弹性盒 flex boxes (元素的display: flex或inline-flex)3.BFC内部特性内部的盒会在垂直方向一个接一个排列(可以看作BFC中有一个的常规流);处于同一个BFC中的元素相互影响,可能会发生margin collapse;但不同BFC可以阻止margin collapse每个元素的margin box的左边,与容器块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此;BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然;计算BFC的高度时,考虑BFC所包含的所有元素,连浮动元素也参与计算;浮动盒区域不叠加到BFC上;4.BFC应用实例1.BFC清除浮动将父元素设置一个能让其变为BFC区域的属性,不如overflow:auto <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> #one{ background:green; width: 100px; height: 50px; float: left; } #two{ background: red; width: 200px; height: 50px; float: left; } #box{ border: 2px solid salmon; width: 400px; overflow: auto; } </style></head><body><div id="box"> <div id="one">one</div> <div id="two">two</div></div></body></html>2.BFC处理margin collapse在CSS中,两个或多个毗邻的普通流中的盒子(可能是父子元素,也可能是兄弟元素)在垂直方向上的外边距会发生叠加,这种形成的外边距称之为外边距叠加。这里讲解父子元素,兄弟元素同理。 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> *{ margin: 0; padding: 0; } p{ padding: 0; margin: 20px 0 20px 0; height: 20px; background-color: burlywood; color: #fff; } div{ overflow: auto;//前后的区别取决于这句话,加上就能让父级生成BFC区域包含它们 width: 250px; background-color: #ccc; } </style></head><body><div> <p>aaaaaaaaaaaaaa</p> <p>bbbbbbbbbbbbbb</p></div></body></html>BFC改造后 ...

May 9, 2019 · 1 min · jiezi

JavaScript简史从网景到前端框架三巨头

从上世纪 90 年代中期发行以来,JavaScript 就已经成为最流行的 Web 开发语言之一了。尽管 JavaScript 最初只是一个浏览器脚本语言,但是近几年,我们已经能够明显看到它在不断地演变:在桌面端、移动设备和服务端 Web App 领域都有所发展。 “任何能够用 JavaScript 实现的应用系统,最终都必将用 JavaScript 实现”,Jeff Atwood 之语正在进入现实。 最后,如果大家如果在自学遇到困难,想找一个前端的学习环境,可以加入我们的前端学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题。 JavaScript简史:从网景到前端框架三巨头 以下为译文: 写在前面JavaScript 是 Web 的标准语言,也是最受欢迎的脚本语言。类似的,我的设备检测 API 也主要使用 JS。所以是时候给 JavaScript 写一篇博客文章了。因此,本文将会介绍 JavaScript 的重点内容。首先,我们简要了解 JS 的发展历程。随后介绍 JS 的流行度。最后概述最流行的 JS 库和框架。阅读愉快~ JavaScript:历史概述1989 年,为了加强大学与科学机构之间的信息共享,人们发明了万维网(WWW)。一年后,第一款网页浏览器诞生了,它被简单的命名为:万维网。然而,第一款商业化的浏览器在这几年后才诞生——它是由网景通信公司于 1993 年推出的。1995 年初,网景是当时最流行的网页浏览器之一。 JavaScript简史:从网景到前端框架三巨头 (1994 年,网景浏览器的截图) 在那之前,万维网一直是静态的,只有 HTML 可用。为了扩大及深入发展万维网,网景通信公司发明了 JavaScript(当时叫 Mocha)。JS 的目标是创建一种更富于交互性的动态网站。与软件开发人员相比,设计师的可用性更为重要。因此,代码必须要轻便、简易和简单。 为了不落后于竞争对手(即微软的 IE 浏览器),网景公司与太阳计算机系统公司合作。太阳计算机系统公司创建了 Java:一种用于智能应用程序的语言。然而,Java 并不适合这类受众(Web 设计人员)。更具体地说,Java 太庞大了,它针对的是大型企业。 然而,Brendan Eich(网景 JavaScript 的主要负责人)创建了 JS 的工作原型。在很短的时间内,JavaScript 就集成到了他们的 Web 浏览器中。JavaScript 天生就是一种小型客户端的脚本语言。 ...

May 9, 2019 · 2 min · jiezi

基于-Github-API-的图床-Chrome-插件开发全纪录

最近基于 Github API 开发了一款图床 Chrome 插件 Picee,现在已经开源并上架 Chrome 应用商店。当中的过程涉及到一些有趣的知识点,故将其记录下来。 Github地址:https://github.com/jrainlau/p...Chrome商店下载地址:Picee 灵感平时有写点东西的习惯,但是奈何一直找不到合适的图床。有人推荐以微博或者七牛来做图床,但是总给我一种”受制于人“的感觉,不知道什么时候就会被各种限制,比如禁止图片外链等等。后来发现其实 Github 是非常适合做图床的,因为仓库里的文件都可以通过 https://raw.githubusercontent.com 这个链接直接外链以供下载。但是如果为了写个文章而每次添加图片都需要一顿 Git 操作,那么写作体验必定非常不好,如果有更方便的办法就好了——那就是Github API。 Github APIGithub 提供了一套完善的 API 以供操作,几乎涵盖了开发一个完整 Github 客户端的所有功能。API 分为 REST 风格的 v3 版本和 GraphQL 风格的 v4 版本。为了使用方便,我选择的是 v3 版本。具体的 API 细节可以在官方文档查看。 要制作一个图床应用,我们只需要用到上传文件的 API 即可。但是在调用这个 API 之前,首选需要用户对应用进行授权,也就是所谓的登录操作。 授权对于一般的”查看”操作,是不需要授权的,比如获取用户的公开信息,获取公有仓库的 issues 等等。但是有两个场景是需要授权的,其一是任何对于仓库的“增删改查”操作(包括提交 issue,评论等);其二则是对于某 IP 有 API 的调用次数限制,若这个 IP 调用 Github API 的次数过多则需要授权。 那么授权应该怎么做呢?官方提供了三种办法,分别是 Basic,oAuth2 token和oAuth2 key/secret。 Basic授权也就是最传统的账号密码授权方式,我们可以在命令行用 curl 来测试之: curl -u "账号:密码" https://api.github.com如果是正确的账号密码,则会返回一系列的内容,否则会返回错误信息。 ...

May 9, 2019 · 2 min · jiezi

重学前端学习笔记十CSS语法关于带的规则

笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com。一、CSS相关标准文档1.0、W3C的网站关于CSS相关的标准链接1.1、CSS语法的最新标准链接1.2、CSS规则CSS 的顶层样式表由两种规则组成的规则列表构成,一种被称为 at-rule,也就是 at 规则,另一种是 qualified rule,也就是普通规则。1.2.0、at-rule由一个 @ 关键字和后续的一个区块组成,如果没有区块,则以分号结束。1.2.1、qualified rule指普通的 CSS 规则,由选择器和属性指定构成的规则。二、at 规则2.0、CSS 标准里的 at-rule@charset: https://www.w3.org/TR/css-syntax-3/@import:https://www.w3.org/TR/css-cascade-4/@media:https://www.w3.org/TR/css3-conditional/@page:https://www.w3.org/TR/css-page-3/@counter-style:https://www.w3.org/TR/css-counter-styles-3@keyframes:https://www.w3.org/TR/css-animations-1/@fontface:https://www.w3.org/TR/css-fonts-3/@supports:https://www.w3.org/TR/css3-conditional/@namespace:https://www.w3.org/TR/css-namespaces-3/上面由winter整理(winter原话:不用谢,我已经帮你找好了,如果页面定位不准,你可以打开页面搜索关键字)大笑。 2.1、@charset@charset 用于提示 CSS 文件使用的字符编码方式,它如果被使用,必须出现在最前面。这个规则只在给出语法解析阶段前使用,并不影响页面上的展示效果。@charset "utf-8";2.2、@import@import "index.css";@import url("index.css");import 还支持 supports 和 media query 形式。(这一点不怎么理解) @import [ <url> | <string> ] [ supports( [ <supports-condition> | <declaration> ] ) ]? <media-query-list>? ;2.3、@mediamedia 是 media query 使用的规则,能够对设备的类型进行一些判断 @media print { body { font-size: 10px }}2.4、@pagepage 用于分页媒体访问网页时的表现设置(这个我还没有用过_(:3」∠)_) @page { margin: 10%; @top-left { content: "Hamlet"; } @top-right { content: "Page " counter(page); }}2.5、@ counter-stylecounter-style 产生一种数据,用于定义列表项的表现。 ...

May 9, 2019 · 2 min · jiezi

栅格GRID-未来可期-更便捷的布局方式

栅格布局组成: wrapper(父元素)和 items(子元素)。 父 属性设置: display: grid;或display: inline-grid; /*网格模式*/grid-template-columns: 40px auto 50px; /*子元素列的宽度*/grid-template-rows: 25% 100px auto; /*子元素行的高度 设置则定高 不设则自适应*//*他们俩可设置是px 百分比 也可以自动伸缩auto*/grid-gap: 5px; /*网格区域的间距 可设置单一间距 也可以上下一个间距左右一个间距 。 不支持上右下左四个值写法*/子 属性设置:不设置一下值是 默认均分。 更多变化 需要用到⤵️ grid-row-start: 2; /*行 的开始*/grid-row-end: 3; /*行 的结束*//*上面两句可简写成 grid-row: 2 / 3;*/grid-column-start: 1; /*列 的开始*/grid-column-end: 4; /*列 的结束*//*同理上面两句可简写成 grid-column: 1 / 4;*/------------更简洁写法-----------------------grid-row-start: 2; /*行 的开始*/grid-row-end: 3; /*行 的结束*/grid-column-start: 1; /*列 的开始*/grid-column-end: 4; /*列 的结束*//*上面四句可简写成*/grid-area:2/1/3/4; /*顺序grid-row-start,grid-column-start,grid-row-end,grid-column-end。*/ 理解row和columns的排序 基本就理解grid的用法例如:grid-row-start: 2; 指的是从上到下第二条线开始grid-column-start: 1; 指的是从左到右第一条线开始 ...

May 8, 2019 · 2 min · jiezi

CSS3动画简单案例

1.简易加载中 @keyframes myfirst { from{transform: rotate(0deg)}to{transform: rotate(360deg)} } .loading{ animation: myfirst 1.5s infinite linear;//infinite控制执行次数这里一直执行,linear执行速度,匀速 border: 16px solid #f3f3f3; border-radius: 50%; border-top:16px solid blue; width: 120px; height: 120px; } <div class="loading"></div>2.简易进度条.move { width: 0px; height: 10px; animation: moveHover 5s infinite linear; } <div class="move"></div>3.过渡属性 .change { transition: width 2s; font-size: 10px; width: 100px; height: 20px; background: yellow; -moz-transition: width 2s; /* Firefox 4 */ -webkit-transition: width 2s; /* Safari 和 Chrome */ -o-transition: width 2s; /* Opera */ } .change:hover { width: 500px; } <div class="change">鼠标滑过</div> .bigger{ font-size: 20px; width: 0; height: 0;//scale根据宽高变大,必须设置width和height background: #2A9F00; transition: transform 5s; } .bigger:hover{ transform: scale(10); } <div class="bigger">大</div>

May 8, 2019 · 1 min · jiezi

微信小程序网络层封装promise-登录锁

一、对小程序的request的封装写过小程序的应该知道,微信的request不封装基本上不能用,写的显的太冗长,而且是回调式的,回调地狱什么的就不说了,可读性差。下面是我的封装代码,顺便支持一下promise。function baseRequest({ url, method, header, data, complete }, resolve, reject) { wx.request({ url, method, header, data, success: function (res) { // 需要判断服务器code的用这一段 // 我司服务器返回0表示真正的成功,其他code表示各种错误码 // if (res.data.code === 0) { // resolve(res) // } else { // reject(res) // } resolve(res) }, fail: function (res) { reject(res) }, complete: function (res) { complete(res) } })}function requestPromise( options ) { let req = new Promise((resolve, reject) => { baseRequest(options, resolve, reject) }) return req}function get(options) { options.method = 'GET' return requestPromise(options)}function post(options) { options.method = 'POST' if (!options.header) { options.header = {} } options.header["Content-Type"] = "application/x-www-form-urlencoded" return requestPromise(options)}function put(options) { options.method = 'PUT' if (!options.header) { options.header = {} } options.header["Content-Type"] = "application/x-www-form-urlencoded" return requestPromise(options)}module.exports = { get, post, put}如何使用:1. 将上面的代码写到一个独立的文件里,我的命名为network.js。2. 然后将其绑定到全局的 wx 对象身上。 wx.Network = require('./network.js')。(在app.js里面绑定)3. 实例如下wx.Network.get({ url: 'xxx.xxx.xxx', // 请求路径 data: { a: "a" // 参数列表 } }).then(res => { console.log("请求成功") }).catch(res => { console.log("请求失败") })二、登录锁基本的request请求封装完了后,还有一些特殊的需求,比如1. 在首页我会进行登录, 登录后获得token, 然后我拿着token去请求其他需要token才可以请求的接口 (比如个人购物信息)2. 这个时候一种做法是登录完成前不进行需要token的请求,并且有蒙板进行拦截操作(正在登录ing...)3. 对于我公来说这种方法有一个致命的弊端,就是在高并发的情况下,服务器的压力很大,首页的登录接口很慢才有返回(进首页即自动登录),这个时候,用户看到的界面就是loading,而且可能时间比较长,如果用户对你的产品粘性不高,绝大部分人直接就走了4. 为了优化这种情况下的用户体验,我们全面取消了登录的loading,替换成了“登录锁”的形式5. 效果为未登录调用需要token的接口时,不请求,直到登录完成后才会请求6. 即如果这个请求需要token,那么先判断有没有登录,如果没有登录,启动定时器一段时间后(200ms),再次判断,如果已经登录,发出请求,如果没有,重复以上操作加了登录锁后的代码如下: ( 添加了新的 wait 函数,调用get,post,put时增加第二个参数,表示是否需要token )function baseRequest({ url, method, header, data, complete }, resolve, reject) { wx.request({ url, method, header, data, success: function (res) { // 需要判断服务器code的用这一段 // 我司服务器返回0表示真正的成功,其他code表示各种错误码 // if (res.data.code === 0) { // resolve(res) // } else { // reject(res) // } resolve(res) }, fail: function (res) { reject(res) }, complete: function (res) { complete(res) } })}function wait(options, needToken, resolve, reject) { if (needToken) { var token = wx.getStorageSync('token') if (!token) { setTimeout(() => { wait.apply(null, arguments) }, 200) } else { if (!options.header) { options.header = {} } options.header["token"] = token baseRequest(options, resolve, reject) } } else { baseRequest(options, resolve, reject) }}function requestPromise( options, needToken = true ) { let req = new Promise((resolve, reject) => { wait(options, needToken, resolve, reject) }) return req}function get(options, needToken) { options.method = 'GET' return requestPromise(options, needToken)}function post(options, needToken) { options.method = 'POST' if (!options.header) { options.header = {} } options.header["Content-Type"] = "application/x-www-form-urlencoded" return requestPromise(options, needToken)}function put(options, needToken) { options.method = 'PUT' if (!options.header) { options.header = {} } options.header["Content-Type"] = "application/x-www-form-urlencoded" return requestPromise(options, needToken)}module.exports = { get, post, put}如何使用:(使用方式和上面一样,只是调用的时候多一个参数)1. 将上面的代码写到一个独立的文件里,我的命名为network.js。2. 然后将其绑定到全局的 wx 对象身上。 wx.Network = require('./network.js')。(在app.js里面绑定)3. 实例如下wx.Network.get({ url: 'xxx.xxx.xxx', // 请求路径 data: { a: "a" // 参数列表 } }, true // 增加第二个参数,true表示需要token, false表示不需要 ).then(res => { console.log("请求成功") }).catch(res => { console.log("请求失败") })

May 8, 2019 · 2 min · jiezi

小程序的一些小知识总结

小程序很多方法都是异步的原因刚接触小程序的时候,发现很多微信提供的api都是异步的,如路由跳转,设置和读取缓存,还有获取节点信息等微信的api,都是异步的,需要传入回调函数才能获得结果,在我们正常的前端开发中,这些都不是异步的,当时很奇怪为什么是这样的,最近看了微信的一个开发教程之后,总算是明白了。微信小程序开发教程 小程序的底层架构是双线程模式,逻辑层和渲染层是分开的两个线程,渲染层指的就是渲染wxml和wxss,逻辑层指的是执行js文件,两个线程分开运行,通过微信客户端进行通信,调用微信的api的时候其实就是执行js的线程和微信客户端通信下图是微信官方文档里渲染页面的一个流程图 注意事项:上述说了,小程序的渲染层和逻辑层是分开的两个线程,执行js逻辑的只有一个线程,所以在js里声明了的函数,只要有调用,就算页面卸载了,最终都会执行,所以要注意的是,一些interval,或者一些注册的其他函数,如果不想在页面离开后继续执行的话,在页面卸载的时候要注销掉。 发布和订阅模式先补充一个知识点:在小程序的appjs的onLaunch里,给全局变量wx添加的属性,是全局有效的,能在其他页面中调用,比如: onLaunch: function () { wx.aaa = '123456'; wx.bbb = function () { console.log('541521') }}onLoad: function () { console.log(wx.aaa); wx.bbb();}之前对发布和订阅一直没什么概念,但是多学点东西总没坏处,近期自己花了点时间专门看了一下,大概明白了一点。 订阅:订阅就是在某个地方注册一个自定义的事件,供其他地方调用发布:触发已经订阅的函数 下面是我写的一个方法,可能会有一些bug,但是目前没有发现,要是有问题的话欢迎交流一下 var MyEvent = (function () { // 声明方法 var pub, sub, remove; // 订阅缓存记录 var subCache = {}; // 发布缓存记录 var pubCache = {}; // 参数缓存 var paramCache = {}; // 订阅事件 sub = function (key, fn) { if (!subCache[key]) { subCache[key] = []; } // 添加到订阅缓存中 subCache[key].push(fn); // 如果有发布记录,则直接执行函数 if (pubCache[key]) { if (paramCache[key]) { fn.apply(null, paramCache[key]); } else { fn.apply(null); } pubCache[key] = undefined; } }; pub = function () { var key = Array.prototype.shift.call(arguments); var fns = subCache[key]; // 没有订阅过,则将参数缓存,待订阅的时候直接执行 if (!fns || fns.length === 0) { pubCache[key] = true; paramCache[key] = Array.prototype.slice.call(arguments, 0); return; } // 有订阅记录,则直接执行 for (let fn of fns) { fn.apply(null, arguments); } }; remove = function (key) { // 把所有的缓存全部清除 subCache[key] = undefined; pubCache[key] = undefined; paramCache[key] = undefined; }; return { pub: pub, sub: sub, remove: remove };})();module.exports = MyEvent;使用方法如下:在appjs里引入MyEvent,并挂载在wx对象上 ...

May 8, 2019 · 2 min · jiezi

手把手编写一个Vue日历表组件

项目需要,需要一个日历表组件,产品狗嫌弃第三方提供的组件样式太丑,功能不全,带刀和产品理论奈何产品有枪。无奈只能自己写一个,发布完这条博客我就提离职,再也不和产品多BB。Html=>`<template> <div class="calender"> <div class="calender-title-wrapper"> <div class="calender-title"> <div class="calender-arrow-item left2" v-if="false"></div> <div class="calender-arrow-item left1" @click="month--"></div> <div class="calender-Date-text">{{year}}年{{month}}月</div> <div class="calender-arrow-item right1" @click="month++"></div> <div class="calender-arrow-item right2" v-if="false"></div> </div> </div> <div class="calender-content-wrapper"> <div class="calender-days-wrapper"> <div class="calender-days">日</div> <div class="calender-days">一</div> <div class="calender-days">二</div> <div class="calender-days">三</div> <div class="calender-days">四</div> <div class="calender-days">五</div> <div class="calender-days">六</div> </div> <div class="calender-content"> <div class="calender-item-wrapper" v-for="item in daysArr" :class="{'no-current-day':item.month!=month, active:item === clickItemObj, currentDay:item.day===_CurrentDate.day&& item.month===_CurrentDate.month&& item.year===_CurrentDate.year}" @click="_clickDaysItem(item)" > <div class="calender-item">{{item.day}}</div> <div class="tem-wrapper"> <span class="temp" v-for="d in markArr" :style="{background: d.color}" v-if="_visibleTemp(d,item)"></span> </div> </div> </div> <div class="calender-mask-wrapper"> <div class="calender-mask-item" v-for="item in markArr"> <span class="tem" :style="{background:item.color}"></span> <span class="text">{{item.name}}</span> </div> </div> </div></div></template>`js=> ...

May 8, 2019 · 3 min · jiezi

vue项目中的遇到的坑和感悟

使用keep-alive包裹的组件/路由,打开一次后created只会执行一次,有两种情况,一、如果要重新渲染部分数据,可以在activated中做处理;二、路由/组件重新重新created,可以使用官方推荐的:key="key" ,然后去改变key的值,组件就会重新挂载了beforeRouteEnter中的next函数的执行时间是在组件mounted之后,因此需要在此处处理的数据要注意了网页刷新时vuex数据会丢失,需配合localStorage或sessionStorage使用,把必须数据先存后取对于权限及不确定路由,可以使用addRoutes(),可以避免抖动熟练使用es6的数组map、find、filter等方法,对解构赋值、class继承、promise,及es7中的async和await使用computed替代watch,computed依赖于data属性的更改,是有缓存的待续...在开发过程中,条条大路通罗马,但是要考虑哪条路是最优路径。如何少写冗余代码,优化性能,才是我们需要考虑的。每天进步一点点,持续更新···

May 8, 2019 · 1 min · jiezi

重学前端学习笔记九JavaScript中的对象分类

笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com。一、javaScript对象分类介绍1.0、宿主对象(host Objects)由 JavaScript 宿主环境提供的对象,它们的行为完全由宿主环境决定。1.1、内置对象(Built-in Objects)由 JavaScript 语言提供的对象。1.1.0、固有对象(Intrinsic Objects )由标准规定,随着 JavaScript 运行时创建而自动创建的对象实例。1.1.1、原生对象(Native Objects)可以由用户通过 Array、RegExp 等内置构造器或者特殊语法创建的对象。1.1.2、普通对象(Ordinary Objects)由 {} 语法、Object 构造器或者 class 关键字定义类创建的对象,它能够被原型继承。下面winter主要介绍了普通对象之外的对象原型(刚好都是我不太懂的,mark一下) 二、宿主对象2.0、window对象全局对象 window 上的属性,一部分来自 JavaScript 语言,一部分来自浏览器环境宿主也会提供一些构造器,比如使用 new Image来创建 img 元素(winter下次会讲浏览器的API,到时再详细的mark一下)三、内置对象·固有对象3.0、简单介绍固有对象在任何 JS 代码执行前就已经被创建出来,类似基础库的角色ECMA 标准为我们提供了一份固有对象表,里面含有 150+ 个固有对象(链接打开比较慢,稍等一下就好)3.1、小实验:获取全部 JavaScript 固有对象3.1.0、三个值Infinity、NaN、undefined3.1.1、九个函数eval、isFinite、isNaN、parseFloat、parseInt、decodeURI decodeURIComponent、encodeURI、encodeURIComponent3.1.2、一些构造器Array、Date、RegExp、Promise、Proxy、Map、WeakMap、Set、WeapSet、Function、Boolean、String、Number、Symbol、Object、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError URIError、ArrayBuffer、SharedArrayBuffer、DataView、Typed Array、Float32Array、Float64Array、Int8Array、Int16Array、Int32Array、UInt8Array、UInt16Array、UInt32Array、UInt8ClampedArray3.1.3、四个用于当作命名空间的对象Atomics、JSON、Math、Reflect3.1.4、处理方法1、winter的做法:使用广度优先搜索,查找这些对象所有的属性和 Getter/Setter,就可以获得 JavaScript 中所有的固有对象。 2、下面代码可以研究一下看看,new Set()不懂的可以看看MDN关于set的介绍,(我现在还没有看明白,我去不同网页打开运行输出set不一样,感觉有点懵逼_(:3」∠)_,理解的大佬可以留言告诉我,不胜感激) var set = new Set();var objects = [ eval, isFinite, isNaN, parseFloat, parseInt, decodeURI, decodeURIComponent, encodeURI, encodeURIComponent, Array, Date, RegExp, Promise, Proxy, Map, WeakMap, Set, WeakSet, Function, Boolean, String, Number, Symbol, Object, Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError, ArrayBuffer, SharedArrayBuffer, DataView, Float32Array, Float64Array, Int8Array, Int16Array, Int32Array, Uint8Array, Uint16Array, Uint32Array, Uint8ClampedArray, Atomics, JSON, Math, Reflect];objects.forEach(o => set.add(o));for(var i = 0; i < objects.length; i++) { var o = objects[i] for(var p of Object.getOwnPropertyNames(o)) { var d = Object.getOwnPropertyDescriptor(o, p) if( (d.value !== null && typeof d.value === "object") || (typeof d.value === "function")) if(!set.has(d.value)) set.add(d.value), objects.push(d.value); if( d.get ) if(!set.has(d.get)) set.add(d.get), objects.push(d.get); if( d.set ) if(!set.has(d.set)) set.add(d.set), objects.push(d.set); }}四、内置对象·原生对象4.0、分类winter按照不同应用场景,将原生对象分成了以下几个种类 ...

May 8, 2019 · 2 min · jiezi

H5归纳

写在前面 -- 需要提前了解的这是写给自己的归纳HTML5介绍新的特性 用于绘画的 canvas 元素用于媒介回放的 video 和 audio 元素对本地离线存储的更好的支持新的特殊内容元素,比如 article、footer、header、nav、section新的表单控件,比如 calendar、date、time、email、url、searchHTML5 浏览器兼容性兼容性Internet Explorer 8 及更早 IE 版本的浏览器不支持以上的方式。 //国外 <!--[if lt IE 9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> //国内 <!--[if lt IE 9]> <script src="http://cdn.static.runoob.com/libs/html5shiv/3.7/html5shiv.min.js"></script> <![endif]-->你可以让一些较早的浏览器(不支持HTML5)支持 HTML5(你可以 "教会" 浏览器处理 "未知" 的 HTML 元素)。 //为了能让旧版本的浏览器正确显示这些元素,你可以设置 CSS 的 display 属性值为 blockheader, section, footer, aside, nav, main, article, figure { display: block; }HTML5 新元素<canvas> 新元素 <canvas> 标签定义图形,比如图表和其他图像。该标签基于 JavaScript 的绘图 API 浏览器支持IE 9、Firefox、Opera、Chrome 和 Safari 支持 <canvas> 标签。新多媒体元素 ...

May 7, 2019 · 2 min · jiezi

块级元素的三种垂直水平居中的方法

直奔主题在这里提供三种块级元素垂直水平居中的方法 flex(子级宽高可固定也可不固定,随意)定位+margin(固定子级的宽高,margin-top,margin-left取自身一半的负值)定位+transform(不固定子级的宽高)flex html<div class="parent"> <div class="child"></div></div>css.parent{ width: 500px; height: 500px; margin: 0 auto; border: 1px solid gainsboro; display: flex; justify-content: center; align-items: center;}.child{ width: 200px; height: 200px; background: red;}定位+margin html<div class="parent"> <div class="child"></div></div>css.parent{ position: relative; width: 500px; height: 500px; margin: 0 auto; border: 1px solid gainsboro; }.child{ position: absolute; top: 50%; left: 50%; width: 200px; height: 200px; margin-left: -100px; margin-top: -100px; background: red; }定位+transform html<div class="parent"> <div class="child"> <span>我是子元素</span> </div></div>css.parent{ position: relative; width: 500px; height: 500px; margin: 0 auto; border: 1px solid gainsboro; } .child{ position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); background: red; }个人更喜欢flex ...

May 7, 2019 · 1 min · jiezi

记录一次开发微信网页分享

需求最近在做一个项目需求,分享领好书活动,获取用户的个人信息以及unionID,并诱导用户分享给好友或朋友圈,达到裂变拉新的目的。在做的过程中遇到了一些坑的地方,所以回过来总结一下 技术方案使用微信JS-SDK自定义分享到好友和分享到朋友圈 实现步骤1、要实现微信H5网页自定义分享功能,必须先熟悉下微信公众平台开发文档,具体文档里面说的很详细,这里说下需要注意的点,别忘了绑定开发者权限,还有绑定js安全域名,要不然有可能会报redirect_uri参数错误。 2、首先一般在做微信H5网页活动,都需要获取用户的个人信息,这就需要用户授权,一般授权有两种方式,一种是静默授权,一种是网页授权,这个在微信开发文档说的很详细。 对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知一般网页授权流程分为四步: ①引导用户进入授权页面同意授权,获取code ②通过code换取网页授权access_token(与基础支持中的access_token不同) ③如果需要,开发者可以刷新网页授权access_token,避免过期 ④通过网页授权获取用户基本信息(openid 、UnionID、个人头像、性别、省市、微信昵称等) 3、下面是具体实现代码,说下大概思路,通过判断参数是否在微信浏览器中打开,是否让用户授权,并重定向到微信的接口拿到code后通过接口传给后端返回用户的基本信息。 // 用户授权 if (this.$route.query.from) { // 跳转微信页面 let _nowUrl = window.location.href.split("?")[0] +`?pictureId=${this.$route.query.pictureId}`; // 参数拼接 let _shareUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=微信公众号APPID&redirect_uri=${encodeURIComponent(_nowUrl)}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`; window.location.href = _shareUrl; // 重定向到这个定义的URL } // 通过code获取用户信息 if (this.$route.query.code) { let _code = this.$route.query.code; this.handleWechatMsg(_code); }4、接下来就是如何自定义分享给好友或者朋友圈,同样也是按照调用微信开发文档上说的进行配置和调用。在调用分享接口成功之后开始调用分享api,并在调用成功之后的回调函数执行跳页,这里微信那边做了限制,如果用户在点击分享的时候取消了,默认还是走success成功回调函数,是拿不到最终分享成功的状态。下面是实现分享的具体代码 // 分享给朋友或朋友圈 wxChatShare(param) { var that = this; let _url = encodeURIComponent(param.url); apiUrl.wechatConfig(_url).then(res => { if (res.data.code == 200) { wx.config({ debug: false, appId: res.data.content.appid, timestamp: res.data.content.timestamp, // 必填,生成签名的时间戳 nonceStr: res.data.content.nonceStr, // 必填,生成签名的随机串 signature: res.data.content.signature, // 必填,签名 jsApiList: [ "onMenuShareTimeline", "onMenuShareAppMessage" // "updateAppMessageShareData", // "updateTimelineShareData" ] }); // wx.ready(function() { //分享到朋友圈 wx.onMenuShareTimeline({ title: param.title, // 分享标题 link: param.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: param.imgUrl, // 分享图标 success: function() { // 用户点击了分享后执行的回调函数 that.$Message.message("分享成功!"); that.toRouter(); } }); //分享到好友 wx.onMenuShareAppMessage({ title: param.title, // 分享标题 desc: param.desc, // 分享描述 link: param.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: param.imgUrl, // 分享图标 type: param.type, // 分享类型,music、video或link,不填默认为link dataUrl: param.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function() { // 用户点击了分享后执行的回调函数 that.$Message.message("分享成功!"); that.toRouter(); } }); // wx.updateTimelineShareData({ // title: param.title, // 分享标题 // link: param.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 // imgUrl: param.imgUrl, // 分享图标 // success: function(res) { // // 设置成功 // that.$Message.message("设置成功!"); // that.toRouter(); // } // }); // //分享给朋友 // wx.updateAppMessageShareData({ // title: param.title, // 分享标题 // desc: param.desc, // 分享描述 // link: param.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 // imgUrl: param.imgUrl, // 分享图标 // success: function(res) { // // 设置成功 // that.$Message.message("设置成功!"); // that.toRouter(); // } // }); // }); wx.error(function(res) { console.log("验证失败返回的信息:", res); }); } else { console.log(res.data.message); } }) .catch(err => { this.$Message.message(error); }); },总结这里遇到比较坑的就是,在调用分享事件的时候,不能同时写四个分享按钮事件,如果都写上,会造成在安卓机上还没有点击分享按钮的时候,就已经走分享成功success回调函数了,这里说下为啥写四个分享按钮事件,因为发现如果不写上即将废掉的两个onMenuShareTimeline、onMenuShareAppMessage会在安卓机上遇到不能分享的问题,所以把新增的两个分享按钮事件updateAppMessageShareData、updateTimelineShareData注释掉,就都可以分享了,iOS和安卓均没问题。 ...

May 7, 2019 · 2 min · jiezi

重学前端学习笔记八JavaScript中的原型和类

笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com。一、什么是原型?1.0、定义原型是指一个词语或一个类型意义的所有典型模型或原形象,是一个类型的组典型特征1.1、基于类的编程语言诸如 C++、Java 等流行的编程语言是使用类的方式来描述对象,基于类的编程提倡使用一个关注分类和类之间关系开发模型。1.2、基于原型的编程语言如 JavaScript 编程语言是利用原型来描述对象,基于原型的编程看起来更为提倡程序员去关注一系列对象实例的行为,而后才去关心如何将这些对象,划分到最近的使用方式相似的原型对象,而不是将它们分成类。1.3、原型系统的“复制操作”有两种实现思路一个是并不真的去复制一个原型对象,而是使得新对象持有一个原型的引用另一个是切实地复制对象,从此两个对象再无关联。javaScript选择了第一种方式。 二、JavaScript 的原型2.0、原型系统的两条概括如果所有对象都有私有字段 [[prototype]],就是对象的原型读一个属性,如果对象本身没有,则会继续访问对象的原型,直到原型为空或者找到为止。2.1、三个内置函数可以利用下面三个方法,更直接地访问操纵原型,来实现抽象和复用。 Object.create 根据指定的原型创建新对象,原型可以是 nullObject.getPrototypeOf 获得一个对象的原型Object.setPrototypeOf 设置一个对象的原型winter举了用原型来抽象猫和虎的例子: var cat = { say() { console.log("meow~"); }, jump() { console.log("jump"); }}var tiger = Object.create(cat, { say: { writable: true, configurable: true, enumerable: true, value: function(){ console.log("roar!"); } }})var anotherCat = Object.create(cat);anotherCat.say(); // meow~var anotherTiger = Object.create(tiger);anotherTiger.say(); // roar!三、早期版本中的类与原型3.0、“类”的定义是一个私有属性 [[class]]所有具有内置 class 属性的对象:(ES3和之前版本) var o = new Object;var n = new Number;var s = new String;var b = new Boolean;var d = new Date;var arg = function(){ return arguments }();var r = new RegExp;var f = new Function;var arr = new Array;var e = new Error;console.log( [o, n, s, b, d, arg, r, f, arr, e].map(v => Object.prototype.toString.call(v) ))语言使用者唯一可以访问 [[class]] 属性的方式是 Object.prototype.toString。 ...

May 6, 2019 · 2 min · jiezi

小程序如何生成海报分享朋友圈

项目需求写完有一段时间了,但是还是想回过来总结一下,一是对项目的回顾优化等,二是对坑的地方做个记录,避免以后遇到类似的问题。 需求利用微信强大的社交能力通过小程序达到裂变的目的,拉取新用户。生成的海报如下 需求分析1、利用小程序官方提供的api可以直接分享转发到微信群打开小程序2、利用小程序生成海报保存图片到相册分享到朋友圈,用户长按识别二维码关注公众号或者打开小程序来达到裂变的目的 实现方案一、分析如何实现相信大家应该都会有类似的迷惑,就是如何按照产品设计的那样绘制成海报,其实当时我也是不知道如何下手,认真想了下得通过canvas绘制成图片,这样用户保存这个图片到相册,就可以分享到朋友圈了。但是要绘制的图片上面不仅有文字还有数字、图片、二维码等且都是活的,这个要怎么动态生成呢。认真想了下,需要一点一点的将文字和数字,背景图绘制到画布上去,这样通过api最终合成一个图片导出到手机相册中。 二、需要解决的问题1、二维码的动态获取和绘制(包括如何生成小程序二维码、公众号二维码、打开网页二维码)2、背景图如何绘制,获取图片信息3、将绘制完成的图片保存到本地相册4、处理用户是否取消授权保存到相册 三、实现步骤这里我具体写下围绕上面所提出的问题,描述大概实现的过程 ①首先创建canvas画布,我把画布定位设成负的,是为了不让它显示在页面上,是因为我尝试把canvas通过判断条件动态的显示和隐藏,在绘制的时候会出现问题,所以采用了这种方法,这里还有一定要设置画布的大小。 <canvas canvas-id="myCanvas" style="width: 690px;height:1085px;position: fixed;top: -10000px;"></canvas>②创建好画布之后,先绘制背景图,因为背景图我是放在本地,所以获取 <canvas> 组件 canvas-id 属性,通过createCanvasContext创建canvas的绘图上下文 CanvasContext 对象。使用drawImage绘制图像到画布,第一个参数是图片的本地地址,后面两个参数是图像相对画布左上角位置的x轴和y轴,最后两个参数是设置图像的宽高。 const ctx = wx.createCanvasContext('myCanvas')ctx.drawImage('/img/study/shareimg.png', 0, 0, 690, 1085)③创建好背景图后,在背景图上绘制头像,文字和数字。通过getImageInfo获取头像的信息,这里需要注意下在获取的网络图片要先配置download域名才能生效,具体在小程序后台设置里配置。 获取头像地址,首先量取头像在画布中的大小,和x轴Y轴的坐标,这里的result[0]是我用promise封装返回的一个图片地址 let headImg = new Promise(function (resolve) { wx.getImageInfo({ src: `${app.globalData.baseUrl2}${that.data.currentChildren.headImg}`, success: function (res) { resolve(res.path) }, fail: function (err) { console.log(err) wx.showToast({ title: '网络错误请重试', icon: 'loading' }) } }) }) let avatarurl_width = 60, //绘制的头像宽度 avatarurl_heigth = 60, //绘制的头像高度 avatarurl_x = 28, //绘制的头像在画布上的位置 avatarurl_y = 36; //绘制的头像在画布上的位置 ctx.save(); // 先保存状态 已便于画完圆再用 ctx.beginPath(); //开始绘制 //先画个圆 前两个参数确定了圆心 (x,y) 坐标 第三个参数是圆的半径 四参数是绘图方向 默认是false,即顺时针 ctx.arc(avatarurl_width / 2 + avatarurl_x, avatarurl_heigth / 2 + avatarurl_y, avatarurl_width / 2, 0, Math.PI * 2, false); ctx.clip(); //画了圆 再剪切 原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内 ctx.drawImage(result[0], avatarurl_x, avatarurl_y, avatarurl_width, avatarurl_heigth); // 推进去图片 这里举个例子说下如何绘制文字,比如我要绘制如下这个“字”,需要动态获取前面字数的总宽度,这样才能设置“字”的x轴坐标,这里我本来是想通过measureText来测量字体的宽度,但是在iOS端第一次获取的宽度值不对,关于这个问题,我还在微信开发者社区提了bug,所以我想用另一个方法来实现,就是先获取正常情况下一个字的宽度值,然后乘以总字数就获得了总宽度,亲试是可以的。 ...

May 6, 2019 · 6 min · jiezi

封装uniapp的需要token的请求

config.js const app = { apiUrl: 'http://216:18080/webcase/', //请求的地址 baseRequest(obj) { try { const userToken = uni.getStorageSync('userToken'); if (userToken) { if (obj.header) { obj.header["token"] = userToken; } else { obj.header = { "token": userToken }; } obj.url = this.apiUrl + obj.url; uni.request(obj) } else{ console.log("获取不到userToken") } } catch (e) { console.log(e) console.log("获取不到userToken") } },}export default app;需要使用的页面 import app from "@/api/apiConfig" getUserStatus() { app.baseRequest({ url: 'getUserStatus', method: 'POST', success: (res) => { // 用户状态存到缓存中去 try{ uni.setStorageSync('userStatus', res.data.data.type) uni.setStorageSync('userAgentInfo',res.data.data) }catch(e){ //TODO handle the exception } if(res.data.data.type == 2) { this.getLawInfo() } else { this.yhju= false } } }) }

May 6, 2019 · 1 min · jiezi

手机H5弹出软键盘后隐藏软键盘下方留白解决基于uniapp

解决思路:当焦点失焦的时候,页面回到顶部 <input type="number" v-model="lawLicense" value="" placeholder="律师执业证号" @blur="gobackTop()" /> gobackTop() { uni.pageScrollTo({ scrollTop: 0 }); }这个是uni-app的写法如果是单纯用vue的话就是 gobackTop() { window.scrolll(0, 0);}

May 6, 2019 · 1 min · jiezi

前端面试必问题答疑2

一,css部分1,简单介绍下css权重优先级: 默认样式<标签选择器<类选择器<id选择器<行内样式<!important 0 1 10 100 1000 1000以上 继承的权重为0 (字体的css会继承自父类标签元素) 权重会叠加 (div.box 权重:1+10=11) (div #box 权重:1+100=101) 相同权重的选择器,后边的代码会覆盖前面的 2,实现一个不知道宽高的盒子水平垂直居中,有哪几种实现方式: a) 使用CSS方法: 父盒子设置:display:table-cell;text-align:center;vertical-align:middle; 子盒子设置:display:inline-block;vertical-align:middle; 代码实现:=> .father{ width:300px; height:300px; display:table-cell; text-align:center; vertical-align:center; } .son{ background:red; display:inline-block; vertical-align:middle; } b) 使用CSS3 transform: 父盒子设置:position:relative; 子盒子设置:position:absolute;left:50%;top:50%;transform:transform(-50%,-50%); 代码实现:=> .father{ width:300px; height:300px; position:relative; } .son{ background:red; position:absolute; top:50%; left:50%; transform:transform(-50%,-50%); } c) 弹性盒子: 父盒子设置:display:flex;justify-content:center;align-item:center; 子盒子设置:空,不需要设置 代码实现:=> .father{ width:300px; height:300px; display:flex; justify-content:center; align-item:center; } .son{ background:red; } [参考]([https://zhuanlan.zhihu.com/p/27186791][1]) 3,如何用css画一个三角形: 代码实现:=> #eg{ width: 0; height: 0; border: 100px solid transparent; border-bottom: 100px solid blue; }二,JS部分:1,请写一段代码将"2019-4-28"转成"2019年4月28日" 代码实现:=> let str = '2019-4-28'; let year = str.split('-')[0]; let month = str.split('-')[1]; let date = str.split('-')[2]; let str1 =year+"年"+month+"月"+date+"日"; console.log(str1); 2,写一段代码将数组 ['a','b','c'] , 变成 ['c','b','a'] 。(可使用js自带方法,也可以自己实现) 代码实现:=> var arr=['a','b','c']; //var arr1=arr.sort();//正序 var arr1=arr.reverse();//反序 console.log(arr1); 三,Vue部分:1,vue的生命周期钩子函数有哪些? answer:=> beforeCreate created beforeMount mounted beforeUpdate updated activated deactivated beforeDestroy destroyed [详细]([https://www.cnblogs.com/xkloveme/p/7435271.html][2]) 2,什么是keep-alive?它有什么作用?与他对应的钩子函数是那些? answer:=> 是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM。 对应的钩子函数: activated 类型:func 触发时机:keep-alive组件激活时使用; deactivated 类型:func 触发时机:keep-alive组件停用时调用; 3,vue的事件修饰符是什么,她能做什么事?举个栗子:在vue的click事件中,如何阻止事件传播? answer:=> 事件修饰符处理了许多DOM事件的细节,让我们不再需要花大量的时间去处理这些烦恼的事情, 而能有更多的精力专注于程序的逻辑处理。在Vue中事件修饰符主要有: .stop:等同于JavaScript中的event.stopPropagation(),防止事件冒泡 .prevent:等同于JavaScript中的event.preventDefault(),防止执行预设的行为 (如果事件可取消,则取消该事件,而不停止事件的进一步传播) .capture:与事件冒泡的方向相反,事件捕获由外到内 .self:只会触发自己范围内的事件,不包含子元素 .once:只会触发一次 举个栗子:=> .stop 防止事件冒泡 冒泡事件:嵌套两三层父子关系,然后所有都有点击事件,点击子节点,就会触发从内至外 子节点-父节点的点击事件 4,什么是vue router路由导航守卫?工作中用过她吗?常用她处理什么问题? 导航守卫即是在路由跳转的时候,根据vue-router提供的导航守卫主要用来通过跳转或取消参数 或查询的改变并不会出触发进入/离开的导航守卫 路由跳转前做一些验证,比如登录验证,是网站中的普遍需求。 对此,vue-route 提供的 beforeRouteUpdate 可以方便地实现导航守卫(navigation-guards)。 5,从路由/user跳转到/home,有几种方式? 1.router-link 2.this.$router.push() (函数里面调用) 3.this.$router.replace() (用法同上,push) 4.this.$router.go(n) () [详细介绍]([https://blog.csdn.net/jiandan1127/article/details/86170336][3]) 6,什么是vuex?他有什么作用?如何改变store中的状态(state)? answer:=> vuex是一个专为vue.js应用程序开发的状态管理模式。vuex解决了组件之间同一状态的共享问题。 当我们的应用遇到多个组件之间的共享问题时会需要 状态管理核心状态管理有5个核心,分别是state、getter、mutation、action以及module。 1.state state为单一状态树,在state中需要定义我们所需要管理的数组、对象、字符串等等,只有在这里定义了, 在vue.js的组件中才能获取你定义的这个对象的状态。 2.简单的 store 模式 var store = { debug: true, state: { message: 'Hello!' }, setMessageAction (newValue) { if (this.debug) console.log('setMessageAction triggered with', newValue) this.state.message = newValue }, clearMessageAction () { if (this.debug) console.log('clearMessageAction triggered') this.state.message = '' } } 所有 store 中 state 的改变,都放置在 store 自身的 action 中去管理。 这种集中式状态管理能够被更容易地理解哪种类型的 mutation 将会发生,以及它们是如何被触发。 当错误出现时,我们现在也会有一个 log 记录 bug 之前发生了什么。 此外,每个实例/组件仍然可以拥有和管理自己的私有状态: var vmA = new Vue({ data: { privateState: {}, sharedState: store.state } }) var vmB = new Vue({ data: { privateState: {}, sharedState: store.state } }) End!

May 6, 2019 · 2 min · jiezi

走进前端开发框架的演变

对于大多数前端框架,我想聊一聊,这些前端框架从何而来,解决了什么问题,又有哪些高明之处。 认识了解问题,切忌一头扎进去研究而未了解其全貌。为此,我们追溯到20世纪90年代,网景浏览器横空出世,占据了浏览器市场第一的份额。那时的网景浏览器已经搭载了 Cookie、 Frames 和 JavaScript 等功能,可惜好景不长,再后来与微软的“浏览器大战”中败下了阵来。 于是网景公司将代码开源,创造了 Mozilla ,也就是现在的 Firefox。可以说,浏览器大战从未停止过,Opera 、 Safari 、 Google Chrome …… 当然,还有微软的 Internet Explorer 以及一些其他的浏览器。各浏览器引擎不同,标准不一,苦了的就是我们的主角:前端开发。 排版引擎所有这些浏览器,使用最广泛的无非是这些引擎: Gecko 、 WebKit 和 Trident 。最早的 Netscape 使用的是 Gecko 排版引擎,后来的 Firefox 继承了它的衣钵。微软从 Spyglass 公司买来技术开发了 Internet Explorer , 使用了 Trident 引擎。苹果开发了 WebKit ,做出了 Safari 浏览器,后来引擎开源, Google 做出了基于 WebKit 的 Chrome 。 有人会说,那 QQ浏览器、360浏览器、世界之窗、搜狗浏览器之类的,这些浏览器只是套了 Chrome 或 IE 的内核罢了。 而和前端程序员打交道的,最终就是这三样东西: HTML 、 CSS 、 JavaScript 。 JavaScriptHTML 负责描述界面的元素结构, CSS 负责描述界面的样式表现, JavaScript 负责界面元素的交互和与后台数据的交互。早期的静态网页,甚至不需要 JavaScript ,因为不需要太多的交互。即使用到 JavaScript ,最多也是用于表单验证、弹弹提示框。 ...

May 5, 2019 · 2 min · jiezi

重学前端学习笔记七JavaScript对象面向对象还是基于对象

笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com。1、学习JavaScript面向对象时是否有这样的疑惑?为什么 JavaScript(直到 ES6)有对象的概念,但是却没有像其他的语言那样,有类的概念呢?为什么在 JavaScript 对象里可以自由添加属性,而其他的语言却不能呢?2、什么是面向对象?2.1、JavaScript 对象的特征2.1.1、对象的特征(来自《面向对象分析与设计》一书)对象具有唯一标识性:即使完全相同的两个对象,也并非同一个对象。对象有状态:对象具有状态,同一对象可能处于不同状态之下。对象具有行为:即对象的状态,可能因为它的行为产生变迁。关于第一点: var a1 = { a: 1 };var a2 = { a: 1 };console.log(a1 == a2); // false关于第二、三点: c++中称"状态和行为"为成员变量和成员函数java中则称它们为属性和方法javaScript中将状态和行为统一抽象为属性winter举了个例子,代码如下: var o = { d: 1, f() { console.log(this.d); }};上面代码中,o是对象,d是一个属性,而函数f也是一个属性,只是写法不一样,总结来说,在JavaScript中,对象的状态和行为其实都被抽象为了属性。 2.1.2、JavaScript 中对象独有的特色对象具有高度的动态性,这是因为 JavaScript 赋予了使用者在运行时为对象添改状态和行为的能力。举例说明运行时如何向一个对象添加属性: var o = { a: 1 };o.b = 2;console.log(o.a, o.b); //1 2为了提高抽象能力,JavaScript的属性被设计成比别的语言更加复杂的形式,它提供了数据属性和访问器属性(getter/setter)两类。 2.2、JavaScript 对象的两类属性2.2.1、数据属性4个特征: value:就是属性的值.writable:决定属性能否被赋值.enumerable:决定 for in 能否枚举该属性.configurable:决定该属性能否被删除或者改变特征值.2.2.2、访问器(getter/setter)属性2.2.2.1、4个特征: getter:函数或 undefined,在取属性值时被调用.setter:函数或 undefined,在设置属性值时被调用.enumerable:决定 for in 能否枚举该属性.configurable:决定该属性能否被删除或者改变特征值.2.2.2.2、Object.getOwnPropertyDescripter 和 Object.defineProperty() var o, d;o = { get foo() { return 17; } };d = Object.getOwnPropertyDescriptor(o, "foo");// d {// configurable: true,// enumerable: true,// get: /*the getter function*/,// set: undefined// }o = { bar: 42 };d = Object.getOwnPropertyDescriptor(o, "bar");// d {// configurable: true,// enumerable: true,// value: 42,// writable: true// }o = {};Object.defineProperty(o, "baz", { value: 8675309, writable: false, enumerable: false});d = Object.getOwnPropertyDescriptor(o, "baz");// d {// value: 8675309,// writable: false,// enumerable: false,// configurable: false// }实际上 JavaScript 对象的运行时是一个“属性的集合”,属性以字符串或者 Symbol 为 key,以数据属性特征值或者访问器属性特征值为 value。 ...

May 5, 2019 · 1 min · jiezi

CSS布局基础三栏布局

前言大家总是听到双飞翼布局和圣杯布局...也不知道是谁取的名字,我就叫三栏布局吧。虽然他们有些细微的区别,但本质上都是实现一个三栏布局,即左右两栏固定,中间自适应。 实现方案网上随便一搜,全是实现方案,少到两三种,多到七八种。各种方法都有优缺点,但我觉得比较实用的方法主要就那三四种,因为很多方法其实是被淘汰的或者说太麻烦(如表格布局)。 浮动方案绝对定位方案flex布局方案网格布局(本章不讲)方案一:浮动方案实现思路:先将左右两栏进行浮动,左边栏向左浮动,右边栏向右浮动就能固定在两边。但是要注意一点,这种方法要将中间栏放在最后,因为如果将中间栏放在中间,并且没有对自身进行浮动的话,会占据文档中的位置,导致右边栏并不能完全和左边栏平齐。 HTML: <!-- 三栏布局 浮动定位--> <div class="layout"> <header>头部</header> <main> <div class="left">左边栏</div> <div class="right">右边栏</div> <div class="center">中间栏</div> </main> <footer>底部</footer> </div> <!-- 三栏布局 浮动定位-->SCSS: //浮动布局.layout { color:white; text-align: center; height: 100%; overflow: hidden; header,footer{ width: 100%; height: 70px; background: rgb(202,132,2); } footer { position: absolute; bottom: 0; } main { width: 100%; height: 100%; background: red; .left,.right { width: 300px; height: 100%; background: rgb(14, 214, 171); } .left { float:left; } .right{ float:right; } .center { height:100%; background: rgb(26, 26, 122); } } }效果: ...

May 5, 2019 · 2 min · jiezi

HTML基础复习语义化

HTML语义化概念官方解释:语义化是指用合理的HTML标记以及其特有的属性去格式化文档内容。通俗地讲,语义化就是对数据和信息进行处理,使得机器可以理解。 我的理解:在我的理解中语义化就是让我们写的每一行代码都有其意义,不仅仅是程序实现和功能上而言,还必须能被人和机器很好的理解。简单的说就是你写的代码应该是两全其美的,既要让人读懂也要让机器读懂。在HTML中就是告诉大家,每一个标签都是有它独特的意义的和应用场景的,而不是随便想用就用,想用什么替换就用什么替换。 我认为最好的理解就是将office中的Word与其对比。Word中从头部页眉、标题、正文再到页脚都有单独的样式和设置,所以HTML也大同小异,就是为了将网页内容通过这些设置来呈现出来。包括我现在写的文章是用Markdown来完成的,也是语义化的体现。 我将HTML的语义化分为两部分,一个是结构语义化,一个是标签语义化,虽然这样分会有点问题,但更有利于理解。 结构语义化先从网页的整个结构来说,最早的网页就是来展现最基础的新闻、文章之类的,只是现在的网页设计更厉害了,在样式上看着更加炫酷和多样化,但本质上都是从最基本的结构做起的。可以先看看世界上最早的网页是什么样子: 一般来说我们网页的结构大致上可以从下面这个图来理解(当然布局是可以改变的): 代码展现: <body> <!-- 头部 --> <header></header> <!-- 头部 --> <!-- 导航 --> <nav></nav> <!-- 导航 --> <!-- 主体内容 --> <main> <!-- 正文内容 --> <article> <!-- 章节 --> <section> <p></p> </section> <!-- 章节 --> </article> <!-- 正文内容 --> <!-- 正文之外内容 --> <aside></aside> <!-- 正文之外内容 --> </main> <!-- 主体内容 --> <!-- 底部 --> <footer></footer> <!-- 底部 --></body>标签语义化结构语义化不也就是将标签语义化吗?是的,但是单独拉出来说是因为除了整个网页结构,其他更多的细节我们需要注意语义化。举个例子,下面是腾讯某新闻版块的网页: 现在我们去掉其所有样式后是这样的: 再看看它的源代码: 不难发现,在我们将其网页的所有样式都去掉之后,还是能清晰地读完整篇文章,并且是层次分明的。这就是为什么要将标签语义化。可以看到文章的标题用到了<h1>标签,全文就这一个大标题。然后整篇文章用<p>标签将文段分开,没有用<div>,因为<p>就代表一个段落,而<div>什么都不代表。强调的部分用了<strong>标签。大家知道CSS中的font-wight也可以加粗文字,HTML的<b>标签也可以加粗文字,但是腾讯都没有使用。因为CSS在没有样式的时候就不管用了,<b>标签没有强调的意思,而<strong>的语义更明显。 ...

May 5, 2019 · 1 min · jiezi

第三集-从零开始实现一套pc端vue的ui组件库button组件其一

第三集: 从零开始实现(button组件1)本集定位: 为什么要叫1那, 因为我感觉这个组件细节比较多, 应该会讲很多内容, 所以先把基础功能在这一集实现, 下集去做拓展.button组件 这是一个基本上每个工程都会用到的组件, 传统的button千篇一律的样式, 仿佛按钮不做的一样就没法用似的, 我偏要加一些别人没加过的样式来玩, 做过项目的小伙伴都会遇到一个问题, 防抖与节流, 而这么主要的功能竟然没有ui组件库的按钮来集成, 这次我就把这两个功能集成到按钮式搞一搞, ????开始行动吧.创建组件基本结构 继续秉承bem的思想, button总体结构如下: index.js文件 还是老套路, 组件的name属性很重要. import Button from './main/button.vue'Button.install = function(Vue) { Vue.component(Button.name, Button);};export default Buttonbutton.vue <template> <button class="cc-button"> <slot /> </button></template>载体选用button原生标签, 不选择div标签去模拟, 因为button本身有很多原生属性, 而且语义化也要好过div. slot标签当然是为了接到用户在button中间输入的信息. 按钮第一条, 当然是先分个类型开开胃 <template> <button class="cc-button" :class="[ type ? 'cc-button--' + type : '' ]" :type="nativeType" <slot /> </button></template><script>export default { name: "ccButton", props: { type: String, // 类型 nativeType: String, // 原生的类型还是要给的 }};</script>1: vue的class属性很强大的, 他可以数组的形式, 字符串的形式, 对象的形式, 而我采用的是 数组套一切的形式, 接下来对象类型也会在这个class数组里面使用.2: 原生的type也要接受, 因为用户会有这样的需求的, 我把它命名为nativeType,跟element一样.3: 定义几种相应的type样式, 这个type属性没做校验, 因为就算用户不按照我给出的范围传值, 无非就是样式没变化, 没有其他影响的, 接下来就是定义按钮的type样式了. ...

May 4, 2019 · 3 min · jiezi

UI组件-来做一个可配置的滑块进度条吧

在一些需要用户填写资料的业务场景中,有时会让用户选择某个业务的范围,这时就需要用到滑块进度条。然后你们最爱的产品经理会说,给我整一个颜色可控,滑块按钮可大可小,滑块边框也要可大可小的滑动条来.. emmm,一看这样的设计需求就意味着小程序原生的slider组件就不能用了。因为这玩意在样式上就不能自由的配置,只好来手动实现一个。 结构设计 行吧,那说干就干。首先滑动条可以从俯视图角度来看,分为三层。分别是底部滑轨区域,进度条区域以及供用户操作的滑块本身。 在结构设计中,可以将底部滑轨区域,进度条区域分为一块,这样进度条区域可以根据随着滑动条的高度变化而变化, 宽度则由js控制。除此之外还需要暴露一些参数给外部,让它自己定义长粗宽。 Component({ /** * 组件的属性列表 */ properties: { // 滑块大小 blockSize: { type: Number, value: 32, }, // 滑块宽度 blockBorderWidth: { type: Number, value: 3 }, // 滑轨高度 height: { type: Number, value: 2 }, // 滑轨进度 step: { type: Number, value: 0, }, // 进度值小数位 digits: { type: Number, value: 0, }, },});<view id="slider-wrap" class="slider-wrap"> <view class="silder-bg" style="height: {{height}}rpx;"> <view class="silder-bg-inner"></view> </view> <view class="silder-block" style="height: {{blockSize}}rpx; border-width: {{blockBorderWidth}}rpx;" ></view></view>.slider-wrap { position: relative; display: flex; align-items: center; width: 100%;}.silder-bg,.silder-bg-inner,.silder-block { position: absolute; left: 0;}.silder-bg,.silder-bg-inner { width: 100%; height: 2rpx; flex: 1;}.silder-bg { overflow: hidden; background-color: #eeeeee; border-radius: 8rpx; z-index: 0;}.silder-bg-inner { height: 100%; background-color: #66a6ff; /* border-radius: 8rpx; */ z-index: 1; border-bottom-left-radius: 8rpx; border-top-left-radius: 8rpx;}.silder-block { width: 32rpx; height: 32rpx; background-color: #ffffff; border: solid 3rpx #66a6ff; z-index: 2; border-radius: 50%; box-sizing: border-box;}点击行为事件滑块进度条的滑块是一个听话的小朋友,就是说我们叫它去哪它就听话的过去。所以就不要抓它去煲汤了~在组件外部容器中绑定一个点击事件,我们必须得要知道用户点击位置,在bind:tap事件中取到clientX属性。除此之外还需要取到进度条的位置信息。 ...

May 4, 2019 · 4 min · jiezi

重学-html-の-标签语义化

HTML语义化是指仅仅从 HTML 元素上就能看出页面的大致结构。我们比较习惯使用 div、span 来垒页面,视觉上没啥问题,文字既内容,html 标签只被 css 样式所用,单从 html 结构上很难看出意图。语义标签则是纯文字的补充,比如标题,自然段、章节、列表等我们使用相应的 html 标签会更好些。 语义化的好处对开发者友好---开发者可根据html标签大概了解页面结构对搜索引擎友好---seo 排名更靠前对无障碍设备友好---盲人软件读屏标签列举结构类article、section、nav、aside、footer、header 、ul、li 等该类标签大家掌握理解的应该都不错,按照字面理解即可。 表述类abbr 缩写<abbr title="World Wide Web">WWW</abbr>blockquote、q、citeblockquote 表示整段话的引用、q 表示一行文字的引用、cite表示引述作品名 figure、figcaption两个标签结合使用,来定义图文。 <figure> <figcaption>黄浦江上的的卢浦大桥</figcaption> <img src="shanghai_lupu_bridge.jpg" width="350" height="234" /></figure>pre、codepre 元素可定义预格式化的文本。被包围在 pre 元素中的文本通常会保留空格和换行符。code 在语义上表达是段代码。和 span 没有太大的区别。 使用原则用对比不用好,不用比用错好。

May 3, 2019 · 1 min · jiezi

重学-html-の-link标签

link元素规定了外部资源与当前文档的关系。常用于链接样式表,创建网站图标,预加载资源等。 链接样式表 <link href="main.css" rel="stylesheet"> 创建站点图标<link rel="icon" type="image/png" href="myicon.png"> 预加载用于前端界面性能优化,rel 的属性值可以为preload、prefetch、dns-prefetch。 <link rel="preload" href="style.css" as="style"><link rel="prefetch" href="/uploads/images/pic.png"><link rel="dns-prefetch" href="//fonts.googleapis.com"> prefetch 预获取用户在使用当前界面时,浏览器空闲时先把下个界面要使用的资源下载到本地缓存。浏览器下不下载不可知。举个例子: 网站有A,B 两个界面。当用户访问界面 A 时有很大的概率会访问 B 界面(比如登录跳转)那么我们可以在用户访问界面 A 的时候,提前将 B 界面需要的某些资源下载到本地,性能会得到很大的提升。那么我们只需要在界面 A.html 文件中设置如下代码: <link rel="prefetch" href="/uploads/images/pic.png"> preload 控制当前界面的资源下载优先级,浏览器必须下载资源。举个例子: 网站的一个界面 A的 css 样式文件中使用了外部字体文件,正常情况下该字体的下载是在 css 解析的时候完成的。想想字体文件好像在 css 样式文件解析之前下载到本地比较好。那么我们就可以在head标签设置字体的 preload。 <link rel="preload" href="https://example.com/fonts/font.woff" as="font"> dns-prefetch按照字面理解即可,先把要跳转的域名解析,减少时间。 prefetch & preload 对比关注的页面不同: prefetch 关注要使用的页面,preload 关注当前页面资源是否下载:prefetch 的资源下载情况未知(只在浏览器空闲时会下载),preload 肯定下载 media 属性media 属性规定被链接文档将显示在什么设备上。 <head><link rel="stylesheet" type="text/css" href="theme.css" /><link rel="stylesheet" type="text/css" href="print.css" media="print"/></head>注意: 当界面加载时,两个样式表都会下载到客户端,只是会根据场景不同使用不同的样式。 TODOscript 标签的 async 和 defer 属性的区别和目的? 引用preload & prefetch一步前端

May 2, 2019 · 1 min · jiezi

将数字用中文读取出来

数字转换成中文针对财务数据将金额数据转换成大写,在网上有很多例子,总感觉有更简单的方式实现,下面是具体的源码和探究。如果疑问,或更好的建议欢迎留言,共同学习。 源码class NumToZh_cn { numLevel = [ "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿" ] currencyUnit = [ '角', '分' ] numMapToCh = { '0': '零', '1': '壹', '2': '贰', '3': '叁', '4': '肆', '5': '伍', '6': '陆', '7': '柒', '8': '捌', '9': '玖', '0': '零', '1': '壹', '2': '贰', '3': '叁', '4': '肆', '5': '伍', '6': '陆', '7': '柒', '8': '捌', '9': '玖', } _dataIntHandle( arr ){ return arr.map( ( item, index ) => { const unit = this.numLevel[ arr.length - index - 1 ]; return item === '0' ? ( unit === '万' || unit === '亿' ) ? unit : '零' : this.numMapToCh[ item ] + unit; }).join('').replace(/零+/g, '零' ).replace(/零$/,'') + '元'; } _dataDeciHandle( arr ){ return arr.map( ( item, index ) => item === '0' ? '' : this.numMapToCh[ item ] + this.currencyUnit[ index ] ).join(''); } convert( numStr ){ numStr = '' + numStr; if( !/^\d+(\.\d+)?$/.test( numStr.trim() ) ) throw 'param is not number'; const [ x='', y='' ] = numStr.split('.'); return this._dataIntHandle( x.split('') ) + this._dataDeciHandle( y.split('') ) + '整'; }}const numToZh_cn = new NumToZh_cn();export { NumToZh_cn}源码说明通过 num 与中文的映射实现,避免了传统的循环遍历的实现方式。目前支持持17位数,如果更大的数据可进行修正。 ...

May 2, 2019 · 1 min · jiezi

我从-fabricjs-中学到了什么

前言熟悉 canvas 的朋友想必都使用或者听说过 Fabric.js,Fabric 算是一个元老级的 canvas 库了,从第一个版本发布到现在,已经有 8 年时间了。我近一年时间也在项目中使用,作为用户简单说说感受: 方便,只有想不到,没有做不到源码写的真好,代码规范,注释清晰社区真匮乏,国内资源尤其少看文档不如看源码优缺点都很鲜明,但总的来说,如果你要做一个在线编辑类的项目,比如在线 PPT,在线制图等应用,fabric 绝对是个很好的选择。 那么这一系列文章要写什么?这里不会主要介绍如何使用 fabric,主要写的内容是把在阅读源码过程中,把涉及到原理相关的知识总结出来,比如相关图形学知识、canvas 相关、fabric 中的设计思想等的相关知识。所以,如果你现在还对 fabric 不是很了解,建议先去官网找几个 demo 试一下。 下面我们进入这次的正题,这篇文章主要介绍 fabric.canvas 涉及到的部分内容。 从创建画布开始fabric 创建画布很简单: const canvas = new fabric.Canvas("domId", options);在这样一行代码背后,fabric 主要做了下面这几件事情: 创建缓存 canvas构建两层 canvas 元素:lower-canvas 和 upper-canvas绑定事件处理 retina 屏...下面我把相关内容一一阐述。 canvas 缓存介绍 canvas 缓存,fabric 中的缓存也是类似的道理,简单来说,_就是使用一个离屏 canvas 来做预渲染,在真实画布上用 drawImage 代替直接绘制图形_。 我们先来看个 例子,大家可以把 FPS meter 打开,切换按钮可以看到,不使用缓存和使用缓存 FPS 值差距还是挺大的,我电脑在使用缓存的时候基本在 60fps,不使用会降到 15fps 左右。大家可以打开控制台或者在 这里 查看代码。下面列出主要的代码片段: class Ball { constructor(x, y, vx, vy, useCache = true) { // ... if (useCache) { this.useCache = useCache; this.cacheCanvas = document.createElement("canvas"); // 离屏 canvas 宽高取要渲染图形的宽高,不可以取真实 canvas 的宽高,否则会渲染大量无用区域 this.cacheCanvas.width = 2 * (this.r + BORDER_WIDTH); this.cacheCanvas.height = 2 * (this.r + BORDER_WIDTH); this.cacheCtx = this.cacheCanvas.getContext("2d"); this.cache(); } } paint() { // 使用缓存直接使用创建的离屏canvas,否则直接绘制图形 if (!this.useCache) { ctx.save(); ctx.lineWidth = BORDER_WIDTH; ctx.beginPath(); ctx.strokeStyle = this.color; ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI); ctx.stroke(); ctx.restore(); } else { ctx.drawImage( this.cacheCanvas, this.x - this.r, this.y - this.r, this.cacheCanvas.width, this.cacheCanvas.height ); } } move() { // ... } cache() { // 绘制图形 this.cacheCtx.save(); this.cacheCtx.lineWidth = BORDER_WIDTH; this.cacheCtx.beginPath(); this.cacheCtx.strokeStyle = this.color; this.cacheCtx.arc( this.r + BORDER_WIDTH, this.r + BORDER_WIDTH, this.r, 0, 2 * Math.PI ); this.cacheCtx.stroke(); this.cacheCtx.restore(); }}解释一下二者区别: ...

May 2, 2019 · 3 min · jiezi

重学-html-の-meta-标签

meta简介网页元数据,常用于定义网页的编码、说明、关键字、修改日期及其他信息。这些数据服务于浏览器、搜索引擎等。 meta 标签的2个属性name, http-equiv。 <meta name="参数" content="具体的描述">。 name 属性<!-- SEO 搜索引擎优化 --><meta name="keywords" content="关键词"><meta name="description" content="页面介绍"><!-- 移动设备Viewport --><meta name="viewport" content="initial-scale=1"><!-- 关闭iOS电话号码自动识别 --><meta name="format-detection" content="telphone=no"><!-- 360浏览器指定内核 --><meta name="renderer" content="webkit"> http-equiv 属性http-equiv 模拟 http 服务器响应头。 X-UA-Compatible用于告知浏览器以何种版本来渲染页面。(一般都设置为最新模式,在各大框架中这个设置也很常见。) <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> / cache-control控制缓存。 <meta http-equiv="cache-control" content="no-cache">共有以下几种用法:no-cache: 协商缓存。先发送请求,与服务器确认该资源是否被更改,如果未被更改,则使用缓存。no-store: 不允许缓存,每次都要去服务器上,下载完整的响应。public : 缓存所有响应,但并非必须。private : 只为单个用户缓存,因此不允许任何中继进行缓存。(比如说CDN就不允许缓存private的响应)maxage : 表示当前请求开始,该响应在多久内能被缓存和重用,而不去服务器重新请求。例如:max-age=60表示响应可以再缓存和重用 60 秒。 指定编码<meta charset="UTF-8">插播: doctype用于指定文档标准和版本,浏览器根据该值采用哪种渲染模式。一步前端

May 1, 2019 · 1 min · jiezi

MUI在项目中使用时遇到的问题的个人总结

picker 添加年插件问题总结 取消按钮点击事件无法获取可以获取到取消按钮标签和确定按钮标签 但是只能获取去顶按钮事件,取消点击事件无法获取 通过判断picker的display状态也不能确认此事件 lable标签无法绑定事件这时需要添加一个单独全选按钮时 可以在herder内添加一个按钮 调用同一picker会保存一部分数据不清除可以在picker.dispose()结束时判断第一个picker是否已经调用, 如果第一个picker调用了 判断函数内重新生成新的picker , 存储新的数据 ,这时就可以 最后清除这个picker 4.setData后 在show()调用前重新赋值添加新的元素只能添加值 没有对应的html片段 可以在setData前把data存储到一个变量内 进行修改后再传入setData5.单页时由于下拉刷新只能在页面内使用一次 再次使用会造成冲突 两者均不可用 只在首页面使用 或者像mui库示例一样 跳转到新页面 双webview6.picker蒙层点击禁止事件无法绑定 可以获取到此蒙层点击事件,但是无法阻止默认事件可通过点击后删除此蒙层,再次调出此picker display = block生成一个自定义蒙层 判断点击事件是否在蒙层上 添加私有class生成前先判断是否有此class蒙层 有则先移除removeChild减少在页面新生的元素 每当点击到蒙层就先删除原私有蒙层再创建新私有蒙层 以此模拟禁止蒙层点击事件7.模拟禁止蒙层会同时影响其他蒙层效果 如折叠框蒙层 重新给折叠框蒙层添加事件 先判断其display 值 none 或者 null;首次点击可能已经被模拟禁止清除 此时为空值剩下的根据display状态修改即可8.360浏览器兼容模式模拟IE浏览时JQ的AJAX请求GET类型不能正常执行,使用POST请求。 9.IE EDGE下Iframe标签渲染问题可以使用META调整至IE低版本渲染模式。 10.mui返回按钮不支持通过window.open打开的页面 可以使用window.location.href打开新页面,能够直接使用。 11.onbeforeunload事件,除IE完全支持至修改返回内容外 ,其余浏览器均不支持。查到相关内容大致原因如下: 此机制避免某些开发者通过监听此事件,阻止用户离开页面,做些不一道德的事情。仅对想要在用户关闭页面时还执行各种操作阻止用户关闭操作的PM表示,咳咳咳。。。 mui返回按钮返回mui可滑动单页面套用时需要严格按照demo模板静态HTML层进行修改 不需要的内容可以通过z-index覆盖隐藏。mui遮罩在手机端容易出现不能正常显示的问题,使用原生js和html生成遮罩效果。JS拼接HTML片段时 闭合标签需要不换行拼接,或者换行使用转义符进行拼接。对页面功能进行调整后,功能函数耦合度要同时尽可能降低耦合度,减少页面功能修改时其他受影响函数的修改。

April 30, 2019 · 1 min · jiezi

UTF8UTF16-和-Unicode-有什么联系

UTF-8、UTF-16 和 Unicode 有什么联系起源在计算机发明之初,由于计算机只能存储二进制的数据,美国人民为了交流通信方便,约定了一个编码规范,也就是 ASCII(American Standard Code for Information Interchange:美国信息交换标准代码); ASCII 是基于拉丁字母的一套电脑编码系统,是单字节编码,主要用于显示现代英语和其他西欧语言。它使用 7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符。随着计算机传到了欧洲,发现很多符号(法语,德语等)没办法用 ASCII 表示,于是欧洲人自己也撸了一套编码,也就是 ISO/IEC 8859-1。 ISO/IEC 8859-1 也是单字节编码,并且向下兼容 ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。和ASCII的区别体现在:ASCII是一个7位的容器,ISO-8859-1是一个8位的容器。再后来,计算机就传入了中国,中国汉字少说就有几万,常用的就有几千个了。如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。于是乎,我们就撸出了一套GBK,并向下兼容ASCII。 GBK 全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification),采用双字节编码,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。这时国际组织看不下去了,要是这样下去每个地区都出一套自己的编码,那还得了。于是乎撸了一套把大家的编码都归纳进去的编码,也就是 unicode编码。 Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode 只是一种字符码表, 而在计算机中进行存储时,必须指定一种具体的存储方式。常见的如utf8, utf16, utf32等。UTF—8UTF—8(8-bit Unicode Transformation Format),以8位无符号整数为单位对Unicode进行编码。 UTF-8 的特点是对不同范围的字符使用不同长度的编码,是一种变长编码,对于一个Unicode的字符被编码成1至4个字节。对于0x00-0x7F之间的字符,UTF-8 编码与 ASCII 编码完全相同。 UTF-8编码的最大长度是4个字节,即可以容纳21位二进制数字。而 Unicode 的最大码位0x10FFFF也只有21位。 UnicodeUTF-8U+0000 – U+007F0xxxxxxxU+0080 – U+07FF110xxxxx 10xxxxxxU+0800 – U+FFFF1110xxxx 10xxxxxx 10xxxxxxU+10000 – U+10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx一个字节的uft8表示的unicode 码范围为(0 ~0x7F)两个字节长度的uft8 表示的unicode码范围为(0x80 ~ 0x07FF) ...

April 30, 2019 · 1 min · jiezi

在线使用iconfont字体图标

使用阿里巴巴矢量图标库在线使用案例三种使用方式介绍使用准备进入 阿里巴巴矢量图标库 ,登陆以后,搜索需要的图标,然后点击添加入库 进入“我的图标库”(右上角购物车),点击添加至项目 点击 + 图标创建一个新项目,然后把新图标加入到新项目中。(也可以按需添加到已有项目) 进入我的项目,即可看到如下界面 三种使用方式介绍unicode引用unicode是字体在网页端最原始的应用方式,特点是: 兼容性最好,支持ie6+,及所有现代浏览器。支持按字体的方式去动态调整图标大小,颜色等等。但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。注意:新版iconfont支持多色图标,这些多色图标在unicode模式下将不能使用,如果有需求建议使用symbol的引用方式unicode使用步骤如下: 拷贝项目下面生成的font-face@font-face {font-family: 'iconfont'; src: url('iconfont.eot'); src: url('iconfont.eot?#iefix') format('embedded-opentype'), url('iconfont.woff') format('woff'), url('iconfont.ttf') format('truetype'), url('iconfont.svg#iconfont') format('svg');}定义使用iconfont的样式.iconfont{ font-family:"iconfont" !important; font-size:16px;font-style:normal; -webkit-font-smoothing: antialiased; -webkit-text-stroke-width: 0.2px; -moz-osx-font-smoothing: grayscale;}挑选相应图标并获取字体编码,应用于页面<i class="iconfont">&#x33;</i>font-class引用font-class是unicode使用方式的一种变种,主要是解决unicode书写不直观,语意不明确的问题。 与unicode使用方式相比,具有如下特点: 兼容性良好,支持ie8+,及所有现代浏览器。相比于unicode语意明确,书写更直观。可以很容易分辨这个icon是什么。因为使用class来定义图标,所以当要替换图标时,只需要修改class里面的unicode引用。不过因为本质上还是使用的字体,所以多色图标还是不支持的。使用步骤如下: 拷贝项目下面生成的fontclass代码://at.alicdn.com/t/font_8d5l8fzk5b87iudi.css挑选相应图标并获取类名,应用于页面:<i class="iconfont icon-xxx"></i>symbol引用这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。这种用法其实是做了一个svg的集合,与上面两种相比具有如下特点: 支持多色图标了,不再受单色限制。通过一些技巧,支持像字体那样,通过font-size,color来调整样式。兼容性较差,支持 ie9+,及现代浏览器。浏览器渲染svg的性能一般,还不如png。使用步骤如下: 拷贝项目下面生成的symbol代码://at.alicdn.com/t/font_8d5l8fzk5b87iudi.js加入通用css代码(引入一次就行):<style type="text/css"> .icon { width: 1em; height: 1em; vertical-align: -0.15em; fill: currentColor; overflow: hidden; }</style>挑选相应图标并获取类名,应用于页面:<svg class="icon" aria-hidden="true"> <use xlink:href="#icon-xxx"></use></svg>在线使用点击生成代码 完整使用代码 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>iconfont使用</title> <!-- fontclass --> <link rel="stylesheet" type="text/css" href="http://at.alicdn.com/t/font_1170286_tfb5h7u1t9.css"> <style type="text/css"> /* unicode */ @font-face { font-family: 'iconfont'; /* project id 1170286 */ src: url('//at.alicdn.com/t/font_1170286_tfb5h7u1t9.eot'); src: url('//at.alicdn.com/t/font_1170286_tfb5h7u1t9.eot?#iefix') format('embedded-opentype'), url('//at.alicdn.com/t/font_1170286_tfb5h7u1t9.woff2') format('woff2'), url('//at.alicdn.com/t/font_1170286_tfb5h7u1t9.woff') format('woff'), url('//at.alicdn.com/t/font_1170286_tfb5h7u1t9.ttf') format('truetype'), url('//at.alicdn.com/t/font_1170286_tfb5h7u1t9.svg#iconfont') format('svg'); }/* unicode字体样式 */ .iconfont { font-family: "iconfont" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -webkit-text-stroke-width: 0.2px; -moz-osx-font-smoothing: grayscale; }/* symbol字体样式 */ .icon { width: 1em; height: 1em; vertical-align: -0.15em; fill: currentColor; overflow: hidden; } p { color: #fff; } p:last-child{ font-size: 2em; } </style> <!-- Symbol --> <script type="text/javascript" src="http://at.alicdn.com/t/font_1170286_tfb5h7u1t9.js"></script></head><body> <div style="width: 100%;text-align: center;background: #333;padding: 20px;"> <p><i class="iconfont">&#xe633;</i> Unicode</p> <p><i class="iconfont icon-fanhuidingbu"></i> Font class</p> <p> <svg class="icon" aria-hidden="true"> <use xlink:href="#icon-fanhuidingbu"></use> </svg> Symbol </p> </div></body></html>使用效果如下: ...

April 30, 2019 · 1 min · jiezi