前端技术日志-在生产环境中使用原生-JavaScript-模块

本期刊专注于 Web 前端前沿技术,收集的内容来自于国外各大前端技术周刊,这里把自己感兴趣的,并值得分享的内容做了整理。部分链接可能无法直接打开,你需要通过科学上网的方式来解决。 本期热文在生产环境中使用原生 JavaScript 模块归功于打包技术的发展,现在,你可以将生产代码部署为 ES2015 模块了——包括静态和动态导入,而且比目前的非模块方式能获得更好的性能。 https://philipwalton.com/arti... PHILIP WALTON Web Template Studio 2.0Web Template Studio 是来自微软的 Visual Studio Code 的一个扩展,可以从 VS Code 以“向导”式风格生成新的全栈应用程序。 支持 Angular,Vue 和 React。 https://blogs.windows.com/win... LEA AKKARI (MICROSOFT) 2019年8月的 JavaScript 框架状态(视频)每隔半年,Tracy Lee 就会与几位不同框架的代表坐下来,来简单了解他们的工作状况。这一小时的剧集包含了 Evan You(Vue.js),Minko Gechev(Angular),Michael Dawson(Node.js),Jen Weber(Cardstack),Manu Mtz.-Almeida(Ionic)和 Marvin Hagemeister(Preact)。 https://www.youtube.com/watch... TRACY LEE 你应该知道的 React 中的 JavaScript在学习和使用 React 时,您应该要熟悉的 JavaScript 特性示例。 https://kentcdodds.com/blog/j... KENT C DODDS Node v12.9.0 发布,推出了 V8 7.6升级到 V8 7.6 后开辟了一些新机会,比如 Promise.allSettled()、JSON.parse 和 frozen/sealed 的数组性能改进,BigInt 现在有一个 toLocaleString 的方法可用于大数字的本地格式化。 ...

August 28, 2019 · 2 min · jiezi

你不知道WebSocket吗

什么是WebSocket?WebSocket是一种在单个TCP连接上进行全双工通信的协议。这里我们发现了一个有趣的词:”全双工”,那我们就来简单了解下通信方式有哪些! 单工通信双方中,一方固定为发送端,一方则固定为接收端。信息只能沿一个方向传输。例如计算机与打印机之间的通信是单工模式 说的简单些就是:我打你你只能忍着! 半双工允许数据在两个方向上传输,但是同一时间数据只能在一个方向上传输,其实际上是切换的单工。例如HTTP协议:客户端向服务器发送请求(单向的),然后服务器响应请求(单向的) 说的简单些就是:我打你,你忍完后可以打我,我忍着… 全双工允许数据在两个方向上同时传输。例如手机通话,WebSocket就是这个样子! 说的简单些就是:两个人同时可以互相打对方 说了这么多其实目的就是让大家知道,WebSocket是支持双向通信的!双向通信的优点为什么要支持双向通信?单向通信有什么问题?还是从HTTP说起,我们知道HTTP协议是半双工的,而且服务器不能主动推送消息给浏览器!这个就是他的缺陷。假若我希望实现一个股票交易系统,可能股价每秒钟都有变化,但是价格变化了如何通知我们的客户端? 咱们来看看以前是怎么实现的! 轮询什么叫轮询?就是不停的轮番询问!说的直白些就是客户端定期发送请求给服务端。 短轮询配段代码,Talk is cheap,show me your code. const express = require("express");const app = express();// express 静态服务中间件用来返回静态文件app.use(express.static(__dirname));// 当前价格是100元let currentPrice = 100;// 获取最新价格接口app.get("/getPrice", (req, res, next) => { res.send('¥'+currentPrice * Math.random());});app.listen(3000);客户端不停的发送请求,去服务端获取最新价格。 <div>当前交易价格: <span id="price"></span></div><script> setInterval(() => { fetch('/getPrice'). then(res=>res.text()). then(data=>price.innerHTML = data) }, 1000);</script>很快我们就看出了这样编写代码的缺陷!如果数据变化的不快呢,那就会发送很多无意义的请求。每次发送请求都会有HTTP的Header会消耗大量流量,同时也会消耗CPU的利用率!长轮询长轮询是对短轮询的改进版,就是当第一个请求回来时再发送下一个请求! (function poll(){ fetch('/getPrice'). then(res=>res.text()). then(data=>{price.innerHTML = data;poll()})})()问题依旧是显而易见的!如果服务端数据变化很快,那么请求数目会更多;如果变化很慢,可能ajax会出现超时的问题。Iframe方式我们并不希望每次都创建一个新的请求,此时就可以使用Iframe来实现长连接 app.get("/getPrice", (req, res, next) => { setInterval(()=>{ // 不能使用end 否则会中断请求,我们要实现的是长连接 res.write(` <script> parent.document.getElementById('price').innerHTML = ${currentPrice * Math.random()} </script> `); },1000);});<body> <div>当前交易价格: <span id="price"></span></div> <iframe src="/getPrice" frameborder="0"></iframe></body>现在确实可以利用Iframe实现了长连接通信,但是页面的状态一直是加载态!EventSource流EventSource 接口用于接收服务器发送的事件。它通过HTTP连接到一个服务器,以text/event-stream 格式接收事件, 不关闭连接。 ...

August 28, 2019 · 2 min · jiezi

前端面试每日-31-第134天

今天的知识点 (2019.08.28) —— 第134天[html] Web Worker线程的限制是什么?[css] transition、animation、transform三者有什么区别?[js] [请写出如下代码运行的结果并解释为什么?[代码]](https://github.com/haizlin/fe... var type = 'images'; var size = {width: 800, height: 600}; var format = ['jpg', 'png']; function change(type, size, format){ type = 'video'; size = {width: 1024, height: 768}; format.push('map'); } change(type, size, format); console.log(type, size, format);[软技能] 你在工作中有用到过websocket吗?用它来解决什么问题?《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。 前端面试每日3+1题,以面试题来驱动学习,每天进步一点! 让努力成为一种习惯,让奋斗成为一种享受!欢迎在 Issues 和朋友们一同讨论学习! 项目地址:前端面试每日3+1 【推荐】欢迎跟 jsliang 一起折腾前端,系统整理前端知识,目前正在折腾 LeetCode,打算打通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎点个Star, 同时欢迎微信扫码关注 前端剑解 公众号,并加入 “前端学习每日3+1” 微信群相互交流(点击公众号的菜单:进群交流)。 学习不打烊,充电加油只为遇到更好的自己,365天无节假日,每天早上5点纯手工发布面试题(死磕自己)。希望大家在这浮夸的前端圈里,保持冷静,坚持每天花20分钟来学习与思考。在这千变万化,类库层出不穷的前端,不建议大家等到要找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢迎大家到Issues交流,鼓励PR,感谢Star,大家有啥好的建议可以加我微信一起交流讨论!交流讨论欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎点个[Star] 前端面试每日3+1

August 28, 2019 · 1 min · jiezi

前端20个灵魂拷问-彻底搞明白你就是中级前端工程师-下篇

不知不觉,已经来到了最后的下篇 其实我写的东西你如果认真去看,跟着去写,应该能有不少的收获。最近一些跨平台技术,React-native和flutter之类的,比较火。但是,我还是不准备把它们放进来,因为那是为做App而生,我想把Electron这个桌面端跨平台的技术放进来。理由是什么,后面说 这是上篇和中篇,如果你是第一次看这个系列文章,欢迎去从头开始学习: 前端20个灵魂拷问 彻底搞明白你就是中级前端工程师 【上篇】前端20个灵魂拷问 彻底搞明白你就是中级前端工程师 【中篇】 以及一些比较不错的文章: 从零编写一个React框架 我们为什么要熟悉这些通信协议 单页面应用SPA原理 9102年:手写一个React脚手架 【优化极致版】 性能优化不完全手册 Electron跨平台入门系列 上面的文章,gitHub上,都有对应的源码。进入正题一千个人眼里有一千个哈姆雷特,我们做不到完美每个人评判的标准不一样,我们唯有拿出碾压这个层级的能力的时候,才能堵住质疑者的嘴。当然,我们不做技术杠精,技术本身没有好坏。不喜欢就不理会 最后问题,我准备如下内容:前端的性能优化方向从传输层面去优化的方向预解析地址 首次请求解析地址如果没有缓存 那么可能消耗60-120ms 性能优化不完全手册这里面有介绍 preload预请求必要内容,prefetch预请求可能需要内容 这种请求方式不会阻塞浏览器的解析,而且能将预请求的资源缓存起来,而且可以设置crossorgin进行跨域资源的缓存,不会推迟首屏的渲染时间,还会加快后面的加载时间,因为后面的本身需要的资源会直接从缓存中读取,而不会走网络请求。 使用 preload 前,在遇到资源依赖时进行加载: 使用 preload 后,不管资源是否使用都将提前加载: 可以看到,preload 的资源加载顺序将被提前: 使用 preload 后,Chrome 会有一个警告: preload 和 prefetch 混用的话,并不会复用资源,而是会重复加载。若不确定资源是必定会加载的,则不要错误使用 preload,以免本末倒置,给页面带来更沉重的负担。 preload 加载页面必需的资源如 CDN 上的字体文件,与 prefetch 预测加载下一屏数据,兴许是个不错的组合。 preload和prefetch详解 这篇文章写得很棒 感谢作者 减少传输次数部分图片base64处理,然后使用雪碧图。多张图拼成一张传输 当然base64这个东西慎用,实际开发中它表现并那么好 减少传输体积例如后端返回数据:“该用户没有拥有权限” 可以改成:0 约定优于配置的思想一定要有 使用probbuffer协议ProtoBuffer是由谷歌研发的对象序列化和反序列化的开源工具 它的本质就是将一段数据序列化,转变成二进制形式传输 然后另外的服务器端或者客户端接受到之后 反序列化,转换成对应的数据格式(json) 好像还有人没有听说这个传输协议 其实它传输过程就是2进制流的形式 用得最多的是和GRPC配合Go语言或者服务器之间传输数据 ...

August 28, 2019 · 3 min · jiezi

CSS-自定义属性-入门

引言 ‏‎‪‏‪‭‫‬‪‫‫‮‫‪‪‏众所周之,CSS的维护一直是件不易的事情,特别是在构建大型Web站点或Web应用程序时,如果是多人协作的话难度更大。另外,由于CSS语言是一种声明式语言,而且不像其他语言有变量、条件和逻辑等特性,一直生存在程序语言鄙视链的最底层。也因为这个原因,社区中有了各种CSS处理器语言,比如Sass、LESS和Stylus等。这些处理器语言引入了一些类似其他程序语言的特性,比如变量、运算符和逻辑运算等。 虽然CSS处理器给编写和维护CSS带来了一些便利,但还是需要额外的编译。不过处理器中的变量着实为我们带来很大的优势,也正因为如此,社区开始将CSS处理器中的变量引入到原生CSS中,经过多年的推进和演变才有了今天的CSS自定义属性。 一、CSS 自定义属性简介 所谓自定义属性,就是CSS作者(CSSer)自己定义的属性,这些属性统称为自定义属性,允许作者自由的选择名称,自由的为名称属性分配任意值。这些属性能够提供给var()函数使用,被var()函数引用的自定义属性又常被称为变量。 这样一来,CSSer声明的这些自由属性就有了两个名称:自定义属性 和 变量: 自定义属性:使用--(代表任意声明的名称)声明的特殊格式作为名称,该名称被称为自定义属性,同时可以给自定义属性赋予任何值。比如--color: #fff。 变量:CSS的var()函数引用的自定义属性被称为变量。var()会返回自定义属性所对应的值,同时可以被运用于相应的CSS属性。对应的即是CSS规则中的属性值。 用一张图来描述他们之间的关系: 二、CSS自定义属性的作用 当我们构建大型Web网站或Web应用时,使用的CSS数量是非常庞大的,并且在很多场合有着大量的重复使用。就拿网站的配色方案来举例,一些颜色在CSS文件中会出现很多次,并被重复使用。当你修改配色方案时,不论是调整某个颜色或完全修改整个配色,都会是一个复杂的问题。如果单纯的依赖全局的查找替换是远远不够,这样的操作难免会出错。 如果使用了CSS的框架,这种情况会变得尤其糟糕,此时如果要修改颜色,则需要对框架本身进行修改。虽然这些框架都有可能引入了Sass这样的CSS处理器帮助我们减少了出错的机会,提高了可维护性的能力,但这种通过添加额外步骤的方式(需要做编译处理),可能会增加系统的复杂性。CSS自定义属性(CSS变量)的出现,为我们带来了一些CSS处理器的便利,并且不需要额外的编译。在CSS中使用CSS自定义属性的好处和在编写语言中使用变量的好处没有特别的不同之处。W3C规范上有过这样的一段描述: 使用CSS自定义属性使得大文件更易于阅读,因为看起来很随意的值有了一个提示信息的名字,并且编辑这些文件更加简单,更不易于出错。因为你只需要在自定义属性处修改一次,这个修改就会应用到使用该自定义属性的任何地方。 简单地说,CSS自定义属性除了提供了更灵活的设置、引用和修改的便利性之外,还具有较强的语义化(这需要你对语义化有足够强的意识,比如primary这样的名称总是要比red这样的名称来得有意义)。这些语义化信息让你的CSS文件变得易读和理解。 为此,可读性和可维护性是CSS自定义属性最大的优势。并且,它让我们可以在CSS中使用原生的变量,而不再需要借助于类似Sass这样的CSS处理器。 三、CSS自定义属性语法3.1 自定义属性的声明 CSS自定义属性和常规CSS属性的用法是一样的。把它们当作动态属性会比变量更好。这意味着它们只能在声明块中使用。也就是说,自定义属性和选择器是强绑定的。可以是任何有效的选择器。 如果已声明的CSS自定义属性未被任何属性调用的话,将不会产生任何的效果。只会是一段字符串停留在你的样式文件中。 声明自定义属性的时候,自定义属性名前面要加两根连词线(--)。 body { --foo: #7F583F; --bar: #F7EFD2;} CSS自定义属性的命名规则比较松散,可以是任何有效的字符,比如中文、大写字母、驼峰命名、中距线、emoji和HTML实体等等: 自定义属性名大小写敏感,--color 和 --COLOR 是两个不同的自定义属性。3.2 var() 函数 var()函数用于读取变量,将变量当作var()函数的第一个参数传进去。 a { color: var(--foo); text-decoration-color: var(--bar);} var()函数还可以使用第二个参数,表示自定义属性的默认值。如果该自定义属性不存在,就会使用这个默认值。 color: var(--foo, #7F583F);var() 的第二个参数不处理内部的逗号或空格,都视作参数的一部分。 var(--font-stack, "Roboto", "Helvetica");var(--pad, 10px 15px 20px);var()函数还可以用在自定义属性的声明。 :root { --primary-color: red; --logo-text: var(--primary-color);}var()函数可以代替元素中任何属性中的值的任何部分。不过var()函数不能作为属性名、选择器或者其他除了属性值之外的值。.foo { --side: margin-top; /* 无效 */ var(--side): 20px;}四、CSS 自定义属性的使用4.1 CSS自定义属性命名 CSS自定义属性的命名规则比较松散,可以是任何有效的字符,比如中文、大写字母、驼峰命名、中距线、emoji和HTML实体等等: ...

August 28, 2019 · 2 min · jiezi

好快-1分钟开发好一个下拉刷新滚动加载列表

好快, 1分钟写好下拉刷新,滚动加载自动分页列表前言欢迎关注BUI Webapp专栏 或者 bui神速微信公众号. 以往文章: 2019开发最快的Webapp框架--BUI交互框架微信Webapp开发的各种变态路由需求及解决办法!【BUI实战篇】BUI数据驱动做的拼图游戏 Webapp移动适配版,基于vuejs拼图游戏改造webapp结合Dcloud平台打包图文教程一张脑图看懂BUI Webapp移动快速开发框架【上】--框架与工具、资源一、观看实操视频 点击观看视频实录 安装完以下环境后, 从0到1, 手把手教, 你也可以做到!二、开发准备安装buijs cli命令行工具(需要先安装node环境, 建议使用node 8.x);如何安装使用buijs?安装bui-fast 快速编辑器插件(推荐vscode);如何安装使用bui-fast?打开跨域的chrome浏览器;如何打开跨域的Chrome浏览器?三、开发过程使用 buijs 构建工程 1.创建Webapp工程buijs create demo2.安装依赖cd demo/npm installwindows 推荐使用淘宝的 cnpm install3.运行预览npm run dev使用bui-fast编辑器插件生成控件视频里使用的是vscode 可以在安装插件那里找到 bui-fast. xxx 假设为控件名生成规则1: 在html里, 使用 ui-xxx 生成控件结构ui-list生成以下结构 <div id="uiList" class="bui-scroll"> <div class="bui-scroll-head"></div> <div class="bui-scroll-main"> <ul class="bui-list"> </ul> </div> <div class="bui-scroll-foot"></div></div>在js里, 使用 bui-xxx 生成控件的初始化代码bui-list生成以下初始化代码 // 列表控件 js 初始化:var uiList = bui.list({ id: "#uiList", url: "http://rap2api.taobao.org/app/mock/84605/example/getNews", pageSize: 5, data: {}, //如果分页的字段名不一样,通过field重新定义 field: { page: "page", size: "pageSize", data: "data" }, callback: function(e) {}, template: function(data) { var html = ""; data.forEach(function(el, index) { html += `<li class="bui-btn bui-box"> <div class="bui-thumbnail"><img src="${el.image}" alt=""></div> <div class="span1"> <h3 class="item-title">${el.name}</h3> <p class="item-text">${el.address}</p> <p class="item-text">${el.distance}公里</p> </div> <span class="price"><i>¥</i>${el.price}</span> </li>` }); return html; }});保存就会自动预览四、从bui.list看自动分页设计原理 ...

August 27, 2019 · 2 min · jiezi

第二篇-仿写Vue生态系列模板小故事

( 第二篇 )仿写'Vue生态'系列___'模板小故事.' 本次任务 承上: 完成第一篇未完成的'热更新'配置.核心: 完成'模板解析'模块的相关编写, 很多文章对模板的解析阐述的都太浅了, 本次我们一起来深入讨论一下, 尽可能多的识别用户的语句.启下: 在结构上为'双向绑定'、watch、dep等模块的编写打基础. 最终效果图 一. 模板页面我们既然要开发一个mvvm, 那当然要模拟真实的使用场景, 相关的文件我们放在:'cc_vue/use'路径下, 代码如下: 'cc_vue/use/1:模板解析/index.html', 本篇专门用来展示模板解析的页面'cc_vue/use/1:模板解析/index.js', 本篇专门用来展示模板解析的逻辑代码本来要展示html文件的信息, 但是内容冗长而且没有什么技术可言, 所以不在此展示了. function init(){ new C({ el: '#app', data: { title: '努力学习', ary: [1, 2, 3], obj: { name: '金毛', type: ['幼年期', '成熟期', '完全体'] }, fn() { return '大家好我是: ' + this.obj.name; } } });}export default init;一. 配置文件与简易的热更新之所以说它是简易的, 原因是我们并不会去做到很细致, 比如本次不会去追求每一次的精准更新, 而是每一次都会对整体采取更新, 毕竟本次工程热更新只是一个知识点, 我们还有很多很多更重要的事要做emmmm 一些自己的观点热更新并不是算很神奇, 我之前配置过vuex的热更新相关, 后来总结了一下, 它与回调函数概念差不多, 原理就是当编辑器, 或者是serve检测到你的文件有相应变化的时候, 执行一个回调函数, 这个回调函数里面就是一些重新渲染, 更新dom等等的操作, 你可能会有疑问, vue的热更新做的那么好, 也没看见有什么热更新的回调函数啊, 其实这都归功于'vue-loader', css 热更新考的是css-loader, 他们在处理文件的阶段就把热更新的回调代码注入了js文件里面, 所以我们才会是无感的, 所以没有'loader'帮助我们注入热更新, 那本次我们就自己手动实现.???? ...

August 21, 2019 · 5 min · jiezi

伪元素的content属性使用中文字符集可能会出现乱码情况

伪元素的content使用中文字符集在某些浏览器可能会出现乱码的情况 解决办法: * 确保HTML的META属性 设置为 charset='utf-8'* 使用[站长工具][1] 或者JS的escape将中文字符集转成Unicode编码就OK了, 例如content: "•••" => content: "\2022\2022\2022" 即可。

August 21, 2019 · 1 min · jiezi

前端面试每日-31-第127天

今天的知识点 (2019.08.21) —— 第127天[html] html的button中的reset有什么作用?[css] 说说你对min-width和max-width的理解,它们有什么运用场景?[js] JavaScript有几种类型值?能否画出它们的内存图?[软技能] 说说你对移动端和web前端开发的主要区别是什么?项目地址: 前端面试每日3+1 【推荐】欢迎跟 jsliang 一起折腾前端,系统整理前端知识,目前正在折腾 LeetCode,打算打通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎点个Star, 同时欢迎微信扫码关注 前端剑解 公众号,并加入 “前端学习每日3+1” 微信群相互交流(点击公众号的菜单:进群交流)。 《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。 前端面试每日3+1题,以面试题来驱动学习,每天进步一点! 让努力成为一种习惯,让奋斗成为一种享受!相信 坚持 的力量!!!学习不打烊,充电加油只为遇到更好的自己,365天无节假日,每天早上5点纯手工发布面试题(死磕自己,愉悦大家)。希望大家在这浮夸的前端圈里,保持冷静,坚持每天花20分钟来学习与思考。在这千变万化,类库层出不穷的前端,建议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢迎大家到Issues交流,鼓励PR,感谢Star,大家有啥好的建议可以加我微信一起交流讨论!希望大家每日去学习与思考,这才达到来这里的目的!!!(不要为了谁而来,要为自己而来!)交流讨论欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎分享! 项目地址: 前端面试每日3+1

August 21, 2019 · 1 min · jiezi

电竞CSGO数据API接口-战队数据列表API调用示例代码

http://www.xxe.io/import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.annotation.JSONField; import java.nio.charset.StandardCharsets;import java.nio.file.Files;import java.nio.file.Paths;import java.util.List; /** @API: 战队列表@Website: http://www.xxe.io/*/public class CsgoTeam { public static void main(String[] args) { try { String content = getContent(); Respond rsp = JSON.parseObject(content, Respond.class); System.out.println(rsp.code); System.out.println(rsp.message); rsp.getData().forEach(System.out::println); } catch (Throwable t) { t.printStackTrace(); }}/** * 获取API返回内容 * <p> * Note: 这里为了方便测试我使用了一份本地文件,使用时应替换为真实接口返回内容 */private static String getContent() { try { StringBuilder builder = new StringBuilder(); List<String> lines = Files.readAllLines(Paths.get("./src/main/resources/CsgoTeam.json"), StandardCharsets.UTF_8); lines.forEach(builder::append); return builder.toString(); } catch (Throwable t) { t.printStackTrace(); return ""; }}public static class Respond { @JSONField private int code; @JSONField private String message; @JSONField private List<Team> data; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public List<Team> getData() { return data; } public void setData(List<Team> data) { this.data = data; }}public static class Team { @JSONField private long teamId; @JSONField private String name; @JSONField private String logo; @JSONField private String country; @JSONField private int worldRank; @JSONField private int weekInTop30; @JSONField private List<Integer> playerIds; @Override public String toString() { return "Team{" + "teamId=" + teamId + ", name='" + name + '\'' + ", logo='" + logo + '\'' + ", country='" + country + '\'' + ", worldRank=" + worldRank + ", weekInTop30=" + weekInTop30 + ", playerIds=" + playerIds + '}'; } public void setTeamId(long teamId) { this.teamId = teamId; } public void setName(String name) { this.name = name; } public void setLogo(String logo) { this.logo = logo; } public void setCountry(String country) { this.country = country; } public void setWorldRank(int worldRank) { this.worldRank = worldRank; } public void setWeekInTop30(int weekInTop30) { this.weekInTop30 = weekInTop30; } public void setPlayerIds(List<Integer> playerIds) { this.playerIds = playerIds; }}} ...

August 20, 2019 · 2 min · jiezi

positionfixed宽高自适应元素水平垂直居中

.modal-user-dialog{ position: fixed; left: 50%; top: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%);}

August 20, 2019 · 1 min · jiezi

前端面试每日-31-第126天

今天的知识点 (2019.08.20) —— 第126天[html] 请说说Canvas和SVG图形的区别是什么?[css] 说说你对hasLayout的理解,触发hasLayout的方式有哪些?[js] 保护js代码的方式有哪些?分别说说他们的原理是什么?[软技能] 你有了解opengl吗?它有哪些作用?项目地址: 前端面试每日3+1 【推荐】欢迎跟 jsliang 一起折腾前端,系统整理前端知识,目前正在折腾 LeetCode,打算打通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎点个Star, 同时欢迎微信扫码关注 前端剑解 公众号,并加入 “前端学习每日3+1” 微信群相互交流(点击公众号的菜单:进群交流)。 《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。 前端面试每日3+1题,以面试题来驱动学习,每天进步一点! 让努力成为一种习惯,让奋斗成为一种享受!相信 坚持 的力量!!!学习不打烊,充电加油只为遇到更好的自己,365天无节假日,每天早上5点纯手工发布面试题(死磕自己,愉悦大家)。希望大家在这浮夸的前端圈里,保持冷静,坚持每天花20分钟来学习与思考。在这千变万化,类库层出不穷的前端,建议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢迎大家到Issues交流,鼓励PR,感谢Star,大家有啥好的建议可以加我微信一起交流讨论!希望大家每日去学习与思考,这才达到来这里的目的!!!(不要为了谁而来,要为自己而来!)交流讨论欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎分享! 项目地址: 前端面试每日3+1

August 20, 2019 · 1 min · jiezi

CSS颜色相关总结

原文地址:CSS颜色相关总结Introduction总结CSS中颜色的使用方法,达到需要的效果。 RequirementCopy your pex3.html file (from your previous practice exercise) into a file named pex4.html. Alternatively, your pex4.html file may be a revised /improved version of pex3.html, and/or also you could also add/eliminate content. You should keep in your file at least one image with figure caption and at least one table (with the contents as before). You should style this file with CSS, by creating an external CSS file (name it stylePex4.css), and then linking the CSS file from the HTML file. (Place the style file in the same folder as the html file; the linking from the HTML file should be RELATIVE.) Include comments in both of your files, at the top of the file, indicating the name of the other file (thus indicating the connection between these two files), your name and date.Include at least one CSS rule (and corresponding HTML elements and/or attributes as needed in the HTML file) , so that the styling effects are visible in: ...

August 19, 2019 · 5 min · jiezi

前端面试每日-31-第125天

今天的知识点 (2019.08.19) —— 第125天[html] 举例说明table怎么合并行和列的?[css] 使用纯CSS代码实现动画的暂停与播放[js] 你有用过webRTC吗?它有什么运用场景?[软技能] 说说你对Web App 、Hybrid App和Native App这三者的理解?项目地址: 前端面试每日3+1 【推荐】欢迎跟 jsliang 一起折腾前端,系统整理前端知识,目前正在折腾 LeetCode,打算打通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎点个Star, 同时欢迎微信扫码关注 前端剑解 公众号,并加入 “前端学习每日3+1” 微信群相互交流(点击公众号的菜单:进群交流)。 《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。 前端面试每日3+1题,以面试题来驱动学习,每天进步一点! 让努力成为一种习惯,让奋斗成为一种享受!相信 坚持 的力量!!!学习不打烊,充电加油只为遇到更好的自己,365天无节假日,每天早上5点纯手工发布面试题(死磕自己,愉悦大家)。希望大家在这浮夸的前端圈里,保持冷静,坚持每天花20分钟来学习与思考。在这千变万化,类库层出不穷的前端,建议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢迎大家到Issues交流,鼓励PR,感谢Star,大家有啥好的建议可以加我微信一起交流讨论!希望大家每日去学习与思考,这才达到来这里的目的!!!(不要为了谁而来,要为自己而来!)交流讨论欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎分享! 项目地址: 前端面试每日3+1

August 19, 2019 · 1 min · jiezi

小程序输入框文字上移问题-文字弹出输入框

输入框文字上移问题wxlm <input autoFocus="true" bindconfirm="confirmSearch" bindinput="search" class="srch-ipt" confirmType="search" placeholder="搜索内容" placeholderClass="ipt-placeholder" type="text" value=""></input>wxss .srch-ipt { /* prettier-ignore */ height: 32PX; text-align: left; /* prettier-ignore */ font-size: 15PX;}.ipt-placeholder { /* prettier-ignore */ font-size: 15PX; color: #bebebe; text-align: left;}.lxy-nav-bar-search__input { flex: 1;}上方代码可以完美解决ios文字上移问题,对于Android会降低偏移大小,因为此问题是微信原生组件所带来的,所以此套方案较为合适 Android机子文字弹出输入框在 Android 机子会出现文字被键盘弹起顶出 input 框,解决方案为页面设置一个死的高度不要高于 windowHeight,最好是设置一个固定高度或者动态计算高度赋值小程序自定义导航栏(完美适配所有手机)Taro组件gitHub地址详细用法请参考README原生组件gitHub地址详细用法请参考README

August 19, 2019 · 1 min · jiezi

rem自适应原理

需要了解的知识html{font-size:16px}p{font-size:1rem}1rem = 16px;rem 和 em 类似,em相较于父元素的字体大小,而rem相较于html的字体大小; 实现原理有了这个以上的前提可以通过监测屏幕大小改变html的字体大小,从而实现自适应大小的效果; 获取设备宽度与设计稿宽度的比例 作为html font-size的大小;假如是750/750 那么font-size:1px;设计稿上200px,代码就要写200rem;这样写太大.通常750/750*100,多除100;100作为px转化为rem的换算比例,100px = 1rem;那么设计稿750px代码里就要写7.5rem;function getRem () { var html = document.getElementsByTagName("html")[0]; var deviceWidth = document.body.clientWidth || document.documentElement.clientWidth; var rem = deviceWidth / designWidth * 100; console.log(rem) html.style.fontSize = rem+ "px";}设计稿为750px时,html{font-size:50px;} 50px * 7.5 = 375px;正好是设备的宽度;当设计稿750px,设备320px时, 320/750100 = 42.6666667;42.66667 7.5 = 320px;所以当设备为375时 7.5rem是maxWidth,设备是320时,7.5rem也是maxWidth,这样就达到了自适应设备的目的;简陋版完整代码: (function (designWidth,n) { function getRem () { var html = document.getElementsByTagName("html")[0]; var deviceWidth = document.body.clientWidth || document.documentElement.clientWidth; var rem = deviceWidth / designWidth * n; console.log(rem) html.style.fontSize = rem+ "px"; } getRem () window.addEventListener('resize',function (){ getRem() })})(750,100)

August 18, 2019 · 1 min · jiezi

css选择器-lastchild-lastoftype

last-child【同理first-child】:last-child表示其父元素的最后一个子元素,且这个元素是css指定的元素,才可以生效。 last-of-type【同理first-of-type】:last-of-type表示其父元素的最后一个指定类型的元素 这两个区别就是last-child必须要多具备一个条件,就是必须是父元素的最后一个子元素,强调的是最后child,而last-of-type只要符合最后一个type就可以。【例子1 2 】 弊端:对于元素选择伪类比较准确,但是对于类选择器选择伪类可能就会不太准确【例子 3 4】 现在看例子: 一、正常情况的没有干扰元素的ul下面全部都是lihtmlcss结果: 两个都会对最后一个li生效。 last-child last-of-type 二、ul下面不止有li,还有其他的元素,这个在实际场景中也是会出现的htmlcss结果: last-child选不中目标元素,last-of-type可以选择目标元素 last-child last-of-type 三、选择某类的最后一项htmlcss][11] 结果: last-child与last-of-type均不会选中某类的最后一项 .line:last-child与.line:last-of-type 四、父元素下同类名不同元素选择最后一个类名html css 结果:last-child选中既是最后一个子元素又是最后一个类名元素; last-of-type 会选择不同元素的最后一项子类 .line:last-child .line:last-of-type

August 18, 2019 · 1 min · jiezi

第十三集-从零开始实现一套pc端vue的ui组件库-评分组件-小星星

第十三集: 从零开始实现一套pc端vue的ui组件库( 评分组件 小星星 )1. 本集定位     说起评分的话, 最早看到这种形式是电影网站, 每部电影得到几颗星这种方式, 后来就出现了用户来手动选星星打分的玩法, 这些方式更直观, 更吸引用户参与进去, 这个组件其实还有很多玩法, 比加载动画, 我可以把星星不断的点亮作为一个加载进度的映射, 这个组件很多ui库都把他做的很固定, 比如说自能是5颗星星或者笑脸, 而本次编写这个组件我的原则就是, 星星的数量可以任意的多, 当然也可以任意的少, 最少1颗, 最多无限颗, 是不是很有趣????.     实现思路因为我这边icon组件用的是svg实现的, 最后选择了使用两排一样的icon组件, 重叠在一起, 然后把最上层的宽度变化一下, 就达到了选择区域有颜色的效果了. 2. 需求评审只读模式: 可只做展示.选择模式: 可通过点击设置新的评分.颜色与大小, 要可供用户自己设定.特色: 可设置'星星'的总数量.可设置满分为多少分可更换图形, 绝对不止是'星星'.要兼容多层父级组件的情况以及多层父级并且父级组件滚动偏移的情况可以每次以半颗星为单位进行选取.3. 基础的搭建先上一张正常状态下的效果图vue-cc-ui/src/components/Rate/index.js import Rate from './main/rate.vue'Rate.install = function(Vue) { Vue.component(Rate.name, Rate);};export default Ratevue-cc-ui/src/components/Rate/main/rate.vue <template> <div class='cc-rate' :style="{ cursor: disabled ? 'auto' : 'pointer', // 不让修改的状态也就没必要出现小手了 }"> <i class='cc-rate__box'> <span class='cc-rate__dark'> <cc-icon v-for='item in num' :key='item' :size="`${size}px`" :name='iconType.name' /> </span> <span class='cc-rate__bright' :style="{ width }"> <cc-icon v-for='item in num' :key='item' :size="`${size}px`" :name='iconType.name' /> </span> </i> </div></template>上述的num指的就是 用户定义的星星的数量total就是当星星满分的时候, 相当于多少分 ...

August 18, 2019 · 4 min · jiezi

html的几种水平垂直居中的方式基础

前言 我们在编写马过程中,想必大家对水平垂直居中的方法了解并不多。所以我给大家总结式的列出几种常用的水平垂直居中的方法。 第一种方法 <!--html盒子代码--><!--水平垂直居中--><div class="Centered1"> <p>d第一种</p></div><!-css样式部分--> .Centered1{ background-color: #800070; width: 100%; height:500px; position: relative; } .Centered1 p{ width: 200px; height: 200px; background-color: deeppink; line-height: 200px; text-align: center; position: absolute; left: 0; bottom: 0; right:0; top: 0; margin: auto; }第二种方法 <!--html盒子代码--><!--水平垂直居中--><div class="Centered2"> <p>d第二种</p></div><!-css样式部分-->/*第二种方法水平垂直居中*/ .Centered2{ background-color: #ef8518; width: 100%; height: 500px; position: relative; } .Centered2 p { position: absolute; width: 200px; height: 200px; background-color:red; line-height: 200px; text-align: center; left: 50%; top:50%; margin-left:-100px; margin-top: -100px; }第三种方法 ...

August 18, 2019 · 1 min · jiezi

前端面试每日31周汇总20190818

《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。 前端面试每日3+1题,以面试题来驱动学习,每天进步一点! 让努力成为一种习惯,让奋斗成为一种享受!相信 坚持 的力量!!!项目地址: https://github.com/haizlin/fe... 【推荐】欢迎跟 jsliang 一起折腾前端,系统整理前端知识,目前正在折腾 LeetCode,打算打通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎点个Star, 同时欢迎微信扫码关注 前端剑解 公众号,并加入 “前端学习每日3+1” 微信群相互交流(点击公众号的菜单:进群交流)。 学习不打烊,充电加油只为遇到更好的自己,365天无节假日,每天早上5点纯手工发布面试题(死磕自己,愉悦大家)。希望大家在这浮夸的前端圈里,保持冷静,坚持每天花20分钟来学习与思考。在这千变万化,类库层出不穷的前端,建议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢迎大家到Issues交流,鼓励PR,感谢Star,大家有啥好的建议可以加我微信一起交流讨论!希望大家每日去学习与思考,这才达到来这里的目的!!!(不要为了谁而来,要为自己而来!)htmlHTML5规范将元素分为哪几个大类?分别说说它们的特点使用canvas画出一个矩形说说form-data、x-www-form-urlencoded、raw、binary的区别是什么?请描述下application cache的更新过程?你知道富文本编辑器的实现原理吗?说说你对富文本的理解,你有用过哪些富文本编辑器呢?有使用过HTML5的跟踪元素吗?说说你对它的理解css举例说明伪类:nth-child、:first-child与:first-of-type这三者有什么不同?什么是zoom?它有什么作用?举例说明微信端兼容问题有哪些?请举例说明伪元素 (pseudo-elements) 有哪些用途?设置字体时为什么建议设置替换字体?你有没有自己写过一套UI库?说下遇到哪些难点?说说你对GPU的理解,举例说明哪些元素能触发GPU硬件加速?js如何实现文件拖动上传?分析('b' + 'a' + +'a' + 'a').toLowerCase()返回的结果能否正确获取本地上传的文件路径?如果可以怎么做?如果不可以解释下为什么?请说说escape、encodeURI、decodeURI、encodeURIComponent和decodeURIComponent的区别?如何终止WebWork?写一个方法把多维数组降维使用正则去掉html中标签与标签之间的空格软技能你有开发过弹幕吗?知道它的原理吗?说说看你了解雅虎前端优化的35条军规吗?你能说上几条?如果一个项目要你重构成前后端分离,你的方法论是什么?用哪种格式可以存储包含Alpha通道的图像?Alpha通道是指什么?你有签过保密协议吗?说说你对保密协议的理解你对jsfuck有了解吗?它的原理是什么?请举例说明你有做过骨架屏吗?它的原理是什么知道吗?全部所有 交流讨论项目地址: https://github.com/haizlin/fe...

August 18, 2019 · 1 min · jiezi

前端面试每日-31-第124天

今天的知识点 (2019.08.18) —— 第124天[html] HTML5规范将元素分为哪几个大类?分别说说它们的特点[css] 举例说明伪类:nth-child、:first-child与:first-of-type这三者有什么不同?[js] 如何实现文件拖动上传?[软技能] 你有开发过弹幕吗?知道它的原理吗?说说看项目地址: 前端面试每日3+1 【推荐】欢迎跟 jsliang 一起折腾前端,系统整理前端知识,目前正在折腾 LeetCode,打算打通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎点个Star, 同时欢迎微信扫码关注 前端剑解 公众号,并加入 “前端学习每日3+1” 微信群相互交流(点击公众号的菜单:进群交流)。 《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。 前端面试每日3+1题,以面试题来驱动学习,每天进步一点! 让努力成为一种习惯,让奋斗成为一种享受!相信 坚持 的力量!!!学习不打烊,充电加油只为遇到更好的自己,365天无节假日,每天早上5点纯手工发布面试题(死磕自己,愉悦大家)。希望大家在这浮夸的前端圈里,保持冷静,坚持每天花20分钟来学习与思考。在这千变万化,类库层出不穷的前端,建议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢迎大家到Issues交流,鼓励PR,感谢Star,大家有啥好的建议可以加我微信一起交流讨论!希望大家每日去学习与思考,这才达到来这里的目的!!!(不要为了谁而来,要为自己而来!)交流讨论欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎分享! 项目地址: 前端面试每日3+1

August 18, 2019 · 1 min · jiezi

2019年夏天我走上了前端之路

HTML5语义化标签文本相关标签表格相关标签表单相关标签多媒体API的丰富与增强CSS3属性选择器文本相关属性背景边框,边距属性大小、定位、轮廓属性盒模型与布局相关属性表格相关属性CSS动画效果scss、less预编译器JavaScriptJavaScript基础语法JavaScript DOM操作JavaScript事件类型、机制等本地存储与离线应用localStorage、sessionStorageindexedDB存储与调用Web Worker多线程APIworker线程数据交换嵌套workerSharedWorkerPromise的原理及使用客户端通信跨文档消息传递WebSocket通信心情初探前端开发,内容非常丰富,发展也是非常迅速,所以必定学无止境。面对如大海般的知识,我相信很多人跟我一样也会有些迷茫,不知所措。边学习边想了很久,技术是社会发展的推动力,可以说技术是永远学不完的,所以切不可贪多,求全。对于浩如烟海的知识与技术,我们该如何应对呢?想必有很多前辈都会有这样的经验,学技术需要一专多长,需要从一个切入口达到一定的深度,再去考虑扩展广度。那么像我这个夏天所学,远远不够,可以说才刚刚了解前端,要想达到去企业工作的水平还需要更多的实践和练习。那么怎么能做到不成为社会发展的淘汰者呢?这就需要掌握核心的本领,高屋建瓴,从平地而起,在计算机科学领域,算法,计算机网络,操作系统可以说是非常核心的内容了,所有的程序设计都因此而有意义。对于程序来说,代码的架构,复用度,可维护性,高性能则是成为专家的必经之路。前端开发,其核心在于用户交互,我们要关心,页面的交互性,布局,用户体验和网页性能优化。对于代码来说就是简洁、高效、可维护性高。对于前端开发来说,我机缘巧合走上这条路,我便始终如一,尽管可能与我专业不尽相同,这便是人生,所有事都是缘分。

August 17, 2019 · 1 min · jiezi

30分钟完成JavaScript中的记忆游戏

通过在30分钟内构建一个记忆游戏来学习JS,CSS和HTML! 本教程介绍了一些基本的关于HTML5,CSS3和JavaScript概念。 我们将讨论数据属性,定位,透视,转换,flexbox,事件处理,超时和三元表达式。 读懂此文章不需要大家有许多编程方面的知识。 如果您已经知道HTML,CSS和JS的用途,那就绰绰有余了! 项目结构让我们在终端中创建项目文件: ???? mkdir memory-game ???? cd memory-game ???? touch index.html styles.css scripts.js ???? mkdir imgHTML连接css和js文件的初始页面模板。 <!-- index.html --><!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Memory Game</title> <link rel="stylesheet" href="./styles.css"></head><body> <script src="./scripts.js"></script></body></html>这个游戏有12张卡片。每个卡片由一个名为.memory-card的容器div组成,其中包含两个img元素。第一个代表卡片的front-face(意为正面),第二个代表卡片的back-face(意为背面)。 <div class="memory-card"> <img class="front-face" src="img/react.svg" alt="React"> <img class="back-face" src="img/js-badge.svg" alt="Memory Card"></div>我们可以在Memory Game Repo下载该项目的资源文件。这组卡片将被包装在section容器元素中。最终代码结果是这样的: <!-- index.html --><section class="memory-game"> <div class="memory-card"> <img class="front-face" src="img/react.svg" alt="React"> <img class="back-face" src="img/js-badge.svg" alt="Memory Card"> </div> <div class="memory-card"> <img class="front-face" src="img/react.svg" alt="React"> <img class="back-face" src="img/js-badge.svg" alt="Memory Card"> </div> <div class="memory-card"> <img class="front-face" src="img/angular.svg" alt="Angular"> <img class="back-face" src="img/js-badge.svg" alt="Memory Card"> </div> <div class="memory-card"> <img class="front-face" src="img/angular.svg" alt="Angular"> <img class="back-face" src="img/js-badge.svg" alt="Memory Card"> </div> <div class="memory-card"> <img class="front-face" src="img/ember.svg" alt="Ember"> <img class="back-face" src="img/js-badge.svg" alt="Memory Card"> </div> <div class="memory-card"> <img class="front-face" src="img/ember.svg" alt="Ember"> <img class="back-face" src="img/js-badge.svg" alt="Memory Card"> </div> <div class="memory-card"> <img class="front-face" src="img/vue.svg" alt="Vue"> <img class="back-face" src="img/js-badge.svg" alt="Memory Card"> </div> <div class="memory-card"> <img class="front-face" src="img/vue.svg" alt="Vue"> <img class="back-face" src="img/js-badge.svg" alt="Memory Card"> </div> <div class="memory-card"> <img class="front-face" src="img/backbone.svg" alt="Backbone"> <img class="back-face" src="img/js-badge.svg" alt="Memory Card"> </div> <div class="memory-card"> <img class="front-face" src="img/backbone.svg" alt="Backbone"> <img class="back-face" src="img/js-badge.svg" alt="Memory Card"> </div> <div class="memory-card"> <img class="front-face" src="img/aurelia.svg" alt="Aurelia"> <img class="back-face" src="img/js-badge.svg" alt="Memory Card"> </div> <div class="memory-card"> <img class="front-face" src="img/aurelia.svg" alt="Aurelia"> <img class="back-face" src="img/js-badge.svg" alt="Memory Card"> </div></section>CSS我们将使用一个简单但非常有用的重置,适用于所有项目: ...

August 17, 2019 · 6 min · jiezi

学习成果一个很简单的登录框

介绍 除了样式之外,只通过css的伪类选择器实现了当鼠标焦点在'用户名'或'密码'输入框时,提示信息自动缩小并跑到左上方。如若输入框中没有值,则回到原来的样子,若有值则不再恢复。 其基本原理是 css3 提供的伪元素选择器,通过在<input>标签中增加require属性(这个属性并不是一个键值对),使得当输入框中有内容时会被:valid选择器选中。至于鼠标焦点还在输入框中时利用的伪类选择器:focus算是老生常谈了。但说明输入框内容的<label>标签并不是<input>标签的子元素,该如何通过<input>的状态管理<label>呢?便用到了兄弟选择器~。eleA ~ eleB作为选择器时,会选中所有和 eleA 同辈的 eleB 元素。官方文档点此:传送门。 另外最后被密码输入框的浏览器自动提示曾经的内容搞得烦的一批,搜索了一下可以通过在<input>标签中添加autocomplete="off"禁止浏览器做输入框提示,完美。 代码index.html <!DOCTYPE html><html><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title></head><body> <div id="login-div"> <p id="form-title-p">简单登录框</p> <form action="" id="login-form"> <div class="input-div"> <input type="text" id="carpoolername-input" required /> <label>用户名</label> </div> <div class="input-div"> <input type="password" id="password" required autocomplete="off" /> <label>密码</label> </div> <div class="btn-div"> <button id="submit-btn" type="button">登录</button> </div> </form> </div></body></html>index.css要记得和index.html的相对位置,自行在index.html中添加引用。 * { padding: 0; margin: 0;}body { background: linear-gradient(127deg, #64c4ed, #fec771); height: 100vh; font-family: "Helvetica Neue", Helvetica, Arial, "Microsoft Yahei", "Hiragino Sans GB", "Heiti SC", "WenQuanYi Micro Hei", sans-serif;}#login-div { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); display: flex; flex-direction: column; justify-content: center; align-items: center; color: white; padding: 3vh 3vw; background-color: #8b4367; opacity: .8; outline: none; border: none; border-radius: 10px; box-shadow: 2px 2px 6px #8b4367;}#login-div #form-title-p { font-weight: 500; font-size: 2rem; padding: 10px; margin-bottom: 20px; letter-spacing: 0.5rem;}.input-div { position: relative; padding: 5px; margin-bottom: 2vh;}.input-div,.btn-div { text-align: center; vertical-align: middle;}.input-div input { width: 15vw; height: 5vh; padding: 0 1rem; outline: none; border: none; background-color: transparent; border-bottom: 1px solid black; font-size: 14px;}.input-div label { position: absolute; left: 1rem; top: .5rem; font-size: 16px; transition: 0.2s;}.input-div input:focus ~ label,.input-div input:valid ~ label { left: 0; top: -10px; font-size: 12px;}.btn-div button { outline: none; border: none; margin-top: 3vh; width: 90%; box-sizing: border-box; padding: 10px; border-radius: 8px; box-shadow: 1px 1px 1px #32dbc6; background-color: #49beb7; color: white; font-size: 16px;}

August 17, 2019 · 2 min · jiezi

css动画实现呼吸圆

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"><title>圆动画</title><style> .content{ width: 300px; height: 400px; background-color: #333; margin: 0 auto; } div{ box-sizing: border-box; } .box{ width: 300px; height: 300px; padding: 30px; animation-name: out; animation-duration: 2s; animation-timing-function: linear; animation-iteration-count: infinite; } .outer{ /*width: 240px; height: 240px;*/ height: 100%;/*关键所在,只能设置百分比,不能指定数值,内圆相同*/ border: 2px solid #fff; border-radius: 50%; padding: 30px; animation-name: in; animation-duration: 2s; animation-timing-function: linear; animation-iteration-count: infinite; } .inner{ /*width: 180px; height: 180px;*/ height: 100%; border:5px solid #fff; border-radius: 50%; } @keyframes out{ 25%{ padding: 20px; } 50%{ padding: 30px; } } @keyframes in{ 25%{ padding: 40px; } 50%{ padding: 30px; } 75%{ padding: 42px; } 100%{ padding: 30px; } }</style></head><body> ...

August 8, 2019 · 1 min · jiezi

绩效考核管理思维导图讲解绘制软件那个好

绩效管理是每个企业都必须面对的现实问题,因为企业的发展乃至于生存所依靠的就是价值的创造。企业是人的集合也是物质资本的集合,在扎样的背景下,如何能够最大程度的激发员工的内在驱动力就是我们所关注的重点。本文用思维导图为你介绍一下什么是绩效管理,如何做好绩效管理。 一张思维导图告诉你什么是绩效管理从下图绩效管理的定义来看,想必很多大企业已经能够从自身的经营哲学理念里面找到相对应的契合点了,可是更多的中小微企业还需要在进一步阐述之中才能更好更直接地运用到位。那么时间我们一起来看看绩效管理的相应流程。对于在这个板块当中还不甚明了的企业管理者而言,这是最最重要的一项。 绩效管理流程第一步,目标清晰 领导需要花费更多的时间来制定一个清晰的目标,只有在清晰地目中传递的过程当中,能够准确无误的被下属所哦。领悟到,才算是真正的清晰目标。现在的企业运营讲究的是高效以及精准。如果领导人在下达目标的时候,完全是要靠下属的思想觉悟,认知见识来猜。这就十分地官僚主义了。 更多的时候,清晰的目标能够与员工个人的目标相吻合,甚至是一致,就能最大限度的激励起员工的主观能动性。也是比激励机制更加有效的一种方式方法。 第二步,设计自己的KPI 如企业已经发现了员工的关键素质,从过去的服从变为了现在的投入。我好多员工,随着时代的发展,人们已经认识到了,只有员工的主动,积极,充分的投入到工作当中去,才能够给企业的运营带来不可估量的价值。如果只需要员工去服从,那么这和过去的官僚主义,官本位思想又有什么太大的区别呢?首先要和员工一起来探讨;领导要将自己的思路,策略解释的清楚;员工需要根据自己所理解的思路与策略,设计好自己的工作目标;员工能够向领导阐述,自己所涉及的工作目标的合理性和自己比较意义在哪里? 第三步,有效流程 我们的流程当中只涉及到业务扩展的目标,或者员工个人提升计划的进度。那么这就不是一个很完整流程,只有我们在努力的过程中晚上这两项才算是尽到了领导的职责。更的时候领导是需要带领团队和组织不断发展的。不仅仅在上述的两个方面要帮助员工的成长,领导自己也需要在两方面下足功夫。 第四步,沟通机会 其实我们在做绩效沟通的时候,这也是一次与员工沟通很好的机会。一定要注意选择一些宽松的环境,不仅是指氛围,更重要的是心态。最好是每个月一次,最少呢是一个季度要进行一次,如果像杰克韦尔奇那样管理大团队的话,只要注重高级管理人员就够了。 绩效沟通的出发点是要高效沟通的我们其实主要注重的就是项目进度,如何了解员工的工作思路,还有需要什么样的支持。 这些是我们作为管理者要沟通的重点方向。 第五步,沟通心态 在这个步骤里面,我们需要的是激发下属的潜力。其实下属与上司沟通的机会并不多,我们要把握住这个机会让他们可以展示自己过往工作中的突出业绩,以及处理事情的思维逻辑。进而展示出我们对他们的认可。任何人当被谈论到有需要改善的地方的时候,都会变得惶恐,手足无措。啊在这里我们需要表现得就是要有一个真诚的态度,要本着对事不对人的原则,同时要表达出希望他能够获得成功的这种趋势。这些都很重要。 第四和第五共同构成了,我们需要共同努力,建立一个良好的工作环境的基础。 第六步,相关的绩效培训 帮助员工理清问题,在绩效的环节当中,会对工作和收入有什么样的影响,需要我们领导层面进行一个正面的引导。 培训的形式就很多啦,不做赘述。 关于绩效考核的形式也有很多,感兴趣的朋友可以去mindmaster思维导图社区下载思维导图源文件查看。同时感兴趣的各位可以把源文件保存下来,打印也是可以的咯。今天的分享就到这里。 << 点击查看思维导图原图 软件推荐:MindMaster 可谓是思维导图软件中的新秀。界面设计更加时尚大方,超大的操作按钮图标,即便是零基础用户都可以快速上手;功能颇具特色,让学生用户可以用上甘特图、幻灯片以及鱼骨图等功能。MindMaster提供免费基础版,自带海量的符号和精美的例子,无需联网,就能找到合适的图标和模板,高效完成导图的绘制工作。 更多特点 1、适用于Mac、Windows以及Linux三大操作平台; 3、功能和易用性堪比国外的MindManager软件; 4、模板、例子以及剪贴画素材比较丰富,特别是内置科学用的图形符号; 5、支持云协作和云分享; 6、可切换为黑色护眼的模式。 软件下载地址: 点击即可下载免费思维导图软件

August 8, 2019 · 1 min · jiezi

医学思维导图讲解绘制软件那个好

要想成为一名合格的医生,背书还真是一道绕不开的坎,作为一名医学生,背书背到崩溃是生活的常态。面对那些种类繁多的药品名称,各种数据症状和临床表现,简直崩溃有木有。其他专业背书好歹能画个重点,但是医学你想找重点?不存在的,病人的病可不会挑重点给你治。什么?你问我怎么才可以提高背书的效率?思维导图记忆法一起来了解下! 什么是思维导图?思维导图又叫心智图,是一种用来提高大脑逻辑思维能力的工具 ,它简单而又及其有效。如今在很多地区和国家都掀起了一股思维导图的热潮,越来越多的人都在学习使用思维导图。他已经被应用于生活中的方方面面,包括学习笔记、做决策、计划、会议记录、演讲、写作等,都可以看到思维导图的影子。 如何借助思维导图把书读薄?大家都知道,学医的要背的书通常都是一本比一本厚,要是没点技巧光靠死记硬背是很难背下来的,所以我们需要借助思维导图拆书法来将这些书读“薄”。 我们可以通过建立联想记忆,之后只记忆标题,当提及标题的时候联想扩展到各个知识点。读到最后,呈现在你思维框架内的只有大块的模块与线索,类似一个索引目录一样。你的知识体系框架基本确立,不再拘泥于某一个点,而是通透,全面地审视一个学科,这个过程就是将书读薄。 当然了,理想的高效背书模式,还是建立在平时努力的基础上的,临时抱佛脚什么方法都很难帮你,如果你对这种背书方法已经跃跃欲试的话,可以点击此处来获取免费的思维导图软件。 软件推荐MindMaster 可谓是思维导图软件中的新秀。界面设计更加时尚大方,超大的操作按钮图标,即便是零基础用户都可以快速上手;功能颇具特色,让学生用户可以用上甘特图、幻灯片以及鱼骨图等功能。MindMaster提供免费基础版,自带海量的符号和精美的例子,无需联网,就能找到合适的图标和模板,高效完成导图的绘制工作。 更多特点 1、适用于Mac、Windows以及Linux三大操作平台; 3、功能和易用性堪比国外的MindManager软件; 4、模板、例子以及剪贴画素材比较丰富,特别是内置科学用的图形符号; 5、支持云协作和云分享; 6、可切换为黑色护眼的模式。 点击即可下载免费思维导图软件 温馨提示:>> 点击进入思维导图社区,搜索:医学,即可免费获取本文高清版思维导图。

August 8, 2019 · 1 min · jiezi

政治经济学思维导图讲解绘制软件那个好

说到政治的学习,很多人第一个想到的可能都是经济学,经济学作为政治的敲门砖,应该怎么样才能学好呢?经济学的学习中又有了什么“捷径”可以走呢?经济学的知识体系庞大,用思维导图来整理和归纳不失为一个好方法。接下来,小编将用一组思维导图,带大家走近高中的政治经济学,让政治学习变得更简单。 其实在经济学的学习中,我们需要的是抓住“主体”,从主体出发来分析问题,解决问题,那么经济学的主体有哪几个呢?经济学有三大主体,分别是“个人” “企业” “国家”,这一次小编就从三大主体出发,揭秘经济学的“捷径”学习方法。 第一大主体是个人 个人是经济活动的参与者,在经济活动中占据着重要地位,个人又可以分为“四大者”,在学习中我们一定要注意区分“四大者”,不要混淆。 第二大主体是企业 企业也是经济活动的参与者,只是这个的参与力度更大,企业需要注意的是它的生产经营,如果主体是企业一定记得企业是以“盈利为最终目的”的。 第三大主体是国家 国家作为是经济活动的参与者,一定程度上也领导着经济活动的开展,国家部分需要重点理解“四大经济”,即经济政策,经济制度,经济目标,经济措施。 最后,希望在思维导图的“三大主体”的引导之下,大家能够更加领悟经济学,当然小编自己整理的思维导图只是九牛一毛,那么如何获得更多的专业思维导图? 一些大神整理的思维导图要怎么保存下来自己复习呢?想要获取更多政治思维导图要在哪找呢?其实很简单,只要在MindMaster导图社区中搜索关键词即可获得。大多数模板是可以免费下载和使用的,通过MindMaster思维导图软件,你可以对模板进行二次编辑和修改。 点击此处即可免费下载思维导图MindMaster 温馨提示:MindMaster目前已支持Windows、macOS、Linux电脑端系统,以及网页浏览器在线画图,移动版安卓(Android)手机、苹果(ios)手机以及iPad版,只需要注册一个亿图云账号,就能轻松实现文档同步共享。

August 8, 2019 · 1 min · jiezi

第十集-从零开始实现一套pc端vue的ui组件库-计数器组件

第十集: 从零开始实现( 计数器组件 ) 本集定位: 听到计数器这个名字很多人是不是一瞬间没有什么印象, 毕竟这个组件用的比较少,就是那种左边一个'-'右边一个'+', 控制某些数量的时候才会用到, 比如我之前做的商城小程序只有'下单'页面的规格弹出框里面才有他的身影, 如果是涉及到处理商品数量很频繁的业务场景应该会很常见吧, 但是不要看这个组件小, 编写它的时候坑还不少, 本次我们就来做一个计数器, 目标就是尽可能小, 尽可能的省性能. 1:需求分析每次+1 -1是常态, 但是如果搞活动, 每次最少为+-2个或三个, 就要兼容一下了,( 举一个实际遇到的坑, 我们之前把用户限制为每次活动, 每个用户只能买2个, 但是没有做好防备, 导致用户可能这次只买一个, 而下次他再次购买的时候会提示每次只能买两个, 但显示他只点击了买一个, 因为他已经买过一个, 为了兼容这个问题, 搞得还要加莫名其妙的补救代码 )中间的显示区应该可输入的, 用户想买1000个不可能让他+1+1+1..., 某些组件采用的是, 平时其为div, 点击之后变为input, 个人感觉完全没必要, 一个元素就够了, 何必搞两个元素, input状态下把他的默认样式去掉就好了.左右两边要有限制, 很多时候会有限购一说, 比如我做的商城, 库存只有10个 或者单个用户最多购买3个, 最少买两个等等限制.小数位数的显示一说... 这个其实我还真遇到过, 有一种需求叫做, 只要涉及数字就必须精确到后两位, 这种需求会导致后台同学对数据库做一定的限制, 从而我们传给后台的数据也就存在限制了.2: 基本结构:先展示一章普通状态的图, 让我们更直观的去完成它, 造型比较别致, 是本套组件的一个特点, 哈哈做的与别人一样会导致思想的禁锢, 自己写代码多尝试新的东西, 但是工作中一定要中规中矩, 以公司条款为准则. vue-cc-ui/src/components/InputNumber/index.js import inputNumber from './main/input-number.vue'inputNumber.install = function(Vue) { Vue.component(inputNumber.name, inputNumber);};export default inputNumbervue-cc-ui/src/components/InputNumber/main/input-number.vue ...

August 8, 2019 · 3 min · jiezi

vue动画笔记

背景内置的<transition>和<transition-group>组件同时支持CSS和JS钩子过渡和动画的不同:过渡就是从一个状态向另一个状态插入值(从起始状态,到结束状态,再回来)动画不同,可以在一个声明中设置多个状态(比如动画50%的位置设置一个关键帧,然后在70%的位置,也可以设置延迟属性实现复杂运动)CSS过渡假设有一个简单的模态窗。通过点击按钮显示或隐藏模态窗。可以这样做:创建一个按钮的vue实例,在实例中创建一个子组件,设置数据的状态这样可以通过切换布尔值并添加事件处理实现子组件的显示及隐藏。可以使用v-if或者v-show来切换组件的可见性。也可以使用slot放置模态窗的切换状态过渡部分结构:<transition name="fade"> <app-child v-if="isShowing" class="modal"> <button @click="toggleShow"> Close</button></app-child></transition>.fade-enter-active, .fade-leave-active { transition: opacity 0.25s ease-out;} .fade-enter, .fade-leave-to { opacity: 0;}CSS动画所有有趣的动画都是基于enter-active和leave-active可以给每一个实例一个特殊类enter-active-class="toasty"leave-active-class="bounceOut"动画部分结构:<transition name="ballmove"enter-active-class="bouncein"leave-active-class="rollout"><div v-if="isShowing"> <app-child class="child"></app-child></div></transition>对于反弹对画,如果使用CSS的话,需要设置大量关键帧,@mixin ballb($yaxis: 0) { transform: translate3d(0, $yaxis, 0);} @keyframes bouncein { 1% { @include ballb(-400px); } 20%, 40%, 60%, 80%, 95%, 99%, 100% { @include ballb() } 30% { @include ballb(-80px); } 50% { @include ballb(-40px); } 70% { @include ballb(-30px); } 90% { @include ballb(-15px); } 97% { @include ballb(-10px); }} ...

August 8, 2019 · 1 min · jiezi

前端面试每日31第114天

今天的知识点 (2019.08.08) —— 第114天[html] 举例说明HTML5的Canvas元素有什么用途?[css] 为什么要使用css sprites?[js] 写一个把数字转成中文的方法,例如:101转成一百零一[软技能] 你知道什么是B/S和C/S架构吗?说说它们的区别项目地址: 前端面试每日3+1 【推荐】欢迎跟 jsliang 一起折腾前端,系统整理前端知识,目前正在折腾 LeetCode,打算打通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎点个Star, 同时欢迎微信扫码关注 前端剑解 公众号,并加入 “前端学习每日3+1” 微信群相互交流(点击公众号的菜单:进群交流)。 《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。 前端面试每日3+1题,以面试题来驱动学习,每天进步一点! 让努力成为一种习惯,让奋斗成为一种享受!相信 坚持 的力量!!!学习不打烊,充电加油只为遇到更好的自己,365天无节假日,每天早上5点纯手工发布面试题(死磕自己,愉悦大家)。希望大家在这浮夸的前端圈里,保持冷静,坚持每天花20分钟来学习与思考。在这千变万化,类库层出不穷的前端,建议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢迎大家到Issues交流,鼓励PR,感谢Star,大家有啥好的建议可以加我微信一起交流讨论!希望大家每日去学习与思考,这才达到来这里的目的!!!(不要为了谁而来,要为自己而来!)交流讨论欢迎大家前来讨论,如果觉得对你的学习有一定的帮助,欢迎分享! 项目地址: 前端面试每日3+1

August 8, 2019 · 1 min · jiezi

如何实现一个颜色选择器

本文首发于我的博客在开发公司UI组件库的过程中,颜色组件ColorPicker由于时间关系没有去深入研究,看着花花绿绿的色谱图,以为实现起来会很复杂,就直接将一个开源的颜色选择器封装了一下。这大概是半年以前的事了,这篇文章也在我的博客中以草稿形式(只有标题没有内容,当时是做了一个记录,想着后来有时间了去研究,目前这种草稿还有很多????)存放了半年了。前段时间请教了公司UI同事一些颜色相关的概念,又去搜索了下这方面的知识,收获还是蛮大的,尤其是知乎色彩空间中的 HSL、HSV、HSB 有什么区别?这篇提问中,@Forrest近乎大白话的回答,超赞????。 在了解了相关概念之后,再去审视这个组件的话,就不会有那种陌生行业的抵触感了。最终也实现了这个这个组件,DEMO,并将实现过程记录如下: 【解析Photoshop调色器】小章节是基于维基百科和知乎文章对一些颜色概念的总结。开发视角总结的可能并不太专业,了解即可。 解析Photoshop调色器 HSL、HSV、HSB的区别作为前端,我们了解HEX,了解RGB,但对于HSL、HSV、HSB这几个颜色概念往往是模糊不清的。如上图Photoshop的调色器,其中下部分别有H、S、B、R、G、B等几个输入框,R、G、B分别代表红绿蓝三原色的颜色通道,通过对这三个颜色通道的变化以及相互之间的叠加可以得到各种不同的颜色,这是我们所熟知的。那么H、S、B又是什么呢? 事实上,HSB同RGB一样,也是一种颜色模式,其中H(hue)表示色相(什么颜色),S(saturation)表示饱和度(颜色的纯度),B(brightness)表示明度亮度(颜色的明亮程度)。相较于RGB模式,HSB颜色模式更加人性化,它定义了颜色“是什么颜色?颜色艳不艳?颜色亮不亮?”。 什么是色相色相就是在不同的光照下,人眼所感觉不同的颜色。 ”赤橙黄绿青蓝紫,谁持彩练当空舞?“,伟人的诗词早就描绘过了。在HSV/HSL色彩模式下, 色相是以红色为0度(360度),黄色为60度,绿色为120度,青色为180度,蓝色为240度,品红色为300度的表现,其值范围为0 - 360度,如下图: 什么是饱和度饱和度是指颜色的强度或纯度。饱和度表示色相中彩色成分所占的比例,用从 0 (透明) ~ 100% (完全饱和)的百分比来度量。纯度是色彩感觉强弱的标志,纯度高的颜色人眼看上去显得比较鲜艳。 什么是明度明度是颜色的相对明暗程度。通常是从 0 (黑) ~ 100% (白)的百分比来度量的。 同样的,HSL、HSV和HSB一样,都是基于色相、饱和度、明度三方面对色彩的解释。其中HSB 和 HSV 是同一个东西,只是叫法上不同。后面我们统一使用HSV来表示。 对三种颜色模式的区别,知乎上(文末附链接)有个很浅显易懂的回答: 在原理和表现上,HSL 和 HSB 中的 H(色相) 完全一致,但二者的 S(饱和度)不一样, L 和 B (明度 )也不一样: HSB 中的 S 控制纯色中混入白色的量,值越大,白色越少,颜色越纯;HSB 中的 B 控制纯色中混入黑色的量,值越大,黑色越少,明度越高HSL 中的 S 和黑白没有关系,饱和度不控制颜色中混入黑白的多寡;HSL 中的 L 控制纯色中的混入的黑白两种颜色。HSV的三个值表达范围分别为: H [0-360] float S [0-1] float V [0-1] float 上述概念,可能并不太专业,了解即可。 用程序思维来解释上述概念的话,就是说我们在一个颜色中混入不同程度的黑和白就能变为另外一种颜色值,如下图:也就是说,抛开R、G、B三个颜色通道之外,还可以通过色相H、饱和度S、明度V另外三个通道来表达颜色。 ...

August 8, 2019 · 2 min · jiezi

复习CSS实现宽高等比自适应容器

在最近开发移动端页面,遇到这么一个情况:当页面宽度 100% 时,高度为宽度一半,并随手机宽度变化依然是一半。 于是我们就需要实现一个宽度自适应,高度为宽度一半的容器。 这里先以高度为宽度一半为例,也可以是其他任意比例。 一、思考如何实现这个问题类似于:我们在移动端页面,上面有一张宽度 100% 的图片,如果我们没设置高度,则图片会根据原有尺寸,等比缩放。 我们可以借助这个想法,根据元素高度,来为元素设置一个相应比例的高度即可。 二、实现方法1 - 通过 vw 视口单位实现所谓视口单位(viewport units)是相对于视口(viewport)的尺寸而言,100vw 等于视口宽度的 100%,即 1vw 等于视口宽度的 1%。 我们就可以利用这个特性,实现移动端的宽高等比自适应容器。 HTML代码: <div class="box"> <img src="http://images.pingan8787.com/2019_07_12guild_page.png" /></div>CSS代码: *{ margin:0; padding:0}.box{ width:100%; height:51.5vw}.box img{ width:100%; }为什么 .box 高度为 51.5vw 呢?原因是图片原来的尺寸是 884 * 455的宽高比例,即 455 / 884 = 51.5%。 这个方法相比原来图片的等比缩放,有个优点:无论图片是否加载成功,容器高度始终是计算完成,不会造成页面抖动,也不会造成页面重绘,从而提升性能。 下面看看这种情况下,图片加载成功和失败的对比: 三、实现方法2 - 通过子元素 padding 实现通过设置子元素的 padding 属性来实现,是比较常用,也是效果比较好的一种,这里需要理解的是:子元素的 padding 属性百分比的值是先对父容器的宽度而言。 这里看下面代码和效果图理解下: HTML代码: <div class="box"> <div class="text">我是王平安,pingan8787</div></div>CSS代码: .box{ width: 200px;}.text{ padding: 10%;} ...

August 8, 2019 · 1 min · jiezi

常用元素水平垂直居中方案

flex实现水平垂直居中适用场景:父子宽高都可未知(比较推荐这种方式,简单,而且目前兼容性也不错。) <html> <head> <style> .parent { width: 100%; height: 100px; background: cyan; display: flex; justify-content: center; align-items: center; } .son { width: 20%; height: 20%; background: pink; } </style> </head> <body> <div class='parent'> <div class='son'></div> </div> </body></html>绝对定位加上负margin适用场景:父元素宽高已知未知都行,但是首先得有宽高。其次子元素的宽高必须已知,因为需要设置子元素的负margin. (也可以将负margin设置成translate来做位移实现) <html> <head> <style> .parent { position: relative; width: 200px; height: 200px; background: pink; } .son { position: absolute; left: 50%; top: 50%; margin-left: -25px; margin-top: -25px; width: 50px; height: 50px; background: yellow; } </style> </head> <body> <div class='parent'> <div class='son'></div> </div> </body></html>绝对定位 + auto margin适用场景:父子元素宽高都未知的情况(该方式不需要明确知道子元素宽高,子元素宽高可用百分比,对于子元素宽高不确定需要居中的情况比较适合。) ...

August 7, 2019 · 2 min · jiezi

CSS-常用布局在小程序中的应用

CSS 常用布局在小程序中的应用所有css布局的根本都是3个基本概念:定位、浮动、外边距操纵我们其他的布局实现方式,都是基于正常的文档流来进行的。所以我们先来看看什么是正常的文档流。 正常文档流(Normal Flow):正常布局流是指在不对页面进行任何布局控制时,浏览器默认的HTML布局方式。默认的文档流,确保在没有任何css样式的时候,还能够正确的渲染和显示内容。使页面具有比较好的可读性以及合理性。(position display float table flex-box grid-layout)默认情况下,元素是如何布局的? (引用自 https://developer.mozilla.org)首先,取得元素的内容来放在一个独立的元素盒子中,然后在其周边加上内边距、边框和外边距。(盒子模型)一个块级元素的内容宽度默认是其父元素的100%,其高度与其内容高度一致。行内元素的height width与内容一致。你无法设置行内元素的height width。 如果你想控制行内元素的尺寸,你需要为元素设置display: block; (或者,display: inline-block; inline-block 混合了inline 和 block的特性。)那独立元素之间又是如何相互影响的呢? 正常布局流是一套在浏览器视口内放置、组织元素的系统。默认情况下,块级元素按照在文档中书写出现的顺序放置 --- 每个块级元素会在上一个元素下面另起一行,它们会被设置好的margin 分隔。行内元素的表现有所不同 --- 它们不会另起一行;只要在其父级块级元素的宽度内有足够的空间,它们与其他行内元素、相邻的文本内容(或者被包裹的)被安排在同一行。如果空间不够,溢出的文本或元素将移到新的一行。如果两个相邻的元素都设置了margin 并且两个margin有重叠,那么更大的设置会被保留,小的则会消失 --- 这被称为外边距叠加。我们在传统的css布局当中,不管是css2还是css3,大致囊括了静态布局、流式布局、弹性布局、自适应布局、响应式布局、网格布局。对于css的这些布局方式,在小程序中又是怎样的呈现方式呢?我们分别来看一看。 1. 静态布局 (Static Layout)固定宽度布局。宽度以像素为单位。(当然我们还可以使用其他的绝对长度单位)缺点:无论窗口多大,尺寸不变。无法充分利用空间。行长和文本易读性不好。静态布局就是传统的网站形式:对于PC设计一个居中布局,窗口缩小时,内容被遮挡,呈现横竖向滚动条。对于移动设备,单独建立一个m.域名及相应的移动网站。静态布局在小程序中一般很少出现。因为如果使用静态布局,就无法做到不同屏幕自适应,750px的设计稿在小屏幕的手机上就会出现滚动条。 呈现效果如下: // wxml 代码<view class='page'> <view class='header'>静态布局</view> <view class='content'> <text>静态布局内容部分在小程序中的呈现。小程序page样式在overflow-x上默认是hidden。</text> </view></view>//样式如下page { overflow-x:scroll;}.page, .header, .content { width: 750px;}.content { background: #ccc;}2. 流式布局 (Liquid Layout)(百分比布局)流式布局是页面元素的宽度按照屏幕分辨率进行适配调整,但整体布局不变。使用百分比实现:流式布局能够相对于浏览器窗口进行伸缩。缺点:窗口宽度较小,行变得非常窄,很难阅读。需要设置min-width来解决,但是如果min-width较大的话,也会有静态布局相同的限制。宽度太宽,同样会存在行长过长的问题。流式布局(Liquid)的特点(也叫"Fluid") 是页面元素的宽度按照屏幕进行适配调整,主要的问题是如果屏幕尺度跨度太大,那么在相对其原始设计而言过小或过大的屏幕上不能正常显示。我们来看看在小程序中使用流式布局的效果: 在不同的屏幕大小下呈现出来的效果如下: <!-- wxml代码 --><view class='page fluid'> <view class='header fluid__header'>流式布局</view> <view class='content'> <!-- 两列 --> <view class='wrapper'> <view class='grid-item grid-half'> <text>我是左侧部分</text> </view> <view class='grid-item grid-half'> <text>我是右侧部分</text> </view> </view> <!-- 三列 --> <view class='wrapper'> <view class='grid-item grid-three'> <text>我是左侧部分</text> </view> <view class='grid-item grid-three'> <text>我是中间部分</text> </view> <view class='grid-item grid-three'> <text>我是右侧部分</text> </view> </view> </view></view>/* css代码 */.fluid, .content, .wrapper { width: 100%; box-sizing: border-box;}.wrapper { height: 200px; margin-bottom: 20px;}.wrapper .grid-item { height: 100%; background: #ccc; display: inline-block; box-sizing: border-box;}.wrapper .grid-half { width: 48%;}.wrapper .grid-half:nth-child(2n) { margin-left: 4%;}.wrapper .grid-three { width: 32%;}.wrapper .grid-three:not(:first-child) { margin-left: 2%;}3. 弹性布局 (Flex Layout)CSS 弹性盒子布局是 CSS 的模块之一,定义了一种针对用户界面设计而优化的 CSS 盒子模型。在弹性布局模型中,弹性容器的子元素可以在任何方向上排布,也可以“弹性伸缩”其尺寸,既可以增加尺寸以填满未使用的空间,也可以收缩尺寸以避免父元素溢出。子元素的水平对齐和垂直对齐都能很方便的进行操控。通过嵌套这些框(水平框在垂直框内,或垂直框在水平框内)可以在两个维度上构建布局。对Flex的理解可以参考阮一峰 Flex 布局教程:语法篇。在此不做详细说明。那我们看看在小程序中Flex布局的使用。依然还是上一个例子中的wxml,我们只需要修改对应的class以及css即可。 ...

August 7, 2019 · 2 min · jiezi

更快助你弄懂React高阶组件

谈到react,我们第一个想到的应该是组件,在react的眼中可真的是万物皆组件。就连我们获取数据用到的axios也可以用组件来表示...比如,我们可以这样封装 <Request instance={axios.create({})} /* custom instance of axios - optional */ method="" /* get, delete, head, post, put and patch - required */ url="" /* url endpoint to be requested - required */ data={} /* post data - optional */ params={} /* queryString data - optional */ config={} /* axios config - optional */ debounce={200} /* minimum time between requests events - optional */ debounceImmediate={true} /* make the request on the beginning or trailing end of debounce - optional */ isReady={true} /* can make the axios request - optional */ onSuccess={(response)=>{}} /* called on success of axios request - optional */ onLoading={()=>{}} /* called on start of axios request - optional */ onError=(error)=>{} /* called on error of axios request - optional *//>在项目中我们可以这样写 ...

August 7, 2019 · 3 min · jiezi

程序员也要懂的一些保险和理财知识

前言首先,这不是一篇科普文, 关于保险和理财的一些`基本概念不会过多解释` 。这篇文章主要是这段时间以来,我`个人的一些总结和收获`, 比较浅显,毕竟不是专业的, 分享给大家看看, 献丑了。楼主是个小财迷, 从大学起就在培养理财方面的意识, 付出了一些实践,也取得了一些收获。 在校期间, 从大二起,做了三份家教,大四实习, 加上拿到的四年各类奖学金,16年毕业的时候,已经存了十万块。 (可惜, 智商不够,当时没买比特币, 三十倍啊啊啊啊啊啊, 错过了一套房.) 毕业之后, 就在厂里搬砖。 几点保险的常识大学期间, 我就开始购买保险, 不过都是小打小闹, 买的都是一年期的意外险。 19年年后, 手里也有一些钱了,就考虑配置一套保险, 也做了很多功课, 有几个常识还是需要提一下: 五险一金中的五险, 就是我们常说的那个社保,包括:养老保险, 医疗保险, 工伤保险,生育保险 和 失业保险。社保只是最最最基本的保障, 保障范围十分有限,我们有必要给自己配置一份商业保险。 商业保险分四大险种: 重疾险, 医疗险, 寿险, 意外险。保险的本质 在于转嫁风险, 避免意外发生时给家人造成巨大的经济损失。保险配置应该优先考虑家庭经济支柱。买保险, 要结合自己的实际情况, 最好做一下财务分析,根据自己的实际财务状况选择最合自己的保险。年前买了份平安福,每年2万, 缴费期30年。 但是我犹豫期退保了, 因为看了保险合同之后, 觉得很不划算。 后来经过一番学习和咨询, 请了保险规划师,最终选定了一套组合方案, 在这里和大家分享一下: 重疾险, 基本保额50万(线上投保总保费不能超过20万, 我就拆成了2份。) 嘉多保, 基础保额30万, 终身。百年康惠保, 基础保额20万, 到70周岁定期寿险 大麦定期, 基本保额50万,到70周岁医疗险 平安e生保, 基本保额300万, 一年期。意外险 百万身故保险计划, 基本保额100万, 保意外伤害和意外身故比较亲民的配置,一套组合下来,一年的费用大概是8400块, 不算贵。 也就是我一年工资的 * 分之一。 ...

August 7, 2019 · 1 min · jiezi

工艺流程图用什么软件做

工艺流程图(简称PFD),是用图表符号表达产品从原料到成品完成整个工艺过程中所做工作的图示。 通过工艺流程图绘制,目的是指导我们更好的检视生产和操作工作。我们很容易发现工艺制作中那些重复和遗漏的环节,便于我们对生产工序的优化和改善,从而充分发挥工业设备的利用率。 工艺流程图绘制工具:亿图图示 无论是设计师、工艺员,还是中控控制室的主操人员,除了掌握专业知识之外,能绘制工艺流程图也是关键的技能。在画工艺流程图过程中,我们需要用到对应的设备、仪表、阀门和管道之类的图形,那么在选择绘制工具时,就要严格选择具有丰富符号库和模板的绘图软件,可以让我们在绘制的时候更轻松、方便。 绘制工艺流程图步骤 工欲善其事必先利其器,小编以亿图图示绘图软件为例,教大家快速绘制出完整的工艺流程图。首先打开亿图图示软件,点击“新建”选中“工业自动化”,会出现很多模板可供选择,选中心仪的模板即可。 跳转进入到画布页面,简洁的页面设计很容易让我们发现画布周围的工具栏。选中需要修改的符号,在左侧的符号库中,拖动出所需新的符号,修改好文字注释并用连接线连接起来即可。最后记得将画好的工艺流程图保存导出需要的格式,还可以直接打印出来,非常方便!

August 7, 2019 · 1 min · jiezi

产品经理画流程图的工具

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

August 7, 2019 · 1 min · jiezi

H3BPM关于钉钉免登失败的处理

企业钉钉的免登陆验证失败 处理方案钉钉后台配置1.首先创建H5应用 2.配置信息 3.H5应用设置白名单出口(服务端出口ip) H3BPM后台配置1.后台管理参数设置 2.钉钉同步可以同步H3BPM用户到钉钉组织机构 常见问题 1.jsticket 失效 错误码 52011 确认ip白名单是否正确 需要重启引擎 2. 52013 签名校验失败 请检查“url, nonceStr, timestamp, ticket”等参数是否正确 检查钉钉配置的url和请求的url是否一致 3.登录无权限 确保钉钉的用户id 和h3bpm内的登录账户一致

August 7, 2019 · 1 min · jiezi

流程图的绘制软件

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

August 7, 2019 · 1 min · jiezi

把富文本的-↵-转为br标签

例如:"我家孩子在SayABC小班课↵跟小伙伴们一起互帮互助,↵合作竞争,学习更加有动力!↵从简单的单词到句型和场景对话,↵孩子越来越敢于开口说英语啦![耶]↵扫码立即领取外教课[爱心]↵让孩子从小与世界接轨~" 需要转为才能被html识别,并且换行。可以这样做。 ‘↵’是回车符'/n',这段内容是通过textarea人为编辑,提交给后端保存的。编辑框中可以识别的字符,在普通的标签里面没办法识别到,所以要转换成可以识别的<br/> 方法1string.replace(/(rn|n|r)/gm, "")然后再用v-html=转换之后的string,就可以正常展示换行了 方法2第二种方法是用 <pre></pre>标签,<pre> 标签的一个常见应用就是用来表示计算机的源代码。可以识别字符串中的‘/n’,‘/r/n’, 制表符,空格... 方法3第三种方法是用<textarea></textarea>展示,这样那边编辑的什么,这边就会显示什么

August 7, 2019 · 1 min · jiezi

用键盘8个键演奏一首蒲公英的约定送给996的自己或者一首月亮代表我的心给七夕的她

体验地址: https://wscats.github.io/pian...项目地址: https://github.com/Wscats/piano 用键盘8个键演奏一首蒲公英的约定送给996的自己或月亮代表我的心给七夕的她,非常简单~ 这个项目仅仅用了几个简单的前端技术实现,献给每一位挚爱音乐的代码家???? 如果你喜欢或者对你有帮助,给我点个赞支持下吧???? 技术点和目录结构项目中没有使用市面主流的框架(React,Vue 和 Angular )和热门的技术,而用的是Omi框架(JSX+WebComponents),还有 Omil 的单文件组件 SFCs 加载器,组件通讯基于Proxy特性,并结合了 VScode 的插件 Eno-Snippets基于AST和正则实时编译.eno或.omi 后缀组件减轻部分的 Webpack 的局部编译压力,当然其他同学们熟知的技术这里就不提及了。 src assetselement app-piano songs 钢琴简谱目录app-piano.eno 单文件组件app-piano.js 组件编译后的JS文件notes.js 键盘按键和音符的映射index.js 组件根容器,配置Proxy的通信方法public samples/piano 钢琴单音符素材app-piano.eno开发中你需要编写的单文件组件app-piano.js经过Eno-Snippets修改或者保存文件Hello.eno后经过插件转化的js文件如下图,左边的代码是我们编写的 .eno 后缀的单文件组件,右边是经过 Eno Snippets 生成的 .js 后缀文件。 Develop & Installation<!-- <img src="./public/demo.png"> -->开发,构建和运行。 # 获取远程仓库代码git clone https://github.com/Wscats/piano# 进入目录cd piano# 安装依赖npm install# 启动项目npm start# 在浏览器访问 http://localhost:3000使用 npm 包管理器安装。 npm install omi-piano运行或者发布属于自己的演奏版本。 # 进入目录cd omi-piano# 安装依赖npm install# 启动项目npm start# 发布自已的演奏版本npm run build简单乐理知识首先我们先补习点音乐基础,提前收集好最基本的钢琴单音素材,每个音符对应一份.mp3文件,用一个对象记录起来,类似下面这样,举个例子这里的A指的是CDEFGAB音名中A也就是Sol,这是最基本的乐理,有没有让你想起小时候上音乐课,画板上的五线谱。 ...

August 7, 2019 · 7 min · jiezi

反思我使用ID选择器时应该考虑这些问题

ID选择器是否唯一?有没有在css中使用大量的ID选择器?作为一个小白,从接触前端开始就铭记ID选择器的值唯一,所以在自己编写代码时严格遵循。但是最近工作需求修改前辈代码时发现项目中有很多多ID重名的情况,甚至在平时查资料的时候也会看到。怀疑自己对id的认知是否明确,所以查阅资料,在此做个总结,规范自己。 单个html中的id选择器值要唯一你会发现重名后的ID选择器对页面样式等都没有影响,因为这样书写没有语法错误,但是这种写法是不规范的,当使用document.getElementById('*')是只能获取到第一个被ID选择器标记的元素。 css中尽可能少的使用id选择器,一般为了实现功能,少些一个class,我也会用id选择器定义元素的样式,不知这种方式会不会有什么问题?

July 16, 2019 · 1 min · jiezi

代码质量把控和项目进度之间的平衡

作为前端负责人,很多时候发愁的不是写好代码,而是怎么让身边水平较差的小伙伴能写出好的代码另外,你还要保证项目的进度,所以代码质量和项目进度之间有着天然的矛盾,怎么去平衡值得我们去思考,以下是我的一点经验代码质量由以下几个方面来保证代码风格问题,由工具和强制规范去解决,eslint + prettier + 代码规范(ts部分需要完善)code review,现在主要是由我来看, 后面开放给每个人,我会整理checklist,来协助大家reviewCI (结合gitlab,但是还没有做起来)在项目进行中不断重构(现在我就是这么干的),特别是在原有功能上新增功能,势必会对老代码进行修改,这是重构的大好机会。封装公共的组件库,这样让别人可以很方便的用你写的库,减少了让别人写烂代码的机会在框架架构层面把代码写好,让大家在框架内写代码的时候减少写烂代码的机会具体来谈谈code review现在每个人的代码我都会review,但是我不可能把很多时间放在上面,所以有时候不满意的地方,我会降低要求,直接放过了。所以这中间需要一个取舍,哪些是要严格要求的,哪些是可以不管的。 对变量命名上绝对要严格,而且这是非常容易修改的地方,大家也都愿意改对于代码行数,如果超出行数导致代码过于复杂,难以维护,一定要提出拆分对同一个需求在实现上不同,只要对方的实现没有特别大的漏洞,都可以接受在代码实现度上有更好的方案,可以采取建议的方式,而不是直接否决也要看人,有的人能接受别人的建议,有的人听不得半点否定的东西,要区别对待好代码不一定是写出来的不一定。假如你是做业务逻辑的。首先,好代码可能是聊出来的。比如需求确认这一块,多问多画流程图少动手。就可以减少后期很多麻烦事情。如果在没有理解透需求的情况下动了手,就会做得越多,错的越多。我相信很多工程师都有这种感觉。其次,好代码可能是边读边写出来的。回顾一下一天的工作,你会发现,不管是,你写文章,或者是做一些其他的东西。读代码,大部分都是跳转代码,文件内跳转,文件外跳转,分屏浏览。在这个过程中不断整理和梳理原有的概念。最后落实到代码上。代码的直接修改。占到你很少的时间。最后,好代码是改出来的。

July 16, 2019 · 1 min · jiezi

又是一波前端知识点总结

总结的点都杂七杂八,但愿能找到对你有所帮助的,没有的也没关系嘛!????1. vue强制渲染某个组件$forceupdate 使 Vue 实例重新渲染。注意它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件。由于某些场景 $forceupdate 不起作用,所以用下面的hack方法。一般来说,这种强制渲染某个组件的情况不多,在组件内部应该处理好内部的渲染。 这个例子还是因为使用某个库后发现了一个bug,后面才想到以下hack方法的。 <my-comp v-if="show"></my-comp><script>data() { return { show: true }},methods: { reRender() { this.show = false this.$nextTick(() => { this.show = true }) }}</script>必须用v-if,v-show不行在$nextTick回调中重新赋值,否则vue会忽略show的第一次赋值2. vue里的ref和v-for一起使用时,得到的引用将会是一个包含了对应数据源的这些子组件的数组当 ref 和 v-for 一起使用的时候,你得到的引用将会是一个包含了对应数据源的这些子组件的数组。<div v-for="item in list" :ref="item.code" @click="handleClick(item.code)">{{item.title}}</div>handleClick(code) { ~~let dom = this.$refs[code]~~ // 错误的写法 let dom = this.$refs[code][0]} vue的一些api在特殊情况下会出现不一致的情况,这点比较蛋疼,需要对文档比较熟悉。 3. Gitlab不仅仅可以作为代码仓库,还可以作为项目管理工具,通过标签,里程碑,提交历史,代码审核流程等。以后在公司里,如果做项目管理或者code review都可以用gitlab来做。 4. css 背景图片background-size的几种适用范围css 背景图片background-size的几种适用范围 5. 作为TL,安排工作计划,协调各种资源也是需要花费时间的,这些时间需要考虑在内,必然会减少编写代码的时间。这一点要清楚。6. 怎么评估工期需求非常明确而且经常这样做:自己评估时间 * 1.5需求不够清晰,有可能变,但是代码和技术方案熟悉:自己评估的时间 * 2需求不够清晰,代码和技术方案也是新的,需要探索:自己评估的时间 * 2.5 or 3自己评估的时间一般会留点 buffer,自我感觉应该没问题,实际上开发过程可能会有各种会议、需求和技术方案变更或者突发事件。所以多留一点 buffer 会更好,因为这个时间点可能是下游运营活动上线时间点,评估后业务方觉得太长可以砍需求拆成两期或者调整上线预期,但一旦设置了时间点,不应该跳票。如果你比预期早完成上线,皆大欢喜,如果你一次次的告知业务方还需要延期一两天,效果正好相反。7. 无缝滚动组件无缝滚动组件 ...

July 16, 2019 · 2 min · jiezi

什么是AI云推广

如今互联网环境在改变,客户的选择越来越多,客户的体验度也日益上升,在无形中增加了很多商家与企业的无效投入。在我们面对互联网速度发展的今天,中国三千万中小企业无时无刻不在承受巨大压力。很多企业渐渐开始在变中求生存,而在生存的列表里,网络推广、智慧营销、资金流则是各企业排名在前列的需求痛点。而AI云推广经过这两年的研发与改进,在17年底全面升级,全国首创将AI(人工智能)大数据融入企业营销,推出国内第一个智能营销推广应用机器人,AI云推广全网营销将要面临的是日益精准、精细,甚至是精明,我们不妨说这是一种变得越来越精明的营销。AI云推广系统是通过互联网云计算实现百度电脑端、百度手机端、360、搜狗等搜索引擎的快速排名技术。通过该技术可以实现3-7天在搜索结果首页达到2000-1万个关键词排名。AI云推广系统改变了传统SEO/信息群发/竞价等传播方式,是新一代“简单”“智能”“精准”“高效”全网霸屏云推广营销统。AI云推广系统排名稳定,关键词无限制发布,全国投放,能有效提高企业知名度,品牌曝光率,达到推广的效果,真正解决客户的网络营销困惑! 搜索AI云推广系统的特点 一、快 关键词上线快,3-7天登陆各大搜索引擎首页!二、多 关键词数量多,万词上线,3-7天可达到2000-1万,30天内达到1万关键词以上!三、霸屏 关键词霸屏展示,百度、搜索、360等搜索引擎首页霸屏展示,3-10条信息展示!搜索AI云推广系统的优势一、不限制关键词 AI云推广系统上线关键词多,能匹配更多精准关键词。二、效果明显 企业可以一键查询关键词排名,排名报表一目了然,随时随地关注排名效果。三、无须重新建站 AI云推广不需要从新建站,展示形式是H5页面。四、排名快 当天提词,隔天排名,后期关键词可达1000-1万词以上!五、排名稳定,随意点击不扣费 效果现在,费用可控!六、投放地域广、时间长 全国范围无差别投放,全天24小时推广!七、搜索引擎全覆盖 无论是百度PC端、移动端还是搜狗、360等多个搜索引擎,全部关键词排到首页。八、超高转化率 点击之后直接展示H5官网,提升转化率。九、后台工单系统 加强后期维护,无缝对接。十、流量统计系统 流量统计清晰,加强客户效果监控与查看。十一、微信小程序及微官网 增加新媒体微信端搭建及推广。十二、媒体软文发布系统 全国各个区域,全天24小时! 来源:多享科技

July 16, 2019 · 1 min · jiezi

IIFE立即执行函数

区别functionIife最左边为(。编译器认为是iife,不是函数。 IIFE的目的是为了隔离作用域,防止污染全局命名空间 弥补scope的缺陷 用于隔离作用域全局作用域 块级作用域 函数作用域只有function才能实现作用域隔离,因此如果要将一段代码中的变量、函数等的定义隔离出来,只能将这段代码封装到一个函数中。 将代码封装到函数中的目的是为了复用。在JS中,当然声明函数的目的在大多数情况下也是为了复用,但是JS迫于作用域控制手段的贫乏,我们也经常看到只使用一次的函数:这通常的目的是为了隔离作用域了!既然只使用一次,那么立即执行好了! IIFE构造单例模式 JS的模块就是函数,最常见的模块定义如下:functionmyModule(){ varsomeThing="123"; varotherThing=[1,2,3]; functiondoSomeThing(){ console.log(someThing);} functiondoOtherThing(){ console.log(otherThing);} return{ doSomeThing:doSomeThing,doOtherThing:doOtherThing}} varfoo=myModule();foo.doSomeThing();foo.doOtherThing(); varfoo1=myModule();foo1.doSomeThing();如果需要一个单例模式的模块,那么可以利用IIFE:var myModule=(functionmodule(){ varsomeThing="123"; varotherThing=[1,2,3]; functiondoSomeThing(){ console.log(someThing);} functiondoOtherThing(){ console.log(otherThing);} return{ doSomeThing:doSomeThing,doOtherThing:doOtherThing}})(); myModule.doSomeThing(); myModule.doOtherThing()

July 16, 2019 · 1 min · jiezi

移动端web前端实用小技巧

及时搜索onchange 需要input onblur之后触发,不能满足及时搜索需求keypress 键盘点击及时触发,但是鼠标复制粘贴就不是很好了,input oninput是标准事件,当input元素value值发生改变时触发onpropertychange是当前对象发生改变,ie专属(例如 input textarea)均可用文字溢出显示省略号css 解决 text-overflow:ellipsis;overflow:hidden;white-space:nowrap; 如果是行内元素 加一个display:block; 有的时候,移动端会因为设置了这个 块级属性而改变对齐方式,可以选择js控制 js substring 截取固定字符串,用...代替 即可 解决ios滑屏兼容css:-webkit-overflow-scrolling:touch;-webkit-transform: translate3d(0,0,0); 清除a标签 移动端闪烁效果清除所有a标签在点击时出现的特效:a{ -webkit-tap-highlight-color:rgba(255,0,0,0);} 清除click事件闪烁效果event.preventDefaule()阻止默认事件,如果有冒泡事件,还需阻止冒泡事件,event.stopPropagation() JS永动机原理“永动机”顾名思义就是一直运动的机器,原理是setIntval(function(){},time),显示器渲染速度在1000ms 60z左右为最佳,再快也渲染不上,所以time设置成为20最好, 而控制时间部分,如果是20的整数倍可以用次数来叠加例如: var num=0setIntval(function(){ num++ if(num==5){ alert("100ms") ,ps:这个方法为下等 }},20)第二种方法是用 new Date() 获取客户端当前的时间,通过getTIme()转化成毫秒,通过当前时间的改变来 执行你需要的方法例如: var lasttime=0;setIntval(function(){ var curtime=new Date().getTime() if(curtime-lasttime>=1000){ alert("1s执行一次") lasttime=curtime }},20)永动机很适合做游戏执行部分,感兴趣的小伙伴可以关注留言跟小编一起探讨一下 作者:易企秀——王明

July 16, 2019 · 1 min · jiezi

讲清楚基础系列css布局

两列或三列布局使用flexfloat左右position:absolute,中间margin-left,margin-right圣杯和双飞翼布局,都是为了实现一个两侧宽度固定,中间宽度自适应的三栏布局。<!-- 圣杯布局:column左浮动center宽度100%,否则会导致高度坍塌left使用负外边距margin-left:-100%,然后使用相对定位定位到最左边right直接使用负边距居右--><header id="header">header</header><main id="container"> <div id="center" class="column">center</div> <div id="left" class="column">left</div> <div id="right" class="column">right</div></main><footer id="footer">footer</footer><!-- 双飞翼--><header id="header">header</header><main id="container" class="column"> <div id="center">center</div></main><aside id="left" class="column">left</aside><aside id="right" class="column">right</aside><footer id="footer"></footer>垂直水平居中水平居中text-align:center和块级元素的margin:0 auto;table方案,(IE8+)<style>.table{ display:table;}.cell{ display:table-cell; text-align:center; vertical-align:middle;}</style><div class="table"> <div class="cell"> <img src="http://p0.qhimg.com/t01c430356016e16a2c.png" alt="" /> </div></div>absolute+margin:auto方案,兼容主流的浏览器;但是需要定义父容器的高度,否则子元素绝对定位会导致父元素的坍塌。.absolute-aligned { position: relative; min-height: 500px; background: hsl(200, 100%, 97%);}.absolute-aligned img { margin: auto; position: absolute; top: 0; left: 0; bottom: 0; right: 0;}absolute+translate,(IE9+),同样需要设置父元素的高度.center { background: hsl(180, 100%, 97%); position: relative; min-height: 500px;}.center img { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 30%; }Flexbox方案.center { background: hsl(240, 100%, 97%); display: flex; justify-content: center; align-items: center;}calc方案,IE9+,更适合子元素宽高固定的情况// 50%是父元素的中心点,减去图片宽度和高度的一半从而达到定位效果.calc { background-color: hsl(300, 100%, 90%); min-height: 350px; position: relative;}.calc img { width: 100px; height: 100px; position: absolute; left: calc(50% - 50px); top: calc(50% - 50px);}

July 16, 2019 · 1 min · jiezi

highcharts大数据显示

今日分享基于highcharts的地图,柱状图及饼图设计界面中的图表均是模拟ajax请求json格式完成图形渲染。界面设计为响应式设计,可适配不同尺寸大小的屏幕。效果图展示: 饼图位于second.html 代码下载地址:https://github.com/zhangshuan...(图表若无法显示,可放于服务器测试。)

July 16, 2019 · 1 min · jiezi

svg-线条动画

<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg&quot;> <line x1="10" y1="10" x2="10" y2="90" /><polyline points="30,0 30,90 80,90" fill="none" stroke="black" stroke-width="4"/></svg> <style>svg { background: #ccc;}svg line { /* stroke: #999; */ stroke-width: 4; fill: none;}@keyframes depict { from { stroke: red; stroke-dashoffset: 200; } to { stroke: red; stroke-dashoffset: 0; }}svg polyline{ stroke-dasharray: 200; animation: depict 2s linear 0s 1 normal forwards;} </style>

July 16, 2019 · 1 min · jiezi

实用浏览器调试技巧动画节点删除节点增加

今天分享一些平时不常用,但总有一天你会用到的浏览器调试技巧。先来看一个H5页面,下面是地址http://liticool.info/wsvist/i... (订阅号里无法跳转外部链接的话请复制此链接在微信中打开liticool.info/wsvist/index.html#/?sharekey=0a4384df4f65b6b47a74f76f8f3f3e1d&source=wxd56b51346bc8cbfc)我是在微信中看到这个H5场景的,看到了里面酷炫的动画。就想看看这个效果是怎么实现的,然后我把地址复制到了浏览器中,我的踩坑之路也就此开始了。 坑1:当我把链接复制到浏览器之后,发现在浏览器中一直显示一个loading。不能正常观看。 思考:为啥在微信中可以,在浏览中就不行呢?然后立马想到了用微信开发者工具打开,果然好使。可以看到酷炫的动画了。然后我F12打开调试工具,选取其中一个dom元素。准备看它的css代码。但是问题又来了。 坑2:dom元素一直在动,css代码也一直在变。 经过高人指点:点击关闭按钮旁边的三个点->Moretools->Animation.你会发现出现一个新的面板,点击那个暂停按钮。你会发现css动画停止了。如图。坑3:dom动一会儿就被删除了。出现了新的场景(渲染了新的dom元素)这该如何是好. 动画虽然停止了,但是dom的删除是js控制的。js的还在运行。过几秒之后又页面又重新渲染了其他dom元素。怎么让js也停止执行呢,首先想到的是打个断点,但问题是去哪里打断点呢。打的早了dom还没渲染出来,打的地方不对代码可能不走那里。于是高人又出来指点了:可以在dom节点上打断点:选取一个dom元素,右键->Break On->node removal.这样在此dom节点被删除的时候,程序就会停下来。如图。如此这般,我们就可以轻松找到想要看的css代码了。补充:还有一种阻止js执行的办法,就是禁用javascript。还是点击三个点->Settings->Debugger->Disable JavaScript打勾就可以了。这样js就不会执行了,dom元素也不会被删掉了。如图:彩蛋:介绍一个在浏览器中全局搜索代码的方法,点击Sources面板,会看到左侧有目录结构,右键目录结构->Search in all files。这样就可以在所有文件中搜索代码了。这个在开发中还是很有作用的。如图:小扩展:还有一个场景:一个页面会从后台请求字体包,字体包会在某个时刻通过js加入到style标签中。但是我们不知道是哪段js代码执行了这个操作。现在想找到这个代码,应该怎么办呢?方法:给style标签打断点:右键style标签->Break On->subtree modifications 这样,在style中插入@font-face时,就会直接停在执行插入的那一段js代码处。如图 作者:易企秀——Hison

July 16, 2019 · 1 min · jiezi

html通过canvas转成base64

作者:@wucj shouzijiang 在H5的营销活动中,经常生成一张图片让用户分享或者保存,这时候处理方案有两种。一种是让后端生成图片,返回一个图片地址给前端展示一种是前端自主合并生成图片展示,文中主要说明这个方案 demo <!--生成后存放的IMG--><img src="" id="saveImages" alt=""><a href="javascript:;" class="create">生成海报</a><!--用来生成的HTML--><div id="saveContent" class="saveContent"> <img src=""> <div class="name pa"></div> <div class="msg pa"></div></div><style>#saveContent{width: 7.5rem; height: 12.27rem; position: relative;}#saveContent img{ width: 100%;}#saveContent .name{color: #7c5234;font-size: .3rem;top: 6.55rem;line-height: .6rem;text-align: center;left: 0;right: 0;}#saveContent .msg{color: #7c5234;font-size: .24rem;top: 7.35rem;text-align: center;left: 0;right: 0;}#saveContent .msg span{ color: #cf5350; font-size: .36rem;}</style><!--使用最新版本的html2canvas--><!--官网https://html2canvas.hertzen.com/--><script src="//html2canvas.hertzen.com/dist/html2canvas.min.js"></script><script src="//static.leiting.com/lib/jquery-1.9.0.min.js"></script><script>//生成$(function(){ var isCreate=false; $('a.create').on('click',function(){ isCreate=true; $('#saveContent img').attr('src','//activity.leiting.com/wd/201904/data/images/pop/1.jpg'); $('#saveContent .name').html('aaaaaa'); $('#saveContent .msg').html('bbbbbbbbbb'); html2canvas(document.getElementById('saveContent'), { onrendered: function(ca) { $('#saveImages').attr('src',ca.toDataURL('image/jpeg')); } }); })})</script>

July 16, 2019 · 1 min · jiezi

移动端键盘和光标的兼容那点事

作者:@micky思 @wupq @yewq 在H5的开发中,个人的制作页面布局习性不同,多多少少会产生在真机上input的光标和键盘的弹出会出现的各种BUG,文中整理了部分遇到的问题,欢迎新增 ios移动端输入框上浮导致输入位置偏移问题原因:遮罩层定位为fixed,当键盘弹起时,ios11以及以下视口计算有问题,页面的fixed会失效,变成absolute,结果就是当屏幕数据超过一屏时,滑动页面,input框也会跟着一起滚动导致光标不跟随密码弹出框移动。解决方法:如果使用页面数据不超过一屏(禁止滚动),那么即使变成了absolute页面也不会有什么变化。//在弹窗出现的事件里加入$('.wrap').css('height','100%');//wrap为包含除弹窗外的所有页面元素的父div//关闭弹窗时div恢复原来高度$('body').on('click','.pop_close',function(){ $('.wrap').css('height','24.69rem');});//ps:如果整体背景图是在父元素wrap里,background-size:cover微信输入法键盘弹起H5页面无法还原//判断ios系统var u=navigator.userAgent;if(u.indexOf('iPhone')>-1){ var flag; $('body').on('focus','input',function(){ flag=false; }); $('body').on('blur','input',function(){ flag=true; setTimeout(function(){ if(flag==false){ return false; }else{ document.body.scrollTop=document.body.scrollTop; } //防止在多个input间切换时做过多操作 },0); //解决select导致的键盘弹起 $('.select').on('click',function(){ document.body.scrollTop = document.body.scrollTop; }); });}readonly时,IOS会出现光标和输入提示<input type="text" class="" value="" readonly unselectable="on" onfocus="this.blur()">

July 15, 2019 · 1 min · jiezi

踩坑完全指南长期更新

有很多坑踩过的,记录下来。尤其是css,相信前端er们最讨厌写的就是css样式篇如何设置表格的单元格内容高度回答链接???? 必须要给单元格加一个高度,当然这个高度的值本身并不会生效 <td style="height: 1px"/>

July 15, 2019 · 1 min · jiezi

前端面试重点之多列布局

在页面开发中,当我们拿到设计师给出的UI图后,首先考虑的就是布局问题,而多列布局会是我们碰到最多的布局问题,个人就汇总了开发中常见多列布局问题的解决方法。按列数可以分为两列布局,三列布局,多列布局,其中布局方法中的原理都有类似之处。 目录 一、定宽+自适应两列布局二、两列定宽,一列自适应布局 三、左边不定宽,右边自适应布局 四、多列不定宽,一列自适应 五、等宽布局解决方案 六、等高布局解决方案 (文中Css代码中颜色需自行添加) 一、定宽+自适应两列布局<div class="parent"> <div class="left"><p>left</p></div> <div class="right"><p>right</p></div></div>需求:实现左侧100px,右侧自适应,且间距20px 方法一:左侧浮动,右侧宽度通过margin调整.left { float: left; width: 100px;}.right { margin-left: 120px; //相差的20px是左右之间的间距}方法二:左侧浮动,右侧BFC.left { float: left; width: 100px; margin-right: 20px;}.right { overflow: hidden;}方法三:table单元格默认会等宽,但是table-layout: fixed能够让table元素布局优先,。 .parent { display: table; width: 100%; table-layout: fixed;}.left, .right { display: table-cell;}.left { width: 100px; padding-right: 20px;}方法四:flex.parent { display: flex;}.left { width: 100px; margin-right: 20px;}.right { flex: 1}方法五:css3 calc()计算属性.left { display: inline-block; width: 100px; margin-right: 20px;}.right { display: inline-block; width: calc(100% - 120px);}二、两列定宽,一列自适应布局多列布局用到的属性原理基本都一样,上面的方法也同样适用于此。 ...

July 15, 2019 · 2 min · jiezi

请说出静态资源请求的优化措施是否用过雪碧图和iconfont

减少HTTP请求 CSS/JS 合并打包小图标等用iconfont代替:作为单个DOM节点使用,可以设置大小、颜色等,非常便利。个人建议前端来维护这个字体包,每次有新增的图标,让设计师给我们对应的svg文件即可,前端自己去 icomoon.io/ 这个网站,导入原来的selection.json文件,增量生成新的css,无比方便。之前,我一直以为iconfont只能是单色的呢,其实也可以是多色的,svg里面多一些path而已,设计师会搞定的。生成字体后,前端正常引用即可(引用的时候,多色字体会多一些标签)使用base64格式的图片:有些小图片,可能色彩比较复杂,这个时候再用iconfont就有点不合适了,此时可以将其转化为base64格式(不能缓存),直接嵌在src中,比如webpack的url-loader设置limit参数即可 减少静态资源的体积压缩静态资源:合并打包的js、css文件体积一般会比较大,一些图片也会比较大,这个时候必须要压缩处理。前后端分离项目,不论是gulp还是webpack,都有相应的工具包。针对个别图片,有时候也可以单独拿出来处理,我个人经常使用这个网站 tinypng.com/ 在线压缩编写高效率的CSS:涉及到代码层面的优化比较多也比较细,不同水平的技术人员写出来的肯定不一样,这里不做进一步的分析。但是为什么要把CSS拿出来说一说呢?因为现在项目里面基本上都在使用CSS预处理器,Less、SaaS、Stylus等等,这导致了某些初级前端的滥用:嵌套5、6层,甚者能达到7、8层,吓死个人!嵌套这么深,影响浏览器查找选择器的速度不说,这也一定程度上产出了很多冗余的字节,这个要改、要提醒,一般建议嵌套3层即可。关于编写高效率的CSS,推荐一篇文章,《Writing efficient CSS selectors》服务端开启gzip压缩:大招,最近刚知晓,真是太牛逼了,一般的css、js文件能压缩60、70%,当然,这个比率可以设定的。前后端分离,如果前端部署用node、express作服务器的话,使用中间件compression即可开启gzip压缩: // server.jsvar express = require('express');var compress = require('compression');var app = express();app.use(compress());复制代码对于一般的SPA项目,如果node服务器的作用比较简单,比如只是做个接口转发之类的,很多人更倾向用Nginx作服务器,Nginx在转发接口、压缩、缓存等功能上更胜一筹。不过,大部分前端对Nginx应该陌生一些,为了实践技术,用熟悉的node即可,真正的项目部署,有专业的实施人员来搞 使用缓存

July 15, 2019 · 1 min · jiezi

常见核心前端面试问题与详细解答

本文总结了前端老司机经常问题的一些问题并结合个人总结给出了比较详尽的答案。关于知识点原理和详细,参考讲堂的视频教程:前端增长-重新定义大前端课程知识在不断更新,本片内容也逐步更新官方博客:FED123前端学堂 1.关于性能优化说说js文件摆放顺序、减少请求、雪碧图等等原理, 说下window.performance.timing api是干什么的?浏览器是按照文档流解析html,为了更快构建DOM树和渲染树将页面呈现到屏幕上,建议是降js放在文档dom树结尾,body标签闭合前。浏览器并发HTTP请求有限制(6个左右),加载页面html后开始解析,解析到外链资源比如js css和图片,就会发http请求获取对应资源。减少请求就是减少这些资源请求, 可以 css资源合并,js资源合并,图片资源合并同时做lazyload,区分首屏非首屏接口,按需请求数据。雪碧图是一种图片资源的合并方法,将一些小图片合成一张图,通过background-position来定位到对应部分。window.performance.timing 参考下前端页面性能指标数据计算方法, performance接口属于w3c标准hight resolution time中的一部分,通过navigation timeline api 、 performance timeline api,user timing api,resource timeline api 这四个接口做了增强实现。其中navigation timeline api中PerformanceTiming 接口数据放在 performance.timing这个对象上。主要记录了浏览器从跳转开始的各个时间点的时间,比如navigationStart是页面开始跳转时间,fetchStart是页面开始时间,domainLookupStart是DNS开始时间,domainLookupEnd是DNS结束时间, 查找到DNS后建立http链接,connectStart和connectEnd分别是链接开始和结束时间,然后是requestStart开始发起请求时间,responseStart开始响应时间,responseEnd响应结束时间。然后是苟安DOM树时间,分别是domLoading, domInteractive, domContentLoad和domComplete时间,分别对应document.readyState状态loading、interactive和complete。最后是页面onload,分别是loadEventStart和loadEventEnd时间节点。可以通过这个接口统计前端的页面性能数据。 domainLookupStart - fetchStart = appCache时间,这段时间浏览器首先检查缓存domainLookupEnd -domainLookupStart = DNS时间connectEnd - connectStart = TCP时间responseStart - requestStart = FTTB首字节时间,或者说是服务器响应等待时间domContentLoad - navigationStart = 页面pageLoad时间 loadEventEnd - navigationStart = 页面onLoad时间 关于知识点原理和详细,参考讲堂的视频教程:前端增长-重新定义大前端 2.请你描述下一个网页是如何渲染出来的,dom树和css树是如何合并的,浏览器的运行机制是什么,什么是否会造成渲染阻塞?参考下:浏览器工作原理   浏览器渲染与阻塞原理 第一部分通过performance.time这个api我们可以了解浏览器加载网页的流程,浏览器边加载html边构建DOM树,当然会有容错和修正机制。浏览器解析到行内css和内联css会立马加入到构建渲染树,解析到外链css就开始加载,加载完之后也会合并到渲染树的构建中,最后将渲染树和DOM做节点链路匹配,也叫layout阶段,计算每个DOM元素最终在屏幕上显示的大小和位置。 遍历顺序为从左至右,从上到下,绘制在屏幕上,layout过程中可能会触发页面回流和重绘,比如某个外链css加载完解析之后合并构建到渲染树中,其中某个css改变了DOM树种某个元素的定位(改成绝对定位)或者改变了长宽边距等位置信息,会触发重新layout,所以会回流reflow。重绘是比如css改变了之前的背景图片颜色,浏览器会重新绘制。 会有渲染阻塞,浏览器刷新的频率大概是60次/秒, 也就是说刷新一次大概时间为16ms,如果浏览器对每一帧的渲染工作超过了这个时间, 页面的渲染就会出现卡顿的现象。浏览器内核中有3个最主要的线程:JS线程,UI渲染线程,事件处理线程。此外还有http网络线程,定时器任务线程,文件系统处理线程等等。 JS线程负责JS代码解析编译执行,称为主线程。常说‘浏览器是单线程’指的是JS主线程只能有一个,主线程执行同步任务,会阻塞UI渲染线程。JS线程核心是js引擎 (IE9+: Chakra firefox:monkey chrome:v8)。webworker可以创建多个js线程,但是受主线程控制,主要用于cpu密集型计算。UI渲染线程当然是负责构建渲染树,执行页面元素渲染。核心是渲染引擎(firefox:gecko、chrome/safari:webkit),由于JS可以操作DOM元素处理样式等,JS主线程是执行同步任务的,所以设计上JS引擎线程和GUI渲染线程是互斥的。 也就是说JS引擎处于运行状态时,GUI渲染线程将处于冻结状态。事件处理线程,由于浏览器是事件驱动的,事件处理线程用来控制事件回调处理,浏览器触发某个事件后会把事件回调函数放到任务队列中,可以看下下面会提到。其他线程统称工作线程,如处理 ajax 的线程,dom事件线程、定时器线程、读写文件的线程等,工作线程的任务完成之后, 会推入到一个任务队列(task queue) ...

July 14, 2019 · 5 min · jiezi

CSS-常用布局在小程序中的应用

CSS 常用布局在小程序中的应用所有css布局的根本都是3个基本概念:定位、浮动、外边距操纵我们其他的布局实现方式,都是基于正常的文档流来进行的。所以我们先来看看什么是正常的文档流。 正常文档流(Normal Flow):正常布局流是指在不对页面进行任何布局控制时,浏览器默认的HTML布局方式。默认的文档流,确保在没有任何css样式的时候,还能够正确的渲染和显示内容。使页面具有比较好的可读性以及合理性。(position display float table flex-box grid-layout)默认情况下,元素是如何布局的? (引用自 https://developer.mozilla.org)首先,取得元素的内容来放在一个独立的元素盒子中,然后在其周边加上内边距、边框和外边距。(盒子模型)一个块级元素的内容宽度默认是其父元素的100%,其高度与其内容高度一致。行内元素的height width与内容一致。你无法设置行内元素的height width。 如果你想控制行内元素的尺寸,你需要为元素设置display: block; (或者,display: inline-block; inline-block 混合了inline 和 block的特性。)那独立元素之间又是如何相互影响的呢? 正常布局流是一套在浏览器视口内放置、组织元素的系统。默认情况下,块级元素按照在文档中书写出现的顺序放置 --- 每个块级元素会在上一个元素下面另起一行,它们会被设置好的margin 分隔。行内元素的表现有所不同 --- 它们不会另起一行;只要在其父级块级元素的宽度内有足够的空间,它们与其他行内元素、相邻的文本内容(或者被包裹的)被安排在同一行。如果空间不够,溢出的文本或元素将移到新的一行。如果两个相邻的元素都设置了margin 并且两个margin有重叠,那么更大的设置会被保留,小的则会消失 --- 这被称为外边距叠加。我们在传统的css布局当中,不管是css2还是css3,大致囊括了静态布局、流式布局、弹性布局、自适应布局、响应式布局、网格布局。对于css的这些布局方式,在小程序中又是怎样的呈现方式呢?我们分别来看一看。 1. 静态布局 (Static Layout)固定宽度布局。宽度以像素为单位。(当然我们还可以使用其他的绝对长度单位)缺点:无论窗口多大,尺寸不变。无法充分利用空间。行长和文本易读性不好。静态布局就是传统的网站形式:对于PC设计一个居中布局,窗口缩小时,内容被遮挡,呈现横竖向滚动条。对于移动设备,单独建立一个m.域名及相应的移动网站。静态布局在小程序中一般很少出现。因为如果使用静态布局,就无法做到不同屏幕自适应,750px的设计稿在小屏幕的手机上就会出现滚动条。 呈现效果如下: // wxml 代码<view class='page'> <view class='header'>静态布局</view> <view class='content'> <text>静态布局内容部分在小程序中的呈现。小程序page样式在overflow-x上默认是hidden。</text> </view></view>//样式如下page { overflow-x:scroll;}.page, .header, .content { width: 750px;}.content { background: #ccc;}2. 流式布局 (Liquid Layout)(百分比布局)流式布局是页面元素的宽度按照屏幕分辨率进行适配调整,但整体布局不变。使用百分比实现:流式布局能够相对于浏览器窗口进行伸缩。缺点:窗口宽度较小,行变得非常窄,很难阅读。需要设置min-width来解决,但是如果min-width较大的话,也会有静态布局相同的限制。宽度太宽,同样会存在行长过长的问题。流式布局(Liquid)的特点(也叫"Fluid") 是页面元素的宽度按照屏幕进行适配调整,主要的问题是如果屏幕尺度跨度太大,那么在相对其原始设计而言过小或过大的屏幕上不能正常显示。我们来看看在小程序中使用流式布局的效果: 在不同的屏幕大小下呈现出来的效果如下: <!-- wxml代码 --><view class='page fluid'> <view class='header fluid__header'>流式布局</view> <view class='content'> <!-- 两列 --> <view class='wrapper'> <view class='grid-item grid-half'> <text>我是左侧部分</text> </view> <view class='grid-item grid-half'> <text>我是右侧部分</text> </view> </view> <!-- 三列 --> <view class='wrapper'> <view class='grid-item grid-three'> <text>我是左侧部分</text> </view> <view class='grid-item grid-three'> <text>我是中间部分</text> </view> <view class='grid-item grid-three'> <text>我是右侧部分</text> </view> </view> </view></view>/* css代码 */.fluid, .content, .wrapper { width: 100%; box-sizing: border-box;}.wrapper { height: 200px; margin-bottom: 20px;}.wrapper .grid-item { height: 100%; background: #ccc; display: inline-block; box-sizing: border-box;}.wrapper .grid-half { width: 48%;}.wrapper .grid-half:nth-child(2n) { margin-left: 4%;}.wrapper .grid-three { width: 32%;}.wrapper .grid-three:not(:first-child) { margin-left: 2%;}3. 弹性布局 (Flex Layout)CSS 弹性盒子布局是 CSS 的模块之一,定义了一种针对用户界面设计而优化的 CSS 盒子模型。在弹性布局模型中,弹性容器的子元素可以在任何方向上排布,也可以“弹性伸缩”其尺寸,既可以增加尺寸以填满未使用的空间,也可以收缩尺寸以避免父元素溢出。子元素的水平对齐和垂直对齐都能很方便的进行操控。通过嵌套这些框(水平框在垂直框内,或垂直框在水平框内)可以在两个维度上构建布局。对Flex的理解可以参考阮一峰 Flex 布局教程:语法篇。在此不做详细说明。那我们看看在小程序中Flex布局的使用。依然还是上一个例子中的wxml,我们只需要修改对应的class以及css即可。 ...

July 14, 2019 · 2 min · jiezi

position定位有哪些各有什么特点

osition属性值:position的属性值共有四个常用我们在布局上经常会用到的相对定位和绝对定位常用的属性top、bottom、left、right或者 z-index 声明在position为static的情况下无效。 特点:absoluteabsolute fixed改display属性blockk 1)块状元素在position(relative/static)的情况下width为100%,但是设置了position: absolute之后,会将width变成auto(会受到父元素的宽度影响)。 2)元素设置了position:absolute之后,如果没有设置top、bottom、left、right属性的话,浏览器会默认设置成auto,而auto的值则是该元素的“默认位置”。即设置position: absolute前后的offsetTop和offsetLeft属性值不变。1.会改变行内元素的呈现模式,使display之变更为block。 2.会让元素脱离普通流,不占据空间。 3.默认会覆盖到非定位元素上。

July 14, 2019 · 1 min · jiezi

如何禁止用户全选文字内容

body{-webkit-touch-callout: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;}

July 14, 2019 · 1 min · jiezi

浮动相关问题

浮动相关问题: 使得父元素包含子元素,常见的方式是为父元素设置overflow:hidden或浮动父元素。根本原因在于创建BFC的元素,子浮动元素也会参与其高度计算,即不会产生高度塌陷问题。实际上只要让父元素生成BFC即可,并不只有这两种方式。 复制代码<!DOCTYPE html><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <!--The viewport meta tag is used to improve the presentation and behavior of the samples on iOS devices--><meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/> <title></title> <style> html, body { height: 100%; width: 100%; margin: 0; padding: 0; }#map{ padding:0;}.first{ margin:20px; background:lightgreen; border: 2px solid lightgreen; /*display:inline-block;*/ /*overflow:hidden;*/ /*float: left;*/ /*position: absolute;*/}ul{ overflow:hidden; margin:10px; background:lightblue; width:100px; height:200px; float: left;}li{ margin:25px;}</style> </head> <body class="claro"> <div class="first"> ...

July 14, 2019 · 1 min · jiezi

清楚浮动边界塌陷bfc

CSS清浮动处理(Clear与BFC)在CSS布局中float属性经常会被用到,但使用float属性后会使其在普通流中脱离父容器,让人很苦恼 1 浮动带来布局的便利,却也带来了新问题 复制代码 1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Clear float</title> 6 <style type="text/css"> 7 .container{ 8 margin: 30px auto; 9 width:600px;10 height: 300px;11 }12 .p{13 border:solid 3px #a33;14 }15 .c{16 width: 100px;17 height: 100px;18 background-color: #060;19 margin: 10px;20 float: left;21 }22 </style>23 </head>24 <body>25 <div class="container">26 <div class="p">27 <div class="c"></div>28 <div class="c"></div>29 <div class="c"></div>30 </div>31 </div>32 </body>33 </html>复制代码我们希望看到的效果是这样的 但结果却是这样的 父容器并没有把浮动的子元素包围起来,俗称塌陷,为了消除这种现象,我们需要一些清除浮动的技巧。 2 如何清理浮动 清理浮动一般有两种思路 利用 clear属性,清除浮动使父容器形成BFC分别看一下 2.1 利用 clear属性,清除浮动 ...

July 14, 2019 · 1 min · jiezi

清楚浮动4种方式

清除浮动:根据情况需要来清楚浮动 。 清除浮动的目的: 就是为了解决 父 盒子高度为0 的问题。 1.、额外标签法 给浮动盒子的后面添加一个新的div 2、overflow:hidden 触发了bfc模式,就不用清除浮动了 bfc模式:http://www.cnblogs.com/dojo-l... 3、伪元素 网易搜狐常用 .clearfix:after{ content:””; visibility:hidden; display:block; height:0; clear:both; }.clearfix{ //IE6模式下 zoom:1;} 清除浮动: 真正的叫法 闭合浮动 4、 双伪元素 小米,淘宝常用 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><style type="text/css">.father{width: 600px;height: auto;border:1px solid red;}.child1,.child2{background: pink;width: 250px;height: 250px;float: left;}.clearfix:before,.clearfix:after{ /真正意义上的闭合浮动/display: table;content: "";}.clearfix:after{clear:both;}.clearfix{ //IE6zoom:1;}</style></head><body><div class="father clearfix"><div class="child1">哥哥</div><div class="child2">妹妹</div></div></body></html>

July 14, 2019 · 1 min · jiezi

啦咯ill图

根据CSS继承一说,我们在“div#wrap”的内容容器中没有显式的设置字体大小,这样整个“div#wrap”将继承了其父元素“body”的字体——“16px”。1、给段落设置样式:——“12px”的字体,“18px”的行高以及margin值从CSS继承中,我们可以得知我们所有段落继承了其父元素“div#wrap”的“font-size:16px”。同时我们通过前面的介绍得知1px = 1 ÷ 16 = 0.0625em,这样一来我们就很轻松的知道“12px”等于多少个“em”0.0625em × 12 = 0.750em这样我们就可以给段落p设置样式: p {font-size: 0.75em;/*0.0625em × 12 = 0.750em */} 要计算出段落所需的行高和“margin”为“18px”,来满足Richard Rutter说的basic leading,那我们就需要像下面的方法和来计算:18 ÷ 12 = 1.5em使用所需的行高值“18px”直接除以“字体大小12px”,这样就得到了段落“p”的“line-height”值。在本例中行高就等于字体的“1.5”倍,接着我们把“line-height”和“margin”样式加到段落“p”中 p{ font-size: 0.75em;/*0.625em × 12 = 0.750em */ line-height: 1.5em;/*18px(line-height) ÷ 12(font-size) = 1.5em */ margin: 1.5em;/*18px(margin) ÷ 12(font-size) = 1.5em */ } 2、给标题设置一个18px的字号标题“h1”和段落“p”一样的原理,他也是继承他父元素“div#wrap”的“16px”的“font-size”,所以我们也是按同样的方法可以计处出他的“em”0.0625em × 18 = 1.125em我们可以把得出的值写到CSS样式表中 h1 { font-size: 1.125em;/*0.625em × 18 = 1.125em*/ } 同样为了保留Richard Rutter所说的vertical rhythm,我们同样将标题“h1”的“line-height”和“margin”都设置为“18px”,使用方法前面介绍的方法。很容易得到他们的“em”值为“1em”: ...

July 14, 2019 · 1 min · jiezi

前端增长重新定义大前端

前端增长-重新定义大前端 精心打造全新课程,欢迎吐槽!反馈宝贵意见! 在线课程:思否课堂限时免费哦! 课程介绍前端知识点很多,很细碎。一般同学都是死记硬背一些知识点。机灵的同学会背一些案例,更聪明的同学会背一下原理,理解下大概。奈何时光催人老,再好的记忆也会有忘记的时候,况且人生的不同阶段所侧重的点也不一样。所以本课程从面试考察的知识点入手,梳理前端知识点脉络,精讲各个点的长问问题和设计原理,让你从死记硬背转化为理解,实现前端能力增长。再也不需要死记硬背,该忘记就忘记吧,有事没事想一想,捋一捋就行。 课程大纲本课程参考总结的脑图逐个展开讲解原理。(目前课件还在更新中) 第一章 HTML-相识1.1 前端增长,业界发展,盘他?1.2 学习目标,人生就是起起落落落?1.3 HTML咋解析的呢?DOM构建1.4 CSSOM如何构建?会阻塞吗1.5 RenderTree上来秀一波1.6 Layout布局引擎,新交规解析1.7 牛逼的render进程合成层,拯救世界1.8 HTML加载阻塞?咋不上天呢1.9 页面渲染会堵车吗?FM93交通之声 第二章 CSS-相知2.1 啥是Containing Block?有鸟用2.2 要BFC?要啥自行车2.3 到底是怎么定位?挖坑吗2.4 咋布局?设套吗?flex兄弟上车2.5 CSS优先级,优生优育2.6 CSS预处理原理2.7 合成器和非合成器动画,爆GPU菊花2.8 大哥,你的动画卡顿了,快逃2.9 基线和行高的坑 第三章 JavaScript-相爱 课时19 浏览器引擎与webkit课时20 JavaScript虚拟机运行原理流程剖析课时21 JavaScript类型推断课时22 JavaScript虚拟机对象访问优化课时23 秒懂事件循环原理课时24 事件循环之宏任务与微任务课时25 JavaScript虚拟机垃圾回收课时26 JavaScript数据类型与内存模型课时27 数据类型检测与深浅克隆课时28 数据监听方法有哪些?课时29 模块数据通信的方法 第四章 浏览器-相生 【待更新】 第五章 框架-相克 【8月10更新】 第六章 编码能力-相辅 【8月10更新】 第7章 NodeJs-相成 【8月20更新】 第8章 打包-相情 【8月20更新】 第9章 小程序-相怨【8月20更新】 第10章 前端架构-相恨 【8月20更新】 课件思维导图:

July 14, 2019 · 1 min · jiezi

除了px还有什么单位都如何计算

选择使用什么字体单位主要由你的项目来决定,如果你的用户群都使用最新版的浏览器,那推荐使用rem,如果要考虑兼容性,那就使用px,或者两者同时使用。做移动端页面的几乎离不开rem这个单位。REM表示“Root EM”,字面上指的是根元素的em大小。在Web文档的上下文中,根元素就是你的html元素。如果没有重置,html默认font-size:16px。我们可以方便的使用相对字体大小,而且还避免了使用嵌套的em结构的混乱。 1÷ 父元素的font-size × 需要转换的像素值 = em值

July 14, 2019 · 1 min · jiezi

css实现二级菜单

不多废话,先上预览https://codepen.io/Ritr/pen/W...这一次还是使用<input type="checkbox">的选中与否来实现展开、收起二级菜单的。 第一步:初始化默认二级菜单的li高度为0 选择一级菜单时,将二级菜单高度设置为20px 这样设置是为了方便我们以后添加动画效果 html <ul class="menu"> <li class="main-menu"> <label for="ck1"> <span>水果</span> </label> <input id="ck1" type="checkbox"> <ul class="sub-menu-container"> <li class="sub-menu">橘子</li> <li class="sub-menu">香蕉</li> <li class="sub-menu">苹果</li> </ul> </li> <li class="main-menu"> <label for="ck2"> <span>水果</span> </label> <input id="ck2" type="checkbox" checked> <ul class="sub-menu-container"> <li class="sub-menu checked">橘子</li> <li class="sub-menu checked">香蕉</li> <li class="sub-menu checked">苹果</li> </ul> </li> </ul>css /* 初始化 */*{ margin:0; padding:0}.container{ width:500px; margin:0 auto; text-align:center;}.menu{ width:200px; display:inline-block;}li{ list-style:none; cursor:pointer; text-align:left; text-indent:5px;}.main-menu{ background:#0099CC; margin:1px 0;}.sub-menu{ background:#00CCFF; margin:1px 0; overflow:hidden; height:0;}.sub-menu.checked{ height:20px;}效果图 第二步:选中checkbox时展开二级菜单,取消选择时收起二级菜单划重点--注意label和input之间的位置html <ul class="menu"> <li class="main-menu"> <label for="ck3"> <span>水果</span> </label> <input id="ck3" class="ck" type="checkbox"> <ul class="sub-menu-container"> <li class="sub-menu">橘子</li> <li class="sub-menu">香蕉</li> <li class="sub-menu">苹果</li> </ul> </li> <li class="main-menu"> <label for="ck4"> <span>水果</span> </label> <input id="ck4" class="ck" type="checkbox" checked> <ul class="sub-menu-container"> <li class="sub-menu">橘子</li> <li class="sub-menu">香蕉</li> <li class="sub-menu">苹果</li> </ul> </li> </ul>css ...

July 13, 2019 · 1 min · jiezi

前端面试重点之居中问题

前端面试重点——居中问题在页面布局开发中,居中问题是我们经常碰到的问题,掌握居中问题对于解决页面布局非常重要,同时它也是常见的面试重点。本文汇总一些常见的居中方式以及一些注意点,权当学习笔记。[toc] 一、水平居中1. inline-block + text-align确保子元素是行内块级元素后,给父元素 text-align: center; 这种情况对于子元素定宽或者不定宽都生效。<div class="parent"> <div class="child">child</div></div>.parent { text-align: center;}.child { display: inline-block;}2. table + margin此时利用table的宽度是内容的宽度,且table可以使用margin<div class="parent"> <div class="child">child</div></div>.child { display: table; margin: 0 auto;}3. absolute + transform确定父元素 相对定位后,将子元素通过绝对定位在父元素内实现居中。该方法适用于子元素定宽或者不定宽,万能方法。<div class="parent"> <div class="child">child</div></div>.parent { position: relative;}.child { position: absolute; left: 50%; top: translateX(-50%);}4. flex + justify-content弹性布局(flex布局)也是常用来居中的方式,只需要给父级元素添加弹性布局格式,同时设置横轴对齐方式justiify-content来设置居中。<div class="parent"> <div class="child">child</div></div>.parent { display: flex; justify-content: center;}在选择居中对齐的时候,也可以通过考虑子元素的宽度是否确定,如果宽度确定,也可通过:margin: 0 auto;实现水平居中。注意点: text-align用来设置元素中的的文本行内元素的对齐方式;text-align只对行内元素有效,对块元素无效,不能设置块元素的对齐方式;二、垂直居中1. line-height = height (只适用于单行内行内元素)这种方法在设置单行块的时候特别有效,需要知道父元素高度。<div class="parent"> <div class="child">child</div></div>.parent { height: 100px;}.child { line-height: 100px;}2. table-cell + vertical-align(单行,多行都可居中)利用表格单元格的特性,单元格内支持居中。<div class="parent"> <div class="child">child</div></div>.parent { display: table-cell; vertical-align: middle;}3. absolute + transform父元素相对布局,子元素绝对布局,适用很多场景。<div class="parent"> <div class="child">child</div></div>.parent { position: relative;}.child { position: absolute; top: 50%; transfrom: translateY(-50%);}4. flex + align-itemflex布局,通过纵向对齐align-item设置交叉轴对齐。<div class="parent"> <div class="child">child</div></div>.parent { display: flex; align-items: center;}三、水平垂直居中将上面的水平居中方法和垂直居中方法结合起来就可以实现水平垂直居中。1. inline-block + text-align + table-cell + vertical-align<div class="parent"> <div class="child">child</div></div>.parent { diaplay: teable-cell; text-align: center; vertical-align: middle;}.child { display: inline-block;}2. margin: auto已知宽高的元素父元素相对定位,子元素绝对定位。<div class="parent"> <div class="child">child</div></div>.parent { positon: relative;}.child { position: absolute; top: 0; right: 0; left: 0; bottom: 0; margin: auto;}3. transform + translate不管宽高是否给定,都可以使用父元素相对定位,子元素绝对定位。(未知宽高可能是行内元素) ...

July 13, 2019 · 1 min · jiezi

移动开发兼容问题

1.安卓使用绝对定位布局与原生input有冲突如果绝对定位的元素在最下面,键盘弹起时,绝对定位元素会在键盘上面 解决办法: 使用flex布局实现,有一个flex-shrink可使用或者监听resize事件,将元素隐藏export function adapterPosition(selector) { if (/iphone/i.test(navigator.userAgent)) return const h = window.innerHeight; const dom = document.querySelector(selector) if (!dom) return const display = dom.style.display window.addEventListener('resize', () => { const height = window.innerHeight if (height < h) { dom.style.display = 'none' } else { dom.style.display = display } });}2.低版本浏览器,给input设置flex:1之后,将兄弟元素挤出了父元素空间具体原因待查,反正需要给input加一个display:block <div class="item"> <div class="name">验证码</div> <input class="jInput input" type="number" pattern="[0-9]*" placeholder="请输入短信验证码"> <button class="btn jSendVcodeBtn"> 发送验证码 </button></div>.item { margin-left: 15px; box-sizing: border-box; height: 60px; padding: 12px 15px 12px 0; overflow: hidden; background-color: #fff; color: #212121; position: relative; display: -webkit-box; display: flex; -webkit-box-align: center; align-items: center; border-bottom: 1px solid #f4f4f4; font-size: 16px;}.item .name { margin-right: 10px; min-width: 48px;}.item .input { display: block; // 需要加一个display:block outline: 0 none; -webkit-box-flex: 1; flex: 1; font-size: 16px; padding: 0; border-width: 0; box-shadow: none; -webkit-user-select: text; -moz-user-select: text; -ms-user-select: text; user-select: text;}3.relative top失效关于relative元素top属性失效的原因,父元素没有设置高度,子元素top使用百分比的时候没有参照,此时可以使用px值 ...

July 13, 2019 · 1 min · jiezi

移动端input框问题

部分问题可参考:https://www.cnblogs.com/ljx20... 失焦之后webview没有回到原来位置input.addEventListener('blur', () => { setTimeout(() => { window.scrollTo(document.body.scrollLeft, document.body.scrollTop); }, 20)})不聚焦问题如果引入了fastclick,那么需要修改源码,如下 FastClick.prototype.focus = function(targetElement) { targetElement.focus();};如果还有问题,尝试监听input的focus,然后延时聚焦 this.jInput.addEventListener('focus', () => { setTimeout(() => { this.jInput.focus() }, 300)})如果没有引入fastclick,网上找其他原因吧,还没遇到过

July 13, 2019 · 1 min · jiezi

JavaScript是否阻塞解析

不论是内联还是外链js都会阻塞后续dom的解析和渲染 如果把JavaScript放在页面顶部,下载和解析JavaScript的时间里面,dom迟迟得不到解析和渲染,浏览器一直处于白屏,所以把JavaScript文件放在页面底部更有利于页面快速呈现。 defer和async首先,async和defer对于内联JavaScript都是无效的 defer 设置了defer的script外链文件,在下载js文件期间不会阻塞HTML的解析,而且等js下载完毕时若HTML还没解析完毕,js会等到HTML文档解析完毕后再执行。如果有多个js下载文件,那么执行时也是按照顺序执行。 async 设置了async的script外链文件,在下载js文件期间不会阻塞HTML的解析,但是js下载完毕之后就会立即执行,无论现在HTML是否正在解析。defer和async首先,async和defer对于内联JavaScript都是无效的https://segmentfault.com/img/... Css为什么要放在HTML文档的<head>标签内Css阻塞渲染首先说结论: 对于一个HTML文档来说,不管是内联还是外链的css,都会阻碍后续的dom渲染,但是不会阻碍后续dom的解析。 如果把css文件引用放在HTML文档的底部,浏览器为了防止无样式内容闪烁,会在css文件下载并解析完毕之前什么都不显示,这也就会造成白屏现象。(但是在firefox浏览器中测试,会出现样式闪烁,这也算是不同浏览器的权衡吧,要么等css全解析完一起显示,要么先显示然后css解析完再重新画上新样式)当css文件放在<head>中时,虽然css解析也会阻塞后续dom的渲染,但是在解析css的同时也在解析dom,所以等到css解析完毕就会逐步的渲染页面了。 怎么优化因为Css的解析会阻塞页面的渲染,为了让页面尽早的呈现处理,那么就要避免一些无用的css文件。使用媒体查询可以让css文件只在必要的时候解析,进而避免不必需的渲染阻塞,加快页面呈现时间

July 13, 2019 · 1 min · jiezi

css加载会不会造成文档解析阻塞

ss加载不会阻塞DOM树的解析 css加载会阻塞DOM树的渲染 css加载会阻塞后面js语句的执行、 因此,为了避免让用户看到长时间的白屏时间,我们应该尽可能的提高css加载速度,比如可以使用以下几种方法: 使用CDN(因为CDN会根据你的网络状况,替你挑选最近的一个具有缓存内容的节点为你提供资源,因此可以减少加载时间) 对css进行压缩(可以用很多打包工具,比如webpack,gulp等,也可以通过开启gzip压缩) 合理的使用缓存(设置cache-control,expires,以及E-tag都是不错的,不过要注意一个问题,就是文件更新后,你要避免缓存而带来的影响。其中一个解决防范是在文件名字后面加一个版本号) 减少http请求数,将多个css文件合并,或者是干脆直接写成内联样式(内联样式的一个缺点就是不能缓存)

July 13, 2019 · 1 min · jiezi

Css优先级

内联样式,优先级1000id选择器,优先级100类和伪类,优先级10元素选择器,优先级1通配选择器,优先级0继承的样式没有优先级当选择器包含多种选择器时,需要将多种选择器的优先级相加然后进行比较。但是注意,选择器的优先级计算不会超过他的最大数量级, 如果选择器的优先级一样,则使用靠后的样式。 并集选择器的优先级时单独计算。可以在样式的最后添加一个!important,则此时该样式会获得一个最高的一个优先级,将会超过所有的样式甚至超过内联样式,所以在开发中尽量避免使用。

July 13, 2019 · 1 min · jiezi

列举几条常用的CSS-reset是否了解normalizecss

Normalize.css只是一个很小的css文件,但它在磨人的HTML元素样式上提供了跨浏览器的高度一致性。相比于传统的CSS reset,Normalize.css是一种现代的、为HTML5准备的优质替代方案。总之,Normalize.css是一种CSS reset的替代方案。 我们创造normalize.css有下面这几个目的: 保护有用的浏览器样式而不是去掉他们。 一般化的样式:为大部分HTML元素提供。 修复浏览器自身的bug并保证各浏览器的一致性。 优化css可用性:用一些小技巧。 解释代码:用注释和详细的文档来。 注意:Normalize支持包括手机浏览器在内的超多浏览器,同时对HTML5元素、排版、列表、嵌入的内容、表单和表哥都进行了一般化。尽管这个项目基于一般化的原则,但我们还是在合适的地方使用了更实用的默认值。 Normalize vs Reset Normalize.css 保护了有价值的默认值Reset通过为几乎所有的元素施加默认样式,强行使得元素有相同的视觉效果。相比之下,Normalize.css保持了许多磨人的浏览器样式。这就意味着你不用再为所有公共的排版元素重新设置样式。当一个元素在不同的浏览器中有不同的默认值时,Normalize.css会力求让这些样式保持一致并尽可能与现代标准符合。 Normalize.css 修复了浏览器的bug它修复了常见的桌面端与移动端浏览器的bug。这往往超出了Reset所能做到的范围。关于这一点,Normalize.css修复的问题包含了HTML5元素的显示设置、预格式化文字的font-size问题、在IE9中SVG的溢出、许多出现在各浏览器和操作系统中的与表单相关的bug。 Normalize.css 不会让你的调试工具变的杂乱使用Reset最让人困扰的地方莫过于在浏览器调试工具中大段大段的继承链,在Normalize.css中就不会有这样的问题,因为在我们的准则中对多选择器的使用是非常谨慎的,我们仅会有目的地对目标元素设置样式。 Normalize.css 是模块化的这个项目已经被拆分为多个相关却又独立的部分,这使得你能够很容易也很清楚地知道哪些元素被设置了特定的值。因此这能让你自己选择性地移除掉某些永远不会用到的部分(比如表单的一般化)。 Normalize.css 拥有详细的文档Normalize.css的代码基于详细而全面的跨浏览器研究与测试。这个文件中拥有详细的代码说明并在Github Wiki中有进一步的说明。这意味着你可以找到每一行代码具体完成了什么工作、为什么要写这句代码、浏览器之间的差异,并且你可以更容易的进行自己的测试

July 13, 2019 · 1 min · jiezi

如何做到一个list中奇数和偶数行的背景色不一样

若是用原生js就要判断,例如for(var i = 0; i < 元素行数; i++){if(i%2 == 0){//奇数行代码}else{//偶数行代码}}而且用css也可以添加奇偶数行的样式,例如元素为tr的奇偶设置tr:nth-child(odd){background:#0f0;}tr:nth-child(even){background:#ff0;}

July 13, 2019 · 1 min · jiezi

CSS14个实用技巧的精选和推荐

此文章主要为大家介绍了CSS14个实用技巧的精选推荐,具有一定的参考价值,学习觉得挺不错的,分享给大家。 创业项目 2018优选 本页技巧目录: 1、CSS字体属性简写规则 2、FireFox移除超链接的虚线 3、让固定宽度的页面居中 4、隐藏水平滚动条 5、针对浏览器的选择器 6、同时使用两个类 1、CSS字体属性简写规则 一般用CSS设定字体属性是这样做的: font-weight:bold; font-style:italic; font-varient:small-caps; font-size:1em; line-height:1.5em; font-family:verdana,sans-serif; 但也可以把它们全部写到一行上去: font: bold italic small-caps 1em/1.5em verdana,sans-serif; 注意:这种简写方法只有在同时指定font-size和font-family属性时才起作用。而且,如果你没有设定font-weight, font-style, 以及 font-varient ,他们会使用缺省值,这点要记上。 2、FireFox移除超链接的虚线 FireFox下,当你点击一个超链接时会在外围出现一个虚线轮廓。这很容易解决, 只需要在标签样式中加入 outline:none。 a{ outline: none; } 3、让固定宽度的页面居中 为了让页面在浏览器居中显示, 需要相对定位外层div,然后把margin设置为auto。 wrapper {margin: auto; position: relative; } 4、隐藏水平滚动条 为了避免出现水平滚动条,在body里加入 overflow-x:hidden 。 body { overflow-x: hidden; } 当你决定使用一个比浏览器窗口大的图片或者flash时,这个技巧将非常有用。 5、针对浏览器的选择器 这些选择器在你需要针对某款浏览器进行css设计时将非常有用。 IE6及其更低版本 html {}IE7及其更低版本 :first-child+html {} html {} 仅针对IE7 *:first-child+html {} ...

July 12, 2019 · 2 min · jiezi

CSS面试须知哪些需要掌握得CSS技巧

1 介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的? 标准盒子模型:宽度=内容的宽度(content)+ border + padding + margin低版本IE盒子模型:宽度=内容宽度(content+border+padding)+ margin 2 box-sizing属性? 用来控制元素的盒子模型的解析模式,默认为content-boxcontext-box:W3C的标准盒子模型,设置元素的 height/width 属性指的是content部分的高/宽border-box:IE传统盒子模型。设置元素的height/width属性指的是border + padding + content部分的高/宽 3 CSS选择器有哪些?哪些属性可以继承? CSS选择符:id选择器(#myid)、类选择器(.myclassname)、标签选择器(div, h1, p)、相邻选择器(h1 + p)、子选择器(ul > li)、后代选择器(li a)、通配符选择器(*)、属性选择器(a[rel=”external”])、伪类选择器(a:hover, li:nth-child) 可继承的属性:font-size, font-family, color 不可继承的样式:border, padding, margin, width, height 优先级(就近原则):!important > [ id > class > tag ]!important 比内联优先级高 4 CSS优先级算法如何计算? 元素选择符: 1class选择符: 10id选择符:100元素标签:1000 !important声明的样式优先级最高,如果冲突再进行计算。如果优先级相同,则选择最后出现的样式。继承得到的样式的优先级最低。 5 CSS3新增伪类有那些? p:first-of-type 选择属于其父元素的首个元素p:last-of-type 选择属于其父元素的最后元素p:only-of-type 选择属于其父元素唯一的元素p:only-child 选择属于其父元素的唯一子元素p:nth-child(2) 选择属于其父元素的第二个子元素:enabled :disabled 表单控件的禁用状态。:checked 单选框或复选框被选中。 6 如何居中div?如何居中一个浮动元素?如何让绝对定位的div居中? ...

July 12, 2019 · 3 min · jiezi

HTML中的图片

HTML中的图片< img src="">图片的三种格式JPGJPG适合照片,包含一千六百多种颜色,这是一种有损格式,因为照片缩小时会丢掉图像的一些信息不支持透明度文件比较小不支持动画PNGPNG支持上百种颜色,的图像。PNG有三种:<blockquote>PNG-8,PNG-24,PNG-32</blockquote> <p>取决于你需要表示多少种颜色。 </p> 这是一种无损格式允许将颜色设置为“透明”,使图像下面的东西显示出来PNG文件的大小取决于颜色的多少GIFgif图支持256种颜色是一种“无损”格式也可以设置透明度,但是只支持将一种颜色设置为“透明”GIF文件一般比JPEG文件大支持动画——三种格式里唯一支持动画的 总结: gif,png适合做小文本和logo图,JPEG适合照片** < img src="" alt="" width="" height=""> 其中src表示图片地址,alt表示图片未被加载时显示的替代文字,width表示图片宽度,htight表示图片高度 最好不要用width和height控制图片大小,因为这样在获取网页资源的时候还是要加载原来的图片的,建议用ps调下分辨率再加载进去如果想要将图片设置为跳转则在img标签嵌套在a标签内就可以了** #### 蒙版 蒙版即根据背景颜色柔滑文本边缘的一种效果,一般用于透明背景图片**如果把一个透明呢的图片放在web页面中,则要确定这个图像的蒙版颜色与web页面的背景色一致。透明图像可以使用PNG或GIF格式

July 12, 2019 · 1 min · jiezi

选择器特殊性排名

按照特殊性优先级排名000从左到右 第一个0:如果这个选择器包含id+1 例如:<pre>#choice {color:red;}</pre> 100第二个0:如果这个选择器包含类或伪类+1 例如:<pre>.choice {color:black;}</pre> 010第三个0:如果这个选择器包含元素名+1 例如:<pre>h1{color:blue;}</pre> 001用法将他们读作真正的数进行对比即可例如:100 > 010 > 001;

July 12, 2019 · 1 min · jiezi

echarts大屏字体自适应

用echarts做大屏可视化的时候会遇到不是用电脑投屏而是直接在大屏打开的情况,这时候大屏幕下固定的px为单位的字体就会显得很小。有一种解决方法就是采用rem为单位,根据屏幕的宽度调整html的font-size. 获取屏幕宽度并计算比例function fontSize(res){ let docEl = document.documentElement, clientWidth = window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth; if (!clientWidth) return; let fontSize = 100 * (clientWidth / 1920); return res*fontSize;}在需要设置字体的地方可以这样写,如在1920屏宽下字体设置为12px,就可以传入0.12给fontSize fontSize(0.12) tooltip : { trigger: 'axis', axisPointer : { // 坐标轴指示器,坐标轴触发有效 type : 'shadow' // 默认为直线,可选为:'line' | 'shadow' }, textStyle:{ fontSize: fontSize(0.12), } },

July 12, 2019 · 1 min · jiezi

网站维护费用的那些事你知道多少

很多企业做网站找供应商的时候都会牵扯到一个网站续费问题,当问到网站为什么还需要续费的时候,各个网络公司告诉客户是网站维护费用,细心点的网站销售都会告诉客户网站维护费用由哪些组成,但是依然有很多客户处于朦胧状态,这里十二君再给大家普及下一般网站维护费用由哪些组成。 ①域名注册费用 只要做网站都会牵扯到域名续费,一般域名价格首年价格为16-65之间,具体多少因注册商与域名后缀不同而价格不同,各个网络公司一般收费为100-200元/年,为什么比域名注册平台高,因为域名注册平台仅包含注册,不含域名解析等服务,需要自助解析,网建公司有服务在内所以价格略微高于域名注册平台。 ②网站空间费用/服务器费用 网站上的图片文字需要有个储存的地方,与电脑硬盘存储一个道理,比如你的电脑里可能会存储很多小电影,美女图片一样。网站空间/服务器是需要租赁的,一般来说网站空间费用/服务器费用为几百元到几千元不等,也是因空间商不同、空间/服务器配置不同导致的价格不同。网建公司卖的价格略高于空间商,理由与域名费用一样。 ③网站内容更新的人力费用 网站产品更新、新闻发布、图片处理都是需要人力服务的,所以会产生费用,值得一提的是有些客户一年到头没有什么更新,那么网建公司轻松,小赚一笔。而有些客户频繁更新,那么对于网建公司而言,其实是亏本的。 ④网站bug修复/程序修改费用 网站上线之后,可能会遇见之前做网站的时候没注意导致的bug,那么这个修改也会产生人力成本,程序小调整也是一样,甚至网站空间问题导致的网站打不开依然是需要人力处理的,所以就产生了费用。 ⑤技术咨询费用 很多时候成本是浪费在沟通技术咨询上,经常遇见客户改一个内容只需要几分钟,但是跟客户沟通可能就需要几倍的时间,这个成本是较高的。为什么会这样,还是因为大多数客户互联网意识还不强,很多不了解。因为不懂,所以并不能直接高效的向你表达需求,那么你需要耐心地询问清楚,才能做出修改,所以工时会拉长。这里温馨提示广大客户:不要那么催网建公司,每天网建公司都有新订单,需要做新单,已经上线网站的客户,一般都会进行排单,比如每天下班前会修改掉,否则来一个客户立马修改只会影响效率。比如十二君公司对于网站修改的问题,一般都是当天所有提出网站修改的客户意见汇总,整理成一个个word文档,两个工作日内会改掉完成,然后再给客户回一个文档。 最后:当然关于网站维护费用组成还可能会因各个网建公司情况不同,会有些微调,具体就需要看企业主在哪家做网站了。---PS:本文出自成都多享科技有限公司

July 12, 2019 · 1 min · jiezi

小程序给餐饮行业带来第二春

餐饮行业小程序无非有一下几个优点:一、自助点餐完美的浏览体验用户可以随时查看商家信息,随时查看排队,预约信息。随时查看优惠,随时点餐,点外卖,排队。使用最前沿的小程序技术,近乎完美的用户体验让餐厅和客户互动更便捷友好。 二、节省人力,物力服务员掌上工作台、让服务员爱上工作。服务员使用手机即可实现上菜-划菜-开台-点餐-订单审核-收桌叫号。随时查看餐厅的公告,最新菜品,销售提成等操作简单,快速上手。 三、自己的平台拥有自己的外卖平台深度解决外卖问题。通过小程序即可进入点餐页面,随时点餐对接第三方配送,自动接单打印,自动配送杜绝平台抽成,从现在开始。 四、随时掌控实时的数据分析,随时随地掌握餐厅运营情况。移动端数据分析,随时查看餐厅实时数据、经营情况、提高管理效率智能分析餐厅营收,综合数据报表,第一时间发现运营异常信息。 五、会员营销会员直销多种营销功能,为您提供最简单的营销体验在餐前、餐后都可以对客户进行优惠促进用户到店消费,提升餐厅营业额。 除了已经推行成功的出行领域,餐饮点餐有可能是小程序最佳的线下使用场景之一。微信正在重新调整部分入口,一波新的流量机会可能来了。继「看一看」新增「好看」栏目,近期,有用户发现,微信正在成都地区内测新的功能插件「附近的餐厅」。使用小程序点餐也极大地提高了商家的接待效率,不仅省去了前台人工,而且线上提前预约下单,可以有效拉低后厨的订单处理峰值。无论是到店扫码点餐,还是线上点餐,商家都可在支付后发送优惠券,吸引用户二次到店。 如今,微信以社交关系为基础的附近的餐厅又卷土重来。对于用户而言,点评餐厅等信息好友可见尚无不可,但如果涉及到酒店住宿、景点、出行等领域,肯定会引发巨大恐慌与争议。微信的新功能,也将触及到一大批用小程序做本地化美食推荐的小程序。一旦微信下场来做,这类小程序开发者的机会就没了。         看过上面的介绍后相信大多数小伙伴们对于餐饮微信小程序怎么做都会有一定的认识了。现而今我们大家都清楚餐饮业在当前最为火爆,然而面对电商的冲击,使得线下的服务有些明显大不如前。但小程序的发展,吸引更多线上客户到线下消费,这无疑是实体店的春天。尤其是餐饮业更是可以借此得到更多的利处。   ---本文出自成都多享科技有限公司

July 12, 2019 · 1 min · jiezi

纯css实现开关效果

大家好,我又来了,这次给大家表演使用纯css实现开关效果 首先是构思我们使用<input type="checkbox">标签来实现这个效果。checkbox的选中、未选中的特性,刚好对应开关的打开、关闭on:打开 off:关闭 <label for="ck2"> <input type="checkbox" id="ck2"> <span>未选中,则关闭开关</span></label><br><label for="ck1"> <input type="checkbox" id="ck1" checked> <span>选中,则打开开关</span></label> 开始画出off、on状态的草图这里要讲解一下,使用了position来实现的定位。有不了解的同学可以打开MDN查看相关知识 <P>off状态草图</P><div class="toggle"> <div class="cookie"></div></div><br><P>on状态草图</P><div class="toggle2"> <div class="cookie2"></div></div>.toggle{ display:inline-block; position:relative; height:25px; width:50px; border-radius:4px; background:#CC0000;}.cookie{ position:absolute; left:2px; top:2px; bottom:2px; width:50%; background:rgba(230,230,230,0.9); border-radius:3px;}.toggle2{ display:inline-block; position:relative; height:25px; width:50px; padding:2px; border-radius:4px; background:#66CC33; }.cookie2{ position:absolute; right:2px; top:2px; bottom:2px; width:50%; background:rgba(230,230,230,0.9); border-radius:3px;} 然后我们将这两个草图放到label内<label for="ck4"> <input type="checkbox" id="ck4"> <div class="toggle"> <div class="cookie"></div> </div></label><br><label for="ck3"> <input type="checkbox" id="ck3" checked> <div class="toggle2"> <div class="cookie2"></div> </div></label> 结合label和checkbox整理、优化css<label for="ck5"> <input type="checkbox" id="ck5"> <div class="toggle-finish"> <div class="cookie-finish"></div> </div></label><br><label for="ck6"> <input type="checkbox" id="ck6" checked> <div class="toggle-finish"> <div class="cookie-finish"></div> </div></label>.toggle-finish{ cursor:pointer; display:inline-block; position:relative; height:25px; width:50px; border-radius:4px; background:#CC0000;}.cookie-finish{ position:absolute; left:2px; top:2px; bottom:2px; width:50%; background:rgba(230,230,230,0.9); border-radius:3px;}input:checked + .toggle-finish{ background:#66CC33; }input:checked + .toggle-finish .cookie-finish{ left:auto; right:2px;}到此为止就已经基本实现一个开关的功能了,记得将input隐藏起来哦可以点击预览https://codepen.io/Ritr/pen/W...另外我还优化了一个动画版https://codepen.io/Ritr/pen/L... ...

July 11, 2019 · 1 min · jiezi

轻松实现固定比例的块级容器

给H5布局的时候一般都会碰到banner(横幅) 比如要显示成2比1 当然后端返回的图片是2比1就好了 但事情往往不会那么如意 所以怎么办呢 ? 写死宽高总觉得不妥当默认width: 100%;让height自适应呢 图片会慢慢撑开(产品经理就会说这样用户体验不好 我TM就是用户 我就觉得挺好)方法来了 .banner-wrapper { position: relative; width: 100%; padding-top: 50%; } .banner { position: absolute; left: 0; top: 0; width: 100%; height: 100%; } <div class="banner-wrapper"> <img class="banner" src="./img/portfolio/cabin.png" alt=""> </div>下面说明一下padding-top: 50%;是个关键 用百分比写padding是相对自身的宽的(别问我为什么 事实就是这样) 所以width: 100%; padding-top: 50%;就会完美呈现出一个2比1的盒子 最后把img整个的胡上去 完活 是不是觉得狠简单 用就完了 !

July 11, 2019 · 1 min · jiezi

JS复习JS中事件的捕获与冒泡

https://juejin.im/post/5aab87...

July 11, 2019 · 1 min · jiezi

CSS水平或垂直居中技巧

前言css水平和垂直居中是一个更古不变的话题,它常常出现在优美的网页上以及各大前端面试当中。说来惭愧,在两年前面试的时候,我完全不知道如何做到水平和垂直均居中的方法,那场面别提有多尴尬了(ps:特想找个地洞钻进去)。。。时隔两年,对于这个问题算是有一些了解了,现做个小小的整理,也算是对自己学习的总结。 注:文中例子没写明html代码时,使用的是下面结构: <div class="example example14"> <div class="con"> 超级好用超级放心 <a href="https://tinypng.com/" target="_blank">在线压缩图片</a> <span>压缩完可以 </span> </div></div>只是类名会有所不同。 1、Line-height适用情景:单行文字(垂直居中)原理:将单行文字的行高设定后,文字会位于行高的垂直中间位置。html: <div class="example">Lorem ipsam.</div>css: .example{ width: 400px; background: #afddf3; line-height: 50px;}效果: 2、Line-height + inline-block原理:将多个元素或多行元素当成一个行元素来看待,所以我们必须要将这些数据多包一层,并将其设定为inline-block。由于inline-block在不同浏览器会有空隙产生,因此设定父元素font-size:0来消除,从而达到完美的垂直居中。css: .example2{ width: 400px; border: 1px solid #dcdcdc; line-height: 100px; font-size: 0;}.example2 .con { display: inline-block; line-height: 2; vertical-align: middle; width: 300px; font-size: 15px; background: #afddf3;} 3、:before + inline-block原理::before 伪类元素搭配 inline-block 属性的写法应该是很传统的垂直居中的技巧了,此方式的好处在于子元素居中可以不需要特别设定高度,我们将利用:before伪类元素设定为100%高的inline-block,再搭配上将需要居中的子元素同样设置成inline-block性质后,就能使用vertical-align: middle来达到垂直居中的目的了,此方式在以往其实是个非常棒的垂直居中解决方案,唯独需要特别处理掉inline-block元素之间的4-5px空间这个小缺陷,不用怕,设置父元素font-size: 0,子元素font-size: 15px即可。css: .example3 { margin-top: 10px; width: 400px; height: 150px; font-size: 0; border: 1px solid #dcdcdc;}.example3::before { content: ''; display: inline-block; height: 100%; width: 0; vertical-align: middle;}.example .con { width: 300px; font-size: 15px; background: #afddf3; display: inline-block; vertical-align: middle;} ...

July 11, 2019 · 3 min · jiezi

从master拉取新分支并push到远端

从master拉取新分支并push到远端开发过程中经常用到从master分支copy一个开发分支:1.切换到被copy的分支(master),并且从远端拉取最新版本$git checkout master$git pull2.从当前分支拉copy开发分支$git checkout -b devSwitched to a new branch 'dev'3.把新建的分支push到远端$git push origin dev4.关联$git branch --set-upstream-to=origin/dev5.再次拉取验证$git pull 合并master分支到自己的分支切换到自己的分支(比如:self):git checkout self; 在自己分支下,推送自己的分支到github远端仓库:git push --set-upstream origin self; 在自己分支下,合并master分支到自己的分支:git merge master; 自己的分支pull request到master: 关联本地文件夹到github项目git initgit remote add origin https://自己的仓库url地址git statusgit add .git commit -m '[提交内容的描述]'先 push,以后才能 pull:git push --set-upstream origin master再 git pull撤销 git init 命令:rm -rf .git 撤销 git add . 命令:git rm -rf --cached .

July 11, 2019 · 1 min · jiezi

效果实现在照片上面显示一段文字最多两行多余部分用省略号表示

思路:照片上面显示文字,怎么实现呢?将照片作为div的背景呀! 效果图: html: <div class="outer"> <!-- 多行文本溢出显示 --> <p class="text">我是一段很长的文字我是一段很长的文字我是一段很长的文字我是一段很长的文字我是一段很长的文字我是一段很长的文字我是一段很长的文字我是一段很长的文字</p> </div> <!-- 单行文本溢出显示 --> <p class="oneline">我是一段很长的文字我是一段很长的文字我是一段很长的文字我是一段很长的文字我是一段很长的文字我是一段很长的文字</p> <!-- input溢出显示 --> <input type="text">css <style> .outer { /*将图片作为背景*/ background-image: url(./imgs/img.jpg); /*必须设置div的高度,图片才能显示*/ height: 600px; width: 600px; background-repeat: no-repeat; /*图片填满div*/ background-size: 100%; position: relative; }/* 多行文本溢出隐藏 */ .text { position: absolute; top: 200px; left: 50%; margin-left: -100px; width: 200px; color: hotpink; font-size: 1.2em; /* 将元素作为box伸缩盒子 */ display: -webkit-box; /* 设置文本排列方式 */ -webkit-box-orient: vertical; /* 设置文本行数限制 */ -webkit-line-clamp: 2; /* 溢出部分隐藏 */ overflow: hidden; /* 文本溢出的部分显示省略号 */ text-overflow: ellipsis; }/* 单行文本溢出隐藏 */ .oneline { width: 400px; /* 不换行 */ white-space: nowrap; /* 溢出隐藏 */ overflow: hidden; /* 溢出的文本用省略号显示 */ text-overflow: ellipsis; }/* input的溢出显示省略号 */ input { /* 对于input只需要这一行 */ text-overflow: ellipsis; } </style>单行文本溢出显示省略号/* 单行文本溢出隐藏 */ .oneline { width: 400px; /* 不换行 */ white-space: nowrap; /* 溢出隐藏 */ overflow: hidden; /* 溢出的文本用省略号显示 */ text-overflow: ellipsis; }多行文本溢出显示省略号/* 多行文本溢出隐藏 */ .text { width: 200px; /* 将元素作为box伸缩盒子 */ display: -webkit-box; /* 设置文本排列方式 */ -webkit-box-orient: vertical; /* 设置文本行数限制 */ -webkit-line-clamp: 2; /* 溢出部分隐藏 */ overflow: hidden; /* 文本溢出的部分显示省略号 */ text-overflow: ellipsis; }input 溢出显示省略号/* input的溢出显示省略号 */ input { /* 对于input只需要这一行,因为input本身就不会换行,本身就会溢出隐藏 */ text-overflow: ellipsis; }

July 10, 2019 · 1 min · jiezi

JS事件冒泡与捕获

事件冒泡与事件捕获事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题。 如下:假设三层div都有事件监听,这时我们点击的小的蓝方框,事件执行的顺序是怎么样的呢 <div id="s1" style="height: 400px;width: 400px;border: 1px solid red">红 <div id="s2" style="height: 200px;width: 200px;border: 1px solid yellow"> 黄 <div id="s3" style="height: 100px;width: 100px;border: 1px solid blue">蓝</div> </div></div> 事件冒泡微软提出了名为事件冒泡(event bubbling)的事件流。事件冒泡可以形象地比喻为把一颗石头投入水中,泡泡会一直从水底冒出水面。也就是说,事件会从最内层的元素开始发生,一直向上传播,直到document对象。因此在事件冒泡的概念下在div元素上发生click事件的顺序应该是div -> body -> html -> document 事件捕获网景提出另一种事件流名为事件捕获(event capturing)。与事件冒泡相反,事件会从最外层开始发生,直到最具体的元素。因此在事件捕获的概念下在div元素上发生click事件的顺序应该是document -> html -> body -> div -> div w3c 采用折中的方式,制定了统一的标准——先捕获再冒泡。addEventListener第三个参数默认值是false,表示在事件冒泡阶段调用事件处理函数;如果参数为true,则表示在事件捕获阶段调用处理函数。 测试事件冒泡-点击蓝色 s1 = document.getElementById('s1') s2 = document.getElementById('s2') s3 = document.getElementById('s3') s1.addEventListener("click",function(e){ console.log("红 冒泡事件");//从底层往上 },false);//第三个参数默认值是false,表示在事件冒泡阶段调用事件处理函数;如果参数为true,则表示在事件捕获阶段调用处理函数。 s2.addEventListener("click",function(e){ console.log("黄 冒泡事件"); },false); s3.addEventListener("click",function(e){ console.log("蓝 冒泡事件"); },false); 测试事件捕获-点击蓝色s1.addEventListener("click",function(e){ console.log("红 捕获事件"); },true); s2.addEventListener("click",function(e){ console.log("黄 捕获事件"); },true); s3.addEventListener("click",function(e){ console.log("蓝 捕获事件"); },true); ...

July 10, 2019 · 1 min · jiezi

日本RPA工程师的现状和未来

UiBot东京特约观察 第7期文丨马磊 在日本使用RPA成功实现业务自动化的企业越来越多,RPA已经逐渐成为活跃在各行业比较热门的技术之一,RPA人才也在日本IT职场备受关注。那么,在日本被称为“RPA工程师”的这些人,到底在做一些什么样的工作呢?他们的优势以及未来的前景是什么样的呢?本期我们来一起关注日本RPA工程师的那些事儿。 RPA工程师的工作内容一、软件机器人的开发RPA工程师的核心工作当然是软件机器人的开发。使用RPA开发工具,把各种各样的业务开发成可以实现自动化的机器人程序。因为RPA的最大魅力在于业务流程自动化,因此,RPA工程师首先需要认真听取客户的需求,为客户量身定制最适合的业务自动化解决方案,在此基础上进行程序开发。 二、机器人程序问题的解决RPA工程师不仅仅要开发机器人,在出现BUG以及各种问题时,还要负责解决这些问题。想让软件机器人一直完美地运行下去不出任何问题是十分困难的。举个例子,很多机器人程序的操作对象是Web系统,当这些Web系统的页面结构或者需求发生变更时,RPA程序如果不对此进行适应性修改的话,程序极有可能会出错。 三、RPA咨询当然,这项工作并不完全是RPA工程师的工作,但是一定程度上活用RPA工程师的专业知识必将对咨询工作起到事半功倍的效果。比如,为了将RPA在公司内部普及和运用,公司内部应该成立一个什么样的组织推进起来才比较顺畅?当使用服务器型的工具时,如何管理每一个机器人?类似这样的问题,急需得到RPA工程师的建议。 RPA工程师的收入一个普通的自由职业的RPA工程师,时薪大概是2000日元到5000日元之间。约为120到300元人民币之间。但是对于能力特别强的RPA工程师,或者称之为RPA专家,每月100万日元到150万日元的薪水并不稀奇,甚至业界最高月收入有超过3000万日元的例子。 RPA工程师的优势一、跟其他开发语言的工程师相比,开发速度优势明显。IT工程师,最主要的工作就是写代码,由于RPA工具具有操作直观的优势,并且集成了丰富的控件,重要的操作流程只需简单拖拽即可,相对其他开发语言的工程师来说开发速度上还是比较有利的。二、学习难度较低。RPA技术对于程序上专业知识的要求与其他开发语言相比要求相对较低,对于有编程思想的初学者来说,从学习到实际开发仅需数月即可。跟其他开发语言的能称得上“工程师”的人相比,时间成本优势明显。当然,RPA也并不是一朝一夕就能完全学通的技术,只是入门门槛相对较低。

July 10, 2019 · 1 min · jiezi

移动端兼容问题总结2

发布于: https://luoyangfu.com/article...android 上使用 em,rem 等相对变量单位后,border-radius: 50% 为椭圆描述 background: #ffffff;border: 0.08533rem solid #fd333a;width: 0.34133rem;height: 0.34133rem;border-radius: 0.17067rem;根据网上解决方案:border-radius 设置为具体px值即可。 本人解决方法: 这里需要width 和 height 均需要设置Px值,border-radius 则可以不变使用50%即可。 android 上直接使用 font-family 相关粗体字体,在android 无效描述: 设置相关 medium 字体,字体显示为正常类型字体,无法变粗 解决方式: 设置 font-weight, 在ios机型下不会生效,会根据具体字体表现形式展示,在android上则会表现粗体。 如果有其他解决方案,请不吝赐教。

July 10, 2019 · 1 min · jiezi

微前端改造初探

在写这篇文章的一个多月前,本坑还不知道微前端是什么,大概从字面上的含义是比较小的前端项目。 本坑开始实践它,是由于工作要求。改造一个运行多年,前端用jsp写的服务平台项目(以下简称该平台)。改造它是改造它的前端架构。改造它的原因是比较多人反馈,其页面加载和渲染显得吃力,页面切换后首屏等待时间长的问题,交互体验舒适度不可避免的下降了,特别是在老式电脑面前。 该平台业务比较多,所以组长希望前端框架组能把平台中的前端部分分离出来,最好用当下满大街的Vue、能够按照各个一级菜单分成若干前端子项目,用户访问依然是整体的项目,同时这一改造实施过程不需要重做一个、而是整个500多个页面从局部开始、是逐步、兼容的,新旧同时运行,直至整体被替换。(ps:不重做?这......科学吗?) 看看,慢在哪里其实大概知道慢在哪里,但是不知道究竟慢在具体哪个部分。和其他一以贯之的类似管理平台布局并无不同。左边导航栏,上面顶栏,右侧内容栏,整体页面是一个index.jsp。上面提到的内容栏是一个iframe,里面通过切换src来切换页面。更多的业务造就更多页面,更多页面带来更多的加载。加上长时间没有做好资源加载的管理,导致渲染一次页面需要加载大量js,css或者多次加载同一个文件的情况。该平台大量的配置页面生成,是通过easyui的来做的。通过数据来创造整个页面dom节点,也拖累了内容完整呈现的时间。 我们使用谷歌浏览器performance可以最终追查到这个系统在哪些方面,哪个方法存在着哪些延迟。结论是: 1、混乱的项目资源管理导致大量的资源请求。 2、easyui和项目中不少的dom操作带来大量的重排和重绘。 3、埋点,插件使用不当以及其他。 微前端它是什么呢? 微前端的概念来自于之前流行的微服务。它的来源很大程度是来自于这篇文章 。微服务系统使得后台服务架构能够比较好地规避越来越臃肿的体积带来的性能下降。根据业务合理拆分成一个个的服务,尽量避免一个子服务影响整个项目运行的优势,有效的进行隔离。 那么,前端也有同样的需求吗?答案是肯定的。 今天,日益更新的前端技术,已经能够把一个个页面各个小元素打包成组件库,功能包,在多个项目中引入使用。此外,我们不用再使用难受的iframe来聚合不同的项目,而是导出一个个web component,只需要import 到页面就可以使用。把一个个子项目打包成一个个web component,聚合在入口项目之内。这也许就是微前端现在比较时髦的样子。如果一个大项目有以下特点,微前端可以在这些项目中运用:1、大项目有统一的入口,子项目页面需要无刷新下切换,可是各个子项目在业务上和开发团队上是不同的。 2、项目过大,打包、运行、部署效率出现显著下降的问题。这时希望能根据业务拆分打包,部署。 方案与实施回到本文开头,一开始面对这样的需求还是有些想辞职的冲动,因为觉得需求有点不是符合实际,实际上要实施改版也是需要过程的。 不过静下来想想,搜搜,翻了翻当前项目的前端结构,隐隐约约似乎浮现一些需求可行性的线索。 因为项目的最终目的是把整个jsp页面改成vue来写。而这一要求是逐步替换的过程,所以在改造过程中,同时要保证项目兼容jsp的页面。我们继续沿用了原来就有的iframe,借此把jsp融入整个微前端框架,而已经改造的micro则不需要iframe.我们的开发团队,分框架组和各个业务组。其中每个业务组有3到8个人,他们大多数是后端背景,主要做的也是后端开发。框架组有前端和后端。为了应付庞大的业务开发需求。大部分后端人员都需要使用jsp,js等前端技术进行开发。框架组为了减少他们的前端开发门槛,前端框架组会封装好easyui组件,提供业务组使用。所以,正如前文提到,后端人员是通过数据,结合框架组提供的组件来完成页面的开发的。从某种角度来说,数据配置的页面对接下来的改造工作有一定的帮助,因为大部分页面可以同时改写。 我们对整个项目进行了大致的分类。 1、portal 项目:该项目是整个微前端项目的入口。里面含有loader,用以加载各个项目模块。它也嵌入到子项目中,使得单独运行子项目和portal项目一样的界面要求。2、permission 项目:该项目包含菜单组件,登录页面,顶栏组件,权限控制等。在任何环境下,它都必须首先加载,为子项目模块挂载提供锚点。3、common项目:该项目包含公共业务组件。比如封装好的页面,可以直接给不太能够掌握vue项目的后端人员更加友好的去使用。4、业务项目:就是指业务组各个模块开发的前端项目。什么样的业务分为一个项目,这点由产品和技术人员一起来决定。相对于portal项目,业务项目相当于它的子项目。 前端框架组必须提供一套统一的业务项目的前端模板,可以在确认新建的子项目后迅速的加入到整个项目中,进行开发和部署,而这一过程不能影响其他项目的部署和运行。 除了上述方案浮出水面,还会在改造过程中遇到一个个细节问题。 不过在大方向,框架组成上,前端结构上做好了,细节问题也会随耐心和时间被解决。 分别阐述本坑根据以上的分类,大致进行说明其实现。这其中结合了不少前辈之经验,在文章结尾处鸣谢。 Portal:portal 项目是整个项目部署的入口,它的核心来自于single-spa 在整个项目结构中它将集成到每一个子项目。集成的方式很粗暴简单,就是外联加载。portal负责根据不同的环境来对应的组件和app,同时也安装各个app,卸载各个app等,它负责app在single-spa的生命周期。比如集成模式下根据环境和路由加载对应的app,而在子项目运行时只加载公共组件和不同业务的app。 那么protal是如何加载的呢? protal维护了一个json里面包含了各个子项目的index.html的信息,通过匹配index.html里面的src 、link,加载各项资源。 module.exports = { common: { webName:'common', globalVarName: 'mfe:common', componentsTarget: '/common/release/components/web.html', resourcePatterns: ['/components.[0-9a-z]{8}.js/g'], loadType:'before' }, permission: { webName:'permission', globalVarName: 'mfe:permission', // URL 匹配模式 matchUrlHash: '', // 微前端地址 componentsTarget: '/permission/release/components/web.html', webTarget:'/permission/release/web/web.html', // 资源匹配模式 resourcePatterns: ['/common.[0-9a-z]{8}.css/g','/store.[0-9a-z]{8}.js/g', '/publicPath.[0-9a-z]{8}.js/g','/singleSpaEntry.[0-9a-z]{8}.js/g','/components.[0-9a-z]{8}.js/g'], //是否要在项目启动前加载,before为提前加载,after为hash变化后加载 loadType:'before' }, app4vue:{ webName:'repair-order', globalVarName: 'mfe:app4vue', matchUrlHash: '/layout/repair-order', webTarget: '/app4/release/web/web.html', resourcePatterns: ['/common.[0-9a-z]{8}.css/g','/store.[0-9a-z]{8}.js/g', '/singleSpaEntry.[0-9a-z]{8}.js/g'], loadType:'after' }} async gatherResource () { const self = this // const spaEntry = 'portal' const web = self._webName //如果是微前端聚合模式 if (window._IS_SIGLE_PORTAL) { if (web !== 'mfe-permission') { await self.loadComponents(micros.common) await self.loadApp(micros.permission) } } else { if (web === 'mfe-permission') { await self.loadComponents(micros.common) } else { if (web !== 'mfe-common') { await self.loadComponents(micros.common) } await self.loadApp(micros.permission) } } // return new Promise(resolve => resolve('loader:all Finish!')) }permisson:permission负责登录页,layout中的菜单栏,顶栏。所有的子项目app都必须挂载到permission项目中的显示区块里。也就是说permssion会提供锚点给子项目挂载。 ...

July 10, 2019 · 2 min · jiezi

CSS字体对应的字重

场景设计师给的标注文件经常会出现一个情况,字重总是通过直接设置具体的字体来指定字重。 对应关系但对于开发而言,font-family指的应该是这个字体包含的所有,所以字重应该就用font-size表示,其对应关系大致符合:100 - Thin200 - Extra Light (Ultra Light)300 - Light400 - Regular (Normal、Book、Roman)500 - Medium600 - Semi Bold (Demi Bold)700 - Bold800 - Extra Bold (Ultra Bold)900 - Black (Heavy)

July 10, 2019 · 1 min · jiezi

vue-transition-过渡动画-从左向右进入从右向左进入

弹窗从右向左进入<transition name="moveR"></transition><style lang="scss"> .moveR-enter-active, .moveR-leave-active { transition: all 0.3s linear; transform: translateX(0); } .moveR-enter, .moveR-leave { transform: translateX(100%); } .moveR-leave-to{ transform: translateX(100%); }</style>弹窗从左向右进入<transition name="moveL"></transition><style lang="scss"> .moveL-enter-active, .moveL-leave-active { transition: all 0.3s linear; transform: translateX(0%); } .moveL-enter, .moveL-leave { transform: translateX(-100%); } .moveL-leave-to { transform: translateX(-100%); }</style>注意:在根节点的样式里不要加transform:translateX()属性,否则过渡会失效。例: <template> <transition name="moveL"> <div class="rotating" v-if="rotatShowStatus"> </div> </transition></template><style lang="scss">.rotating { position: absolute; top: 0; left: 58px; height: 100%; width: 300px; z-index: 998; /*transform: translateX(0%);*/ //加了这个属性 过渡动画会失效 transition: all 0.3s; background-color: #041a2e; }</style>

July 10, 2019 · 1 min · jiezi

Chrome-控制台常用调试技巧详解

1、Chrome控制台小技巧打开和关闭抽屉式选项卡:按Esc键可打开和关闭 DevTools 的 Drawer(抽屉式选项卡) 在Drawer(抽屉式选项卡)中,你可以在 Console 控制台中执行命令,查看动画检查器(Animations),配置网络条件(network conditions)和渲染(rendering)设置,搜索(search)字符串和文件等 使用Request blocking 阻塞请求: 使用这个功能可以拦截请求;比较常用的场景是,页面执行完某操作后页面就进行重定向跳转了,这时如果想调试重定向前发的请求做了啥,就可以使用此功能进行阻塞拦截 debugger:代码手动编程设置断点调试;Coverage 代码覆盖率检测:可以观察到代码覆盖率,哪些是没用的,去除无用代码,较少代码体积Changes 变化:显示更改代码的比较,可以通过这个工具观察你用控制台修改过的代码,类似于git 的 diff 功能类似,红色代表删除、绿色代码新增;Snippets:在 console 里可以临时运行代码,但是书写格式不太友好,而且一换行就执行了(虽然可以 shift+enter 换行),不想打开代码编辑器怎么办,可以使用 Snippets 这个工具创建js脚本,并可以访问和从任何页面的Chrome DevTools面板中执行(除非你删除)。 2、console控制台命令$_:返回最近一次计算的表达式的值;$(selector):返回匹配指定CSS选择器的第一个DOM元素的引用,实际是document.querySelector()函数的别名;$$(selector):$\$(selector)返回一个与给定CSS选择器匹配的元素数组,等效于调用document.querySelectorAll();$x(path):返回一个与给定XPath表达式匹配的DOM元素的数组;clear(): 清除控制台中所有历史记录;copy(object):将指定对象的字符串表示复制到剪贴板;debug(function):当调用指定的函数时,调试器被调用并在Sources(源文件)面板上的函数内部断点暂停;dir(object):Console API的console.dir()方法的别名。getEventListeners(object)返回在指定对象上注册事件的监听器keys(object) 返回一个数组,该数组包含属于指定对象的属性名;values(object):回一个数组,该数组包含属于指定对象的属性值;document.body.contentEditable=true:将浏览器变成编辑器monitorEvents(document.body, "click"):第一个参数是要监听的对象。如果未提供第二个参数,所有事件都会返回。要指定要监听的事件,传递一个字符串或字符串数组作为第二个参数;unmonitorEvents(document.body):停止监听body对象上的事件; 3、console API详解有开发就有console,开发调试必使用的一大命令console,看看都有些啥? (1)输出信息基本方法:console.log 用于输出普通信息console.info 用于输出提示性信息console.error用于输出错误信息console.warn用于输出警示信息console.group&&console.groupEnd分组输出,console.groupCollapsed创建新分组console.group('warn警告信息') console.warn('warn1') console.warn('warn2') console.warn('warn3')console.groupEnd()console.group('info信息') console.warn('info') console.warn('info1')console.groupEnd()console.group('log信息') console.warn('log1') console.warn('log2')console.groupEnd()console.group('error信息') console.warn('error1') console.warn('error2')console.groupEnd() 给console输出添加样式(通过背景属性图片也可以输出哦)['log','info','warn','error'].forEach(item => { let $print = console[item]; console[item] = function() { $print.call(console, '%c'+Array.prototype.slice.apply(arguments).join(' '), 'font-size: 16px;padding:10px;font-weight: bold;text-decoration: underline;') }}) (2)复杂类型输出:console.dir | console.dirxml:替代for in详细的输出对象信息,经常遇到的坑点是,使用console.log想打印出对象信息,发现只有[object Object],现在可以使用dir;dirxml如果可以会使用xml形式打印。 ...

July 9, 2019 · 1 min · jiezi

css-预处理器-sassscsslessstylus

css 预处理工具,可以将其编译为 css基本介绍sass/scssSASS 2007年诞生,最早也是最成熟的CSS预处理器,拥有ruby社区的支持和compass这一最强大的css框架Sass的缩排语法,对于写惯css前端的web开发者来说很不直观,sass 不兼容 css 代码Sass3 就变成了Scss(sassy css) 与原来的语法兼容,只是用{}取代了原来的缩进sass 的运行 依赖于 ruby 环境(compass 将 sass 编译为 css)现在可用 node-sass 来编译 sass/scss 文件 node-sass 是一套在 node.js 用 LibSass 編 sass/scss 的工具原始的sass 是用 ruby 编写的,所以需要 ruby 环境,libSass 是原始sass引擎的一个 c/c++ 接口,使用它编译sass不依赖于ruby,可以使用其他语言使用libSassnode-sassruby-sass与libsass的区别安装node-sass时,会去GitHub 下载一个 .node的文件而这个文件托管在墙外的服务器上,所以失败了 node-sass安装失败解决方案以 .sass 或 .scss 为文件后缀名称(现在一般都是用 scss)lessless 2009年出现,受sass的影响较大,但又使用CSS的语法,让大部分开发者和设计师更容易上手,在ruby社区之外支持者远超过SASS,其缺点是比起SASS来,可编程功能不够,不过优点是简单和兼容CSS,反过来也影响了sass演变到了scss的时代,著名的Twitter Bootstrap就是采用LESS做底层语言的。less 可以使用 less.js 在浏览器运行时中解析 less 代码也可以在 node环境中 安装 less,提前编译 less 文件 `npm install -g less &lessc styles.less styles.css` (可以加参数控制编译后的css排版及压缩)以 .less 为文件后缀名称stylusStylus,2010年产生,来自Node.js社区,主要用来给Node项目进行CSS预处理支持,由 TJ 大神开发安装及编译 npm install stylus -g & stylus src/ (可以加参数控制编译后的css排版及压缩)以 .styl 为文件后缀使用现状现在一般都是配合webpack使用这几种预处理语言,需要先安装 编译器、对应 loader,然后再 module.rules 配置其具体规则基本语法less 基本语法属于 css 风格,而 sass,stylus 利用缩进,空格,换行来减少需要输入的 字符目前 scss, stylus 也可以支持 css 风格,用大括号 来书写 ...

July 9, 2019 · 2 min · jiezi

Css清除浮动的方法总结

网页布局中经常会用到float浮动,但是浮动的块级元素脱离了标准文档流,使得浮动元素的父元素没有高度,导致父级元素没有高度,所以需要清除浮动对父级元素的影响,本文介绍清除浮动的几种方法。清除浮动影响的几种方法: 给父级元素设置高度效果图: 代码: <style> * { padding: 0; margin: 0; } .header { height: 30px; line-height: 30px; background-color: #333; } .header a { color: #fff; text-decoration: none; } ul { float: right; } li { float: left; list-style: none; padding-right: 20px; }</style><div class="header"> <ul> <li><a href="#">首页</a></li> <li><a href="#">文章</a></li> <li><a href="#">问答</a></li> <li><a href="#">帮助</a></li> <li><a href="#">关于</a></li> </ul></div>外墙法:使用一个空白块级元素上添加css样式clear清除浮动注意:添加了clear样式的块级元素添加不了margin外边距属性 效果图: 代码: <style> * { padding: 0; margin: 0; } .header { /* background-color: #333; */ } .header a { /* color: #fff; */ text-decoration: none; } ul { float: right; } li { float: left; list-style: none; padding: 5px 20px; } .clearfix { height: 10px; background-color: red; clear: both; } .main { color: #fff; height: 100px; background-color: blue; }</style><div class="header"> <ul> <li><a href="#">首页</a></li> <li><a href="#">文章</a></li> <li><a href="#">问答</a></li> <li><a href="#">帮助</a></li> <li><a href="#">关于</a></li> </ul> </div><div class="clearfix"></div> <div class="main">主要内容</div>内墙法:使用一个空白块级元素上添加css样式clear清除浮动效果图: ...

July 9, 2019 · 2 min · jiezi

angular引入富文本ngxquill自定义图片上传解决Cant-resolve-quill

1. 安装依赖npm i ngx-quillnpm i quillps:一定要安装 quill ,不然ngx-quill会报Can't resolve 'quill' in xxxx, 因为ngx-quill内部引用了quill。 2. 使用1. 引用/* 在自己的`NgModule`的`imports`里面引用,我是在`RoutesModule`里引用的 */import { QuillModule } from 'ngx-quill';@NgModule({ imports: [ ... QuillModule.forRoot() ... ]})2. 使用组件/* 直接使用 */<quill-editor></quill-editor>/* 模板绑定 */<quill-editor [(ngModel)]="content"></quill-editor>/* 响应式表单 */<quill-editor formControlName="content"></quill-editor>点击查看quill配置地址 3. css 样式引用/* 在 index.html 页面上引用 */<link href="https://cdn.quilljs.com/1.2.2/quill.snow.css" rel="stylesheet">点击查看其他css版本 3. 自定义图片上传给组件添加 onEditorCreated 方法,获取quill对象,并绑定自定义图片上传函数 html:<quill-editor (onEditorCreated)="EditorCreated($event)"></quill-editor>ts: // 富文本初始化钩子函数 EditorCreated(quill: any) { // 获取quill的工具栏对象 const toolbar = quill.getModule('toolbar'); // 给工具栏的image功能添加自定义函数,注意this指向问题 toolbar.addHandler('image', this.imageHandler.bind(this)); // 保存quill对象 this.editor = quill; } // 自定义图片上传功能 // 创建一个input对象来实现上传,除了下面的自定义代码区域,其他为官方代码 imageHandler() { const Imageinput = document.createElement('input'); Imageinput.setAttribute('type', 'file'); Imageinput.setAttribute('accept', 'image/png, image/gif, image/jpeg, image/bmp'); // 可改上传图片格式 Imageinput.classList.add('ql-image'); Imageinput.addEventListener('change', () => { const file = Imageinput.files[0]; if (Imageinput.files != null && Imageinput.files[0] != null) { /* 自定义代码 */ ....... ....... // 下面这句话必填,成功后执行 (imageUrl 为上传成功后的图片完整路径) this.editor.insertEmbed(this.editor.getSelection(true).index, 'image', imageUrl); } }); Imageinput.click(); }无注释复制粘贴版本 ...

July 9, 2019 · 1 min · jiezi