关于html5:数据中心三维可视化之集装箱机房

前言随着寰球网络经济的迅猛发展,数据中心逐渐成为了社会倒退的外围能源,需要的日益简单,建设模式也迎来泛滥的挑战。集装箱式数据中心的呈现能够解决这一问题——将服务器、存储、网络设备等全副放入集装箱,集装箱式的设计相比传统数据中心易搬运、成本低、搭建速度快,可不用受场地限度。满足在短期内疾速扩容部署,具备高效制冷、低碳经济、节能环保、灵便运输的低劣属性。 图扑(Hightopo)为此退出3D可视化模块,通过三维仿真技术残缺还原数据中心全貌,进一步实现对泛滥子系统集中调配治理的目标。做到在线实时查看、操作便捷、多重视觉体验,升高机房治理难度,加重机房运维压力。为大型户外作业、电力通信基站等场地资源受限、业务诉求一直增长的特定模式下提供了最佳且灵便的解决方案。 HT for Web 不止自主研发了弱小的基于 HTML5 的 2D、3D 渲染引擎,为可视化提供了丰盛的展现成果。介于 2D 组态和 3D 组态上,Hightopo(以下简称 HT )的 HT for Web 产品上的有着丰盛的组态图标库可供选择,本文将介绍使用HT丰盛的 2/3D 组态 搭建出的一个3D可视化集装箱数据中心。 界面简介及成果预览载入动画:界面由车载集装箱映入眼帘,而后展现集装箱内数据机房的结构;随着画面的加载结束,咱们也能够分明的看到 H T的可视化仿真机房基础设施设施状况。以及右侧为 2D 数据面板,实时理解机房设备状况。 系统分析环境可视化 在3D可视化集装箱式数据中心中,可查看以后数据中心的详情,如容量统计、资产统计、管线统计、告警统计等。反对展现环境内构造布局,以及对应集装箱机房的机柜、服务器、空调、发电机、配电柜、UPS等设施信息。 容量治理可视化 零碎可对机柜U位、电力负荷、各区域承重及存储容量状况进行直观查看和及时更新,可通过2D面板理解该环境下根底设施容量应用的具体数据。 当数据中心机柜有新设施上架时,零碎会间接获取新设施的数据信息以及以后U位的应用状况;对机房机柜电力负荷状况进行散布统计,可抉择通过不同色彩进行辨别机柜功率的大小。 还原实在场景,满足上万条数据同时进行自动更新,兼顾空间、配电、设施等多维度因素,晋升空间可用性和能用率,管理者轻松掌控机房全局容量。    资产治理可视化 传统资产治理模式能用性较差、效率低下,不适用于资产量宏大或品种繁多的数据中心。采纳Hightopo 3D数据可视化技术,即便面对再繁冗的资产,也可通过检索性能疾速查找资源设施,对其进行定位及信息详情展现。在3D场景中可任意查问资产对象,如设施型号规格或CPU负载情况。反对运维人员在线近程调取摆布该资产对象的检修记录、履历信息和以后运行状态等任意信息。如下: 监测蓄冷罐:在机房产生故障时是否失常启动的放冷模式、充冷模式和保冷模式; 监测收缩罐:是否失常运作,确保水压均衡,机房失常运作; 监测冷却塔:是否失常进行循环水冷却等。 将虚构资产事实资产一一对应,资产治理3D可视化运维变得更为直观。实现多个机房集中监控,历史查问,远程管理,预警告警、定位于一体的智慧机房。 管线可视化 在3D可视化环境中能分明看到管线散布的全景视图,运维人员可点击查问单设施的所有链路信息或展现链路中蕴含的全副设施,出现数据中心从低压市电引入至列头柜(智能母线、PDU)输入的变配电零碎设施和线路。 管线可视化能无效梳理数据中心密集的电气管道和网络线路,让运维人员更直观地把握数据中心的管线散布及走线状况,从而疾速排查及修复管线类故障。被动预警及时告知电力网线布局或输、发、变电环节的不合规状况,突破以后数据扩散的场面,进步管线管理水平和故障解决效率。 动环监控可视化 (1)预警告警 智能巡检 动环监控零碎中的设施监控信息,是通过智能数据接口或传感器采集多方面监控数据(如供配电、UPS、消防系统等),实现设施运行的失常状态监测、异样状态预测、告警阀值设定、功率参数、应急预案的智能监控性能。当设施数据超过预设阀值时,零碎将进行预警提醒。在3D可视化环境内联合2D面板展现进去,确保机房内始终保持适合的能源供给。 零碎反对对该可视化场景提供智能巡检计划,运维人员自定义布局巡检门路,对各个巡检节点进行平安治理。辅助运维人员做出科学决策,一改来日“关门看报告、拍脑袋定计划”的景象。 (2)3D温度云图 数据中心“喜冷怕热”,随着计算规模的逐渐增大,热量也会逐步升高。通过装设温湿度监测模块,进而呈现出该环境内所有的热源散布,及时发现疾速定位异样温度区域并揭示管理人员。鼠标点选设施可查看子设施实时温度数据,数据由2D面板出现。 采纳3D温度云图,实时感知机房外部温湿度状况,较大水平上缓解机房温度过高问题,杜绝被动“热处理”。 理论利用面对从天而降的疫情,且在春节期间运维人员较少的状况下,为保障各大科研医疗机构失常运行,全力做好数据中心运作安稳,3D可视化集装箱数据中心无疑是最好的抉择。 利用车辆疾速运输,可依据需要及场地情况扩散或集中叠放部署,做到疾速调度布局。即便运维人员再少,也能做到24小时实时监控,第一工夫发现机房安全隐患,保障机房运维和医疗机构业务的连续性。 3D可视化数据中心治理维持了环境,设施以及资产的稳定性;大幅度降低运维人员的失误率和保护老本,晋升经营效率;监测信息数据扼要精确易于了解,能无效改善不同班次之间的沟通;辨认设施信息缺点,减速故障排查过程,进步平安合规性。数据中心是通信网络的 “心脏”,选用HT三维仿真技术实用强,性能全面、性能稳固,联合集装箱式数据中心本身劣势,利用起来无疑是精益求精。将数据全面集成,扭转数据孤岛景象,成为实现数据中心扁平化、集约化、一体化无力的助推剂,为机房监控的倒退带来革命性的提高。 总结机房是通信网络的重要“心脏”,信息技术在军事畛域的广泛应用,使作战形式和作战伎俩呈现出簇新的风貌,面对信息时代的军事转型,数据中心曾经成为了军队信息化建设要害的因素之一。基于对在航天军工畛域的多年积攒与HT 可视化技术,不仅能够实现了我的项目的高效建设,实现高度的灵活性,还能依据用户的业务需要变动便捷高效地进行批改调整,为用户的业务利用提供了充沛的技术撑持。 咱们更新了数百个工业互联网 2D/3D 可视化案例集,在这里你能发现许多离奇的实例,也能发掘出不一样的工业互联网:https://mp.weixin.qq.com/s/ZbhB6LO2kBRPrRIfHlKGQA,同时,你也能够查看更多案例及成果:https://www.hightopo.com/demos/index.html

January 31, 2021 · 1 min · jiezi

关于html5:小细节盒模型里面连续输入英文和数字不会自动换行汉字会自动换行

问题形容昨天开发中遇到一个小问题,就是间断输出许多数字发现不换行,会始终横向超出盒子的宽度。然而如果是输出间断汉字就会主动换行。起初试了试间断输出英文也是不会主动换行。起初通过一番钻研将细节总结一下: 间断中文会主动换行(两头无空格)间断英文不会主动换行(两头无空格)间断数字不会主动换行(两头无空格)代码如下<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> div { width: 200px; height: 200px; background-color: #cde; /* 默认换行规定就是normal模式,写不写一个样 */ word-break:normal; } </style></head><body> <!-- 间断汉字会主动换行 --> <div> 代码代码代码代码代码代码代码 </div> <br> <!-- 间断英文不会主动换行 --> <div> wwwwwwwwwwwwwwwwwwww </div> <br> <!-- 间断数字不会主动换行 --> <div> 6666666666666666666666666 </div></body></html>效果图如下 解决方案通过css规定 word-break: break-all; 管制即可 代码如下<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> div { width: 200px; height: 200px; background-color: #cde; /* 默认换行规定就是normal模式,写不写一个样 */ word-break:normal; /* 解决方案,加上这个 */ word-break: break-all; } </style></head><body> <div> 代码代码代码代码代码代码代码 </div> <br> <div> wwwwwwwwwwwwwwwwwwww </div> <br> <div> 6666666666666666666666666 </div></body></html>效果图如下 ...

January 31, 2021 · 1 min · jiezi

关于html5:localStorage和sessionStorage本地存储-打卡每天一份劝退技能

大家好,我是魔王哪吒,很快乐意识你~~ 哪吒人生信条:如果你所学的货色 处于喜爱 才会有弱小的能源撑持。 每天学习编程,让你离幻想更新一步,感激不负每一份酷爱编程的程序员,不管知识点如许奇葩,和我一起,让那一颗到处流荡的心定下来,始终走上来,加油,2021加油! 不要胆怯做梦,然而呢,也不要光做梦,要做一个实干家,而不是空谈家,求真力行。 前言如果这篇文章有帮忙到你,❤️关注+点赞❤️激励一下作者,接管好挑战了吗? 笔芯❤️~ 知识点应用HTML5中的Web Storage API, 能够在客户端存储更多的数据,,能够实现数据在多个页面中共享甚至是同步,对于简单的数据,能够应用 Web SQL Database API 来实现。 把握 localStorage 和 sessionStorage 存储形式, 存储 JSON 对象的数据, 应用 Web SQL Database 的基本操作。 Web StorageWeb Storage API 的属性,办法,事件。 cookie 可用于传递大量的数据, 是一个在服务器和客户端 之间来回传送文本值的内置机制,服务器能够依据 cookie 追踪 用户在不同页面的访问信息。 cookie 的特点: 第一,大小的限度,cookie 的大小 限度 在 4KB 以内。 第二,带宽的限度,cookie 数据 会在服务器和浏览器 之间来回传送,所以拜访哪个页面,都会耗费网络的带宽。 第三,平安危险,因为 cookie 会频繁在网络中传送, 所以在网络上是可见的,在不加密的状况下,是由平安危险的。 第四,操作简单,在客户端的浏览器中,应用 JavaScript 操作 cookie数据是比较复杂的。 所以,如果对于较小的数据,并且须要在服务器和客户端之间频繁传送时,才有 cookie 存在的意义。 什么是 web storageWeb Storage 能够在客户端保留大量的数据,Web Storage本地存储的劣势: ...

January 30, 2021 · 2 min · jiezi

关于html5:最佳实践小程序重点场景异常处理一

一、背景小程序在运行过程中难免会遇到一些异常情况,将会给用户带来不好的体验。针对于此,咱们总结出一些常见的case,总结成最佳实际,帮忙开发者正当解决异样,晋升小程序体验。 二、最佳实际场景一:用户回绝受权定位,二次进入页面不敌对一些小程序须要在进入首屏的时候,需向用户获取地理位置权限,然而若用户一旦误点击【回绝】按钮,那么下次再次进入该小程序时,页面间接显示无奈定位。那么对于个别用户,很难晓得如何再次开启权限,并因而无奈应用小程序,给用户造成了不好的体验。 首次进入小程序时,会弹出获取地理位置信息的对话框,用户点击回绝。 再次进入小程序时,页面会如右图所示,整个页面无内容。 那咱们如何解决这个场景的问题呢?这里提出一种优化倡议: 在用户进入页面时,对以后用户的权限进行判断;若用户没有对应权限,则弹出设置页面来疏导用户开启权限。Page({ onLoad() { swan.authorize({ scope: 'scope.userLocation', fail(err) { // 更多错误码请查看官网文档:https://smartprogram.baidu.com/docs/develop/api/open/authorize_swan-authorize/ // 以 10003 用户回绝受权为例 if (err.errCode === 10003) { swan.openSetting({ success(res) { // 弹出开启异样提醒toast swan.showToast({ title: '请点击权限设置->地理位置 开启地理位置权限', icon: 'none' }); }, }); } }); }});这样用户在进入界面中,能够收到敌对的提醒,通过从新开启权限应用该性能。 场景二:获取用户信息及异样解决在业务开发中,常常会有获取用户信息、地址等需要;咱们发现有些开发者,仍旧在应用以下两个废除的api,这是咱们不提倡的。 官网文档中提供了一种通过 button 调用的形式,具体应用形式如下: <!-- index.swan --><button type="primary" class="middle-btn" open-type="getUserInfo" bindgetUserInfo="getUserInfo">获取用户信息</button><button type="primary" class="middle-btn" open-type="openSetting" bindchooseAddress="chooseAddress">获取用户地址</button> // index.jsPage({ getUserInfo(e) { console.log('用户信息:', e); }, chooseAddress(e) { console.log('收货地址:', e); }});用button 的形式来调用API有一系列益处: 在获取信息前,主动进行用户鉴权解决。应用形式简略,更易于保护。同时,为了更好的解决调用api的谬误场景,下方列出了可能会呈现的谬误,以及对应的解决方案: 开发者能够在谬误回调中,通过错误码来解决不同类别的谬误。 场景三: 领取及异样解决在很多的小程序中,须要接入领取性能,官网上提供了百度收银台这样的性能,能够间接接入业务,具体的应用形式见: ...

January 29, 2021 · 1 min · jiezi

关于html5:如何将Sass编译成CSS

本节咱们来学习 Sass 的编译,咱们写好的 Sass 代码,浏览器是不能辨认的,Sass 只不过是作为一个预处理工具,只有将 Sass 代码编译成 CSS 代码后,才可能应用。那么 Sass 要如何编译成 CSS 代码呢,这就是咱们本节须要讲到的内容。 Sass 的编译办法有很多,例如: 命令行编译模式:比较简单,能够间接在终端中输出 Sass 指令来编译,本节咱们次要讲命令行编译模式的应用。GUI工具编译:有的比拟多的看一工具有 Koala、CodeKit、Scout、Compass.app 等,这些工具都须要装置。自动化编译:能够应用 Grunt 或者 Gulp 来配置 Sass 自动化编译。命令编译命令编译就是在终端中输出 sass 命令来编译 Sass 代码,这种编译形式应用起来很简略。 示例:假如当初有一个Sass文件,文件名为 style.scss (Sass 文件的扩展名名 .scss),咱们须要将这个文件中的代码编译成 CSS 代码,能够执行如下命令: sass style.scss style.css命令执行胜利后,会主动创立一个 style.css 文件。然而这样有一个问题,就是每次更改了 style.scss 文件中的内容,都须要执行一次编译命令,就会很麻烦。 如果要解决上述问题,能够应用监听命令 --watch ,例如: sass --watch style.scss:style.css成果如下图所示:[图片上传失败...(image-c1ec04-1610949292960)] 这样一旦咱们批改了 style.scss 文件,只有从新保留,就会将批改内容主动编译到 style.css 文件中。 如果我的项目中有很多的 sass 文件,能够监听整个目录: sass --watch app/sass:public/stylesheetsSass四种输入格局在编译 Sass 代码时,咱们能够指定 Sass 的编译输入格局,这须要用到 --style 指令,这个指定前面可接如下四种 Sass 输入格局: ...

January 29, 2021 · 1 min · jiezi

关于html5:Vue学习笔记vue的计算属性

==计算属性在解决一些简单逻辑时是很有用的==♦什么是计算属性?能够对数据进行一些转换后再显示,或者须要将多个数据联合起来进行显示 计算属性关键词:computed代码示例1<div id="app"> {{ message.split('').reverse().join('') }}</div>代码示例1中的模板很简单,且不容易看懂 代码示例2<div id="app"> <p>原始字符串: {{ message }}</p> <!--谬误用法(很容易出错的点,reversedMessage后不能加括号)--> <!--<p>{{reversedMessage()}}</p>--> <!--正确用法--> <p>计算后反转字符串: {{ reversedMessage }}</p></div> <script>var vm = new Vue({ el: '#app', data: { message: 'Runoob!' }, // 计算属性的 getter computed: { reversedMessage: function () { // `this` 指向 vm 实例 return this.message.split('').reverse().join('') } }})</script>代码示例2中申明了一个计算属性reversedMessage 提供的函数将用作属性 vm.reversedMessage 的 getter 。vm.reversedMessage 依赖 vm.message,在 vm.message 扭转时,vm.reversedMessage 也会随之扭转 computed和methods比照(理解)computed和methods的成果一样,区别在于: computed 是基于它的依赖缓存,只有相干依赖产生扭转时才会从新取值。(计算属性屡次应用,只会调用一次)应用 methods ,在从新渲染的时候,函数总会从新调用执行。(methods执行几次,就调用几次,没有缓存)代码示例3<div id="app"> <!--1.间接拼接:语法过于繁琐--> <h2>{{firstName}} {{lastName}}</h2> <!--2.通过定义methods--> <h2>{{getFullName()}}</h2> <h2>{{getFullName()}}</h2> <h2>{{getFullName()}}</h2> <!--3.通过computed--> <h2>{{fullName}}</h2> <h2>{{fullName}}</h2> <h2>{{fullName}}</h2></div><script src="../js/vue.js"></script><script> const app = new Vue({ el: '#app', data: { firstName:'Lebron', lastName:'James' }, methods: { getFullName() { console.log('getFullName');//能够在浏览器控制台查看执行3次 return this.firstName + ' ' + this.lastName } }, computed:{ fullName:function(){ console.log('getFullName');//能够在浏览器控制台查看执行1次 return this.firstName+' '+this.lastName } } })</script>应用 computed 性能会更好,然而如果不心愿缓存,也能够应用 methods 属性。 ...

January 28, 2021 · 1 min · jiezi

关于html5:关于h5页面复制粘贴

我的项目中遇到了复制粘贴需要,在小程序外面比拟好办,间接应用api接口setClipboardData,然而在h5页面外面就略微麻烦点。须要借助输入框的select性能,能够应用textarea或者input。 一般H5页面,下应用办法如下: <textarea readonly rows="1" id="copy">12345</textarea> <span @click="copy">复制</span> var copyObj=document.getElementById("copy"); copyObj.select(); document.execCommand("Copy"); alert('复制胜利);第二次应用uni-app做的vue我的项目,打包成h5,因为组件textarea会被编译成上面这样子: 此时id="copy"不是在原生的textarea下面,所以下面的办法行不通。还是百度找到上面的方法: let textarea=document.createElement('textarea')textarea.setAttribute('style','position:fixed;top:0;left:0;opacity:0;z-index:-10;');let text=document.createTextNode('12345');textarea.appendChild(text);document.body.appendChild(textarea);textarea.select();document.execCommand('copy');alert('复制胜利);

January 28, 2021 · 1 min · jiezi

关于html5:网易云音乐年度歌单的卡通形象联动制作

最近朋友圈被很多网易云音乐的年底歌单给刷屏了, 我也去看了我的年度歌单, 发现一个有意思的交互成果, 抉择卡通形象, 通过滑动抉择人物的不同头像,衣服,裤子 最终塑造成一个领有独立共性的卡通形象. 界面成果预览 交互成果预览 制作素材把每个滑动的图片进行了全屏截图, 而后通过图片解决工具去除背景, 制作成对立大小的png图片. 图片的卡通元素都是通过截图获取, 每个元素被解决成对立大小, 局部会有锯齿, 仅供参考. 这里头部比拟非凡, 每个形象的头部大小不一, 这里取一个对立的截止线, 不便前面整合成整个形象. 其它相似,顶对齐即可. 剖析交互的特点1. 轮播图2. 跨屏3. 滑动循环4. 局部衣服滑动会触发裤子的扭转5. 局部裤子滑动会触发衣服的扭转6. ...轮播图代码 <div id="slide" class="bui-slide bui-slide-skin01"></div>var uiSlide = bui.slide({ id: "#slide", height: 320, // autopage: true, // 主动分页 data: [{ image: "images/banner01.png", url: "pages/ui_controls/bui.slide_title.html", }, { image: "images/banner02.png", url: "pages/ui_controls/bui.slide_title.html", }, { image: "images/banner03.png", url: "pages/ui_controls/bui.slide_title.html", }], loop: true, // 循环 }) 跨屏轮播图只需加上 cross:true 参数即可. 相熟BUI的敌人, 一眼就能找到相似的成果, 跨屏轮播图 第1-第3的特点就解决了. ...

January 28, 2021 · 6 min · jiezi

关于html5:HTML5中的拖放功能

大家好,我是魔王哪吒,很快乐意识你~~ 哪吒人生信条:如果你所学的货色 处于喜爱 才会有弱小的能源撑持。 每天学习编程,让你离幻想更新一步,感激不负每一份酷爱编程的程序员,不管知识点如许奇葩,和我一起,让那一颗到处流荡的心定下来,始终走上来,加油,2021加油!欢送关注加我vx:xiaoda0423,欢送点赞、珍藏和评论 不要胆怯做梦,然而呢,也不要光做梦,要做一个实干家,而不是空谈家,求真力行。 前言如果这篇文章有帮忙到你,❤️关注+点赞❤️激励一下作者,接管好挑战了吗?文章公众号首发,关注 程序员哆啦A梦 第一工夫获取最新的文章 笔芯❤️~ 知识点拖拽的体验,你享受过吗,在HTML5之前,能够应用事件mousedown,mousemove,mouseup奇妙实现页面的拖放操作,但留神拖放的操作范畴只是局限在浏览器外部。 而HTML5的拖放API性能间接实现拖放操作,而且拖放的范畴曾经超出浏览器的边界,HTML5提供的文件api反对拖拽多个文件并上传。 要学会把握html5中的拖放api和 文件api,光标拖放事件,从web网页上拜访本地文件系统。 拖放api在html5中的拖放api重点: 第一,为页面元素提供了拖放个性; 第二,为光标减少了拖放事件; 第三,提供了用于存储拖放数据的DataTransfer对象 draggable个性draggable个性用于定义元素是否容许用户拖放:提供了三个值 true,false,auto 把元素变成能够拖放的: <div draggable="true"></div>img元素和a元素默认是能够拖放的光标拖放事件在html5中提供了7个与拖放相干的光标事件: 依照工夫的程序: 第一,开始拖拽时触发的事件,事件的作用对象是被拖拽的元素-dragstart事件 第二,拖放过程中触发的事件,事件的作用对象是被拖拽的元素-drag事件 第三,在拖放的元素进入本元素的范畴内时触发,事件的作用对象是拖放过程中光标通过的元素-dragenter元素 第四,在拖放的元素正在本元素的范畴内挪动时触发,事件的作用对象是拖放过程中光标通过的元素-dragover元素 第五,在拖放的元素来到本元素的范畴时触发,事件的作用对象是拖放过程中光标通过的元素-dragleave元素 第六,在拖放的元素被拖放到本元素中时触发,事件的作用对象是拖放的指标元素-drop元素 第七,在拖放操作完结时触发,事件的作用对象是被拖拽的元素-dragend事件 DataTransfer对象在html5中提供了DataTransfer对象,用来反对拖拽数据的存储。 实现拖放的过程中数据交换。 DataTransfer对象: 属性第一,dropEffect属性:用来设置或获取拖拽操作的类型 和 要显示的光标类型。 如果该操作的成果与起初设置的effectAllowed成果不符,则拖拽操作失败。能够设置批改,蕴含值可为:none, copy, link, move 第二,effectAllowed属性:用来设置或获取数据传送操作可利用于操作对象的源元素,指定值:none, copy, copyLink, copyMove, link, linkMove, move, all 和 uninitialized 第三,type属性:获取在dragstart事件登程时为元素存储数据的格局,如果是内部文件的拖拽,则返回Files。 第四,files属性:获取存储在DataTransfer对象中的正在拖放的文件列表FileList,能够应用数组的形式去遍历。 办法第一,clearData()办法:革除DataTransfer对象中寄存的数据: clearData([sDataFormat])[sDataFormat]为可选参数,取值可能为:Text,URL,File,HTML,Image,设置后,可删除指定格局的数据,如果省略该参数,则革除全副数据。第二,setData()办法:向内存中的DataTransfer对象增加指定格局的数据: setData([sDataFormat],[data])第三,getData()办法:从内存的DataTransfer对象中获取数据 getData([sDataFormat])第四,setDragImage()办法:设置拖放时追随光标挪动的图片 setDragImage([imgElement],[x],[y])[imgElement]示意图片对象,[x],[y]别离示意绝对于光标地位的横坐标和纵坐标第五,addElement()办法:增加一起追随拖放的元素,如果想让某个元素追随被拖动元素一起被拖放,则应用此办法 addElement([element])[element]示意一起追随拖动的元素对象示例// 源元素<div id="dragSource" draggable="true"> 拖动 ![](images/dadaqianduan.png)</div>// 指标元素<div id="dropTarget"></div>增加ondragstart监听事件,给拖放的源元素增加ondragstart监听事件,在事件触发时把源元素里的内容追加至dataTransfer对象中。 最初,把增加监听事件的处理函数DragStart()追加到window.onload事件中。 function DragStart() { var source = document.getElementById("dragSource"); // 拖放源元素 // 监听dragstart事件,作用在源元素上 source.addEventListener("dragstart", function(e){ e.dataTransfer.setData('text/plain', e.target.innerHTML); // 向dataTransfer对象中追加数据 e.dataTransfer.effectAllowed="copy"; },false);}// 增加函数DragStart到window.onload监听事件window.addEventListener("load",DragStart,false);增加dragover监听事件,给拖放的指标元素增加dragover监听事件,在事件触发时扭转指标元素的款式,并屏蔽浏览器的默认处理事件。 ...

January 28, 2021 · 3 min · jiezi

关于html5:自学WEB前端真的很难找到工作吗分享土木转行前端经历

自己三流学校土木工程业余毕业,原本想去学iOS来着,咬牙买了台mac。培训机构都报名了。后果过来之后寝室里8集体有7个学完了没找到工作。听完试听我就放弃回家了。回去之后据说了前端就开始自学前端。大四差不多自学了6个月(两头还因为毕业设计耽搁了一两个月)。过后写了个淘宝首页动态页都本人冲动地不行。而后去找工作,到处碰壁。起因无非是: 1、三流大学且不是计算机专业。 2、没有任何工作教训。 第一份工作简直是求来的。这是一家只有十几个人的小公司。老板间接面试的。我跟老板说我后期能够不要工资。如果感觉我不能胜任,我本人来到。 就这样失去了第一份工作。跟了一个十几年教训的java老大-邵哥,一起帮一个地方法院开发一个BS零碎。在他身边真的学了很多货色。邵哥总说本人不会js,但写起js比我当初这个菜鸟强太多了。反正不会的问题总能从他那里失去答案。就这样,我从一个只会写动态页的死切图仔,缓缓地开始提高,ajax,各种JQ插件也能够本人封装一下。半年后我到职了。起因是这家公司我的项目很少,给前端的工作也十分无限,到最初我甚至开始帮老板送货,拿货。 到职后去了沪城。不怎么费力气地找了个小作坊持续修炼降级。这是一家外包公司。啥都接,大部分是门户网站,简略的后盾零碎,起初小程序衰亡又做小程序。在这里应用到了js各种mv*框架。UI框架,各种插件,因为公司会接各种二次开发的我的项目,而这些我的项目用什么乌七八糟的框架都有。一年多工夫每天简直都是996的节奏,每天上班十点多骑着小黄车都感觉本人是全世界最惨的人,于是一个刮风下雨的夜晚,冒雨骑着小黄车的我又决定到职。 这次因为很多起因来到了沪城,回到了离老家不远的某省会城市。投了几个当地的大公司,面试都不是很现实。(这个时候自学,或者说非科班出世的劣势就进去了)自信心蒙受了肯定的打击。面试官问了我很多根底问题,我却瞠目结舌。很多货色知其然不知其所以然。痛定思痛。回去闭关了一两个月,把js高程认真细读了一遍,又尝试着浏览JQ源码(保持了一段时间后不了了之。。。),最初把简历里“精通js”改为"会应用js"。 再起初,又过了两年。也就是当初。在一个不大不小的公司。工资还行,待遇不错,说忙不忙,有人情味。以及,持续找工夫晋升本人。 总结一下,自学进去的最难逾越的就是第一份工作。就像我本人,第一份工作简直是哀求来的,而起初你才明确,其实最难的就是开始。考虑看看有没有敌人或者亲戚有门路的,管他公司好坏,工资多少,先去刷个怪,拿个教训。 看到评论里有正在找工作遇到困难的自学前端er,给一些作为爬过无数个坑的倡议。 1、框架都是浮云,器重js根底。 我发现当初很多新人都有这个状况:js明明写得稀烂,dom操作一塌糊涂离不开JQ,JQ又全靠百度,也不懂作用域,闭包,原型链,npm,webpack也说不出个所以然。而后就开始上手vue,react。看几个视频或博客,照着写了几个我的项目。就感觉本人走在了前端的最前端,如果公司找了这样的同学写我的项目,这我的项目能不出问题吗?所以我集体感觉在前端待业大环境不好的状况下,新人更应该器重根底。其实三大框架在你js根底很好的状况下,学习老本并不算高。前端框架变了又变,外围始终是js。前端抱着须要啥,拿来就用的心态去提高和学习。 2、独立做一个乏味的我的项目 当初前端能做的事件太多了。你能够做一个博客。前端Vue/React 后端express/koa/egg,数据库mongoDB/mysql。还能够做成小程序和app(uni-app/原生html+cordova/appcan)。两头会遇到诸多问题。比方前后端通信啊,前端兼容性啊,数据库连贯啊。你甚至还能够用electron写个C端版本。这个我的项目做下来,你简直会用了所有的技术栈。 如果你想要学习编程,对WEB前端感兴趣,在学习过程中,身边没有一个可能领导你学习的人,能够到这个WEB前端裙:后面484,两头757,前面760,外面有依据目前市场需求,录制的最新的零碎教程,不论是计算机专业想要往WEB前端方向倒退,还是零根底想转行,都能够跟着教程学,有什么不懂的能够在外面问。3、多做笔记,多写博客。 用博客或者笔记,记住本人的每一次掉坑。爬坑的过程才是成长。

January 26, 2021 · 1 min · jiezi

关于html5:工业绿色可视化之核电站工艺流程组态仿真

前言说起核电站,无论是上个世纪80年代产生的切尔诺贝利核电站大爆炸事件,还是2011年产生的福岛核泄漏事件,核辐射给人类造成的伤痛至今还未进行,最近又产生让全世界震惊的“日本将123万吨核废水排向太平洋”的事件。很多人对核电站的概念含糊,但核电站仿佛给人的映像始终是:核电站安全性不高,核废物会危害衰弱,住在核电站左近容易受到核辐射等等。那么,这些放心到底是都真有必要?核电站的安全性真的不高吗? HT 用 3D 可视化的形式为大家科普核电站的工作原理,让大家对以后核电站能有最根本的初步理解,核工业原本就是一个沉甸甸的行业,从它诞生的那时起就跟国家的命运紧密结合,咱们的老一辈核工业人,通过他们的贡献诠释出了“两弹一星”的精力和核工业的精力。 界面简介及成果预览目前世界上的核电站 60%以上都是压水堆核电站,其次要由反应堆、蒸汽发生器、汽轮机、发电机及无关零碎设施组成。因而,咱们利用 HT for Web 自主研发的弱小的 2D/3D渲染引擎,通过搭建场景和动画驱动制作了压水堆核电站发电的工作原理可视化。 整体场景以及交互预览: 通过点击各部位的名字,如果有信息面板的话相应的信息面板会显示,暗藏上一个显示的面板,名字做高亮解决,没有信息面板的只解决名字的高亮成果。   模仿原理动画剖析在核电站中,反应堆的作用是进行核裂变,将核能转化为水的热能。 水作为冷却剂在反应堆中排汇核裂变产生的热能,成为高温高压的水而后沿管道进入蒸汽发生器的U型管内,将热量传给U型管外侧的水,使其变为饱和蒸汽。冷却后的水再由主泵打回到反应堆内从新加热,如此周而复始,造成一个关闭的吸热和放热的循环过程,这个循环回路称为一回路,也称核蒸汽供给零碎。一回路的压力由稳压器管制。因为一回路的次要设施是核反应堆,通常把一回路及其辅助零碎和厂房统称为核岛(NI)。 反应堆 由上述反馈原理能够理解到,反应堆和燃气灶的原理其实没有实质不同,其次要作用加热水产生水蒸气带动汽轮机发电。这里咱们利用了可视化技术模仿了水注入反应堆后加热的过程,水位的变动使得整个动画更加形象的展现出反应堆的工作状态。  主泵 如果把反应堆中的冷却剂比做人体血液的话,那主泵则是心脏。它的功能是把冷却剂送进堆内,而后流过蒸汽发生器,以保障裂变反馈产生的热量及时传递进去。咱们在这里用闪动的亮光来展现其工作状态。  稳压器 稳压器又称压力平衡器,是用来管制反应堆零碎压力变动的设施。在失常运行时,起放弃压力的作用;在产生事变时,提供超压保护。压力回升过程中,咱们退出了稳定的成果以展现稳压器内压力的变动。  蒸汽发生器 它的作用是把通过反应堆的冷却剂的热量传给二次回路水,并使之变成蒸汽,再通入汽轮发电机的汽缸作功。如图,上局部圆形转动时,气泡依据大小不同回升的速度也不雷同;两头传送带的走动更加清晰的展现了正在工作;底下水位升降时,水波也在动作,使整体成果更为贴切。  由蒸汽发生器产生的水蒸汽进入汽轮机收缩作功,将蒸汽的热能转变为汽轮机转子旋转的机械能。汽轮机转子与发电机转子两轴刚性相连,因而汽轮机间接带动发电机发电,把机械能转换为电能。 作完功后的蒸汽(乏汽)被排入冷凝器,进行冷却凝固成水,而后由凝固水泵送入加热器预加热,再由给水泵将其输出蒸汽发生器,从而实现了汽轮机工质的关闭循环,咱们称此回路为二回路。循环冷却水二回路零碎与惯例火电厂蒸汽能源回路大致相同,故把它及其辅助零碎和厂房统称为常规岛(CI)。 凝固水泵 两头风扇转动示意工作正在进行,依据管道内静止方向来决定风扇的逆时针或者顺时针的转动状况。   换料水箱 通过水位的升降来展现;同理展现的还有辅助给水泵、地坑等。   碳酸箱 咱们减少了水的稳定成果,让动画更加形象的展现了这种类型的箱体的工作状态。同理展现的还有除盐水箱、化学药物混合罐、容控器等。  低压加热器 每个加热器的地位推达点不同,在视觉上更真切、更有科技感的成果,同理展现的还有低压加热器。  除氧器 下局部水位升降时带动水稳定,上局部的氧气依据形态的大小挪动速度也不雷同。  综上所述,核能发电包含核能→热能→机械能→电能的能量转换全过程。其中后两种能量转换过程与惯例火力发电厂内的工艺过程基本相同,只是在设施的技术参数上略有不同。核反应堆从性能上相当于火电厂的锅炉零碎(火电站用锅炉“烧水”)。但因为它是强放射源,流经反应堆的冷却剂带有肯定的放射性,个别不宜间接送入汽轮机,所以压水堆核电站比一般电厂多了一套能源回路。 下面说了那么多,那么,核电站到底是个好货色还是坏东西?它跟传统能源先比有什么劣势? 核电站的劣势能够从核能的环保型、经济性、平安等方面来与传统能源做一个简略的比照。 ( 1 )环保方面:核电在产生能源的过程中没有温室气体和污染物的排放。在失常运行状况下,核能零碎的放射性剂量,只有人造辐射剂量的千分之一到百分之一。也就是说,如果你去坐飞机,你承受到的剂量可能比你在核电站旁边还要高很多; ( 2 )经济方面:核电的倒退历史并不长,然而倒退的速度十分快,目前它的电价曾经靠近煤的电价了,如果再思考到雾霾治理的相干费用收入等一些综合性问题,核电的经济效益从整个国家来思考十分有劣势; ( 3 )平安方面:核电是平安能源,产生事变的可能性小。核电是世界上最平安的行业之一。全世界50年来500多座核电反应堆在 其总共1万2千多堆年的运行历史中,只在上世纪七八十年代产生过两起堆芯熔化的严重事故。当初核电站的平安性能更好,产生事变的可能性更小。 核电零碎是一个非常复杂的工业零碎,代表着咱们国家综合工业实力,是大国竞争的阵地。核工业是高科技的策略产业,是国家平安的重要基石。在这样一种综合效应的思考之下,核电应该是大国策略的必然选择。 我国核电站的倒退核电站自 20 世纪 50 年代开始,依据其工作原理和平安性能的差别,可将其分为四代。1951 年,美国最先建成世界上第一座实验性核电站,被称为第一代核电站。到现在曾经倒退到第四代核电站。 我国核电站的建设始于 20 世纪 80 年代中期。首台核电机的组装在秦山核电站进行,1985 年动工,1994 年商业运行,电功率为 300MW ,为我国自行设计建造和运行的原型核电机组。使我国成为继美国、英国、法国、苏联、加拿大和瑞典后,寰球第 7 个能自行设计建造核电机组的国家。截至 2013 年 2 月,我国大陆已建成并投入商业运行的核电站有 7 个,别离为浙江秦山核电站一期、二期、三期,广东大亚湾核电站和岭澳核电站一期、二期,江苏田湾核电站,共 15 台机组,还有 28 台机组处于建设中。 ...

January 25, 2021 · 1 min · jiezi

关于html5:用APICloud开发iOS-App-Clip详细教程

App Clip是苹果公司在WWDC20开发者大会上公布的新性能,用户能够只拜访应用程序的一小部分,而无需下载整个利用,被称为苹果小程序。本文次要介绍如何通过APICloud开发App Clip。 一 创立利用在APICloud上创立App Clip有两种形式,一种能够在登录APICloud后,进入开发控制台进行创立,如下图,另外也能够在开发工具APICloud Studio3中创立。在APICloud Studio3中创立: 二 开发调试App Clip 使⽤和主应⽤⼀样的 APICloud 开发技术,其开发流程和主应⽤也根本⼀致,⽀持使⽤官⽅AppLoader 或者⾃定义 Loader 进⾏ WiFi 代码同步预览,或者云编译进⾏查看。 三 筹备编译证书:在编译装置 App Clip 应⽤之前,须要在控制台“证书”⻚⾯上传编译证书。对于 p12 证书,共⽤主应⽤的p12 即可,App Clip 应⽤的包名由主应⽤的包名 + ⾃定义字符串组成,例如主应⽤包名为com.api.demo,则 App Clip 的包名能够为 com.api.demo.clip,参考创立 App ID,而后再⽤创立好的包名制作 mobileprovision 证书。 ⼀般须要别离筹备测试证书和正式证书,测试证书⽤于开发阶段装置调试,正式证书则⽤于最终公布到App Store。 四 装置启动App Clip抉择测试证书编译后,就能够间接扫描⼆维码进⾏装置。App Clip 应⽤装置后在⼿机主屏幕上不会显示应⽤图标,因而第⼀次装置后⽆法通过主屏幕启动应⽤,此时有下⾯两种⽅式进⾏解决。 1、 配置 App Clips 本地体验,扫描⼆维码启动 为⽅便开发者测试 App Clip,苹果在 iOS 14 零碎⼿机的设置⾥⾯提供了 App Clip 本地体验配置,关上设置 - 开发者 - Local Experiences - Register Local Experience,输⼊要关联的 url 地址,App Clip 的包名,展现在卡⽚上⾯的题目、副标题、图⽚等信息,保留。 ...

January 25, 2021 · 1 min · jiezi

关于html5:了解Vuex状态管理模式的理解强化指南

1Vuex是什么呢?它是Vue的状态管理模式,在应用vue的时候,须要在vue中各个组件之间传递值是很苦楚的,在vue中咱们能够应用vuex来保留咱们须要治理的状态值,值一旦被扭转,所有援用该值的中央就会自动更新。是不是很不便,很好用呢? vuex是专门为vue.js设计的状态管理模式,集中式存储和管理应用程序中所有组件的状态,vuex也集成了vue的官网调式工具,一个vuex利用的外围是store,一个容器,store蕴含了利用中大部分状态。 那么咱们在什么时候利用vuex呢?vuex也不是轻易乱用的,小型简略的利用就不那么适合了,因为用了Vuex是繁琐多余的,更适宜应用简略的store模式;对于vuex更加实用于中大型单页利用:多个视图应用于同一状态,不同视图须要变更同一状态。 传参的办法对于多层嵌套的组件来说,是十分繁琐的,并且对于兄弟组件间的状态传递无能为力;采纳父子组件间接援用或者通过事件来变更和同步状态的多份拷贝,通常会导致无奈保护的代码。 npm install vuex --save //yarn add vueximport Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)在创立vuex实例的中央引入vue,vuex import Vue from 'vue'//引入vueimport Vuex from 'vuex'//引入vuexVue.use(Vuex); //应用 vueximport store from './store' //引入状态治理 storenew一个Vuex.Store实例,并注册state,mutations,actions,getters到Vuex.Store实例中: import Vue from 'vue';import Vuex from 'vuex'; // 引入vueximport store from './store' // 注册storeVue.use(Vuex); // 应用vuexexport default new Vuex.Store({ state: {...}, mutations: {...}, actions: {...}, getters: {...}})// 当代码量大额时候写个js文件即可storeaction.jsindex.jsmutation.js// 引入到store/index.js注册到vuex实例中import mutations from './mutations' // 引入mutationsimport actions from './action' // 引入actionimport Vue from 'vue' // 引入vueimport Vuex from 'vuex' // 引入vuexVue.use(Vuex);// 创立stateconst state = { count: 0};export default new Vuex.Store({ state, // 注册state action, // 注册actions mutations // 注册mutations})创立好vuex.store后,须要在入口文件main.js中引入store并注册到vue实例中,这样就能够在任何组件应用store了。 ...

January 25, 2021 · 8 min · jiezi

关于html5:数据中心三维可视化之集装箱机房

前言随着寰球网络经济的迅猛发展,数据中心逐渐成为了社会倒退的外围能源,需要的日益简单,建设模式也迎来泛滥的挑战。集装箱式数据中心的呈现能够解决这一问题——将服务器、存储、网络设备等全副放入集装箱,集装箱式的设计相比传统数据中心易搬运、成本低、搭建速度快,可不用受场地限度。满足在短期内疾速扩容部署,具备高效制冷、低碳经济、节能环保、灵便运输的低劣属性。 图扑(Hightopo)为此退出3D可视化模块,通过三维仿真技术残缺还原数据中心全貌,进一步实现对泛滥子系统集中调配治理的目标。做到在线实时查看、操作便捷、多重视觉体验,升高机房治理难度,加重机房运维压力。为大型户外作业、电力通信基站等场地资源受限、业务诉求一直增长的特定模式下提供了最佳且灵便的解决方案。 HT for Web 不止自主研发了弱小的基于 HTML5 的 2D、3D 渲染引擎,为可视化提供了丰盛的展现成果。介于 2D 组态和 3D 组态上,Hightopo(以下简称 HT )的 HT for Web 产品上的有着丰盛的组态图标库可供选择,本文将介绍使用HT丰盛的 2/3D 组态 搭建出的一个3D可视化集装箱数据中心。 界面简介及成果预览载入动画:界面由车载集装箱映入眼帘,而后展现集装箱内数据机房的结构;随着画面的加载结束,咱们也能够分明的看到 H T的可视化仿真机房基础设施设施状况。以及右侧为 2D 数据面板,实时理解机房设备状况。 系统分析环境可视化 在3D可视化集装箱式数据中心中,可查看以后数据中心的详情,如容量统计、资产统计、管线统计、告警统计等。反对展现环境内构造布局,以及对应集装箱机房的机柜、服务器、空调、发电机、配电柜、UPS等设施信息。 容量治理可视化 零碎可对机柜U位、电力负荷、各区域承重及存储容量状况进行直观查看和及时更新,可通过2D面板理解该环境下根底设施容量应用的具体数据。 当数据中心机柜有新设施上架时,零碎会间接获取新设施的数据信息以及以后U位的应用状况;对机房机柜电力负荷状况进行散布统计,可抉择通过不同色彩进行辨别机柜功率的大小。 还原实在场景,满足上万条数据同时进行自动更新,兼顾空间、配电、设施等多维度因素,晋升空间可用性和能用率,管理者轻松掌控机房全局容量。    资产治理可视化 传统资产治理模式能用性较差、效率低下,不适用于资产量宏大或品种繁多的数据中心。采纳Hightopo 3D数据可视化技术,即便面对再繁冗的资产,也可通过检索性能疾速查找资源设施,对其进行定位及信息详情展现。在3D场景中可任意查问资产对象,如设施型号规格或CPU负载情况。反对运维人员在线近程调取摆布该资产对象的检修记录、履历信息和以后运行状态等任意信息。如下: 监测蓄冷罐:在机房产生故障时是否失常启动的放冷模式、充冷模式和保冷模式; 监测收缩罐:是否失常运作,确保水压均衡,机房失常运作; 监测冷却塔:是否失常进行循环水冷却等。 将虚构资产事实资产一一对应,资产治理3D可视化运维变得更为直观。实现多个机房集中监控,历史查问,远程管理,预警告警、定位于一体的智慧机房。 管线可视化 在3D可视化环境中能分明看到管线散布的全景视图,运维人员可点击查问单设施的所有链路信息或展现链路中蕴含的全副设施,出现数据中心从低压市电引入至列头柜(智能母线、PDU)输入的变配电零碎设施和线路。 管线可视化能无效梳理数据中心密集的电气管道和网络线路,让运维人员更直观地把握数据中心的管线散布及走线状况,从而疾速排查及修复管线类故障。被动预警及时告知电力网线布局或输、发、变电环节的不合规状况,突破以后数据扩散的场面,进步管线管理水平和故障解决效率。 动环监控可视化 (1)预警告警 智能巡检 动环监控零碎中的设施监控信息,是通过智能数据接口或传感器采集多方面监控数据(如供配电、UPS、消防系统等),实现设施运行的失常状态监测、异样状态预测、告警阀值设定、功率参数、应急预案的智能监控性能。当设施数据超过预设阀值时,零碎将进行预警提醒。在3D可视化环境内联合2D面板展现进去,确保机房内始终保持适合的能源供给。 零碎反对对该可视化场景提供智能巡检计划,运维人员自定义布局巡检门路,对各个巡检节点进行平安治理。辅助运维人员做出科学决策,一改来日“关门看报告、拍脑袋定计划”的景象。 (2)3D温度云图 数据中心“喜冷怕热”,随着计算规模的逐渐增大,热量也会逐步升高。通过装设温湿度监测模块,进而呈现出该环境内所有的热源散布,及时发现疾速定位异样温度区域并揭示管理人员。鼠标点选设施可查看子设施实时温度数据,数据由2D面板出现。 采纳3D温度云图,实时感知机房外部温湿度状况,较大水平上缓解机房温度过高问题,杜绝被动“热处理”。 理论利用面对从天而降的疫情,且在春节期间运维人员较少的状况下,为保障各大科研医疗机构失常运行,全力做好数据中心运作安稳,3D可视化集装箱数据中心无疑是最好的抉择。 利用车辆疾速运输,可依据需要及场地情况扩散或集中叠放部署,做到疾速调度布局。即便运维人员再少,也能做到24小时实时监控,第一工夫发现机房安全隐患,保障机房运维和医疗机构业务的连续性。 3D可视化数据中心治理维持了环境,设施以及资产的稳定性;大幅度降低运维人员的失误率和保护老本,晋升经营效率;监测信息数据扼要精确易于了解,能无效改善不同班次之间的沟通;辨认设施信息缺点,减速故障排查过程,进步平安合规性。数据中心是通信网络的 “心脏”,选用HT三维仿真技术实用强,性能全面、性能稳固,联合集装箱式数据中心本身劣势,利用起来无疑是精益求精。将数据全面集成,扭转数据孤岛景象,成为实现数据中心扁平化、集约化、一体化无力的助推剂,为机房监控的倒退带来革命性的提高。 总结机房是通信网络的重要“心脏”,信息技术在军事畛域的广泛应用,使作战形式和作战伎俩呈现出簇新的风貌,面对信息时代的军事转型,数据中心曾经成为了军队信息化建设要害的因素之一。基于对在航天军工畛域的多年积攒与HT 可视化技术,不仅能够实现了我的项目的高效建设,实现高度的灵活性,还能依据用户的业务需要变动便捷高效地进行批改调整,为用户的业务利用提供了充沛的技术撑持。 咱们更新了数百个工业互联网 2D/3D 可视化案例集,在这里你能发现许多离奇的实例,也能发掘出不一样的工业互联网:https://mp.weixin.qq.com/s/ZbhB6LO2kBRPrRIfHlKGQA,同时,你也能够查看更多案例及成果:https://www.hightopo.com/demos/index.html

January 24, 2021 · 1 min · jiezi

关于html5:前端面试每日-31-第647天

明天的知识点 (2021.01.22) —— 第647天 (我也要出题)[html] 说说你对HTML5中“一次编写,整体应用”的了解[css] 在Less中数据URI的作用是什么?[js] 写一个办法判断在一个一维数组里,有且只有一个数等于给定的值[软技能] 你是如何保障你的网站可拜访性?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

January 22, 2021 · 1 min · jiezi

关于html5:web名词解释

HTML:超文本标记语言,规范通用标记语言下的一个利用。 CSS:层叠样式表(英文全称:Cascading Style Sheets),是一种用来体现 HTML(规范通用标记语言的一个利用)或 XML(规范通用标记语言的一个子集)等文件款式的语言,用于为 HTML 文档定义布局。 JavaScript:一种直译式脚本语言,其次要作用是在不与服务器交互的状况下批改 HTML 页面内容, 为网页增加各式各样的动静性能。Ecma 国内以 JavaScript 为根底制订了 ECMAScript 规范。 jQuery:是一个疾速、简洁的 JavaScript 框架,是一个优良的JavaScript 代码库(或 JavaScript 框架)。 DOM:文档对象模型(Document Object Model,简称 DOM), 是 W3C 组织举荐的解决可扩大标记语言的规范编程接口。 UI:即 User Interface(用户界面)的简称。泛指用户的操作界面,蕴含于挪动 APP、网页、智能穿戴设施等。 CSS3:是 CSS(层叠样式表)技术的降级版本,于 1999 年开始制订,2001 年 5 月 23 日 W3C 实现了 CSS3 的工作草案,次要包含盒子模型、列表、超链接形式、语言模块、背景和边框、文字特效、多栏布局等模块 。 CSS hack:通过在 CSS 款式中退出一些非凡的符号,区别不同浏览器制作不同的 CSS 款式的设置,解决浏览器显示网页特效不兼容性问题。 PHP: 超文本预处理器(Hypertext Preprocessor),PHP 将程序嵌入到 HTML 文档中去执行,是 Web 开发动静网页制作技术之一。 IFRAME:是 HTML 标签,作用是文档中的文档,或者浮动的框架(FRAME)。 Html5:万维网的外围语言,规范通用标记语言下的一个利用超文本标记语言(HTML)的第五次重大批改,其次要的指标是将互联网语义化,以便更好地被人类和机器浏览,并同时更好地反对网页中嵌入各种媒体。 OOP: 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。 ...

January 22, 2021 · 1 min · jiezi

关于html5:这次十分钟把宏任务和微任务讲清楚

为什么写这个文章这是一道大厂、小厂面试官都喜爱问的题目很多面试官和面试者也不晓得什么是标准答案网上各种文章档次不齐..误导过不少人,包含我感觉还是明天花十分钟讲清楚他吧正式开始先上代码 function app() { setTimeout(() => { console.log("1-1"); Promise.resolve().then(() => { console.log("2-1"); }); }); console.log("1-2"); Promise.resolve().then(() => { console.log("1-3"); setTimeout(() => { console.log("3-1"); }); }); } app();输入后果:1-21-31-12-13-1开始剖析面试官特地喜爱问:你讲讲什么是微工作和宏工作大部分面试官其实本人也不懂什么是微工作和宏工作,不信下次你们反诘一下所谓微工作和宏工作宏工作:常见的定时器,用户交互事件等等.(宏工作就是特定的这些个工作,没什么非凡含意)微工作:Promise相干工作,MutationObserver等(一样,只是一种称说而已!!!)到底先执行微工作还是宏工作先有鸡还是先有蛋? 到底是先有宏工作还是微工作啊?第一个准则万物皆从全局上下文筹备退出,全局的同步代码运行完结的这个机会开始例如咱们方才这段代码: function app() { setTimeout(() => { console.log("1-1"); Promise.resolve().then(() => { console.log("2-1"); }); }); console.log("1-2"); Promise.resolve().then(() => { console.log("1-3"); setTimeout(() => { console.log("3-1"); }); }); } app();当执行完了console.log("1-2");的时候,意味着全局的上下文马上要退出了,因为此时全局的同步代码都执行完了,剩下的都是异步代码第二个准则同一层级下(不了解层级,能够先不论,前面会讲),微工作永远比宏工作先执行即Promise.then比setTimeout先执行所以先打印1-3,再打印1-1第三个准则每个宏工作,都独自关联了一个微工作队列我用刚买的黑板画了一张图,大家就晓得什么是层级了 每个层级的宏工作,都对应了他们的微工作队列,微工作队列遵循先进先出的准则,当全局同步代码执行结束后,就开始执行第一层的工作。同层级的微工作永远先于宏工作执行,并且会在以后层级宏工作完结前全副执行结束怎么分辨层级?属于同一个维度的代码,例如上面的func1和func2就属于同层级工作setTimeout(func1)...Promise.resolve().then(func2)...上面这种fn1和fn2就不属于同一个层级的,因为fn2属于外部这个setTimeout的微工作队列,而fn1属于内部setTimeout的微工作队列setTimeout(()=>{Promise.resolve().then(fn1)setTimeout(()=>{Promise.resolve().then(fn2) })})划重点:每个宏工作对应一个独自的微工作队列遇到面试题就依照我的套路,从全局上下文退出前(全局的同步代码执行结束后),开始收集以后层级的微工作和宏工作,而后先清空微工作队列,再执行宏工作.如果这期间遇到宏工作/微工作,就像我这样画个图,把他们塞进对应的层级里即可写在最初简略的1000字,置信能彻底解决你的微工作和宏工作纳闷如果你想了解得更深,记得关注下公众号,后续会写一些更深刻的货色,真正的“深入浅出”

January 22, 2021 · 1 min · jiezi

关于html5:面试官为什么-Promise-比setTimeout-快

作者:Milos Protic 译者:前端小智起源:devinduct点赞再看,微信搜寻【大迁世界】,B站关注【前端小智】这个没有大厂背景,但有着一股向上踊跃心态人。本文 GitHub https://github.com/qq44924588... 上曾经收录,文章的已分类,也整顿了很多我的文档,和教程材料。最近开源了一个 Vue 组件,还不够欠缺,欢送大家来一起欠缺它,也心愿大家能给个 star 反对一下,谢谢各位了。 github 地址:https://github.com/qq44924588... 1.试验咱们来做个试验。哪个执行得更快:立刻解决的 Promise 还是立刻setTimeout(也就是0毫秒的setTimeout)? Promise.resolve(1).then(function resolve() { console.log('Resolved!');});setTimeout(function timeout() { console.log('Timed out!');}, 0);// 'Resolved!'// 'Timed out!'promise.resolve(1)是一个动态函数,它返回一个立刻解析的promise。setTimeout(callback, 0)以0毫秒的提早执行回调函数。 咱们能够看到先打印'Resolved!',再打印Timeout completed!,立刻解决的 promise 比立刻setTimeout更快。 是因为Promise.resolve(true).then(...)在setTimeout(..., 0)之前被调用了,所以 Promise 过程会更快吗? 偏心的问题。 所以,咱们略微更改一下试验条件,而后先调用setTimeout(..., 0): setTimeout(function timeout() { console.log('Timed out!');}, 0);Promise.resolve(1).then(function resolve() { console.log('Resolved!');});// 'Resolved!'// 'Timed out!'setTimeout(..., 0)在Promise.resolve(true).then(...)之前被调用。但,还是先打印Resolved!在打印'Timed out!'。 这是为啥呢? 2.事件循环与异步 JS 相干的问题能够通过钻研事件循环来答复。咱们回顾一下异步 JS 工作形式的次要组成部分。 调用堆栈是一个LIFO(后进先出)构造,它存储在代码执行期间创立的执行上下文。简略地说,调用堆栈执行这些函数。 Web api是异步操作(fetch 申请、promise、计时器)及其回调期待实现的中央。 task queue (工作队列)是一个FIFO(先进先出)构造,它保留筹备执行的异步操作的回调。例如,超时的setTimeout()的回调函数或筹备执行的单击按钮事件处理程序都在工作队列中排队。 job queue (作业队列)是一个FIFO(先入先出)构造,它保留筹备执行的promise 的回调。例如,已实现的承诺的resolve或reject回调被排在作业队列中。 ...

January 22, 2021 · 1 min · jiezi

关于html5:自学编程和计算机科班出身的差别在哪里

如果你看过建筑工地盖房子,就会发现,建高楼之前是要挖很深的地基,要打桩的。但这个对于一个盖好的房子来说是看不到的。而如果你建一个二层小楼,就不必这么麻烦。如果你胆够大,甚至也能够堆个三四层进去,只有没有大风大雨,地质流动稳固,一样也能住人。但你必定不会认为这两个是一样的,和前者相比,后者短少“根基”,一来能达到高度无限,二来有潜在的危险。 科班出身,就是逼着你去打这个地基。 不论你认不认可,至多专业课你得过,数学、英语该考的试还是得考。哪怕有人心底感觉,这些货色跟我写个手机利用有什么关系。等到你几年之后毕业,走上工作岗位,你已经学过的那些货色,即便不间接利用在实践中,也会或多或少给你留下一些理性的意识。比方一个办法会不会带来微小的性能压力,一种写法会不会有潜在的破绽,这些货色不可能有间接的答案,但过来的积攒会对你在解决问题的时候产生影响。很多人看过乔布斯在斯坦福的演讲,大家都挂在嘴边的是:Stay Hungry, Stay Foolish. 但外面还有个很重要的观点:Connect the Dots.(连贯生命中的点)你在学校里学过的种种实践、常识,写过的习题、我的项目,就是这些点。你无奈预测这些货色在什么时候会用上,但在很多年之后再回顾,你会发现这其中的关联。 但自学就可能存在这样的问题:你会更关注那些“有价值”的技能,更在意学习的性价比,会去网上询问“学XXX有没有用”、“XX技术未来好不好”、“怎样才能少走弯路”……因而往往并不会积攒大量的技能点,去堆出某个技能,而是朝着某个技能画出一条中转的线。这样看起来是很快,学两三个月就能开发出一个App之类。但很可能在遇到一些变动之后就难以应答。最显著的差距是会发现,同样是写一个性能,有的人就是开发得快、bug少、效率高、还容易扩大;而有的人就是磕磕碰碰才实现、各种bug。 所以我始终感觉,并不是有了一个文凭就造成了差别,而是这几年的工夫和课程学习带来的差异。如果一个自学者,依照业余的体系架构,把该花的工夫都花了、该学的实践都学了。那么是否科班只是个名头而已,没有区别。但我感觉对于大部分人来说,如果不是在业余的学习环境中,是很难达到雷同的学习规范和学习强度的。这也是为什么很多集体我的项目的运动员,他对技术曾经有很粗浅的意识,但也还是须要雇一个教练来领导本人。 你能够通过接很多我的项目来倒逼本人晋升开发水准,但干燥的理论知识的学习,在没有一个刚需的前提下,想本人逼本人硬啃,的确是挺难的。这可能是科班最大的劣势了。它是一个不利因素,但不是一个必然结果。 房子建好了,地基不好再补;但不论在什么阶段,你都一样能够去晋升本人的业余素养。刚抉择这个行业,你能够埋怨下本人不是科班;但几年之后如果还拿这个来说事,恐怕就有点找借口的意思了。 而后我再举个例子: 拿音乐行业来说,网络时代,有人没通过业余的声乐训练,在网上唱了一两首歌,也有机会大红大紫。但有可能后续就没有更好作品进去,也可能加入选秀被导师一个业余问题就给问倒,还有可能被扒出作品其实是拿其他人的拼凑进去的。然而同样也有人,不是科班出身,但花在做音乐上的工夫并不比科班人少,多年之后一样还是有高质量作品产出,不是科班却胜过科班。 从这样的例子来看,非科班到底行还是不行? 说这个是什么意思?就是说,你不能拿标签来评估人,也不能反过来用个例颠覆普遍现象。科班毕业不会写代码的我见得多了,自学成才的大牛也不是多数。所以,别带着有色眼镜去对待一个类型的人,也不要在这个问题下带着集体偏向去推测他人答复的动机。每个人的状况都不一样,尊重客观规律,认清本人的定位,针对实际状况去思考集体的倒退路线,这才是有价值的。 如果你想要学习编程,对WEB前端感兴趣,在学习过程中,身边没有一个可能领导你学习的人,能够到这个WEB前端裙:后面484,两头757,前面760,外面有依据目前市场需求,录制的最新的零碎教程,不论是计算机专业想要往WEB前端方向倒退,还是零根底想转行,都能够跟着教程学,有什么不懂的能够在外面问。事实就是: 科班多了几年强制学习根底的工夫,必定是有劣势的。你的老师你的同学都是这个行业的,气氛也不一样,连带着你的思维习惯也会不一样。很多非科班的问题是工夫没有花到位。三个月的自学vs四年的科班,差异在工夫上,而不是因为科不科班这个标签。如果你在业余上付出的超过科班人的平均水平,那这个就不是问题。那些所谓科班才有的资源和劣势,你迟早也一样会有的

January 20, 2021 · 1 min · jiezi

关于html5:前端框架LayUI介绍及用法

LayUILayUI 的装置及应用LayUI 的介绍 layui(谐音:类UI) 是一款采纳本身模块标准编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织模式,门槛极低,拿来即用。 由国人开发,16年出厂的框架,其次要提供了很多难看、不便的款式,并且根本拿来即用,和Bootstrap有些类似,但该框架有个极大的益处就是定义了很多前后端交互的款式接口,如分页表格,只需在前端配置好接口,后端则依照定义好的接口规定返回数据,即可实现页面的展现,极大缩小了后端人员的开发成本。 官网:https://www.layui.com 官网文档:https://www.layui.com/doc/ LayUI 的特点(1)layui属于轻量级框架,简略好看。实用于开发后端模式,它在服务端页面上有十分好的成果。 (2)layui是提供给后端开发人员的ui框架,基于DOM驱动。 下载与应用在 官网首页 下载到 layui 的最新版。目录构造如下: ├─css // css目录 │ │─modules // 模块css目录(个别如果模块绝对较大,咱们会独自提取,比方上面三个:) │ │ ├─laydate │ │ ├─layer │ │ └─layim │ └─layui.css // 外围款式文件 ├─font // 字体图标目录 ├─images // 图片资源目录(目前只有layim和编辑器用到的GIF表情) │─lay // 模块外围目录 │ └─modules // 各模块组件 │─layui.js // 根底外围库 └─layui.all.js // 蕴含layui.js和所有模块的合并文件 取得 layui 后,将其残缺地部署(拷贝到我的项目中)到你的我的项目目录,你只须要引入下述两个文件:./layui/css/layui.css./layui/layui.js // 提醒:如果是采纳非模块化形式,此处可换成:./layui/layui.all.js 根本的入门页面<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <title>开始应用layui</title> <link rel="stylesheet" href="layui/css/layui.css"></head><body> <!-- 你的HTML代码 --> <script src="layui/layui.js"></script><script> // 模块和回调函数 // 个别间接写在一个js文件中 layui.use(['layer', 'form'], function(){ var layer = layui.layer ,form = layui.form; layer.msg('Hello World'); }); </script> </body></html> 还须要申明须要应用的 模块 和 回调函数。参照官网文档,抉择本人想要的成果就行。 ...

January 20, 2021 · 11 min · jiezi

关于SegmentFault:5个好用的-CSS-函数快来试试手吧

作者:Milos Protic 译者:前端小智起源:devinduct点赞再看,微信搜寻【大迁世界】,B站关注【前端小智】这个没有大厂背景,但有着一股向上踊跃心态人。本文 GitHub https://github.com/qq44924588... 上曾经收录,文章的已分类,也整顿了很多我的文档,和教程材料。最近开源了一个 Vue 组件,还不够欠缺,欢送大家来一起欠缺它,也心愿大家能给个 star 反对一下,谢谢各位了。 github 地址:https://github.com/qq44924588... 简介CSS 蕴含了许多函数,而且它可能实现许多晚期须要用 JavaScript能力实现的事件。每年都有新的个性被增加进来,这让咱们的开发更加轻松,也缩小了对JavaScript的依赖。CSS 函数是它所具备的最弱小的个性之一,在本文中,我将介绍一些我认为有用的函数。 attr()attr 函数用于获取所选元素的属性值。 它承受三个参数,属性名称,类型和默认值。 语法: attr( attribute-name <type-or-unit>? [, <fallback> ]? )事例: <p data-text="the attr function" data-tooltip="Hi from attr!" class="attr">This text is combined with</p>css p::after { content: ' ' attr(data-text);}p.attr:hover::after { content: ' ' attr(data-tooltip); background-color: orange; color: white}成果: 源码:https://codepen.io/protic_milos/pen/GRpYJKd calc()这个函数使咱们可能计算CSS值,而不是指定确切的值。通常用于计算元素的大小或地位。它反对加法、减法、乘法和除法。 须要特地留神重要一点是+和-运算符必须用空格隔开,不然无奈失常工作。*和/运算符不有这限度,但出于一致性的思考,倡议增加空格。 另外,很棒的是,咱们能够混合CSS单位,例如,咱们能够减去百分比和像素。 咱们能够用calc构建一个带有居中元素的示例: <p class="calc">Centered with calc</p>css p.calc { padding: 10px; background-color: orange; color: white; width: 200px; text-align:center; margin-left: calc(50% - 100px)}成果: ...

January 20, 2021 · 1 min · jiezi

关于SegmentFault:解构标志性的-Apple-Watch-Bubble-UI

当第一款 Apple Watch 在 2015 年推出的时候,我对 WatchOS 的主屏幕设计感到震惊。它的布局不同于规范的网格局布局,而是提出了一种原始的视觉动静界面。 五年后,当我关上这款具备润滑又时尚 UI 的手表时,依然感到敬畏。然而,从工程学的角度来看,我依然对这种布局的底层原理感到困惑。 作为一名经验丰富的应用程序开发人员,我晓得结构导航流程和布局对于任何应用程序的根底都至关重要。Apple 全副都做到了,并且还具备肯定的灵活性,用户的满意度和好奇心。 当然,我喜爱应用 CSS Grid、 Flexbox 以及其余 Web 和挪动端技术来构建牢靠的应用程序布局,然而因为 Apple Watch Bubble UI 背地波及的复杂性,这些办法并不实用。我决定钻研这种布局的各个方面,尤其是摸索能够编排布局的视觉设计的几何形态和设计的数学原理。 免责申明:此用户界面的基本功能和设计的探讨仅源于我的个人见解;苹果很有可能曾经实现了这一布局,甚至可能有很大不同。 布局的根底几何让咱们从气泡的根本蜂窝网格开始。咱们稍后将解决布局中气泡的大小调整以及其余相干成果。如下图所示是每隔一个残缺的气泡行呈现一个少一个气泡的行,以及最初一行的气泡是不残缺的居中气泡行。 如下图所示,UI 能够分为三个同心区域:center(核心),fringe(边缘),和 outer(内部区域)。在针对气泡的大小和地位在屏幕上的变动进行建模时,前两个区域至关重要。同时在针对气泡滑动的所有状况时,如果某个区域蕴含该气泡的核心圆点,则该气泡被判断为在该区域内。 核心区域定义为以 x 半径 和 y 半径 为边界,并且具备拐角半径润饰的处于核心的(圆角)矩形。核心区域中的所有气泡均以其 maximum size(最大尺寸)渲染。 边缘区域边缘区域定义为核心区域内部在其外边缘的肯定 fringe width(边缘宽度)内的空间。此区域用于蕴含每个气泡从最小尺寸到最大尺寸的过渡。当气泡从外围进入该区域时,气泡以其最小大小进行挪动,该大小线性减少,直到达到核心区域时达到其最大大小。 内部区域内部区域定义为 2D 画布上不包含核心和边缘区域的所有空间。在这个区域内,所有气泡都被最小化。 圆形和非圆形矩形区域如何解决?当 x 半径,y 半径和拐角半径均相等时,核心和边缘区域为圆形。此外,当拐角半径为零时,核心区域变为非圆形;然而,边缘区域的拐角仍将以边缘宽度的半径进行倒圆角(棱角切削成圆弧面)。 依据气泡地位计算气泡大小让咱们深入研究布局的根本技巧,让咱们应用定义的区域来开发数学模型,该模型依据气泡在屏幕上的地位来计算气泡的大小。 首先,咱们须要定义另一个要害的视觉地标:拐角区域。 拐角区域定义为由画布的拐角以及核心区域的外部拐角(从边缘的嵌入的拐角半径)界定的四个区域。在拐角区域,尺寸绝对于外部拐角沿径向(指沿半径的方向的)放弃恒定。相比之下,拐角区域内部的气泡在 x 或 y 地位不变时放弃大小不变。 留神: 如果核心区域是圆形,则所有四个外部角均位于核心。否则,如果核心区域造成一个非圆角的矩形,则外部拐角不会偏离矩形的外边缘。 步骤 1:确定气泡是否在角落区域乍一看,这仿佛须要四个独自的操作。然而,咱们能够寻找所有拐角区域之间的相似性,而后就会产生一个表达式:如果气泡在拐角区域内,则 abs(bubble.x) > x_radius and abs(bubble.y) > y_radius因为变量 x radius 和 y radius 实质上是正的。 ...

January 20, 2021 · 1 min · jiezi

关于html5:11个-Javascript-小技巧帮你提升代码质量

Javascript 罕用代码优化和重构的办法简介次要介绍以下几点: 提炼函数合并反复的条件片段把条件分支语句提炼成函数正当应用循环提前让函数退出代替嵌套条件分支传递对象参数代替过长的参数列表少用三目运算符正当应用链式调用合成大型类活用位操作符纯函数本文会不断更新,不足之处欢送补充。 提炼函数益处: 避免出现超大函数。独立进去的函数有助于代码复用。独立进去的函数更容易被覆写。独立进去的函数如果领有一个良好的命名,它自身就起到了正文的作用。语义化将多段拆散的逻辑放在不同的函数中实现,能够使代码逻辑清晰,分明的看到每一步在做什么。代码举例: 实现获取数据,而后操作dom显示数据,最初增加事件 函数提炼前``// 逻辑都写在一起,须要将所有逻辑看完才晓得这段代码是干嘛的,部分逻辑无奈复用function main() {    $.ajax.get('/getData').then((res) => {        const ul = document.getElementById('ul');        ul.innerHTML = res.list.map(text => <li class="li">${text}</li>).join('n');        const list = document.getElementsByClassName('li');        for (let i = 0; i < list.length; i ++) {            list[i].addEventListener('focus', () => {                // do something            });        }    });}`` 函数提炼后``function getData() {    return $.ajax.get('/getData').then((res) => res.data.list);}function showList(list) {    const ul = document.getElementById('ul');    ul.innerHTML = list.map(text => <li class="li">${text}</li>).join('n');}function addEvent() {    const list = document.getElementsByClassName('li');    for (let i = 0; i < list.length; i ++) {        list[i].addEventListener('focus', () => {            // do something        });    }}// 逻辑清晰,一眼读懂每一步在做什么,某些提炼进去的函数还能够被复用async function main() {    const list = await getData(); // 获取数据    showList(list); // 显示页面    addEvent(); // 增加事件}`` 合并反复的条件片段如果一个函数体内有一些条件分支语句,而这些条件分支语句外部分布了一些反复的代码,那么就有必要进行合并去重工作。 `// 合并前function main( currPage ){    if ( currPage <= 0 ){        currPage = 0;        jump( currPage ); // 跳转    }else if ( currPage >= totalPage ){        currPage = totalPage;        jump( currPage ); // 跳转    }else{        jump( currPage ); // 跳转    }};// 合并后function main( currPage ){    if ( currPage <= 0 ){        currPage = 0;    }else if ( currPage >= totalPage ){        currPage = totalPage;    }    jump( currPage ); // 把jump 函数独立进去};` 把条件分支语句提炼成函数简单的条件分支语句是导致程序难以浏览和了解的重要起因,而且容易导致一个宏大的函数。有时能够将条件分支语句提炼成语义化的函数,使代码更加直观,逻辑清晰。 `// 依据不同节令决定打折力度function getPrice( price ){    var date = new Date();    if ( date.getMonth() >= 6 && date.getMonth() <= 9 ){ // 夏天        return price * 0.8;    }    return price;};// 是否是夏天function isSummer(){    var date = new Date();    return date.getMonth() >= 6 && date.getMonth() <= 9;};// 提炼条件后function getPrice( price ){    if ( isSummer() ){        return price * 0.8;    }    return price;};` 正当应用循环如果多段代码实际上负责的是一些重复性的工作,那么能够用循环代替,使代码量更少。 `// 判断是什么浏览器function getBrowser(){    const str = navigator.userAgent;    if (str.includes('QQBrowser')) { return 'qq';    } else if (str.includes('Chrome')) { return 'chrome';    } else if (str.includes('Safari')) {        return 'safri';    } else if (str.includes('Firefox')) {        return 'firefox';    } else if(explorer.indexOf('Opera') >= 0){        return 'opera';    } else if (str.includes('msie')) {        return 'ie';    } else {        return 'other';    }};// 循环判断,将对应关系形象为配置,更加清晰明确function getBrowser(){    const str = navigator.userAgent;    const list = [        {key: 'QQBrowser', browser: 'qq'},        {key: 'Chrome', browser: 'chrome'},        {key: 'Safari', browser: 'safari'},        {key: 'Firefox', browser: 'firefox'},        {key: 'Opera', browser: 'opera'},        {key: 'msie', browser: 'ie'},    ];    for (let i = 0; i < list.length; i++) {        const item = list[i];        if (str.includes(item.key)) {return item.browser};    }    return 'other';}` 提前让函数退出代替嵌套条件分支让函数变成多进口提前返回,替换嵌套条件分支。 `function del( obj ){    var ret;    if ( !obj.isReadOnly ){ // 不为只读的能力被删除        if ( obj.isFolder ){ // 如果是文件夹            ret = deleteFolder( obj );        }else if ( obj.isFile ){ // 如果是文件            ret = deleteFile( obj );        }    }    return ret;};function del( obj ){    if ( obj.isReadOnly ){ // 反转if 表达式        return;    }    if ( obj.isFolder ){        return deleteFolder( obj );    }    if ( obj.isFile ){        return deleteFile( obj );    }};` 传递对象参数代替过长的参数列表函数参数过长那么就减少出错的危险,想保障传递的程序正确就是一件麻烦的事,代码可读性也会变差,尽量保障函数的参数不会太长。如果必须传递多个参数的话,倡议应用对象代替。 一般来说,函数参数最好不要超过3个 `function setUserInfo( id, name, address, sex, mobile, qq ){    console.log( 'id= ' + id );    console.log( 'name= ' +name );    console.log( 'address= ' + address );    console.log( 'sex= ' + sex );    console.log( 'mobile= ' + mobile );    console.log( 'qq= ' + qq );};setUserInfo( 1314, 'sven', 'shenzhen', 'male', '137', 377876679 );function setUserInfo( obj ){    console.log( 'id= ' + obj.id );    console.log( 'name= ' + obj.name );    console.log( 'address= ' + obj.address );    console.log( 'sex= ' + obj.sex );    console.log( 'mobile= ' + obj.mobile );    console.log( 'qq= ' + obj.qq );};setUserInfo({    id: 1314,    name: 'sven',    address: 'shenzhen',    sex: 'male',    mobile: '137',    qq: 377876679});` 少用三目运算符三目运算符性能高,代码量少。 但不应该滥用三目运算符,咱们应该在简略逻辑分支应用,在简单逻辑分支防止应用。 `// 简略逻辑能够应用三目运算符var global = typeof window !== "undefined" ? window : this;// 简单逻辑不适宜应用var ok = isString ? (isTooLang ? 2 : (isTooShort ? 1 : 0)) : -1;` 正当应用链式调用长处: 链式调用应用简略,代码量少。 毛病: 链式调用带来的害处就是在调试不不便,如果咱们晓得一条链中有谬误呈现,必须得先把这条链拆开能力加上一些调试 log 或者减少断点,这样能力定位谬误呈现的中央。 如果该链条的构造绝对稳固,前期不易产生批改,能够应用链式。 `var User = {    id: null,    name: null,    setId: function( id ){        this.id = id;        return this;    },    setName: function( name ){        this.name = name;        return this;    }};User  .setId( 1314 )  .setName( 'sven' );var user = new User();user.setId( 1314 );user.setName( 'sven' );` 合成大型类大型类的合成和函数的提炼很像,类太大会呈现逻辑不清晰,难以了解和保护的问题。 正当的大类合成能够使类的逻辑清晰,且子模块能够不便复用。 活用位操作符编程语言计算乘除的性能都不高,然而某些状况应用位操作符能够晋升乘除等运算的性能。 纯函数纯函数是指不依赖于且不扭转它作用域之外的变量状态的函数。 纯函数的返回值只由它调用时的参数决定,它的执行不依赖于零碎的状态(执行上下文)。 雷同的输出参数,肯定会失去雷同的输入,也就是外部不含有会影响输入的随机变量。 不属于纯函数的特点: 更改文件系统往数据库插入记录发送一个 http 申请可变数据打印/log获取用户输出DOM 查问拜访零碎状态纯函数的作用: 可靠性:函数返回永远和预期统一可缓存性:因为只有输出一样输入肯定一样,因而可将输出作为key,输入作为值,应用对象缓存曾经计算的后果可移植性:因为没有内部依赖,所以移植到任何环境都可正确运行可测试性:不便针对函数做单元测试可并行性:对一些简单计算,能够并行计算(例如应用nodejs多个子过程同时并行计算多个工作,进步计算速度)利用场景: 工具函数最好应用纯函数多平台应用的代码(nodejs、浏览器、微信小程序、native客户端等)绝对独立的性能`var a = 1;// 非纯函数function sum(b) {    return a + b;}// 非纯函数function sum(b) {    a = 2;    return b;}// 非纯函数function sum(b) {    return b + Math.random();}// 纯函数function sum (b, c) {    return b + c;}` ...

January 18, 2021 · 1 min · jiezi

关于html5:如何构建一个多人io-Web-游戏第-1-部分

原文:How to Build a Multiplayer (.io) Web Game, Part 1 GitHub: https://github.com/vzhou842/e... 深刻摸索一个 .io 游戏的 Javascript client-side(客户端)。 如果您以前从未据说过 .io 游戏:它们是收费的多人 web 游戏,易于退出(无需帐户),并且通常在一个区域内让许多玩家相互竞争。其余驰名的 .io 游戏包含 Slither.io 和 Diep.io。 Slither.io:http://slither.ioDiep.io:https://diep.io在本文中,咱们将理解如何从头开始构建.io游戏。您所须要的只是 Javascript 的实用常识:您应该相熟 ES6 语法,this 关键字和 Promises之类的内容。即便您对 Javascript 并不是最相熟的,您依然应该能够浏览本文的大部分内容。 一个 .io 游戏示例为了帮忙咱们学习,咱们将参考 https://example-io-game.victo...。 这是一款非常简单的游戏:你和其余玩家一起管制竞技场中的一艘船。你的飞船会主动发射子弹,你会试图用本人的子弹击中其余玩家,同时避开他们。 目录这是由两局部组成的系列文章的第 1 局部。咱们将在这篇文章中介绍以下内容: 我的项目详情/构造:我的项目的高级视图。构建/我的项目设置:开发工具、配置和设置。Client 入口:index.html 和 index.js。Client 网络通信:与服务器通信。Client 渲染:下载 image 资源 + 渲染游戏。Client 输出:让用户真正玩游戏。Client 状态:解决来自服务器的游戏更新。1. 我的项目详情/构造我倡议下载示例游戏的源代码,以便您能够更好的持续浏览。 咱们的示例游戏应用了: Express,Node.js 最受欢迎的 Web 框架,认为其 Web 服务器提供能源。socket.io,一个 websocket 库,用于在浏览器和服务器之间进行通信。Webpack,一个模块打包器。我的项目目录的构造如下所示: public/ assets/ ...src/ client/ css/ ... html/ index.html index.js ... server/ server.js ... shared/ constants.jspublic/ ...

January 18, 2021 · 6 min · jiezi

关于html5:实现登录页面敲下enter回车键提交表单登录效果

问题形容咱们前端搭建好一个我的项目的根本架子当前,就要开始开发页面了。为了看着高大上一些,产品大佬说,加上一个敲击回车键就能登录的成果。好嘞,话不多少,代码为证: 补充其实还有一种形式,也能够实现敲击回车,本人搞两个input框框,一个按钮,而后给按钮绑定键盘回车事件,然而吧,产品大佬要求咱们麻利开发,所以怎么快,怎么来。哈哈哈 记录一下

January 17, 2021 · 1 min · jiezi

关于html5:前端请求接口的一些问题解决方法

1.当在频繁异步ajax申请响应中操作的时候,因为是异步的快慢不确定最终的申请的数据响应是否是精确的,可应用ajax的abort函数与标记来终止掉多余申请(当每次申请前判断标记,如果在申请中则执行ajax.abort()函数打断ajax的申请后再进行申请。),就能实现每次申请的数据都是正确的。场景:如疾速点击多个checkbox查问条件对表格数据进行查问渲染,当申请解决慢的时候,会导致表格的数据提早渲染。(其余形式:点击后显示遮罩层。按钮节流) 2.blob形式文件下载能够从响应头中取到文件名。如在IE下呈现文件下载不胜利的问题,查看响应头中的状态是否正确,可能是后端没有给出正确的响应。 3.iframe 跨域的时候会显示空白,且用js不能检测到iframe跨域报错。(1.不要应用iframe外嵌页面 2.解决跨域)

January 16, 2021 · 1 min · jiezi

关于html5:必学必会音频和视频

哪吒人生信条:如果你所学的货色 处于喜爱 才会有弱小的能源撑持。 把你的前端拿捏得死死的,每天学习得爽爽的,关注这个不一样的程序员,如果你所学的货色 处于喜爱 才会有弱小的能源撑持。感激不负每一份酷爱前端的程序员,不管前端技能有多奇葩,欢送关注加我入群vx:xiaoda0423 前言心愿能够通过这篇文章,可能给你失去帮忙。(感激一键三连) 学习深刻了解HTML5的audio和video。 HTML5视频概述在HTML5播放一个视频,很简略,只须要一行代码: <video src="resources/dadaqianduan.mp4" autoplay></video>理解多媒体术语理解视频文件格式: Audio Video InterLeaved .aviFlash Video .flvMPEG-4 .mp4Matroska .mkvOgg .ogv音频和视频编解码器 编解码器能够了解为一些算法代码,用于解决视频,音频或者其元数据的编码格局。对音频或视频文件进行编码,可使得文件大大放大,便于在因特网上传输。 音频编解码器: MP3,应用ACC音频 Wav,应用Wav音频 Ogg,应用OggVorbis音频 视频编解码器: MP4,应用H.264视频,AAC音频 WebM,应用VP8视频,OggVorbis音频 Ogg,应用Theora视频,OggVorbis音频 多媒体文件格式audio元素反对的音频格式MP3,Wav,Ogg;video元素反对的格局MP4,WebM,Ogg。 audio元素是专门用于在网页中播放网络音频的video元素是专门用于在网页中播放视频的在HTML5中audio和video元素提供的接口蕴含了一系列的属性,办法和事件,这些接口能够帮忙开发实现对音频和视频的操作。 那么如何在页面中增加音频和视频呢? 音频 <audio src="resources/audio.mp3"></audio>视频 <video src="resources/video.mp4" width="600" height="200"></video>应用source元素因为各种浏览器对音频和视频的编解码器的反对不一样,为了可能在各种浏览器中失常应用,能够提供多个源文件。 <audio src="resources/audio.mp3"> <source src="song.ogg" type="audio/ogg"> <source src="song.mp3" type="audio/mpeg"></audio><video src="resources/video.mp4" width="600" height="200" controls> <source src="movie.ogg" type="video/ogg codes=`theora,vorbis` "> <source src="movie.mp4" type="video/mp4"></video>应用source元素代替了audio或video的标签属性src。src属性用于指定媒体文件的url地址type属性用于指定媒体文件的类型,属性值为媒体文件的MIME类型,该属性值还能够通过codes参数指定编码格局audio和video个性和属性元素的标签个性src,源文件个性,用于指定媒体文件的url地址autoplay,自动播放个性,示意媒体文件加载后自动播放。<video src="resources/video.mp4" autoplay></video>controls,管制条个性,示意为视频或音频增加自带的播放管制条。<video src="resources/video.mp4" controls></video>loop,循环个性,示意音频或视频循环播放。<video src="resources/video.mp4" controls loop></video>preload,预加载个性,示意页面加载实现后如何加载视频数据。none示意不进行预加载metadata示意只加载媒体文件的元数据auto示意加载全副视频或音频,默认值为auto<video src="resources/video.mp4" controls preload="auto"></video>poster是video元素独有的个性,代替内容属性,用于指定一副代替图片的url地址,当视频不能够用时,会显示该代替图片。<video src="resources/video.mp4" controls poster="images/none.jpg"</video>width和height,video元素独有的个性,用于指定视频的宽度和高度<video src="resources/video.mp4" width="600" height="200" controls></video>接口属性currentSrc,只读,获取以后正在播放或已加载的媒体文件的url地址videoWidth,只读,video元素特有属性,获取视频原始的宽度videoHeight,只读,video元素特有属性,获取视频原始的高度currentTime,获取或设置以后媒体播放地位的工夫点startTime,只读,获取以后媒体播放的开始工夫duration,只读,获取整个媒体文件的播放时长volume,获取或设置媒体文件播放时的音量,取值范畴在0.0到0.1之间muted,获取或设置媒体文件播放时是否静音。true示意静音,false示意打消静音ended,只读,如果媒体文件曾经播放结束则返回true,否则返回falseerror,只读,读取媒体文件的错误代码played,只读,获取已播放媒体的TimesRanges对象,该对象内容包含已播放局部的开始工夫和完结工夫。paused,只读,如果媒体文件以后是暂停或未播放则返回true,否则返回falseseeking,只读,获取浏览器是否正在申请媒体数据seekable,只读,获取媒体资源已申请的TimesRanges对象,该对象内容包含已申请局部的开始工夫和完结工夫networkState,只读,获取媒体资源的加载状态buffered,只读,获取本地缓存的媒体数据的TimesRanges对象readyState,只读,获取以后媒体播放的就绪状态playbackRate,获取或设置媒体以后的播放速率defaultPlaybackRate,获取或设置媒体默认的播放速率视频播放的快进<!DOCTYPEHTML><html><head><meta charset="utf-8"><title>视频播放时的快进</title><script type="text/javascript">function Forward() { var el = document.getElementById("myPlayer"); var time = el.currentTime; el.currentTime = time+300;}</script></head><body><video id="myPlayer" src="resources/video.mp4" width="600" height="200" controls></video><br/><input type="button" value="快进" onclick="Forward()"/></body></html>audio和video接口办法接口办法load(),加载媒体文件,为播放做筹备。play(),播放媒体文件。pause(),暂停播放媒体文件。canPlayType(),测试浏览器是否反对指定的媒体类型。代码示例应用接口: <!DOCTYPEHTML><html><head><meta charset="utf-8"><title>播放与暂停</title><script type="text/javascript">var videoEl = null;function Play() { videoEl.play();}function Pause() { videoEl.pause();}window.onload = function(){ videoEl = document..getElementById("myPlayer");}</script></head><body><video id="myPlayer" width="600"> <source src="resources/video.mp4" type="video/mp4"></video><br><input type="button" value="播放" onclick="Play()"/><input type="button" value="暂停" onclick="Pause()"/></body></html>audio和video事件捕捉事件的形式捕捉事件有两种办法:一种是增加事件句柄,一种是监听。 ...

January 16, 2021 · 1 min · jiezi

关于html5:腾讯位置服务地图选点组件使用示例

本文次要应用到的性能为: 1、抉择地址发送(地图选点组件 ) 2、实时地址动态图 3、地图调起 ,手机查看 选址组件次要是选地点的信息,如下: 在js或者数据库中保留这些信息,动态图片和地图API的调起就要用到这些信息,次要还是经纬度。 能够用在聊天发送定位的性能中。 Demo中把key替换成你的key key申请地址:https://lbs.qq.com/dev/console/key/manage <html> <meta charset="utf-8"> <meta http-equiv="Cache-Control" content="no-siteapp" /> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <meta content="telephone=no" name="format-detection" /> <script type="text/javascript" src="js/jquery-1.11.3.min.js"></script> <head> <meta charset="utf-8"> <title></title> </head> <style type="text/css"> #mapPage { display: none; } </style> <body> <div> <a id="lookLoc" href="https://apis.map.qq.com/uri/v1/marker?marker=coord:22.51595,113.3926;title:接管的位置;addr:中山市政府&referer=myapp">点击查看地位</a> <img id="imgLoc" src="https://apis.map.qq.com/ws/staticmap/v2/?center=22.520843533080377,113.38995007717672&zoom=12&size=150*75&scale=2&maptype=roadmap&markers=size:large|color:red|22.520843533080377,113.38995007717672&key=you key" alt="定位地图" onclick="lookLoc()" /><br/> <div id="locInfo"></div> </div> <input type="button" value="发送定位" id="send" /> <iframe id="mapPage" width="100%" height="100%" frameborder=0 src="https://apis.map.qq.com/tools/locpicker?search=1&type=1&total=1&key=you key&effect=zoom&referer=rcwwap"></iframe> </body></html><script> var hrefStr = "https://apis.map.qq.com/uri/v1/marker?"; var imgSrc = "https://apis.map.qq.com/ws/staticmap/v2/?center="; var imgSrc2 = "&zoom=16&size=150*75&scale=2&maptype=roadmap&markers=size:large|color:red|"; var imgStr3 = "&key=you key"; var pointStr = ""; $(document).ready(function() { var loc; $("#mapPage").hide(); $("#send").click(function() { $('#mapPage').attr('src', $('#mapPage').attr('src')); $("#mapPage").css("display", "inline-block"); }) }); window.addEventListener('message', locationPicker, false); //选址 function locationPicker(event) { // 接管地位信息,用户抉择确认地位点后选点组件会触发该事件,回传用户的地位信息 loc = event.data; console.log('locationassa', loc); console.log("注册message事件"); if (loc && loc.module == 'locationPicker') { //避免其余利用也会向该页面post信息,需判断module是否为'locationPicker' console.log('选址location', loc); $("#mapPage").hide(); pointStr = loc.latlng.lat + "," + loc.latlng.lng; $("#locInfo").text(pointStr + " " + loc.poiname + " " + loc.poiaddress); $("#lookLoc").attr("href", hrefStr + "marker=coord:" + pointStr + ";title:" + loc.poiname + ";addr:" + loc.poiaddress + "&referer=myapp"); $("#imgLoc").attr("src", imgSrc + pointStr + imgSrc2 + pointStr + imgStr3); alert("选址胜利"); } }</script>留神1、选址的过程中,拖拽地图时,尽管上面的地址列表会跟着更新,然而不会默认第一个,还须要点击一下地址列表。不像微信一样在拖拽过程中会默认第一个,拖拽完就能够点击发送。如果要做跟微信一样的性能,在拖拽后就须要点击一下地址列表,再点击发送。目前地图组件不反对自定义,例如拖拽地图的事件。 ...

January 15, 2021 · 1 min · jiezi

关于html5:img标签到底是行内元素还是块级元素

面试官问你<img>是什么元素时你怎么答复写这篇文章源自我之前的一次面试,题目便是问img标签属于块级元素还是行内元素,过后想都没想就说了是行内(inline)元素,面试官诘问为什么可能设置 <img /> 标签的宽和高,过后脑子忽然一懵,发现这是本人技术上的一个空白,所以有了这篇文章。浏览本文您将播种<img />标签的根本应用MDN对于元素的定义非凡的可替换元素<img /> 标签的根本应用浏览器反对所有支流浏览器都反对 <img> 标签标签定义及应用阐明<img> 标签定义 HTML 页面中的图像<img> 标签有两个必须的属性:src 和 alt强烈推荐在开发中每个图像中都应用 alt 属性。这样即便图像无奈显示,用户还是能够看到对于失落了什么货色的一些信息。而且对于残疾人来说,alt 属性通常是他们理解图像内容的惟一形式<img />到底是什么元素<img /> 是行内元素还是块级元素?<img /> 标签没有独占一行,所以是行内元素,这没啥问题既然是行内元素为什么可能设置宽高呢?这个问题就要引申出上面局部了,<img /> 标签属于替换元素,具备内置的宽高属性,所以能够设置,具体解释看上面。元素的定义从元素自身的特点来讲,能够分为不可替换元素和替换元素元素相干的MDN解释 不可替换元素(X)HTML 的大多数元素是不可替换元素,即其内容间接体现给用户端(例如浏览器)如:<h1>我是题目</h1>可替换元素浏览器依据元素的标签和属性,来决定元素的具体显示内容例如浏览器会依据 <img> 标签的src属性的值来读取图片信息并显示进去,而如果查看(X)HTML代码,则看不到图片的理论内容;又例如依据 <input> 标签的type属性来决定是显示输入框,还是单选按钮等(X)HTML中的 <img>、<input>、<textarea>、<select>、<object> 都是替换元素。这些元素往往没有理论的内容,即是一个空元素如:<img src="tigger.jpg"/>、<input type="submit" name="Submit" value="提交"/>可替换元素的性质同设置了display:inline-block的元素统一非凡的可替换元素<img>属于可替换元素<img>同时具备行内元素,行内块,和块级元素的个性替换元素个别有外在尺寸,所以具备 width 和 height,能够设定 例如你不指定 <img> 的 width 和 height 时,就按其内在尺寸显示,也就是图片被保留的时候的宽度和高度对于表单元素,浏览器也有默认的款式,包含宽度和高度<img>、<input>属于行内替换元素。height/width/padding/margin均可用。成果等于块元素写在最初如果你感觉这篇文章对你无益,烦请点赞以及分享给更多须要的人!

January 15, 2021 · 1 min · jiezi

关于html5:threejsWebGL引擎用于数据3D可视化展示

` WebGL1.0规范2011年公布以来,至明天2017年,通过了大概6年。当初少数浏览器最新版本曾经可能反对WebGL1.0规范,包含挪动端浏览器。贫道喜爱把团队用SolidWorks软件设计的机械零件在集体网站解析进去,工程师之间能够随时随地用手机浏览器拜访网站,关上整机互相交换,对外交换展现更加不便。贫道置信其它各个领域都有用到WebGL的我的项目,比方国内大型电商平台推动商品在线3D预览显示打算,3D成果的展现要比一张图片体验好得多;游戏行业心愿在线部署游戏,相比须要下载的游戏更加有利于推广;房地产、酒店、商场畛域心愿能够通过网页在线展现室内成果,CAD开发公司心愿能够利用WebGL技术实现在线进行三维建模。除了特定畛域的工程利用外,也有很多的计算机图形学学习者心愿用网页在线展现本人的作品、算法,相比客户端应用OpenGL开发的作品而言,应用WebGL技术实现的作品只须要给别人发送一个链接即可。事实上,越来越多的软件应用搬上了网页,浏览器的作用不仅仅用来展现网页内容,而是作为一个平台。不管学习WebGL还是学习OpenGL,其实都是学习计算机图形学及其延长利用,WebGL对应的是浏览器平台,OpenGL对应的是操作系统平台。 相比浏览器对WebGL的反对而言,WebGL短少的是遍及问题,人才需求远远大于人才供给。俗话说隔行如隔山,WebGL目前的遍及慢,除了图形学比拟难以外,也有这方面问题。WebGL前三个字母体现的是互联网平台、浏览器页面,后两个字母体现的是计算机图形学。理解前端的工程师,往往不理解图形学,理解图形学的往往又不理解网站开发,网页设计。对于图形学的学习材料往往都是应用C或C++语言编写,基于操作系统平台。 因为学员的根底、行业多样化散布,因而本系列WebGL教程尽量关照不同根底、不同畛域的人,对于前端工程师,教程为把图形学的常识零碎解说,对于曾经理解图形学的学习者,教程会解说相干的网页设计常识,只有有肯定的编程能力就行。在理论的WebGL我的项目中,除了图形学自身而言,也要学习交互界面设计,通过HTML和CSS能够实现界面的设计,通过WebGL API、着色器语言GLSL ES和Javascript语言,能够实现图形学局部的开发。如果你曾经纯熟应用HTML、CSS和Javascript语言,你只须要学习WebGL的API和GLSL ES语言,着色器语言GLSL ES相似C语言,运行在GPU上,对于少数学习过C语言的人来说并不难。对于有OpenGL根底的人而言,WebGL API只不过是OpenGL API子集的子集,更多学习的是如何过渡到互联网的生态环境下,在网页上设计利用的GUI要比操作系统平台不便的多,间接应用超文本语言HTML即可。 ` WebGL完满地解决了现有的Web交互式三维动画的两个问题:第一,它通过HTML脚本自身实现Web交互式三维动画的制作,无需任何浏览器插件反对;第二,它利用底层的图形硬件加速性能进行的图形渲染,是通过对立的、规范的、跨平台的OpenGL接口实现的。 WebGL(全写Web Graphics Library)是一种3D绘图协定,这种绘图技术标准容许把JavaScript和OpenGL ES 2.0联合在一起,通过减少OpenGL ES 2.0的一个JavaScript绑定,WebGL能够为HTML5 Canvas提供硬件3D减速渲染,这样Web开发人员就能够借助零碎显卡来在浏览器里更流畅地展现3D场景和模型了,还能创立简单的导航和数据视觉化。显然,WebGL技术标准免去了开发网页专用渲染插件的麻烦,可被用于创立具备简单3D构造的网站页面,甚至能够用来设计3D网页游戏等等。 Three.js是一款开源的支流3D绘图JS引擎(名字Three就是3D的含意),原作者为Mr.Doob,我的项目地址为:https://github.com/mrdoob/three.js/。 咱们晓得WebGL是一种网页3D绘图规范,和jQuery简化了HTML DOM操作一样,Three.js能够简化WebGL编程。 WebGL是HTML5技术生态链中最为令人振奋的规范之一,把Web带入3D的时代,对WebGL没有概念的请浏览本站相干入门教程。 [](#javascript-3d-library)JavaScript 3D libraryThe aim of the project is to create an easy to use, lightweight, 3D library with a default WebGL renderer. The library also provides Canvas 2D, SVG and CSS3D renderers in the examples. Examples — Documentation — Wiki — Migrating — Questions — Forum — Slack — Discord ...

January 15, 2021 · 2 min · jiezi

关于html5:常用正则之整数0到99999正则XXXXXXXXXX正则正整数正则保留两位小数正则含0和不含0

问题形容诸位看官上午好,咱们前端在做我的项目的过程中,经常遇到一些input框测验,比方限度用户不能乱输出内容。形式有很多种,咋办啊?此时,若能善用正则,或者会事倍功半,那么,什么是正则呢?所谓正则我的了解,就是一个前人封装好的对象,此对象自带属性和办法,咱们罕用的用来校验的就是正则的test办法,依据是否符合条件返回布尔值,可用于判断用户是否在乱输出内容。话不多说,上代码! 代码思路html局部 <div id="app"> 负数正则 保留两位(包含0)<el-input v-model.trim="num0" @change="check0" size="mini"></el-input> 负数正则 保留两位(不包含0)<el-input v-model.trim="num1" @change="check1" size="mini"></el-input> 正整数 (不包含0)<el-input v-model.trim="num2" @change="check2" size="mini"></el-input> 折扣 (0-1] 的小数<el-input v-model.trim="num3" @change="check3" size="mini"></el-input> 折扣 (0-1) 的小数<el-input v-model.trim="num4" @change="check4" size="mini"></el-input> 整数 [0,99999]<el-input v-model.trim="num5" @change="check5" size="mini"></el-input> XXXXX-XXXXX正则<el-input v-model.trim="num6" @change="check6" size="mini"></el-input> </div>js局部 export default { name: "app", data() { return { /* 总结:对应正则表达式而言,基本上能够帮咱们匹配到适合的成果 然而有些状况下。正则匹配的不够用,须要咱们手动转换判断管制一下 */ num0: "", num1:"", num2:"", num3:"", num4:"", num5:"", num6:"", }; }, methods: { // 负数正则 保留两位(包含0) check0() { let reg = /^((0{1}\.\d{1,2})|([1-9]\d*\.\d{1,2})|([1-9]+\d*)|0)$/; /* 输出的内容可分为以下状况 1. 值为0 2. 值为非0 2.1 非0然而是数字 2.1.1 非0是数字,然而保留两位小数就为0.00了 2.1.2 非0是数字,保留两位小数仍不为0 2.2 非0然而不是数字 非数字类型的转化后就变成NaN了,正则查看NaN就为false,所以也是间接不合乎 */ // 因为用户可能输出0或0.000000这样模式的数据,故此情景间接转换为0即可 if (Number(this.num0) == 0) { this.num0 = 0; } // 如果用户输出的不是0,再看看是数字还是不是数字 else { // 如果是数字,且解决后保留两位小数合乎正则 if (reg.test(parseFloat((this.num0 * 1.0).toFixed(2)))) { // 若用户输出0.0003保留两位小数就变成了0.00了,故此时就让其显示为0即可 if((this.num0 * 1).toFixed(2) == 0){ this.num0 = 0 }else{ this.num0 = (this.num0 * 1).toFixed(2); } } // 不合乎的状况就是用户输出非数字 else { console.log("不合乎"); this.num0 = ""; } } }, // 整数正则 保留两位(不包含0) check1(){ let reg = /^((0{1}\.\d{1,2})|([1-9]\d*\.{1}\d{1,2})|([1-9]+\d*))$/ if(reg.test(this.num1*1)){ console.log("合乎"); } // 这样的写法就比拟严格,只有不是两位小数,就间接清空 else{ console.log("不合乎"); this.num1 = "" } }, // 正整数 (不包含0) check2(){ let reg = /^[1-9]\d*$/ if(reg.test(this.num2*1)){ console.log("符合要求"); }else{ console.log("不符合要求"); this.num2 = "" } }, // 折扣(0,1]小数 check3(){ let reg = /^(0\.\d+|1)$/ if(reg.test(this.num3*1)){ console.log("符合要求"); }else{ console.log("不符合要求"); this.num3 = "" } }, // 折扣(0,1)小数 check4(){ let reg = /^(0\.\d+)$/ if(reg.test(this.num4*1)){ console.log("符合要求"); }else{ console.log("不符合要求"); this.num4 = "" } }, // [0,99999] 正整数 check5(){ // console.log(this.num5*1); // 上面的这个正则表达式确实能够匹配 [0,99999] 的正整数,然而存在一个BUG // 就是也会匹配到 01 002 0156 等 相似这样的数,所以须要咱们转换一下 let reg = /^(0|\+?[1-9][0-9]{0,4})$/ if(reg.test(this.num5*1)){ console.log("符合要求"); // 字符串 0020 乘以 1 的话,后果是 20 就把字符串转数字了 this.num5 = this.num5*1 + "" // 最初再转回来数字不便传后盾 }else{ console.log("不符合要求"); this.num5 = "" } }, // XXXXX-XXXXX或XXX&XXXX等类似的产品编号模式的正则 check6(){ let reg1 = /^([0-9]{5})-([0-9]{5})$/ let reg2 = /^([0-9]{3})&([0-9]{4})$/ if(reg1.test(this.num6) | reg2.test(this.num6)){ console.log("符合要求"); }else{ console.log("不符合要求"); this.num6 = "" } } },};总结有些时候,用正则能够搞定大多数的状况,不过有的时候正则又会比拟死板,再联合js的一些罕用的小技巧,就能够实现了input框框的校验管制啦。PS:各位看官,我的代码的正文写的也不少哦。如果那里我没写明确,欢送评论@我,我再回复呢。哈哈哈 ...

January 15, 2021 · 2 min · jiezi

关于html5:看不完的那种前端170面试题答案学习整理良心制作

哪吒人生信条:如果你所学的货色 处于喜爱 才会有弱小的能源撑持。 把你的前端拿捏得死死的,每天学习得爽爽的,如果你所学的货色 处于喜爱 才会有弱小的能源撑持。感激不负每一份酷爱前端的程序员,不管前端技能有多奇葩,欢送关注加我入群vx:xiaoda0423 前言心愿能够通过这篇文章,可能给你失去帮忙。(感激一键三连) 1.css3有哪些新个性圆角border-radius,暗影box-shadow,对文字加特效text-shadow,线性突变gradient,变动transform,伪元素::selection,媒体查问,多栏布局,图片边框border-image。 p:first-of-type,抉择属于其父元素的首个<p>元素的每个<p>元素p:last-of-type,抉择属于其父元素的最初一个<p>元素的每个<p>元素p:only-of-type,抉择属于其父元素的惟一<p>元素的每个<p>元素p:only-child,抉择属于其父元素的惟一子元素的每个<p>元素p:nth-child(2),抉择属于其父元素的第二个子元素的每个<p>元素:enabled:disabled,管制表单控件的禁用状态:checked,单选框或复选框被选中2.first-child与first-of-type的区别是first-child匹配的是父元素的第一个子元素,能够说是构造上的第一个子元素first-of-type匹配的是该类型的第一个元素,类型就是指冒号后面匹配到的元素。(只有是该类型的元素第一个即可,不限度是第一子元素)<div> <p></p> <span></span></div>p:first-child匹配到p元素,因为p元素是div的第一个子元素span:first-child匹配不到span元素,因为span是div的第二个子元素p:first-of-type匹配到p元素,因为p是div所有为p的子元素中的第一个span:first-of-type匹配到span元素,因为span是div所有未span的子元素中的第一个。3.解决应用transform:translate属性时会呈现闪动景象-webkit-backface-visibility: hidden; // 暗藏转换的元素的反面-webkit-transform-style: preserve-3d; // 使被转换的元素的子元素保留其3d转换-webkit-transform: translated3d(0,0,0); // 开启gpu硬件加速模式,应用gpu代替cpu渲染动画4.如何应用@keyframes使div元素挪动200像素div { widht:100px; height:100px; background: red; animation: move 3s;}@keyframes move{ from{ margin-left: 0px; } to{ margin-left: 100px; }}5.如何实现文本换行应用word-wrap属性:normal只在容许的断字点换行;break-word在长单词或url地址外部进行换行。 6.超出文本省略应用text-overflow:ellopsis:文本溢出时,为了不显示省略标记...,通过clip间接将溢出的局部裁剪掉。 7.css3动画如何在动作完结时放弃状态不变应用animation-fill-mode,值为none,示意不扭转默认行为;值为forwards,当动画实现后,放弃最初一个属性值;backwards,在animation-delay所指定的一段时间内,在动画显示之前,利用开始属性值;both,向前和向后填充模式都能够利用。 css3动画的长处:在性能上会略微好一些,浏览器会对css3的动画做一些优化,代码绝对简略;css3动画的毛病:在动画管制上不够灵便,兼容性不好,局部动画性能无奈实现。 8.实现某div元素以每秒50px的速度左移100px$('div'),animate({'left': 100}, 2000);div { transition: all 2s linear;}div.style.left = {div.offsetLeft+100)+'px';9.说说box-sizing属性box-sizing属性用来管制元素盒模型的解析模式,默认是content-box content-box让元素维持w3c的规范盒模型,元素的宽度/高度由border+padding+content的宽度/高度决定,设置width/height属性指的是指定content局部的宽度/高度。 border-box让元素维持ie传统盒模型,设置width/height属性指的是指定border+padding+content的宽度/高度。规范浏览器下,依照w3c标准解析盒模型,一旦批改了元素的边框或内距,就会影响元素的盒子尺寸,就不得不从新计算元素的盒子尺寸,从而影响整个页面的布局。content-box盒模型: 布局所占宽度: width=width + padding-left + paddiing-right + border-left + border-right布局所占高度: Height = height + padding-top + padding-bottom + border-top + border-bottompadding-box盒模型: ...

January 14, 2021 · 7 min · jiezi

关于html5:Babel-入门教程

作用:将 ES6+ 版本的代码转换为 ES5代码,以便可能运行在以后环境和旧版浏览器环境中。 这就意味着,能够用 ES6 编写代码,而不必放心以后环境是否反对的问题。 一、配置 .babelrc应用 Babel的第一步,就是配置 .babelrc 这个文件,该文件寄存在我的项目根目录下,用来设置转码规定和插件,根本格局如下: { "presets": [...], "plugins": [...]}其中 presets 字段设定转码规定,可依据须要装置。 # ES2015转码规定$ npm install —save-dev babel-preset-es2015# react转码规定$ npm install —save-dev babel-preset-react# ES7不同阶段语法提案的转码规定(共有4个阶段),选装一个$ npm install —save-dev babel-preset-stage-0$ npm install —save-dev babel-preset-stage-1$ npm install —save-dev babel-preset-stage-2$ npm install —save-dev babel-preset-stage-3而后将这些规定退出 .babelrc: { "presets": [ "es2015", "react", "stage-2" ], "plugins": [...]}二、命令行转码 babel-cliBabel 提供 babel-cli 工具,用于命令行转码。 装置命令如下: $ npm install --global babel-cli根本用法如下: ...

January 14, 2021 · 3 min · jiezi

关于html5:零基础自学编程需要注意什么

我是非科班 0 根底自学过去的,我很分明一个人自学编程有哪些误区,有哪些须要留神的中央,以及哪些能够晋升效率的中央,所以,我从我的自学经验给一些自学编程的后来者总结了一些倡议,心愿给正在自学编程或者打算走这条路的读者一点帮忙。 1. 先造就趣味其实自学编程不是那么难,只有是理工科生、逻辑思维好点,最好英语也好点,根本都能够学会编程,然而很多人都失败了,起因就在于很多人还没入门就放弃了,看着一堆寒冷的英语字母、一些干燥的书籍,以致很多人尝试了一段时间间接就放弃了。所以自学正确的姿态是肯定先要造就下趣味,不要上来就学习编程语言,先搞清楚编程能用来做什么,最好是本人有个小想法,比方本人想做个网站,有这样的想法之后,再去针对性的去学习须要的编程常识,你才会更容易坚持下去。 2. 不要钻牛角尖。很多老手自学的时候,最开始肯定会遇到各种问题,比方学习的时候搞不懂为啥肯定要这样写,程序运行进去了,怎么这么神奇?它背地是什么样的原理呢?等等等,很多人都会花很大的工夫去试图全副弄懂,导致破费大量的工夫,本人进度同时又很慢,过来人通知大家,初学者不要过分钻牛角尖,很多货色,你的 level 没到那个程度,天然没法齐全弄懂,齐全没关系,等到了前面,有些疑难天然就明确了。 这就好比,你初中的一些数学、物理题,你花了很长的工夫也不肯定能明确,然而到了高中之后,你会豁然开朗,原来这个原理是这个意思。 所以,初学者切忌钻牛角尖,循序渐进的去学习好了,哪怕遇到一些不太明确,不知背地原理的事件,齐全没关系。 3. 联合视频初学者肯定要看视频,而且不能只看视频,视频是帮忙你了解的,联合书本、配合视频一起学习,成果是最好的,一些视频解说的比拟通俗,不够零碎,然而只看书的话,很多人容易看到前面就看不懂了,所以,我自认为视频 + 书籍是初学的最好形式,等到前期,有能力了,看书、看视频、看博客就随你了。 当初有很多在线视频网站都很不错的,举荐两个: 「慕课网」和「Udacity」,收费的话上慕课网就够了,如果想自学能力较差,那么能够思考在 Udacity 买套付费课程。 当然,如果付费课程都没能激发你的学习趣味,但你又想走编程这条路,那么能够思考去报个培训班,然而我不是特地倡议,互联网时代,在线教育足以让每个人接触学习咱们感兴趣的行业,付费课程 + 辅助领导 + 自学,我感觉适宜大部分人了。 4. 多敲代码编程是一个极度器重实际的行业,兴许书上的代码你看得懂,然而你本人亲自敲下来肯定会遇到各种问题,所以,初学者在学习的过程中,肯定要亲自实际,哪怕你对着书上的代码一行一行的敲下来,也比你单纯的看有成果的多。 所以,敲代码肯定是随同着整个学习周期的,从最后的学习,到前面入门,再到之后你的晋升,都离不开它,还是那句话,兴许在学习的过程中你会遇到一些难题,会遇到临时不理解的代码,没关系,就闷头敲下去,只有你能坚持下去,一些问题在前面都会天然的有答案的。 5. 坚持下去编程这事其实真的没那么难,只不过编程在一开始不会有那么大的反馈,不像你学唱歌,花几天,就能够唱一首歌了,不像你学语文,花个一周,就会说「之乎者也」了,编程是你可能你花几个月的工夫,你甚至都感觉本人啥都不会,所以很多人在一开始就放弃了。那么自学编程胜利的无一例外都是保持下来了,你得做好少则三个月,多则半年的工夫始终继续学习,并且这么长时间可能感触不到任何提高的状态,然而,一旦你保持下来了,当然,不只是单纯的熬过这个工夫,你得保持每天都要学习,等度过这个初期阶段,你会很有感觉,前面的路虽说也不好走,但起码你没那么迷茫了,你晓得该怎么学习了,你会很容易找到方向了。 相比其余行业来说,编程入门难,做到精更难。然而对于绝大部分自学编程人来说,你该优先思考入门,争取坚持下去,用三个月到半年的工夫,让本人度过这个艰巨的入门期。 6. 折腾个作品进去很多人通过视频 + 书籍的形式保持一段时间,把握了点编程根底,感觉本人学的还能够了,这个时候你该思考折腾个作品进去,这是测验你学的理论知识的过程,这个作品能够很简略,能够是一个简略的博客网站,也能够是做一个小的资讯 App,还能够是一个小的爬虫等,甚至 GitHub 有很多开源的我的项目,你去仿写都没问题,然而重要的肯定要本人亲自去做,而不是对着 copy,置信我,无论你的理论知识把握得如许扎实,在这个过程你都会遇到各种问题,哪怕之前你感觉很简略的货色,然而动起手来可就没那么容易了。 当你破费了很大的功夫,亲自把作品折腾进去了,你会有十分大的满足感与提高感,你的能力有了一个晋升,而且这也算是你的我的项目教训了,有一个残缺作品,其实才算具备找工作的根本能力了,这时候能够试着找一份高级的开发岗位,一旦找到工作,你的自学之路,根本算是成了,前面的路,尽管也不容易,然而你算是熬到了。 最初,再给自学的人倡议一点,要长于应用搜索引擎,你遇到的那点小问题,曾经有有数前辈早都遇到,并且曾经分享在互联网上了,前人的教训是你的贵重学习资源,兴许你一开始应用的是百度,然而,倡议你试着应用 Google,当你学会应用 Google 的时候,你会接触另一个世界。 总之,我是过来人,我十分分明自学编程这条路有如许不易,尤其对于一些非科班的同学,你要耐得住寂寞,你要比他人更致力,你要找到适宜本人的编程方向,再到找到一份工作,这过程的艰苦只有过去人才能领会,然而过来人的教训通知你们,我自学编程胜利简直扭转了我的人生轨迹,而且我从未悔恨过,真心心愿每个自学编程的人都能够找到本人的方向与定位,祝早日找到工作。 如果你想要学习WEB前端,在学习过程中,身边没有一个可能领导你学习的人,能够到这个WEB前端裙:后面484,两头757,前面760,外面有依据目前市场需求,录制的最新的零碎教程,不论是计算机专业想要往WEB前端方向倒退,还是零根底想转行,都能够跟着教程学,有什么不懂的能够在外面问。

January 14, 2021 · 1 min · jiezi

关于html5:js多图片上传获取多个图片base64的值显示到页面

上传前显示成果上传后显示成果 $('#img_purchase').on('click',function(){ $('#purchase').click(); }); $('#img_sale').on('click',function(){ $('#sale').click(); }); function getBase64 (file,Callback) { let reader = new FileReader() let imgResult = '' reader.readAsDataURL(file) reader.onload = function () { imgResult = reader.result } reader.onerror = function (error) { Callback(error) } reader.onloadend = function () { Callback(imgResult) }}; $(document).on('change', '#purchase', function () { var filePath = $(this).val() console.log(filePath); var arr_prepath=this.files; console.log(arr_prepath); for (var i=0;i<arr_prepath.length;i++){ getBase64(arr_prepath[i],function(res){ console.log(res); $('.img_addpurchase').before('<div class="le_img">'+ '![](__JHWIMAGES__/ewc.png)'+ '![]()'+ '</div>',$('.purchase_top').firstChild); }) } });

January 14, 2021 · 1 min · jiezi

关于html5:手把手制作mobileconfig文件在iphone上创建h5网页桌面图标

1,下载mobileconfig文件制作工具下载地址:点击关注公众号,回复appicon, 获取工具的下载地址新建配置形容文件,填写通用信息 填写Web Clip信息 点击菜单栏的导出,留神这里肯定要抉择无, 导出文件命名为unsigned.mobileconfig 2,用收费域名的证书给mobieconfig文件签名签名须要3个文件server.crt 服务器端用于签名的证书 server.key 服务器端用于签名的证书的秘钥 ca.crt 其余机构为服务器颁发的CA证书收费域名的证书申请胜利之后会有两个文件(一个.key, 一个.pem), 关上.pem文件, 提取信息:后面的为server.crt -----BEGIN CERTIFICATE-----server-----END CERTIFICATE-----前面的为ca.crt -----BEGIN CERTIFICATE-----ca-----END CERTIFICATE-----利用openssl签名openssl smime -sign -in unsigned.mobileconfig -out signed.mobileconfig -signer server.crt -inkey server.key -certfile ca.crt -outform der -nodetach签名胜利之后将signed.mobileconfig文件制作成一个下载连贯,用safari浏览器关上并容许,装置这个形容文件就能够了,再看桌面就会有一个图标 感觉有用 ?喜爱就珍藏,顺便点个赞吧,你的反对是我最大的激励!微信搜公众号 [DX前端框架知识库],发现更多Vue, React, Flutter, Uniapp, Nodejs, Html/Css等前端常识和实战. DX前端,分享前端框架知识库,文章详见:DX前端

January 14, 2021 · 1 min · jiezi

关于html5:在vue中使用HTML-5-拖放API

拖放 API 将可拖动元素增加到 HTML,使咱们能够构建蕴含能够拖动的具备丰盛 UI 元素的 Web 利用。 在本文中咱们将用 Vue.js 构建一个简略的看板利用。看板是一种项目管理工具,使用户能够从头到尾直观地治理我的项目。 Trello、Pivotal Tracker 和 Jira 等工具都属于看板利用。 设置看板运行以下命令创立咱们的看板我的项目: vue create kanban-board在创立我的项目时,该抉择只蕴含 Babel 和 ESlint 的默认预设。 实现后,删除默认组件 HelloWorld ,将 App 组件批改为空,仅蕴含裸组件模板: <template> <div></div> </template><script>export default { name: 'App', components: {},};</script><style></style>接下来用 Bootstrap 进行款式设置,只需 Bootstrap CSS CDN 就够了。将其增加到 public/index.html 的 head 重。 <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <link rel="icon" href="<%= BASE_URL %>favicon.ico"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous"> <title><%= htmlWebpackPlugin.options.title %></title> </head>在看板中构建 UI 组件看板的样子应该是这样的: 通常看板要有列和卡片。卡片是要执行的单个我的项目或工作,列用来显示特定卡片的状态。 所以须要创立三个 Vue 组件:一个用于列,一个用于卡片,最初一个用于创立新卡片。 创立 card 组件先来创立 card 组件。在 /component 目录中创立一个新文件 Card.vue。 ...

January 14, 2021 · 6 min · jiezi

关于html5:Vue全新技术栈重构黄老师饿了么商家应用总结

我的项目仓库地址:https://github.com/konglingwen94/vue-elm-sell 我的项目线上地址: http://123.56.124.33:5000 前提自从学习了Vue后,能用Vue解决的场景用例最终我都尽可能的用Vue去实现。单纯的用例需要并没有残缺的我的项目开发流程,从中能学到的货色也是无限的。在这之前除了应用Vue做过vue-music的挪动端音乐播放器我的项目和vue-bytedanceJob(重构某独角兽互联网公司官网招聘网站)之外,本人并没有用Vue涉猎web端更简单的业务场景。 为了找一个我的项目练习,我去github上开始了搜寻,当看到https://github.com/ustbhuangyi/vue-sell这个我的项目时,感觉这个挪动端利用的一些业务场景是本人没有接触过的,于是我就照着这个利用的UI和性能用本人的常识体系和技术栈进行了重构,大略不到半个月的工夫,我实现了第一个commit提交到我的项目上线运行,本篇文章就从利用性能和技术实现一些方面分析此我的项目的开发过程以及采到的坑。 我的项目截图<img src="https://user-gold-cdn.xitu.io/2020/7/1/17308b5c66a54ae5?w=286&h=500&f=gif&s=1854225" width="200"><img src="https://user-gold-cdn.xitu.io/2020/7/1/17308b647f0cba7f?w=286&h=500&f=gif&s=838667" width="200"><img src="https://user-gold-cdn.xitu.io/2020/7/1/17308b6220974f7e?w=286&h=500&f=gif&s=1786516" width="200"><img src="https://user-gold-cdn.xitu.io/2020/7/1/17308b316156fd95?w=286&h=500&f=gif&s=954705" width="200"><img src="https://user-gold-cdn.xitu.io/2020/7/1/17308b33d9cb205e?w=286&h=500&f=gif&s=1187009" width="200"> 我的项目技术栈前端 vue开发我的项目外围框架axios HTTP申请模块lib-flexible 挪动端屏幕适配计划better-scroll 仿IOS成果的挪动端滚动库normalize.css 第三方css款式初始化模块es 6/7 下一代javascript语法后端 express 搭建服务端利用外围框架开发 vue-cli 我的项目初始化脚手架vue-devtools 我的项目开发环境调试工具vscode chrome git macbookpro部署 代码托管仓库 https://github.com/konglingwen94/vue-elm-sell线上地址 123.56.124.33:5000利用性能[x] 商品页 [x] 商品分类导航和商品列表的联动成果[x] 点击商品分类菜单展现对应商品列表信息[x] 增加/删除商品到购物车[x] 点击商品进入到详情页面[ ] 商品增加到购物车动画成果[ ] 页面滚动到对应商品类别时的题目吸顶成果[x] 评论页 [x] 综合评论信息渲染[x] 切换评论筛选项按钮展现对应的信息[x] 抉择展现是否有内容的评论[x] 商家页 [x] 商家店铺信息展现[x] 珍藏店铺[x] 商家实景图片具备bounce成果的滑动显示[x] 利用头部 [x] 点击展现详情[ ] 布告信息动静滚动显示[x] 购物车 [x] 依据商品个数显示不同的状态[x] 购物车商品列表[x] 领取弹窗[x] 清空购物车[x] 减少/删除商品[ ] 利用局部优化bounce成果是指在利用中页面地位滚动到一个端点持续滑动时呈现反弹的成果,常见场景是IOS零碎利用滑动成果性能难点商品导航和内容的左右联动成果成果演示残缺的组件代码点https://github.com/konglingwen94/vue-elm-sell/blob/master/src/views/goods/index.vue。 思路因为商品导航和内容是两个独立的滚动容器,当滚动到一个指标内容块时怎么能力激活它所关联的导航项呢?咱们晓得导航项列表和内容列表在排列程序上是统一的,如果能计算出内容滚动地位处在对应区间块的索引,也就失去了导航列表应该激活的指标索引,而后就能够用Vue数据驱动视图的思维去实现这所有。 容器的左右联动成果是指容器滚动到指标内容时激活其关联的导航菜单项并滚动到可视区域。逻辑实现找到要激活的指标导航项索引的第一步须要把商品内容的各个类别块在容器内的纵坐标地位存储起来(给之后找到激活的指标索引提供比拟对象),因为列表内容时动静渲染的,所以这里须要等所有数据曾经渲染实现后能力操作,上面间接看代码演示吧! template局部 <template> /* 这里只显示局部代码*/ <ul class="foods-list"> <li ref="foodsGroup" class="foods-group" v-for="(item,index) in data" :key="index"> <dl class="foods-group-wrapper"> <dt :class="{fixed:currentIndex===index}" class="foods-group-name">{{item.name}}</dt> <dd class="foods-group-item" v-for="(food ,key) in item.foods" :key="key" > {{food.name}} </dd> </dl> </li> </ul></template>script局部 ...

January 13, 2021 · 2 min · jiezi

关于html5:vue中audio自定义样式页面中包含多个audio

前言 一开始看到UI设计稿,我心田是非常抗拒的。感觉用原生audio的款式就能够了,也不是特地丑,毕竟工夫给的不多,自定义款式还要改逻辑啥的。在网上搜寻了一番有没有适合的插件,没有看到心动的。最初还是硬着头皮本人写了。 参考了一个博客,很感激这位博主,逻辑都能够用。不过原博用的jquery,我本人用vue,而且我的页面可能有不止一个audio,设计稿和原博也很不一样,所以改代码还是花了一番心理。 参考链接: 音频(audio)自定义款式以及管制操作面板vue版本:2.6.12我这里是依照我的设计稿做进去的样子,如果你的设计稿跟我的不一样,那也只须要改一下css局部和html,js还是能间接套用的。 如果急用的同学能够间接跳到最初看残缺的代码,复制了不出意外能够间接用的,只须要把播放按钮的图片改成你本人的图片,再增加可用的audio链接就能够了。 html代码:<div class="page-container"> <div v-for="(item, index) in content" :key="index" class="list-box"> <audio ref="audio" :src="item.audio_url" controls @loadedmetadata="fillTime($event, index)" @timeupdate.stop="updateProgress(index)" @ended.stop="audioEnded(index)"> </audio> <!-- 音频名字 --> <div class="audio-name">{{ item.audio_name }}</div> <div class="control-row"> <!-- 管制播放暂停的按钮 --> <img src="@/assets/play.png" class="play-icon" alt="" @click="playAudio(index)"> <div class="row-right"> <!-- 进度条 --> <div class="pgs"> <div class="pgs-play"></div> </div> <!-- 以后播放时长和总时长 --> <div class="time-row"> <span class="played-time">{{ audioArr[index].currentTime }}</span> <span class="audio-time">{{ audioArr[index].duration }}</span> </div> </div> </div> </div> </div>js代码:export default { data() { return { audioNodes: [], // 用于寄存所有 audio 的 DOM 节点 audioArr: [], // 用于保护 audio 的总时长和以后播放工夫的数组 content: [ // 寄存audio的地址信息,个别是接口返回 {"audio_name":"20210112_1056.m4a","audio_url":"https://xxx.com/android1610420451567524.m4a"}, {"audio_name":"20210112_1056.m4a","audio_url":"https://xxx.com/android1610420451567524.m4a"}, ] } }, mounted() { this.audioNodes = document.getElementsByClassName('list-box') this.content.forEach((item, index) => { this.$set(this.audioArr, index, { duration: '', currentTime: '00:00' }) }) }, methods: { // 切换播放,暂停按钮的事件 playAudio(index) { let audio = this.audioNodes[index].firstChild if (audio.paused) { audio.play() } else { audio.pause() } }, // 获取音频的总时长 fillTime(event, index) { this.audioArr[index].duration = this.transTime(event.target.duration) }, // 将秒数转化成(分:秒)格局 transTime(time) { let duration = parseInt(time) let minute = parseInt(duration / 60).toString().padStart(2, '0') let sec = (duration % 60).toString().padStart(2, '0') return `${minute}:${sec}` }, // 进度条播放的事件 updateProgress(index) { let audio = this.audioNodes[index].firstChild let value = Math.round((Math.floor(audio.currentTime) / Math.floor(audio.duration)) * 100, 0) this.audioArr[index].currentTime = this.transTime(audio.currentTime) let progressTag = this.audioNodes[index].getElementsByClassName('pgs-play')[0] progressTag.style.left = `${value}%` }, // 播放完结的解决动作 audioEnded(index) { let audio = this.audioNodes[index].firstChild audio.currentTime = 0 audio.pause() }, } }css代码:.pgs { background-color: #D8D4D1; text-align: center; position: relative; height: 2px; margin-bottom: 10px; } .pgs-play { position: absolute; top: -2.5px; left: 0; width: 7px; height: 7px; border-radius: 50%; background-color: #B03F28; z-index: 1; } .play-icon { width: 45px; height: 45px; margin-right: 15px; } audio { display: block; height: 0; } .audio-box { background: #F5F5F5; border: 1px solid #D8D4D1; border-radius: 5px; width: 100%; padding: 15px 12px; box-sizing: border-box; } .audio-name { font-size: 15px; color: #252120; margin-bottom: 15px; overflow:hidden; //超出的文本暗藏 text-overflow:ellipsis; //溢出用省略号显示 white-space:nowrap; //溢出不换行 } .control-row { display: flex; align-items: flex-end; } .row-right { flex-grow: 100; } .time-row { position: relative; color: #B0AFAD; font-size: 12px; margin-bottom: 3px; } .audio-time { position: absolute; right: 0; }残缺代码(audio.vue)能够间接套用,只须要改control-row外面的图片地址,这是播放按钮的图片。<style lang="scss"> .page-container { .pgs { background-color: #D8D4D1; text-align: center; position: relative; height: 2px; margin-bottom: 10px; } .pgs-play { position: absolute; top: -2.5px; left: 0; width: 7px; height: 7px; border-radius: 50%; background-color: #B03F28; z-index: 1; } .play-icon { width: 45px; height: 45px; margin-right: 15px; } audio { display: block; height: 0; } .audio-box { background: #F5F5F5; border: 1px solid #D8D4D1; border-radius: 5px; width: 100%; padding: 15px 12px; box-sizing: border-box; } .audio-name { font-size: 15px; color: #252120; margin-bottom: 15px; overflow: hidden; //超出的文本暗藏 text-overflow: ellipsis; //溢出用省略号显示 white-space: nowrap; //溢出不换行 } .control-row { display: flex; align-items: flex-end; } .row-right { flex-grow: 100; } .time-row { position: relative; color: #B0AFAD; font-size: 12px; margin-bottom: 3px; } .audio-time { position: absolute; right: 0; } }</style><template> <div class="page-container"> <div v-for="(item, index) in content" :key="index" class="list-box"> <audio ref="audio" :src="item.audio_url" controls @loadedmetadata="fillTime($event, index)" @timeupdate.stop="updateProgress(index)" @ended.stop="audioEnded(index)"> </audio> <!-- 音频名字 --> <div class="audio-name">{{ item.audio_name }}</div> <div class="control-row"> <!-- 管制播放暂停的按钮 --> <img src="@/assets/play.png" class="play-icon" alt="" @click="playAudio(index)"> <div class="row-right"> <!-- 进度条 --> <div class="pgs"> <div class="pgs-play"></div> </div> <!-- 以后播放时长和总时长 --> <div class="time-row"> <span class="played-time">{{ audioArr[index].currentTime }}</span> <span class="audio-time">{{ audioArr[index].duration }}</span> </div> </div> </div> </div> </div></template><script> export default { data() { return { audioNodes: [], // 用于寄存所有 audio 的 DOM 节点 audioArr: [], // 用于保护 audio 的总时长和以后播放工夫的数组 content: [ // 寄存audio的地址信息,个别是接口返回 {"audio_name":"20210112_1056.m4a","audio_url":"https://xxx.com/android1610420451567524.m4a"}, {"audio_name":"20210112_1056.m4a","audio_url":"https://xxx.com/android1610420451567524.m4a"}, ] } }, mounted() { this.audioNodes = document.getElementsByClassName('list-box') this.content.forEach((item, index) => { this.$set(this.audioArr, index, { duration: '', currentTime: '00:00' }) }) }, methods: { // 切换播放,暂停按钮的事件 playAudio(index) { let audio = this.audioNodes[index].firstChild if (audio.paused) { audio.play() } else { audio.pause() } }, // 获取音频的总时长 fillTime(event, index) { this.audioArr[index].duration = this.transTime(event.target.duration) }, // 将秒数转化成(分:秒)格局 transTime(time) { let duration = parseInt(time) let minute = parseInt(duration / 60).toString().padStart(2, '0') let sec = (duration % 60).toString().padStart(2, '0') return `${minute}:${sec}` }, // 进度条播放的事件 updateProgress(index) { let audio = this.audioNodes[index].firstChild let value = Math.round((Math.floor(audio.currentTime) / Math.floor(audio.duration)) * 100, 0) this.audioArr[index].currentTime = this.transTime(audio.currentTime) let progressTag = this.audioNodes[index].getElementsByClassName('pgs-play')[0] progressTag.style.left = `${value}%` }, // 播放完结的解决动作 audioEnded(index) { let audio = this.audioNodes[index].firstChild audio.currentTime = 0 audio.pause() }, } }</script>文章到这里就完结了,如果对你有帮忙,欢送点赞,珍藏,谢谢~ ...

January 13, 2021 · 4 min · jiezi

关于html5:前端HTML5面试官和应试者一问一答

哪吒人生信条:如果你所学的货色 处于喜爱 才会有弱小的能源撑持。 把你的前端拿捏得死死的,每天学习得爽爽的,如果你所学的货色 处于喜爱 才会有弱小的能源撑持。感激不负每一份酷爱前端的程序员,不管前端技能有多奇葩,欢送关注加我入群vx:xiaoda0423 前言心愿能够通过这篇文章,可能给你失去帮忙。(感激一键三连) 1.HTML5表单减少的输出类型url类型:专门为输出url地址定义的文本库,在验证输出文本的格局时,如果文本框中的的内容不合乎url地址的格局,会提醒验证谬误。email类型:专门是为输出email地址定义的文本框,在验证输出的文本的格局时,如果文本框中的内容不合乎email地址的格局,会提醒验证谬误。在email类型的input元素还有一个multiple属性,示意在该文本框中可输出用逗号隔开的多个邮件地址。range类型:用于把输入框显示为滑动条,能够作为某一特定范畴内的数值选择器。min和max个性,别离示意范畴的最小值,默认为0,范畴的最大值,默认为100.range类型有一个step个性,示意拖动的步长,默认为1。number类型:专门为输出特定的数字而定义的文本框,具备min,max,step个性。tel类型:专门为输出电话号码而定义的文本框,没有非凡的验证规定。search类型:专门为输出搜索引擎关键词定义的文本框,没有非凡的验证规定。color类型:color类型的input元素默认会提供一个色彩选择器。date类型:专门用于输出日期的文本框,默认带日期选择器的输入框。month,week,time,datetime,datetime-local类型的input元素与date类型的input元素相似,提供一个相应的选择器。 2.HTML5减少表单的个性以及元素form个性在HTML5中,能够把从属于表单的元素放在任何中央,而后指定该元素的form个性值为表单的id,该元素就从属于表单。 <input name="da" type="text" form="form1" required/><form id="form1"> <input type="submit" value="提交"/></form>formaction个性:每个表单都会通过action个性把表单内容提交到另外一个页面,而在html5中,为不同的“提交”按钮别离增加formaction个性后,该个性会笼罩表单的action个性,将表单提交至不同的页面。<form id="form1" method="post"> <input name="name" type="text" form="form1"/> <input type="submit" value="提交page1" formaction="?page=1"/></form>formmethod,formenctype,formnovalidate,formtarget个性:formmethod个性会笼罩表单的method个性;formenctype个性可笼罩表单的enctype;formnovalidate个性可笼罩novalidate个性,formtarget个性能够笼罩表单的target个性。placeholder个性,向用户提醒描述性的信息。autofocus个性,用于所有类型的input元素,当页面加载实现时,可主动获取焦点,每个页面只容许呈现一个有autofocus个性的input元素,如果设置多个,相当于未指定该行为。autocomplete个性:利用于form元素和输出型的input元素,用于表单的主动实现。能够autocomplete="on",其能够指定"on","off"和" " 不指定。list个性和datalist元素,能够为某个可输出的input元素定义一个选值列表。<input name="email" type="email" list="emaillist"/><datalist id="emaillist"> <option value="1@qq.com"> dada </option> <option value="2@qq.com"> dada2 </option></datalist>keygen元素:提供了一种平安的形式来验证用户,该元素有密钥生成的性能,在提交表单时,会别离生成一个私人密钥和一个公共密钥,私人密钥保留在客户端,公共密钥则通过网络传输至服务器。<form action=""> <input type="text" name="name"/> <br> <keygen name="security"/> <br><input type="submit"/></form>output元素用于不同类型的输入,该元素必须从属于某个表单,即是写在表单的外部。<form oninput="x.value=da.value"> <input type="range" name="da" value="20"/> <output name="x"></output></form> 3.HTML5如何实现跨域response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Methods", "POST");response.setHeader("Access-Control-Allow-Headers", "x-requested-width,content-type");4.什么是WebSqlWebSql是一个在浏览器客户端的构造关系数据库,是浏览器内的本地RDBMS关系型数据库管理系统,能够应用SQL查问。 WebSql是基于SQLite的。5.利用缓存中网络命令的作用是啥// 在代码login.php始终都不应该缓存或者离线拜访NETWORK:login.php网络命令形容不须要缓存的文件。6.Canvas和SVG的区别是什么SVG是可缩放矢量图形,它是基于文本的图形语言,应用文本,线条,点等来绘制图像。a. 一旦Canvas绘制实现将不能拜访像素或操作它,任何应用SVG绘制的形态都能被记忆和操作,能够被浏览器再次显示。 b. Canvas对绘制动画和游戏无利,SVG对创立图像无利。 c. 因为不须要记住之后的事,所以Canvas运行快,而SVG须要记录坐标,所以运行慢。 d. 在Canvas中不能为绘制对象绑定相干事件;在SVG中能够为绘制对象绑定相干事件。 e. Canvas绘制出的是位图,因而与分辨率有个,SVG是矢量图,与分辨率无关。 应用SVG绘制: <svg xmlns="http://ww.xx.xx/pic/svg" version="1.1"> <rect stype="fill:rgb(255,100,0);" height="200" width="400"></rect></svg>应用Canvas绘制: <canvas id="myCanvas" width="500" height="500"></canvas>var canvas = document.getElementById("myCanvas");var ctx = canvas.getContext("2d");ctx.rect(100,100,300,200);ctx.fillStyle="red"ctx.fill()7.本地存储的数据有生命周期吗本地存储的数据没有生命周期,它将始终存储数据,直到用户从浏览器革除或者应用javascript代码移除。8.表单验证的APIrequired个性:示意此项的值不能为空,否则无奈提交表单。pattern个性用于input元素定义一个验证模式。<input name="code" type="text" value="" pattern="[0-9]{6}" placeholder="6为邮政编码"/>min,max,step个性novalidate用于指定表单或表单内的元素在提交时不验证,form元素利用novalidate个性,示意表单中的所有元素在提交时不再验证。validaty属性用于获取表单元素的ValidityState对象,该对象蕴含8个方面的验证后果。ValidityState对象会继续存在,每次获取validity属性时,返回的是同一个ValidityState对象。var validityState=document.getElementById("username").validity;willValidate属性,用于获取一个布尔值,示意表单元素是否须要验证,如果表单元素设置了required个性或pattern个性,则willValidate属性为true,即表单的验证将执行。var willValidate=document.getElementById("username").willValidate;validationMessage属性,用于获取表单元素的谬误提示信息var validationMessage = document.getElementById("username").validationMessage;ValidityState对象,是通过validity属性获取的,该对象有8个属性。a. valueMissing属性:必填的表单元素的值为空。如果表单元素设置了required个性,则示意必填,如果必填项为空,就无奈通过表单的验证,valueMissing属性会返回true,否则反之。 b. typeMismatch属性:输出值与type类型不匹配。html5减少的表单类型email等,都蕴含一个原始的类型验证,如果用户输出的内容与表单类型不合乎,typeMismatch属性将返回true,否则反之。 c. patternMismatch属性:输出值与pattern个性的正则不匹配。表单元素可通过pattern个性数组正则表达式的验证模式,如果输出内容不符,patternMismatch将返回true,否则反之。 d. tooLong属性:输出的内容大小超过了表单的元素的maxLength个性限定的字符长度。如果超过tooLong属性返回true,否则反之。 e. rangeOverflow属性:输出的值大于max个性的值。个别用于填写数值的表单元素,也可能会应用max个性设置数值范畴的最大值,如果输出的数值大于最大值,则rangeOverflow返回true,否则反之。 f. rangeUnderflow属性,输出的值小于min个性的值,上述雷同。 ...

January 13, 2021 · 1 min · jiezi

关于html5:vue-h5-hbuilder实现扫码功能

先上效果图,合乎需要再进一步浏览最近写了一个手机端的扫码录入零碎,这里简略说一下调取原生app的扫码性能须要留神的点。我是第一次接触H5扫描,GitHub上翻了很多案例,有个独特特点就是,在Hbuilder真机调试时都须要点击能力调取原生二维码扫描,而我的需要是间接触发生成二维码扫描控件,而且千篇一律都是用的new plus.barcode.Barcode这个办法进行创立的控件然而怎么也不显示,最初让我在文档中找到了解决办法如图,官网文档中给出了解答,不想翻文档大家能够参考我图片上的写法`` startRecognize () { let that = this if (!window.plus) return // scan = new plus.barcode.create('bcid'); scan = plus.barcode.create('bcid', [plus.barcode.QR], { top:'60px', left:'0px', width: '100%', height: '100%', position: 'static' }); plus.webview.currentWebview().append(scan); console.log("创立扫描控件---------", scan); // 开始扫描 console.log("开始扫描"); that.startScan(); scan.onmarked = onmarked function onmarked (type, result, file) { switch (type) { case plus.barcode.QR: type = 'QR' break case plus.barcode.EAN13: type = 'EAN13' break case plus.barcode.EAN8: type = 'EAN8' break default: type = '其它' + type break } console.log("扫描数据",type, result, file); result = result.replace(/\n/g, '') alert(result) //敞开 scan.close(); } },好了就这样吧!! ...

January 12, 2021 · 1 min · jiezi

关于直播:即构推出低延迟直播产品L3可将直播延迟降到1s

近日,寰球云通信服务提供商ZEGO即构科技推出低提早直播产品Low-Latency Live,简称L3。这款产品对传统CDN直播中“提早较大、弱网抗性差、观众端内容不同步”等问题进行了无效优化,将无效晋升“在线教育、电商直播、体育直播、秀场直播”场景中的提早高、弱网抗性差和内容不同步等问题。 L3具备与云商 CDN 雷同的高并发能力,但相比规范的 CDN直播产品,提早更低、同步性更强、弱网抗性更好,依附直播起家的即构科技,此次将直播提早低于1s,给用户带来了真正实时的直播体验。 “直播+”破圈减速进行,但痛点日渐突出2020年8月,人民网舆情数据中心公布了《 互联网平台“直播+”赋能钻研报告 》,《报告》深度剖析了当下直播新生态,如电商直播、在线教育、在线医疗、云游览和文化传承等利用现状。 现在的“直播”曾经不再是线上娱乐内容的生产工具,而是与商业场景越来越严密地联合,逐步演变为根底的业务工具。作为将来社会的新型基础设施,“直播+”将在全面推动社会经济、政治、文化倒退等方面大有可为。 但在有些场景,“直播+”还面临着很多痛点,传统 CDN 直播存在“观众提早大、弱网抗性差、观众端内容不同步”等弊病,间接影响用户体验。 而在其中,直播提早大的问题尤为突出,观众从收回评论,到看到主播给出反馈,个别要在5-10秒以上。而在有些场景,如果做不到实时同步,将很影响产品/平台的转化能力。 在线教育场景,学生提出一个问题,老师听到的时候可能曾经是下一个知识点了。电商直播场景,观众还没听到主播发红包,红包曾经收回来了。体育直播,隔壁寝室都在呐喊进球了,你看到的还是一个妙传,观看内容不同步。秀场直播,观众打赏/弹幕互动后,迟迟听不到主播的口播感激/弹幕响应。低提早直播产品L3:可将直播提早降到1s,让直播转化能力更强基于以上痛点,即构ZEGO推出了低提早直播产品L3。 在升高提早方面,即构L3产品负责人许键树介绍:“基于自研的 AVERTP媒体协定,L3只有1s提早,相比传统CDN直播计划5-10s的提早,最高升高 90% 以上。”提早问题解决了,直播场景的内容同步就不是问题。 针对弱网抗性,L3是基于即构的自研媒体协定,相比传统CDN直播弱网抗性更好。市面上实现低提早直播的计划大多应用WebRTC 技术,尽管是开源且残缺的协定,但存在一些局限性,WebRTC 协定最大反对30%丢包,弱网抗性能力比拟个别。 而即构团队是基于自研媒体协定 AVERTP ,在 ABC(码率自适应)的根底上,联合蕴含 FEC(前向纠错)、ARQ(丢包重传)和 PLC(谬误暗藏)的智能 QoS 信道策略,充分利用链路带宽,保障音视频传输的低提早、弱网抗性和多端的同步性。 即构团队耗时3个多月打造了这样一款低提早产品,利用即构自研协定灵便凋谢的劣势,让直播提早更低、内容同步性更强、互动更加高效无阻。 另外许键树还提到,L3的扩展性还很强。它不仅提供了“低提早的媒体服务”,也提供“房间及用户信息管理服务”, 也就是说,用户能够在连麦的同时进行低提早直播。而在此前,客户可能须要在两者之间2选1。L3的强扩展性给了开发者定制更多精品业务的可能,反对客户随时进行用户体验降级” L3不仅提早低、接入更简略,且更加灵便L3接入极其简略,客户只需一个SDK,即可领有全场景音视频能力,仅需调用 1 个 API ,就能够实现从“实时音视频”到“低提早直播”的切换,简略易用。 L3的灵活性体现在,其开发是基于 ZEGO 的实时音视频 SDK ,这使得L3能与实时音视频产品无缝互通,全面的 SDK 接口和齐全的配套插件/服务,同样适配。 L3充沛实用于在线教育、电商直播、一起看、在线竞拍等场景,让互动即刻达到L3实用于对“低提早、内容同时同步、强弱网抗性”要求比拟高的场景,比方在线教育的大班课、超级小班;泛娱乐畛域的“一起看”场景,一起看电影/上演/竞技较量等。同时,也实用于视频平台的“一起看”场景,因为只有每个人看到的片段是统一的,咱们才能够对一部电影发表点评。 在线教育场景中,大班课对低提早的要求很高。老师在讲课的时候,学生要发问,然而如果过了4-5s老师才听到,这时候老师都讲到下一个知识点了。即构低提早直播产品L3反对课堂的随问随答,让互动白板、文件共享等与音视频实时同步。除此之外,超低的提早还能够让在线课堂变换更多玩法,比方近期炽热的实时互动的在线自习室,低提早直播产品L3能够反对无缝切换直播和连麦,学生与老师实时互动。 电商直播、在线拍卖场景对“实时性、同步性”的要求更高。此前,为了放弃口播声音和红包同步,主播在口播之后须要期待大略3s才能够发红包。而在竞拍时刻,多一秒的提早用户都可能错过可爱之物。L3能够让主播与用户端更加同步,让用户少有“错过”体验,主播口播之后就能够收回红包,看到用户征询就能够即刻回复,无效缩小用户散失,帮忙晋升商家流动的转化率。 而在“一起看竞技/上演/电影”的场景,低提早直播产品L3能够让用户立即命中情绪热点,即刻表白观看体验。 ZEGO即构粗浅洞察客户需要,用极致服务晋升用户体验始终以来,即构科技都在贴近客户需要做产品和服务。2018年,即构为刚起步的叮咚课堂贴身定制了行业首套AI课堂解决方案,提前一年让叮咚的业务上线起量。疫情期间,即构的极致技术服务让叮咚的互动课堂失去稳固保障,叮咚抓住行业时机,业务取得飞速发展。 而这次的低提早直播产品L3,也是ZEGO即构在粗浅洞察客户需要的根底之上、为了针对性解决传统CDN的直播痛点而推出的。现在,守业5年的即构迈向“技术+服务”的2.0阶段,深刻理解和服务客户需要成为即构人每天都在钻研的议题。 将来,随着“直播+”日渐成为古代生存的常态,每个人身边正在产生的故事、每一份实时常识的传递、每一个场景的实时再现,都可能有直播在背地提供反对,因而更加高效的直播显得至关重要。许键树对此示意:“影响直播转化成果的往往有可能是那几秒的提早,和那转瞬即逝的卡顿。咱们不心愿这些产生,咱们心愿能够为将来更多场景、更多场高效直播提供相对靠谱的产品,和相对粗疏的服务”

January 12, 2021 · 1 min · jiezi

关于html5:手把手教学HTML

什么是HTMLhttps://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...HTML,全称 Hyper Text Markup Language,又称作超文本标记语言。很多人误以为学习编程,就须要应用编程语言。No,在学习 HTML 之前,咱们肯定要清晰地晓得 HTML 并不是一门编程语言,而是一门描述性的“标记语言”。 HTML 也是一种计算机语言,不仅能够将一般文本转换在 web 层面应用,还能够为一般的无构造文本提供构造,读者须要这种构造来帮忙他们浏览。如果没有构造,单纯的文本将会会合在一起,容易造成混同。 HTML 是由一系列标签(tag)组成的,根本语法如下:<标签符>文本内容</标签符> 标签符个别都是成对呈现,蕴含一个开始符号和一个完结符号 什么是网页?网页其实就是放在服务器上的一个文件,当咱们浏览网页时,这个文件会被下载到咱们本地的电脑,而后再由浏览器解析,渲染出各种丑陋的界面,比方表格、图片、题目、列表等。 网页文件的后缀有很多种,比方.html、.php、.jsp、.asp等,置信读者在浏览器的地址栏里也都见到过,如下图所示: 但不论网页的后缀是什么,它的实质都是一样的,就是由 HTML 代码形成的纯文本文件。 咱们能够应用记事本、Notepad++、Sublime Text、Vim 等文本编辑器关上网页文件,看到它的所有内容,就像上面这样: `<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8"> <title>这是网页题目</title></head><body> <p>这是一段文本</p> <a href="http://c.biancheng.net/">这个一个超链接</a> <ul> <li>条目1</li> <li>条目2</li> <li>条目3</li> </ul></body></html>` * 1* 2* 3* 4* 5* 6* 7* 8* 9* 10* 11* 12* 13* 14* 15* 16这就是 HTML 代码!咱们能够看到很多由<>突围的非凡标记,这叫做 HTML 标签(Tag),浏览器通过辨认这些 HTML 标签来渲染出各种界面和成果。 每种 HTML 标签都有不同的含意,实用于不同的场景,能展现出不同的成果,例如: < html> 标签用来突围以后网页的所有 HTML 代码,能够把它看做一个外壳。< head> 标签示意网页的头部,用来设置一些网页的参数,在浏览器中是看不到的:< meta charset=“UTF-8”> 用来指明以后网页的编码格局是 UTF-8;< title> 用来设置以后网页的题目,相当于文件的名字,它会显示在浏览器的标题栏。< body> 标签示意网页的注释内容,也就是须要在浏览器主界面中显示的内容:< p> 标签用来示意一个段落,能包容一段文本;< a> 标签用来示意一个超链接,用鼠标点击后能够跳转到其它网页;< ul> 标签用来示意一个列表,其中的每个都是子标签,用来示意一个列表项。将下面的代码保留到 index.html,拖到浏览器中运行,能够看到如下的成果: ...

January 11, 2021 · 18 min · jiezi

关于html5:手把手教学HTML

什么是HTMLhttps://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/6758444222...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/2833389642...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/1447214015...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...https://xueqiu.com/2054466366...HTML,全称 Hyper Text Markup Language,又称作超文本标记语言。很多人误以为学习编程,就须要应用编程语言。No,在学习 HTML 之前,咱们肯定要清晰地晓得 HTML 并不是一门编程语言,而是一门描述性的“标记语言”。 HTML 也是一种计算机语言,不仅能够将一般文本转换在 web 层面应用,还能够为一般的无构造文本提供构造,读者须要这种构造来帮忙他们浏览。如果没有构造,单纯的文本将会会合在一起,容易造成混同。 HTML 是由一系列标签(tag)组成的,根本语法如下:<标签符>文本内容</标签符> 标签符个别都是成对呈现,蕴含一个开始符号和一个完结符号 什么是网页?网页其实就是放在服务器上的一个文件,当咱们浏览网页时,这个文件会被下载到咱们本地的电脑,而后再由浏览器解析,渲染出各种丑陋的界面,比方表格、图片、题目、列表等。 网页文件的后缀有很多种,比方.html、.php、.jsp、.asp等,置信读者在浏览器的地址栏里也都见到过,如下图所示: 但不论网页的后缀是什么,它的实质都是一样的,就是由 HTML 代码形成的纯文本文件。 咱们能够应用记事本、Notepad++、Sublime Text、Vim 等文本编辑器关上网页文件,看到它的所有内容,就像上面这样: `<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8"> <title>这是网页题目</title></head><body> <p>这是一段文本</p> <a href="http://c.biancheng.net/">这个一个超链接</a> <ul> <li>条目1</li> <li>条目2</li> <li>条目3</li> </ul></body></html>` * 1* 2* 3* 4* 5* 6* 7* 8* 9* 10* 11* 12* 13* 14* 15* 16这就是 HTML 代码!咱们能够看到很多由<>突围的非凡标记,这叫做 HTML 标签(Tag),浏览器通过辨认这些 HTML 标签来渲染出各种界面和成果。 每种 HTML 标签都有不同的含意,实用于不同的场景,能展现出不同的成果,例如: < html> 标签用来突围以后网页的所有 HTML 代码,能够把它看做一个外壳。< head> 标签示意网页的头部,用来设置一些网页的参数,在浏览器中是看不到的:< meta charset=“UTF-8”> 用来指明以后网页的编码格局是 UTF-8;< title> 用来设置以后网页的题目,相当于文件的名字,它会显示在浏览器的标题栏。< body> 标签示意网页的注释内容,也就是须要在浏览器主界面中显示的内容:< p> 标签用来示意一个段落,能包容一段文本;< a> 标签用来示意一个超链接,用鼠标点击后能够跳转到其它网页;< ul> 标签用来示意一个列表,其中的每个都是子标签,用来示意一个列表项。将下面的代码保留到 index.html,拖到浏览器中运行,能够看到如下的成果: ...

January 11, 2021 · 18 min · jiezi

关于html5:10个Github上相见恨晚的CSS-奇技淫巧项目帮你找到写CSS的灵感

You-need-to-know-css 该我的项目是 CSS 的各种成果实现,尤其是动画成果。 笔者把本人的播种和工作中罕用的一些 CSS 小款式总结成这份文档。目前文档一共蕴含 43 个 CSS 的小款式(继续更新…),所以还是很不错的学习 CSS 的我的项目来的。 比方: 打字成果 <style> main { width: 100%; height: 229px; display: flex; justify-content: center; align-items: center; } span { display: inline-block; width: 21ch; font: bold 200% Consolas, Monaco, monospace; /*等宽字体*/ overflow: hidden; white-space: nowrap; font-weight: 500; border-right: 1px solid transparent; animation: typing 10s steps(21), caret .5s steps(1) infinite; } @keyframes typing{ from { width: 0; } } @keyframes caret{ 50% { border-right-color: currentColor} }</style><template> <main class="main"> <span>前端GitHub</span> </main></template><script></script>https://lhammer.cn/You-need-t...CSS-Inspiration ...

January 11, 2021 · 2 min · jiezi

关于html5:图文学习前端Flex布局

哪吒人生信条:如果你所学的货色 处于喜爱 才会有弱小的能源撑持。 把你的前端拿捏得死死的,每天学习得爽爽的,关注这个不一样的程序员,如果你所学的货色 处于喜爱 才会有弱小的能源撑持。感激不负每一份酷爱前端的程序员,不管前端技能有多奇葩,欢送关注加我入群vx:xiaoda0423 前言本篇文章进行学习css中的一个重点利用,布局款式为flex布局,置信你学习理解过display属性,position属性,float属性,但明天只学习新货色就是flex布局。 flex布局是什么 flex是flexible box的缩写,意思是弹性布局,代码款式如下: .box { display: flex;}Flexbox Layout模块是提供一个更无效的形式来安排,对齐和item之间在一个容器中调配的控件,即便它们的大小是未知的,或者是动静的,所以单词命名flex(弹性工作制的) flex布局能够使容器更改其item的宽度,高度,以便最好地填充可用空间,或者膨胀它们来避免溢出。flexbox布局应用比拟适合应用程序地组件和小规模布局上。 在webkit内核地浏览器中,要加上-webkit前缀哦,代码格局如下: .box { display: -webkit-flex; display: flex;}当设置flex布局之后,子元素(item)的float,clear,vertical-align属性会生效。 学习前要先理解概念 flex container flex items设置flex布局的元素为flex容器(flex container),简称为容器。它的所有子元素都是容器的成员,flex我的项目(flex item),简称为我的项目。那么请查看如下图,解析flex布局背地的次要思维。 如图能够看出,main axis是从main-start到main-end,穿插轴cross axis从cross-start到cross-end。 容器默认有两根轴的,程度的主轴main axis和垂直的穿插轴cross axis,从main-start到main-end叫(main start)主轴;从cross axis从cross-start到cross-end叫(cross axis)穿插轴 单个我的项目占据的主轴空间叫main size,占据的穿插轴空间叫cross size container弹性容器: .container { display: flex;}items弹性我的项目: 容器的属性 flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-contentflex-direction属性决定的是主轴的方向,即是我的项目的排列方向.box { flex-direction: row | row-reverse | column | column-reverse;}.flex-container { -webkit-flex-direction: row; /_ Safari _/ flex-direction: row;}.flex-container { -webkit-flex-direction: row-reverse; /_ Safari _/ flex-direction: row-reverse;}.flex-container { -webkit-flex-direction: column; /_ Safari _/ flex-direction: column;}.flex-container { -webkit-flex-direction: column-reverse; /_ Safari _/ flex-direction: column-reverse;}其应用flex-direction的box格局如下: ...

January 11, 2021 · 3 min · jiezi

关于html5:图文学习前端Flex布局

哪吒人生信条:如果你所学的货色 处于喜爱 才会有弱小的能源撑持。 把你的前端拿捏得死死的,每天学习得爽爽的,关注这个不一样的程序员,如果你所学的货色 处于喜爱 才会有弱小的能源撑持。感激不负每一份酷爱前端的程序员,不管前端技能有多奇葩,欢送关注加我入群vx:xiaoda0423 前言本篇文章进行学习css中的一个重点利用,布局款式为flex布局,置信你学习理解过display属性,position属性,float属性,但明天只学习新货色就是flex布局。 flex布局是什么 flex是flexible box的缩写,意思是弹性布局,代码款式如下: .box { display: flex;}Flexbox Layout模块是提供一个更无效的形式来安排,对齐和item之间在一个容器中调配的控件,即便它们的大小是未知的,或者是动静的,所以单词命名flex(弹性工作制的) flex布局能够使容器更改其item的宽度,高度,以便最好地填充可用空间,或者膨胀它们来避免溢出。flexbox布局应用比拟适合应用程序地组件和小规模布局上。 在webkit内核地浏览器中,要加上-webkit前缀哦,代码格局如下: .box { display: -webkit-flex; display: flex;}当设置flex布局之后,子元素(item)的float,clear,vertical-align属性会生效。 学习前要先理解概念 flex container flex items设置flex布局的元素为flex容器(flex container),简称为容器。它的所有子元素都是容器的成员,flex我的项目(flex item),简称为我的项目。那么请查看如下图,解析flex布局背地的次要思维。 如图能够看出,main axis是从main-start到main-end,穿插轴cross axis从cross-start到cross-end。 容器默认有两根轴的,程度的主轴main axis和垂直的穿插轴cross axis,从main-start到main-end叫(main start)主轴;从cross axis从cross-start到cross-end叫(cross axis)穿插轴 单个我的项目占据的主轴空间叫main size,占据的穿插轴空间叫cross size container弹性容器: .container { display: flex;}items弹性我的项目: 容器的属性 flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-contentflex-direction属性决定的是主轴的方向,即是我的项目的排列方向.box { flex-direction: row | row-reverse | column | column-reverse;}.flex-container { -webkit-flex-direction: row; /_ Safari _/ flex-direction: row;}.flex-container { -webkit-flex-direction: row-reverse; /_ Safari _/ flex-direction: row-reverse;}.flex-container { -webkit-flex-direction: column; /_ Safari _/ flex-direction: column;}.flex-container { -webkit-flex-direction: column-reverse; /_ Safari _/ flex-direction: column-reverse;}其应用flex-direction的box格局如下: ...

January 11, 2021 · 3 min · jiezi

关于html5:你知道-这些HTML标签的作用吗

随着对 JavaScript 框架和库的依赖越来越深,很多人对 HTML 的器重水平升高了。这就导致了咱们无奈充分利用 HTML 的很多性能,这些性能能够大大的加强网站性能。另外通过编写语义化 HTML 能够在网站内容中增加正确的上下文,从而显着改善用户体验。 本文将会介绍一些你可能会疏忽的然而很有用的 HTML 标签。 <base><base> 标签容许你创立一个场景,其中存在一个根本URL,这个 URL 充当文档中所有绝对 URL 的前缀。标签必须有一个蕴含根本URL的 href 或 target 属性,或者两者兼有。 <!DOCTYPE html><html><head> <base href="https://www.google.com/" target="_blank"></head><body><h1>The base element(Google As a case study)</h1><p> <a href="gmail">Gmail</a> - Used to send emails; which are messages distributed by electronic means from one computer user to one or more recipients via a network.</p><p><a href="hangouts">Hangouts</a> - It's used for Messaging, Voice and Video Calls</p></body></html>这样就不用为每个申请反复 URL 的前缀了。 一个 HTML 文档中只能有一个 <base> 元素,并且它必须位于 <head> 元素内。 ...

January 11, 2021 · 3 min · jiezi

关于html5:公路项目建设可视化进度管理

前言福厦漳高铁是福建省继温福铁路之后建成的第二条疾速铁路,也是中国中长期铁路网布局中"四纵四横"疾速客运通道的"一纵"--西北沿海客运专线(杭深客运专线)的重要组成部分。福厦漳铁路北起福州南站,途经莆田、泉州至厦门和漳州。全线共设7座车站,全长297公里,是福建省首条设计时速350公里的疾速铁路站,投资估算总额约505亿元。2017年9月动工,打算2022年建成通车。2020年12月,国新办公布《中国交通的可继续倒退》白皮书。从“走得了”到“走得好”,中国正在从交通大国向交通强国迈进。 新基建我的项目的发展将聚焦于城市轨道交通和城际高速铁路,新一代智能化高速铁路零碎将宽泛使用云计算、大数据、物联网、挪动互联、北斗导航和BIM等新技术。我国已成为高铁经营里程最长的国家,但勘察设计、建设、经营管理所依赖的媒介还次要以二维图为主。将管理手段由二维晋升为三维,并在三维环境下实现多源异构海量数据的综合展现与剖析,将在大规模的高速铁路勘察设计、建设治理与经营保护中施展微小的反对与推动作用。 本文以福厦漳高铁为例,HT for Web 基于三维数字信息技术搭建出的一个高速铁路工程展现平台,为我的项目在策动、施行等各个阶段提供工程信息,实现工程信息互通,达到彻底消除信息孤岛的目标,确保了工程建设的高效性、准确性,达到我的项目增值最大化的目标。 界面简介及成果预览载入动画:界面由远及近展现了残缺的福建铁路线路图;90°旋转的科技环大大地晋升了渲染成果;随着画面的加载结束,咱们也能够分明的看到福建省内的各条铁路,以及在每条线路上的各个站点高深莫测。 两侧为2D面板,右边是具备标注性能的按钮,下方输入框中可展现标注指标的地理位置信息。右侧为福厦漳高铁信息及沿线各个站点的在建信息。 系统分析在高铁建设中,采纳数字信息化技术,就是将施工全周期的所有信息建设可参化数字模型,同时施工计划模仿优化、施工治理过程零碎协调对立等一系列性能,改善在传统项目管理过程无奈实现的这些弊病,是各参见单位、参建者均能高效地协同沟通,为高速铁路实现“高标准、高质量、高效率、零误差”的指标,提供了新的数字化管理模式。 1、实现进度展现 在展现平台上,咱们利用 HT for Web 的数据化建模模仿出现了福厦漳高铁施工线路图,通过平台能够直观的理解到高铁以后的实现进度。 2、施工点位标注性能 界面左上角的终点、隧道、起点、桥梁和路线五个施工指标按钮能够灵便应用,工程人员能够依据需要将工程点指标摆放在施工点位上。 3、工程点的经纬度查问性能 工程人员能够通过点击地图上的工程点来获取相应的名称、编号和经纬度信息;同样的,在输入框中输出准确的经纬度信息也能够在地图中找到相应的工程点。这个性能省去了简单的换算工作,并且极大的进步了工程人员的工作效率,同时也给施工人员明确的施工指标,确保施工指标的准确度与进步施工品质。 4、每个站点建设状况 在界面右上角,咱们能够清晰地看到福厦漳高铁的全线长度、设计时速、站点数以及每个站点的建设状况。咱们能够看到,3D可视化扭转了传统依附二维图纸和报表为主的管理模式。 实现价值围绕人员、机械、物料、办法、环境等现场施工的要害因素,在高铁建设过程中利用3D可视化技术,不仅可能晋升工程施工现场作业工作效率,并且能够实时监控工程进度。该我的项目拓宽了可视化模型的利用空间及利用价值:1.工程项目信息管理 通过BIM、GIS技术、云计算、大数据、物联网、挪动利用和智能利用等先进技术的综合利用,让施工现场感知更透彻、互通互联更全面、智能化更深刻,大大晋升现场作业人员的工作效率。而 HT 的轻量化形式在与传统的 GIS 和 BIM 技术上有了全新的扭转: HT的轻量化、低成本,使企业不再须要购买轻便低廉的 GIS 和 BIM 软件;终点低、成果好,传统 Web 开发人员即可上手,借力 HT 弱小的 3D 渲染成果既可制作出高仿真路线场景跨平台性,任何桌面和挪动终端都能够关上,不便现场运维人员间接手机进行现场查看、编辑和治理2.施工过程治理 便于施工管理人员更加精确地把握构件设计和施工过程信息,做好过程管制工作,打消过错破绽。实现精细化治理,最终达到缩小施工老本、保障施工平安、保护环境等目标,实现保质保量实现施工工作。 3、施工老本治理 有助于实现施工现场“人、机、料、法、环”、各要害因素实时、全面、智能的监控和治理,无效反对了现场作业人员、我的项目管理者各层协同和管理工作,进步施工品质、平安、老本和进度的管理水平,缩小节约。 4、平安品质治理 通过3D可视化技术的利用,及时发现安全隐患,标准质量检查、检测行为,保障工程质量,实现品质溯源和劳务实名制治理,无效撑持主管部门对工程现场的品质、平安、进度、人员的监管。 总结高速铁路建设是我国根底建设的标杆,备受社会各界的关注。要求在施工过程进行精细化治理是必然趋势。现在,高铁工程不再是过来仅能依附数据与揣测反映工况,基于铁路沿线高精度、海量、多源异构的地质地理信息和工程信息,集成信息技术与铁路业余技术,以三维可视化的模式,可能对高速铁路建设、经营全寿命周期的不同阶段提供综合仿真技术服务,最终实现“智慧高铁”的建设指标。 2019 咱们也更新了数百个工业互联网 2D/3D 可视化案例集,在这里你能发现许多离奇的实例,也能发掘出不一样的工业互联网:https://mp.weixin.qq.com/s/ZbhB6LO2kBRPrRIfHlKGQA 同时,你也能够查看更多案例及成果:https://www.hightopo.com/demos/index.html

January 10, 2021 · 1 min · jiezi

关于html5:2多用户博客网站开发实战之需要哪些功能

博客零碎要求界面清新简洁,操作简略,适宜多年龄段的网友应用。通过本零碎,能够在网络上撰写和公布日志文章,增加好友和超链接,浏览博友的主页和日志等,丰盛用户的网络生存。 1.零碎需要剖析1.1性能需要(1)集体博客管理系统须要有以下性能: 登录性能,博客是一个小型的集体网站,须要对网站进行治理就必须须要登录。用户注册性能,本零碎是一个多用户博客管理系统,面向宽广互联网人群,向他们提供博客服务,只有通过注册能力确定博客地址。日志和日志治理性能,撰写日志、治理日志是博客最根本的性能之一。日志分类和治理性能,互联网的博客用户崇尚共性,提供日志分类功可能满足用户的共性需要。评论和评论治理性能,为日志提供评论性能和治理性能是博客作者和博友互动的一种模式。留言和留言治理性能,也是博客最根本的性能之一,不可或缺。减少博友和博友治理性能,博客还有一种力量把一批性情和兴趣爱好类似的人汇集起来,减少和治理博友性能也很重要。集体信息管理性能,批改博客名称、批改头像、批改集体介绍、批改明码,这是博客的重要组成部分之一。(2)管理员零碎是对博客网站的所有信息进行兼顾治理,它须要的性能有: 用户治理,治理注册用户的根本信息;日志治理,管理站内所有日志,时时监控敏感词等;留言治理和评论治理,监督评论内容,保护网络环境的谐和。通过博友治理和链接治理,解除好友关系,删除不良的超级链接。搜寻性能,管理员后盾因为信息量很大,要疾速锁定某一个用户或者某一篇日志,须要搜寻性能。1.2性能需求在目前机器硬件速度快的条件下人们对程序的运行速度尽管不是特别强调,但对处理速度慢的程序,等半天出不来查问后果仍是不大称心。因而,程序的运行速度也是掂量程序品质的一项重要指标。在程序设计阶段,优化代码,升高解决工夫很重要。 1.3开发环境需要该零碎是以VISUAL STUDIO 2019为开发环境,SQL Server 2017为后盾数据库开发进去的。联合Web技术,实现了一个基于WEB的多用户博客管理系统。 2可行性剖析零碎的可行性剖析次要包含经济上的可行性,技术上的可行性,操作上的可行性和社会可行性。2.1经济可行性剖析从该零碎的开发和效益关系上讲,该零碎的开发不须要破费太多的经费。该零碎采纳VISUAL STUDIO 2019这个具备加强性能、灵活性、繁难性和可管理性的开发工具。该零碎的开发能够尽可能快地公布信息,为用户缩小告诉信息的工夫;更及时地理解单位的信息公布状况。因而,从经济可行性上来讲,是可行的。 2.2技术可行性剖析依据现有的技术设备条件和筹备空虚的技术力量和设施,零碎在技术上的实现是可行的。在设施方面,计算机内存容量、外存容量输入输出设施等都可在原有的根底上满足需要。从整个系统结构看,可在原有的局域网的服务器、工作站及网络组件的根底上实现。 2.3操作上的可行性该零碎在操作上非常简单,对于用户来说,只须要具备根本的上网技术。在windows平台下能失常运行,反对大部分支流浏览器。因而该零碎在操作上是可行的。 3多用户博客网站的模块设计模块是数据阐明、可执行语句等程序对象的汇合,它独自命名并且能够通过名字来调用。模块化就是把程序分成若干模块,每个模块实现一个子性能,把这些模块集合起来组成一个整体,能够实现指定性能,解决具体问题。采纳模块化原理能够使软件结构清晰,不仅容易设计,而且容易浏览和了解。此外,模块化使软件容易测试和调试,有利于进步软件的可靠性。 依据之前对博客网站的零碎功能分析,失去如下图所示的功能模块图。4总体功能设计4.1集体博客治理功能设计(1)用户登录 登录页面须要有用户名填写框、明码输入框,还须要有一个登录按钮。输入框要有提示信息,提醒用户填写对应填写。点击登录按钮之后呈现零碎提醒以后状态手否登录胜利或者须要填写用户和明码。 (2)用户注册 注册页面须要用户名填写框、明码填写框和明码的确认框,还须要填写邮箱和博客名称,每个填写框均有相应填写要求的提醒,并且对用户填写的信息进行多用户博客网站管理系统 集体博客管理系统 管理员零碎 博友治理 留言治理 日志治理 博友治理 友情链接治理 日志治理 信息中心 留言治理 日志分类管理 链接治理 评论治理 用户治理 搜寻性能 验证。点击注册按钮之后呈现是否注册确定框,抉择确定后显示“注册胜利”零碎提醒。 (3)日志增加和治理 通过集体核心的日志治理按钮进入日志治理页面。日志治理页面显示用户所有的日志,并能够点击进行全文浏览,不便用户理解具体的内容。创立日志按钮,点击创立日志按钮,进入写日志页面,该页面须要有日志题目的填写框和次要内容的填写框,一些根本的日志优化工具和公布按钮。点击公布之后呈现零碎提醒音讯并跳转回日志治理页面。日志删除按钮,点击后提醒零碎音讯“是否删除”,确认后删除该篇日志。日志批改按钮:点击批改日志按钮,进入日志批改页面,该页面须要有日志题目的填写和次要内容的填写框,一些根本的日志优化工具和公布按钮,内容填写框中应该有以后日志内容,不便用户在此基础上编辑。点击公布之后呈现零碎提醒音讯并跳转回日志治理页面。 (4)留言治理 通过集体核心的日志治理按钮进入留言治理页面。留言治理页面显示用户所有的留言,不便用户查看具体的内容。点击删除按钮后零碎音讯“是否删除”,确认后删除该留言。 (5)博友增加和治理 通过集体核心的博友治理按钮进入博友治理页面。博友治理页面显示用户所有的博客好友,并且能够点击连贯到对方博客。点击删除按钮后零碎音讯“是否删除”,确认后删除该博友。减少博友性能通过浏览别人博客主页显示加为博友按钮。 (6)链接增加和治理 通过集体核心的链接治理按钮进入友情链接治理页面。改显示目前博客所有的友情链接,用户能够点击进入链接地址,不便用户查看具体的内容。点击删除按钮后零碎音讯“是否删除”,确认后删除该地址。 (7)集体信息管理 通过首页批改信息按钮进入集体信息管理页面。该页面提供明码批改和更新头像的性能,明码批改须要输出原始明码以及2遍新密码,批改胜利后零碎提醒批改胜利信息。头像更新性能须要抉择图片按钮,用户在点击抉择图片按钮之后呈现本地图片抉择框,抉择胜利后在更新页面显示新头像,点击确定按钮后提醒“批改胜利”的零碎提示框。 4.2管理员零碎功能设计(1)日志治理 管理员登录后盾后可查看所有的性能面板,点击“日志治理”后可看到所有用户公布的博客。管理员能够抉择浏览日志或者删除日志。当管理员点击日志题目后,链接到日志页面。当管理员抉择删除日志,零碎提醒“确定删除该日志?”。点击确定后进行删除。 (2)留言治理 管理员登录后盾后可查看所有的性能面板,抉择“留言治理”可看到所有留言及留言工夫。 (3)博友治理 管理员登录后盾后可查看所有的性能面板,抉择“博友治理”可看到博友之间的好友关系和结交工夫。管理员能够删除某位用户的好友,还能够通过查问晓得某位用户的好友。 (4)用户治理 管理员登录后盾后可查看所有的性能面板,抉择“用户治理”,能够看到在网站注册的所有用户和注册工夫,能够查看对方博客或者删除博客,还能够通过搜寻找到用户。 (5)评论治理 管理员登录后盾后可查看所有的性能面板,抉择“评论治理”可查看所有日志的评论,也能够浏览该博文,还能够对评论进行删除操作。 (6)友情链接治理 管理员登录后盾后可查看所有的性能面板,抉择“链接治理”,能够查看或者删除用户的友情链接,还能够应用查找性能,找出某个用户下的友情链接,进行操作。 (7)后盾搜寻性能 管理员登录后盾后点击用户治理按钮后能够通过搜寻框疾速定位某一个用户。在博友治理、日志治理模块也须要搜寻性能。 5博客网站的流程图后盾管理程序流程图是一个软件残缺执行的过程概述。 博客网站的后盾治理流程图如下:用户登录零碎后盾,在正确输出用户名和明码后进入查问界面。在这里有一个验证过程,如果输出不正确零碎将显示“用户名或明码谬误,请从新登录!”的对话框提醒从新登陆。进入查问零碎后用户能够实现两个性能,一个是查问,另一个是保护相干信息。保护信息后依然是回到查问界面,在查问界面里输出查问要求,系统验证输出的字符是否存在该用户,如存在就能够看到后果,后果按表的格局用户。同时能够实现对用户进行治理。 如果你感觉这篇文章还不错,请动动小指头点赞、珍藏和关注哦!若本文带给你很大帮忙,也能够打赏博主一杯可乐ゝ◡╹)ノ♡ 摘热闹版权所有,转发或援用请附上原文链接哦!

January 7, 2021 · 1 min · jiezi

关于html5:在解决php5-Excel文件读取时的收获

一、看文档的过程起初在网上查资料的时候用的都是中文,然而跟老师开了两次会之后发现用英文搜寻和用汉语搜寻的效率齐全不一样,于是就用英文搜寻,当然搜到的也有一部分是相似于他人的博客,是他人遇到的一些问题,以及提供的解决办法,然而这些对于我这种什么都不理解的小白来说,堪称是毫无用处之言,惟一的作用就是让我感觉这个货色更难了,所以官网文档还是比拟适宜我的,于时就搜到了github上的一个文档。https://github.com/PHPOffice/PHPExcel,然而在网页的最上面呈现了这些,就是说这个版本曾经被归档了,版本太老曾经禁用了,还给了一个新的网站 PhpSpreadsheet点进去之后发现了另一个办法,还是先看最上面(因为要先看README)我须要的是文档,所以我先看Documentation,外面给了官网文档的链接 official documentation,所以我是须要看的,首先最先看到的就是需要局部,我要判断满足满足我得需要。当然,他是满足我的需要的,而后接下来就是看反对的php版本了。因为我用的是thinkphp5,而它反对的是版本7.5及以上的,所以我并不能满足他的需要,好,看到这里果决退出,毫不眷恋,返回到最开始的那个曾经代码被归档了的界面,当然我也是该当先找文档的。点击进入Documentation,能够看到markdown(一种标记语言)这个文件夹,点击进去。 这时点击overview(概述),进入其子文件夹。当看到Getting-Started的时候,就晓得接下来肯定是看这个文档的啦!首先能够看到的是须要满足的版本,事实证明我的版本是满足条件的,同时还给出了一些装置领导,以及一些例子。装置办法就是间接copy一份Github上的目录就能够了,copy的内容能够放在任意我想放的地位。然而在这遇到一点小问题,我竟然不晓得除了克隆之外怎么从下面复制代码,好吧,其实只有点击code,而后下载就行了。接下来就是跑一下例子看看是否运行了。测试了一下是能够运行的。剩下的步骤就是把须要的代码放到本人的控制器外面,实现了。二、总结1、读文档的能力写代码最重要的能力之一就是读文档,在什么都不晓得的状况下,学会看文档就离胜利不远了,读文档先看彼此需要是否满足,再看其余的,因为如果不满足彼此需要的话就没必要持续看上来了。而且尽量不要去相似博客的一些解决问题的网站,因为大门还没迈进更别提就坐的事了。 2、学习一项新技能在接触新货色的时候,要先找文档这是必定须要的,而且要找一下examples试试,这样有助于了解个性能的分割什么的。 3、markdown之前不晓得markdown是啥意思,找文档的时候天然也不晓得须要看markdown这个文件夹,搜了一下,markdown就是一能让人们用纯文本的模式编写文档而后能够转化成其余格局的一种语言,所以看到这个就应该跟看到documentation一个反馈,就是文档。

January 2, 2021 · 1 min · jiezi

关于html5:HTML5-canvas实现的静态循环滚动播放弹幕

应用办法和API 语法如下: canvasBarrage(canvas, data); 其中: canvas canvas示意咱们的<canvas>画布元素,能够间接是DOM元素,也能够是<canvas>画布元素的选择器。 data data示意弹幕数据,是一个数组。例如上面: [{ value: '弹幕1', color: 'blue', range: [0, 0.5]}, { value: '弹幕2', color: 'red', range: [0.5, 1]}]能够看到数组中的每一个值示意一个弹幕的信息对象。其中value示意弹幕的文字内容;color示意弹幕描边的色彩(弹幕文字自身默认是红色);range示意弹幕在画布中的区域范畴,例如[0, 0.5]示意弹幕在画布中的上半区域显示,[0.5, 1]示意弹幕在画布中的下半区域显示。 而后就能够看到有限滚动的弹幕成果了。 补充阐明: 此弹幕成果默认文字大小是28px,并且文字加粗,如果这个成果不合乎您的需要,须要在canvasBarrage()办法中批改源代码。因为原本就是个简略动态成果,因而没有专门设计成API。此弹幕成果默认是红色文字加可变色彩描边,同样的,如果这个成果不合乎您的需要,须要在canvasBarrage()办法中批改源代码。跟实在的弹幕成果有所不同,这里的弹幕呈现的速度和机会不是基于特定工夫,而是随机产生。所以看到有些文字如同开飞机,而有些文字如同坐着拖拉机。因为是死数据,这样设计会看上去更实在写。源代码: <style> .video-x { position: relative; width: 640px; margin: auto; } .canvas-barrage { position: absolute; width: 640px; height: 360px; } .video-placeholder { height: 360px; background-color: #000; animation: bgColor 10s infinite alternate; } @keyframes bgColor { 25% { background-color: darkred; } 50% { background-color: darkgreen; } 75% { background-color: darkblue; } 100% { background-color: sliver; } } </style> <div class="video-x"> <canvas id="canvasBarrage" class="canvas-barrage"></canvas> <div class="video-placeholder"></div> </div> <script> // 弹幕数据 var dataBarrage = [{ value: '应用的是动态死数据', color: 'blue', range: [0, 0.5] }, { value: '随机循环播放', color: 'blue', range: [0, 0.6] }, { value: '能够管制区域和垂直散布范畴', color: 'blue', range: [0, 0.5] }, { value: '字体大小和速度在办法内设置', color: 'black', range: [0.1, 1] }, { value: '适宜用在一些动态页面上', color: 'black', range: [0.2, 1] }, { value: '基于canvas实现', color: 'black', range: [0.2, 0.9] }, { value: '因而IE9+浏览器才反对', color: 'black', range: [0.2, 1] }, { value: '能够设置边框色彩', color: 'black', range: [0.2, 1] }, { value: '文字色彩默认都是红色', color: 'black', range: [0.2, 0.9] }, { value: '若文字色彩不想红色', color: 'black', range: [0.2, 1] }, { value: '须要本人调整下JS', color: 'black', range: [0.6, 0.7] }, { value: '如果须要的是实在和视频交互的弹幕', color: 'black', range: [0.2, 1] }, { value: '能够回到原文', color: 'black', range: [0, 0.9] }, { value: '查看另外一个demo', color: 'black', range: [0.7, 1] }, { value: '上面就是占位弹幕了', color: 'black', range: [0.7, 0.95] }, { value: '后方高能预警!!!', color: 'orange', range: [0.5, 0.8] }, { value: '后方高能预警!!!', color: 'orange', range: [0.5, 0.9] }, { value: '后方高能预警!!!', color: 'orange', range: [0, 1] }, { value: '后方高能预警!!!', color: 'orange', range: [0, 1] }]; // 弹幕办法 var canvasBarrage = function (canvas, data) { if (!canvas || !data || !data.length) { return; } if (typeof canvas == 'string') { canvas = document.querySelector(canvas); canvasBarrage(canvas, data); return; } var context = canvas.getContext('2d'); canvas.width = canvas.clientWidth; canvas.height = canvas.clientHeight; // 存储实例 var store = {}; // 字号大小 var fontSize = 28; // 实例办法 var Barrage = function (obj, index) { // 随机x坐标也就是横坐标,对于y纵坐标,以及变动量moveX this.x = (1 + index * 0.1 / Math.random()) * canvas.width; this.y = obj.range[0] * canvas.height + (obj.range[1] - obj.range[0]) * canvas.height * Math.random() + 36; if (this.y < fontSize) { this.y = fontSize; } else if (this.y > canvas.height - fontSize) { this.y = canvas.height - fontSize; } this.moveX = 1 + Math.random() * 3; this.opacity = 0.8 + 0.2 * Math.random(); this.params = obj; this.draw = function () { var params = this.params; // 依据此时x地位绘制文本 context.strokeStyle = params.color; context.font = 'bold ' + fontSize + 'px "microsoft yahei", sans-serif'; context.fillStyle = 'rgba(255,255,255,' + this.opacity + ')'; context.fillText(params.value, this.x, this.y); context.strokeText(params.value, this.x, this.y); }; }; data.forEach(function (obj, index) { store[index] = new Barrage(obj, index); }); // 绘制弹幕文本 var draw = function () { for (var index in store) { var barrage = store[index]; // 地位变动 barrage.x -= barrage.moveX; if (barrage.x < -1 * canvas.width * 1.5) { // 挪动到画布内部时候从左侧开始持续位移 barrage.x = (1 + index * 0.1 / Math.random()) * canvas.width; barrage.y = (barrage.params.range[0] + (barrage.params.range[1] - barrage.params.range[0]) * Math.random()) * canvas.height; if (barrage.y < fontSize) { barrage.y = fontSize; } else if (barrage.y > canvas.height - fontSize) { barrage.y = canvas.height - fontSize; } barrage.moveX = 1 + Math.random() * 3; } // 依据新地位绘制圆圈圈 store[index].draw(); } }; // 画布渲染 var render = function () { // 革除画布 context.clearRect(0, 0, canvas.width, canvas.height); // 绘制画布上所有的圆圈圈 draw(); // 持续渲染 requestAnimationFrame(render); }; render(); }; canvasBarrage('#canvasBarrage', dataBarrage); </script>

December 30, 2020 · 3 min · jiezi

关于html5:H5与原生APP交互笔记

目录1. H5调用原生APP办法;2. 原生APP调用H5办法;3. H5跳转原生APP页面;4. H5点击下载APPH5调用原生APP办法// name 办法名(APP里定义的办法)// data 与原生交互数据(比方:微信分享时,调原生分享办法,传分享的数据给原生APP)// 安卓 不须要传data数据时,间接调用window.App[name)](); // 须要传data数据时,调用window.App[](data);// IOS 不须要传data数据时,调用window.webkit.messageHandlers[name].postMessage(null);(IOS不传数据时,须要给null)// 须要传data数据时, window.webkit.messageHandlers[name].postMessage(data);// 与原生APP不须要传数据// 调用原生办法,并且数据为空,IOS须要传nullexport const useNativeMethod = (name, data = null) => { if (state.Navigator.indexOf('Android') > -1 || state.Navigator.indexOf('Adr') > -1) { window.App[name](data); } else if (!!state.Navigator.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)) { window.webkit.messageHandlers[name].postMessage(data); }}原生APP调用H5办法// window['userInfo'] = window.userInfo// 原生APP调用JS办法,须要把办法间接创立到window对象里,不能在Vue的methods里创立// vue这里是在main.js里创立的办法// app登录时,返回用户登录信息window['userInfo'] = (data) => { if (typeof data == 'object') { sessionStorage.setItem('userdata', JSON.stringify(data)) vm.$store.state.userdata = data } else { sessionStorage.setItem('userdata', data) let user = JSON.parse(data) vm.$store.state.userdata = user }}H5跳转原生APP页面// actuive 是APP与前端的一种协定,倡议安卓/IOS协定雷同window.location.href = 'actuive://data'; 关上APP首页window.location.href = 'actuive://data/gotologin' 关上APP的登录页面window.location.href = `actuive://data/${this.workDetail.opus_id}/${this.videodata.direction}` 关上APP指定页面,并且传输数据给原生APPH5点击下载APP// 点击下载APP,判断Ios/安卓,并且跳转不同地址下载APP// Android_Dow_Path 安卓下载地址// IOS_Dow_Path IOS下载地址// 'actuive://data' 与app的一个协定,关上APP(只能在已装置APP应用,没装置APP则不起作用)export const openApp = () => { let platform; if (window) platform = sessionStorage.platform || '' var Android_Dow_Path = `xxxx?f=${platform}`; var IOS_Dow_Path = `xxxx?f=${platform}`; if (window.navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)) { var APPCommon = { init: function () { this.openApp(); }, openApp: function () { var this_ = this; if (this_.isWeixin() || this_.isWeibo()) { if (navigator.userAgent.match(/android/i)) { window.location = Android_Dow_Path; } else { window.location = IOS_Dow_Path; } } else { if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) { var loadDateTime = new Date(); window.setTimeout(function () { var timeOutDateTime = new Date(); if (timeOutDateTime - loadDateTime < 5000) { window.location = IOS_Dow_Path; } else { window.close(); } }, 2000); window.location = 'actuive://data'; } else if (navigator.userAgent.match(/android/i)) { try { window.location = 'actuive://data'; setTimeout(function () { window.location = Android_Dow_Path; }, 500); } catch (e) { } } } }, // UA鉴定 isWeixin: function () { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) == "micromessenger") { return true; } else { return false; } }, isWeibo: function () { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/WeiBo/i) == "weibo") { return true; } else { return false; } }, isAndroid: function () { return navigator.userAgent.match(/Android/i) ? true : false; }, isMobileQQ: function () { var ua = navigator.userAgent; return /(iPad|iPhone|iPod).*? (IPad)?QQ\/([\d\.]+)/.test(ua) || /\bV1_AND_SQI?_([\d\.]+)(.*? QQ\/([\d\.]+))?/.test(ua); }, isIOS: function () { return navigator.userAgent.match(/iPhone|iPad|iPod/i) ? true : false; }, } APPCommon.init() } else { // console.log('PC端') alert('请应用手机关上见面!') }}

December 23, 2020 · 2 min · jiezi

关于html5:好玩的canvas基于css3audioapi和canvas实现的-音频动效

借鉴他人代码利用画布及声音api 做的一个音乐的播放动效 线上地址:http://www.ooo0o.com/2019/fas... JS包曾经公布到npm下来(https://www.npmjs.com/package... npm i fashion_music_cvs // vue我的项目引入形式一: // const fashion_music_cvs = require('fashion_music_cvs') // Vue.prototype.cvsgetready =fashion_music_cvs // vue我的项目引入形式二: import fashion_music_cvs from 'fashion_music_cvs' Vue.prototype.cvsgetready = fashion_music_cvs // // 调用此办法须要传的的params的值应为 下边musiccvsparams的构造 // //在组件中应用前 定义好data里的自定义变量,如下的 musiccvsparams 即可 不// .................. 再// data(){ 需// return{ 要// musiccvsparams : { 这// cvsdom:'',//画布节点元素 个// size:800,//画布原始默认宽高 参// sourcedom:'',//音频源节点元素 数// bgcolor:'rgba(255,255,0,0.5)'//画布圆圈背景色彩 // } // } // ) .................. mounted(){ //【留神:画布元素必须设置一个方形的父级容器】 // 参数:画布元素。画布的默认宽度。音频元素。画布中圆圈背景的色彩 let _this=this; _this.cvsgetready(_this.$refs.musiccvs,800,_this.$refs.musicsrc,'rgba(255,255,0,0.8)') } .......................................... <div id="musiccvsbox" ref="musiccvsbox" style="position: fixed;right: 20px; top: 20px; width: 40vw;height: 40vw;"> <canvas ref="musiccvs" id="musiccvs"></canvas> </div> <audio style="position: fixed;right: 20px; bottom: 20px;" controls ref="musicsrc" preload="true" src="http://www.ooo0o.com/music/WhenIsawyouIfellinlove.mp3"></audio> 留神款式设置: // 自定义画布实现音频显示 #musiccvsbox { margin: 0 auto; position: relative; /* background-color: royalblue; */ background: url('http://ooo0o.com/4eafc201905200012388758.jpg') center center no-repeat; background-size: cover; } #musiccvs { display: block; /* animation: rotate 6s linear infinite; */ position: absolute; left: 0; top: 0; transform-origin: 0 0; } @keyframes rotate { 0% { transform: rotate(0deg) } 100% { transform: rotate(360deg) } } script引入形式 1. <script src="./music_canvas_show.js"></script> 2. 适合的机会去调用 cvsgetready('参数') 即可 // 参数:画布元素。画布的默认宽度。音频元素【留神:画布元素必须设置一个方形的父级容器。代码中已做好适配缩放的设置】。画布中圆圈背景的色彩 // cvsgetready(document.getElementById('cvs'),800,document.getElementById('music')); 个别就onload调用就可 window.onload = function() { cvsgetready(document.getElementById('cvs'), 800, document.getElementById('music'), 'rgba(66,66,66,0.6)'); }我的项目介绍: 基于canvas及声音api做的音频显示成果github: https://github.com/Chinegoodman/fashion_music_cvs我的项目发动原因: 始终就想做一个和网易云音乐相似的动效进去。所以空闲时就钻研学习 我的项目过程: 好吧,挺吃力的反正是。。。你喜爱感觉能用就行。哈哈 ...

December 17, 2020 · 1 min · jiezi

关于html5:前端开发中的文件处理功能认识Files类与File类

前言在现在的我的项目开发过程中,上传图片或者上传头像曾经变成了十分常见的操作。个别的,都须要在向后盾上传图片之前,在页面中预览一下用户抉择的图片。上传头像只须要预览一张图片,如果是上传图片至相册性能,则须要预览用户抉择的多张图片。这样的操作在H5页面中要如何实现呢?本文零碎的教大家意识H5为咱们提供的Files类和File类,这两个类在古代我的项目开发中起着无足轻重的作用。 一、HTML5为文件域新增的属性HTML5为文件域新增了下列两个属性: multiple,设置文件域是否能够同时抉择多个要上传的文件。这是一个没有取值的搁置性属性,书写在文件域的代码中就能够应用。accept,用于在文件域对本地文件进行抉择时对文件类型进行筛选。该属性取值为MIME类型,以确定弹出的资源管理器只显示accept指定类型的文件。同时HTML还规定,在我的项目中应用文件域,必须为文件域设置name属性。除此之外,一个表单若具备文件传递性能,必须将表单的enctype属性设置为multipart/form-data。 例如:想让用户通过文件域从本地资源管理器中抉择多个图片,HTML代码如下所示。<form method="get" action="uploadAvatar" enctype="multipart/form-data"> <input type="file" class="tx" name="file" multiple accept="image/jpeg" /></form>咱们还要晓得,无论应用JavaScript的DOM操作,还是jQuery的相干办法,都无奈利用表单元素的value属性取得用户抉择的文件地址。value属性只能失去一个蕴含文件全名的虚拟地址: C:fakepath文件全名咱们能够从本地的C盘去进行查找,fakepath门路基本不存在。那么咱们要怎样才能在页面中显示用户抉择的图片呢?这就要用到Files类和File类了。 二、意识Files类1、如何创立Files类的实例应用Files类必须先创立Files类的实例,创立格局如下所示。 var 实例名 = 文件域.files;var files=document.querySelector(".tx").files; //变量files就是Files类的实例名alert(files); //[object FileList]2、Files类的属性length,返回Files类所蕴含的文件个数。3、Files类的办法item(index),返回Files类中所蕴含文件中索引值为index的文件。item()办法也能够应用Files类实例名的下标来示意:files.item(0) 也能够写成 files[0]三、意识File类1、如何创立File类的实例应用File类必须先创立File类的实例,创立格局如下所示。 var 实例名 = Files类的实例.item(index);var file=document.querySelector(".tx").files.item(0); //变量file就是File类的实例名alert(file); //[object File]2、File类的属性name,返回文件的文件名。size,以字节(B)为单位返回文件的大小。type,返回文件的MIME类型名。lastModified,返回文件上一次批改的日期间隔1970年1月1日的毫秒数。lastModifiedDate,返回文件上一次批改的日期。四、意识单页面文件的无效地址1、blob地址和base64地址(1)这两类地址都能够在本页面内作为文件的无效地址,在其余页面无奈应用。(2)前端技术产生的这两类地址都无奈在后盾应用。 2、如何取得blob地址var blobAddress = window.URL.createObjectURL(File实例 | Blob实例)3、利用blob地址展现图片预览例:页面中有一个文件域,同时还有一个用来预览图片的容器,HTML代码如下所示。 <input type="file" name="file" /> <div class="imgContainer"></div>原生JavaScript代码如下所示。 var fileNode=document.querySelector("input[type=file]");var imgContainer=document.querySelector(".imgContainer");fileNode.onchange=function(){ var file=this.files.item(0); var img=new Image(); img.src=URL.createObjectURL(file); img.width=60; img.height=60; imgContainer.appendChild(img);}五、FileReader类1、FileReader类的性能FileReader类能够读取到File类实例所指代的文件的内容。要想取得用户所选文件的base64地址必须应用FileReader类。 2、创立FileReader类的实例var fr=new FileReader();3、FileReader类的办法readAsArrayBuffer(file):读取file文件的内容,并作为ArrayBuffer格局失去后果。readAsText(file,charset):依照指定的charset字符集以文本文件的模式读取file文件的内容。readAsBinaryString(file):以二进制字符串的模式读取文件。readAsDataURL(file):读取file文件并返回file文件的base64地址。4、FileReader类的属性result,在文件读取完结时返回指定形式读取文件的后果。5、FileReader类的事件loadStart:开始读取文件时触发该事件。progress:读取文件过程中触发该事件。load:当文件读取完结时触发该事件。例1:读取文件(图片)并失去该文件的base64地址。$(".file").addEventListener("input",function(){ var file=this.files.item(0); var fr=new FileReader(); fr.readAsDataURL(file); fr.onload=function(){ $(".tp").src=this.result; }})例2:为文件的读取设置一个进度条。<progress max="进度条的最大值" value="以后的读取进度"></progress>$(".file").addEventListener("input",function(){ var file=this.files.item(0); var fr=new FileReader(); fr.readAsBinaryString(file); fr.onloadstart=function(){ //当开始读取文件时 $(".pro").style.display="block"; } fr.onprogress=function(){ //读取文件过程中 var temp=(event.loaded/file.size)*100; $("progress").value=temp; $("progress+span").textContent=parseInt(temp*10)/10 + "%"; } fr.onload=function(){ //读取完结时 window.setTimeout(function(){ $(".pro").style.display="none"; },2000); }})六、Blob类1、Blob类的性能实现一个新文件的创立,该类是File类的父类。 ...

December 15, 2020 · 1 min · jiezi

关于html5:HTML学习3部分标签介绍

语义化标签各种不同的标签本身在网页中就有其自带的款式,比方不同标签内的字体大小、字体款式各有不同,然而标签的各类款式咱们通过CSS进行扭转,并且前期咱们为了网页的好看或者达到某种要求,肯定会用CSS从新进行款式设置。因而,咱们在学习HTML标签时,只须要重点记住标签的语义即可,不用在意它的具体款式。 内容语义标签题目标签(h1~h6)h1 ~ h6 一共有六级题目,从 h1 ~ h6重要性递加 ,h1最重要,h6最不重要,h1在网页中的重要性仅次于title标签,个别状况下一个页面中只会有一个h1(搜索引擎搜寻网页时,可能会通过题目来理解网页内容,因而title和h1中个别放十分重要的内容),通常状况下题目标签只会应用到h1~ h3,h4 ~ h6很少用。另外,有些状况下文章的两级题目存在关联性,例如咱们的文章题目HTML学习题目下有一个副标题3.局部标签介绍。因而还存在一个标签 hgroup 专门为题目进行分组。 不用在意款式,只关注标签语义即可。 段落标签 (p)p标签示意页面中的一个段落,就是咱们平时写文章中的段落。 强调标签(em 和 strong)em标签把文本定义为强调的内容strong标签把文本定义为语气更强的强调的内容。 援用标签(blockquote 和 q)blockquote标签定义块援用。blockquote中的所有文本都会从惯例文本中分离出来,常常会在左、右两边进行缩进,而且有时会应用斜体。也就是说,块援用领有它们本人的空间。 q标签定义短的援用。浏览器常常在援用的内容四周增加引号。 换行标签(br)br标签可插入一个简略的换行符(就是按一次回车)。br标签是空标签(意味着它没有完结标签,因而这是谬误的:< b r> < / br >) 结构化语义标签结构化语义标签即布局标签,次要是用于网页的布局。 header 示意网页的头部main示意网页的主体局部(一个页面中只会有一个main)footer 示意网页的底部nav示意网页中的导航 aside 和主体相干的其余内容(侧边栏)article 示意一个独立的文章section示意一个独立的区块,上边的标签都不能示意时应用section 块元素与行内元素仔细观察下面的例子咱们就会发现,有些标签的内容即便很短它也会主动占满一行 即便前面有很大的空白也不会写入内容,像题目标签、段落标签、长援用标签等,而有些标签的内容则不会独自占据一行,写完之后依然和其余内容共处一行 ,例如强调标签 、短援用标签,这就是块标签和行内标签的区别。块元素:独占一行,在网页中个别通过块元素来对页面进行布局。行内元素:能够多个标签存在一行,行内元素次要用来包裹文字。个别状况下会在块元素中放行内元素,而不会在行内元素中放块元素。 非语义标签div:div标签是一个块元素,它没有语义,简直能够用所有块元素的地位,因而是HTML文档中应用最多的一个标签。span:span标签是一个行内元素,它同样没有特定的语义,能够用于大部分须要行内元素的地位。 [注] 自己也正在自学当中,文中如有了解不当或者谬误表述之处,欢送交换斧正。

December 6, 2020 · 1 min · jiezi

关于html5:HTML学习2实体

HTML的不便之处在介绍实体之前先来看一下HTML文档本身的一些规定:图片左侧是源代码,右侧是HTML文档再浏览器中的显示状态。从图中咱们能够看出以下两点: 源代码中咱们在这是测试内容2中增加了一个空格,浏览器如实的显示了进去,而在这是测试内容3中咱们增加了多个空格后,浏览器中却只显示了一个空格,这就是HTML本身存在的规定(其实简直所有语言都存在这一规定,因为为了使代码更容易浏览,咱们常常应用空格和回车来让代码构造更加清晰),然而这一规定很显著使代码与咱们的预期有了肯定的偏差。在下一句代码中,咱们本意是想写一个不等式 a < b > c,然而浏览器却只显示了ac,并且c还有加粗的成果,正如后面所说HTML中标签是由一对尖括号<>包裹的,而凑巧HTML中就有一个标签是 < b > ,所以浏览器将< b >误认为了标签而没有显示在网页当中,显然这也与咱们的冀望不符。实体介绍上述情况实质上是因为咱们的代码存在歧义,浏览器谬误解读了代码含意,导致网页最终与咱们冀望的成果不符,为了解决这一状况,在遇到这种特殊符号时,咱们采纳一种非凡的语法形式来表式,这样就防止了浏览器解读谬误的产生,而这种表达方式就叫做实体,实体是以一个&开始,一个;完结,如下所示: &实体的名字; 后面测试示例中 空格 的实体示意为 &nbsp;大于号>为&gt;小于号<为 &lt;显然,用上实体表白之后,网页如咱们预期的一样显示进去了。更多罕用的实体表白如下图所示: [注] 自己也正在自学当中,文中如有了解不当或者谬误表述之处,欢送交换斧正。

December 3, 2020 · 1 min · jiezi

关于html5:在原生开发中控制HTML5视频

前言有人可能会问,在现在各种前端框架和开发工具横行的年代,还用得上原生开发吗?作为一名从业18年的前端讲师,我要通知大家学习原生开发的长处: 原生开发有助于同学们从原理上意识前端常识,并在实质上学会它。原生开发有助于锤炼同学们的编程程度,进步大家对前端常识的了解。正所谓万变不离其宗,做过我的项目开发的人们都晓得,无论用什么框架,也是要用到扎实的JavaScript功底的。以小程序开发为例,如果用户要在小程序中增加一个十分长的页面,有的时候还是须要应用来实现的,这就可能会波及到原生页面的制作。明天我就为大家讲一讲在原生开发过程中,标记对遇到的一些问题以及这些问题的解决方案。 一、video标记对的属性上面列出了video标记对在开发过程中罕用的原生属性。 二、video标记对的办法上面列出了video标记对在开发过程中罕用的原生办法。 三、video标记对的事件上面列出了video标记对在开发过程中罕用的原生事件以及事件的触发机制。 四、PC端video标记对的问题1、视频如何自动播放以后的浏览器都曾经将视频的自动播放性能去掉了,也就是说在标记对上应用autoplay属性也无奈实现视频的自动播放性能。然而如果为标记对增加上autoplay属性的同时设置其静音播放是能够实现的。 <video src=“video/01.mp4” autoplay muted loop></video>2、视频的全屏播放有的视频是要在页面中实现主动全屏播放的,这类视频往往在页面一进入时就可能占据整个屏幕。目标是显示酷炫的视频成果,而不是展现声音,因而能够静音自动播放。 HTML代码如下所示: <video src=“video/01.mp4” class=“bgVideo” autoplay muted loop></video>CSS代码如下所示: .bgVideo{ width:100%;height: 100%; min-height: 1080px; object-fit: cover;}3、视频全屏后导致的垂直滚动条问题有的视频因为高度过大,在全屏播放后会在页面中产生垂直滚动条。如果不想让页面产生垂直滚动条,即在一屏中显示所有内容包含视频,则能够依照如下的CSS代码进行设置。 .bgVideo{ position:fixed; z-index:-1000;}五、挪动端video标记对的问题1、【IOS】iPhone系列手机中视频的内联播放问题应用IOS零碎的设施,视频在播放时会主动“竖屏全屏”,也就是说在这类设施中单击视频播放按钮,视频不会在页面原有的地位中“内联播放”,而是会呈现相似于全屏的模式。即页面展现为彩色的背景,然而视频在手机竖屏的状况下播放。 这个问题能够通过在标记对中增加属性的形式来解决。 IOS10及其以上版本的操作系统能够反对playsinline属性。IOS10以下版本的操作系统只能应用-webkit-playsinline属性。所以,HTML代码如下所示: <video playsinline webkit-playsinline></video>2、【Android】多个视频同时播放问题一个页面下若有多个视频,这样的状况在Andro零碎中可能会呈现多个视屏同时播放的景象。该问题的解决原理:在一个视频的play事件中,将其余所有的视频都暂停掉。 jQuery代码如下所示: $("video").on("play",function(){ var reg=/android/i; if(reg.test(navigator.userAgent)){ var currentVideo=$(this).get(0); for(var i=0;i<$("video").length;i++){ if($("video").get(i)!==currentVideo){ $("video").get(i).pause(); } } }})留神:在视频的play事件中不要再调用play()办法,免得产生堆栈溢出。 3、在挪动端自定义视频的管制按钮对于不显示零碎原生控制面板的视频,应用本人制作的元素来管制视频的播放与暂停。 jQuery代码如下所示: $(".control").on("touchstart",function(){ var node=$(this).next().get(0); if(node.paused){ node.play(); $(this).find("img").css("display","none"); }else{ node.pause(); $(this).find("img").css("display","inline"); }}).on("touchend",function(){ var node=$(this).next().get(0); node.muted=false;})留神:此时视频在HTML文档中必须设置为静音状态。 4、补充:挪动端如何判断用户设施是IOS设施还是Android设施应用navigator.userAgent属性来判断返回值当中是否带有特定的字符串。 ...

December 3, 2020 · 1 min · jiezi

关于html5:H5拖拽上传文件进度条显示

这篇文章利用H5的拖放API,实现拖拽文件到浏览器上传的性能。 业务需要: 1、拖拽上传文件到浏览器可上传区域。2、上传文件停留在可上传区域,提示信息可上传。3、开释上传文件,开释地位在可上传区域,执行上传操作,显示上传进度。 拖放事件HTML 的 drag & drop 应用了 DOM event model 以及从 mouse events 继承而来的 drag events 。一个典型的拖拽操作是这样的:用户选中一个可拖拽的(draggable)元素,并将其拖拽(鼠标不放开)到一个可搁置的(droppable)元素,而后开释鼠标。依据业务需要,这里将应用到的拖拽事件包含: dragover 文件被进入到可上传区域时触发dragleave 拖拽文件来到可上传区域时触发drop 拖拽文件在可上传区域开释时触发接下来编写可上传区域的dom元素: <div id="target"> <p class="tip">拖拽文件到此处上传</p></div>增加事件: const dragEl=document.getElementById("target");dragEl.addEventListener("dragover",handleOver)dragEl.addEventListener("drop",handleDrop)dragEl.addEventListener("dragleave",handleLeave)// 开释在指标区域function handleDrop(ev){ ev.preventDefault(); // 获取开释文件 console.log(ev.dataTransfer.files[0])}function handleOver(ev){ ev.preventDefault(); console.log("进入指标区域")}function handleLeave(ev){ ev.preventDefault(); console.log("来到指标区域")}增加的拖拽事件都要先阻止浏览器默认事件提示信息良好的提示信息能够让用户有更好的应用体验,接下来给上传区域增加提示信息: <div class="u init" id="target"> <p class="tip-start">拖拽文件到此处上传</p> <p class="tip-over">松开上传</p> <p class="tip-uploading">上传中...</p> <p class="tip-done">上传胜利</p> <p class="tip-error">上传失败</p></div>通过款式管制信息的显示暗藏: .u{ width: 100%; height: 95vh; display: flex; align-items: center; justify-content: center; transition:background .3s;}.u [class^="tip"]{ opacity: .5; font-size: 23px; text-align: center;}.u [class^="tip"]{ display: none;}.u.init{ background-color: #f0f0f0;}.u.init .tip-start{ display: block;}.u.actived{ background-color: #f9f9f9; border: 1px dashed #ddd;}.u.actived .tip-over{ display: block;}.u.uploading{ background-color: #ddd;}.u.uploading .tip-uploading{ display: block;}.u.success{ background-color: #f5f5f5;}.u.success .tip-done{ display: block;}.u.error{ background-color: #ffd0d0;}.u.error .tip-error{ display: block;}这里通过给target元素增加不同的类名,管制不同信息的款式,如下: ...

November 18, 2020 · 3 min · jiezi

关于html5:10个有用的HTML文件上传技巧

上传文件的能力是许多Web和挪动利用的要害需要,从将照片上传到社交媒体上到将简历公布到工作门户网站上,文件上传无处不在。 作为一名Web开发人员,咱们肯定晓得HTML提供了原生文件上传的反对,并借助于JavaScript的一点帮忙。在HTML5中,File API被增加到DOM中。利用它,咱们能够读取 FileList 和其中的 File 对象,这就解决了文件的多种用例,即在本地加载文件或通过网络发送到服务器进行解决等。 在本文中,咱们将探讨HTML文件上传反对的10种用法,心愿你感觉它有用。 在任何时候,如果您想应用这些文件上传性能,都能够在这里找到: HTML文件上传演示:https://html-file-upload.netl...该演示的源代码在我的Github存储库中,✋请随时关注我,并通过示例不断更新代码,如果您感觉有用,请给一个⭐。 源代码仓库:https://github.com/atapas/htm...1.单个文件上传咱们能够将输出类型指定为 file,以在Web应用程序中应用文件上传器性能。 <input type="file" id="file-uploader">输出文件类型使用户能够通过按钮上传一个或多个文件,默认状况下,它容许应用操作系统的本地文件浏览器上传单个文件。 上传胜利后,File API 能够应用简略的JavaScript代码读取 File 对象。要读取 File 对象,咱们须要监听文件上传器的 change 事件。 首先,通过ID获取文件上传器实例 const fileUploader = document.getElementById('file-uploader');而后增加一个 change 事件侦听器,以在上传实现后读取文件对象,咱们从 event.target.files 属性获取上传的文件信息。 fileUploader.addEventListener('change', (event) => { const files = event.target.files; console.log('files', files);});在浏览器控制台中察看输入,留神 FileList 数组中的 File 对象领有上传文件的所有元数据信息。 上面是雷同示例的代码页,供您进一步钻研 CodePen:https://codepen.io/atapas/pen...<div> <h1>单个文件上传</h1> <input type="file" id="file-uploader"> <p>上传文件,并在浏览器控制台中查看输入。</p> <p id="feedback"></p></div>const fileUploader = document.getElementById('file-uploader');fileUploader.addEventListener('change', (event) => { const files = event.target.files; console.log('files', files); const feedback = document.getElementById('feedback'); const msg = `File ${files[0].name} uploaded successfully!`; feedback.innerHTML = msg;});2.多文件上传咱们能够一次上传多个文件。为此,咱们只须要在输出文件标签中增加一个名为 multiple 的属性即可。 ...

November 14, 2020 · 5 min · jiezi

关于html5:前端面试每日-31-第574天

明天的知识点 (2020.11.10) —— 第574天 (我也要出题)[html] 说说你对HTML5中pattern属性的了解[css] css unicode字符集有哪些分类?[js] 写一个办法,批量删除指定索引的数组元素[软技能] 说说你对上家公司的评估《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

November 10, 2020 · 1 min · jiezi

关于html5:iOS下带小数点的数字键盘

问题业务开发中常常遇到要弹出数字键盘的问题,产品方心愿弹出带小数点的纯数字键盘。上面代码: <input type='number'/>在android下能弹出数字与小数点的键盘,而且主动会屏蔽非法字符,很完满。但iOS下不是纯数字键盘,只是键盘的第一行是数字而已: 而且iOS下无奈避免中文、字母、空格、及各种特殊符号。而且输出这些符号后绑定的值变成空,无奈获取以后显示的内容。 这种键盘很难解决,在keydown input等事件里做输出拦挡、过滤,难以解决所有情况。特地是切换到九宫格键盘后更是没法解决。 预期后果咱们想要这样的键盘: 这种键盘在很多app外部,以及一些组件库里都见到过。iOS原生很容易实现这种数字键盘,h5里比拟麻烦。 解决方案如下:这是一段vue代码: <input v-model="purchaseMoney" type="text" inputmode="decimal" maxlength="12" placeholder="不少于0.01元" @input="onInputAmount($event)" @blur="onInputBlur($event)">利用inputmode这个属性,具体请参考:https://developer.mozilla.org... 好,当初键盘曾经是带小数点的数字键盘了。在iOS下safari,微信等大略看了下,目前都能够。 键盘是进去了,而后还须要写点逻辑解决一些非法状况:避免复制粘贴进来特殊字符、屏蔽表情、多个小数点并存、结尾有多个0、替换结尾的0为新的数字、管制小数为2位等。 onInputAmount() { let temp = this.purchaseMoney; if (temp) { temp = temp.replace(/[^0-9.]/g, ''); // 字符串中有多个点,只保留第一个,其余的过滤掉 if (temp && temp.length && temp.indexOf('.') != temp.lastIndexOf('.')) { var arr = temp.split('.'); let first = arr.shift(); temp = first + '.' + arr.join(''); } // 如果小数局部截取最多2位 if (temp.indexOf('.') != -1) { let intergerPart = temp.split('.')[0]; let decimalPart = temp.split('.')[1]; if (decimalPart.length > 2) { decimalPart = decimalPart.substring(0, 2); } temp = intergerPart + '.' + decimalPart; } // 去掉头部多余的0 while (/^0[0-9]/.test(temp)) { temp = temp.substring(1); } } this.purchaseMoney = temp;},至此,次要的性能根本满足了,当前发现问题再更新。 ...

November 9, 2020 · 1 min · jiezi

关于html5:H5公众号点击内置浏览器的关闭左上角的叉叉监听到事件

// 点击左上角敞开时触发 window.addEventListener('pagehide', () => { localStorage.clear()})

November 9, 2020 · 1 min · jiezi

关于html5:HTMLCSSJSJQuery学习笔记

一.HTML概述1.1 HTML是什么?HTML(Hyper Text Markup Language): 超文本标记语言 超文本:超级文本(文本、图片、视频、音频等) 标记(标签/元素/节点):就是由尖括号括起来的一组内容 <html> <div> <img>等 就是用于开发网页的最根底的语言对于HTML须要留神的是: 1) 通过HTML开发的网页文件通常是以 .htm 或 .html为后缀 2) 通过HTML开发的网页文件由浏览器负责解析并显示 3) HTML实质就是一个文档(txt,word,html,ppt)1.2 HTML的构造1.2.1.例: <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>网页</title> </head> <body> </body></html>1.2.2.HTML构造详解 (1)<!DOCTYPE html> 文档申明, 用来申明HTML文档所遵循的HTML标准和版本 下面是html5.0的申明, 也是目前最罕用的版本 (2) <html></html>根标签, 用于包裹所有的网页内容(除了文档申明) (2)<head></head> 头局部, 用来寄存HTML文档的根本属性信息, 比方网页的题目, 文档应用的编码等, 这部分信息会被浏览器优先加载. (3) <body></body>体局部, 用来寄存可视化的网页内容. 即真正的网页数据 (4)<title> </title>申明网页的题目 (5) <meta charset="utf-8">用来告诉浏览器应用哪一个编码来关上HTML文档, 这个编码肯定要和文件保留时的编码保持一致, 才不会呈现中文乱码问题.1.3 HTML语法(理解)1.3.1、html标签标签:也叫做标记、元素等,标签分为开始标签,例如: <head>、<body>和完结标签,例如: </head>、</body>开始标签和完结标签之间还能够蕴含其余内容。 <head> <titile>申明网页的题目</title> <meta charset="utf-8"></head>有些标签开始标签和完结标签之间没有内容要包裹,通常能够写成自闭标签,例如: <br/> <hr/> <input/> <img/> <link/>等1.3.2、html属性在标签上能够申明属性(属性不能独立存在,必须申明在标签上) ...

November 8, 2020 · 7 min · jiezi

关于html5:给萌新HTML5-入门指南二

上一篇咱们曾经为大家介绍了HTML5新增的内容和根底页面布局,这篇会持续向大家介绍狭义上HTML5中另一个组成部分:JavaScript数据类型。 JavaScript作为一种弱类型语言,最大的特点就是动静类型。也就是说不必提前申明变量的类型,在程序运行时,类型会被动静的确定,并且在执行过程中能够动静的批改变量的类型。同时不同类型变量在运算时会主动进行隐式的类型转换。以下是一些常见的隐式转换示例: var foo = 2020; // typeof foo -> "number"var foo = "SpreadJS" // typeof foo -> "string"var foo = true + 1; // foo = 2 typeof foo -> " number"var foo = true + false; // foo = 1 typeof foo -> " number"var foo = '5' - '2'; // foo = 3 typeof foo -> " number"var foo = 20 + 20 + "SpreadJS" // foo = "40SpreadJS" typeof foo -> "string"var foo = "SpreadJS" + 20 + 20 // foo = "40SpreadJS" typeof foo -> " string"根据最新的 ECMAScript 规范将数据类型定义了 8 种: ...

November 5, 2020 · 2 min · jiezi

关于html5:一熟练HTML5CSS3每天复习一遍

前言学习网页的概念和分类,理解动态网页和动静网页的不同;理解网页浏览器的工作原理。理解HTML,XHTML,HTML5的概念,制作简略的HTML页面的开发。 什么是网页能够在internet上通过网页浏览信息,如新闻,图片等,还可公布信息,如招聘信息等,网页是在某个中央某一台计算机上的一个文件。 网页次要由3局部组成:构造,体现,行为。 动态网页的特点是不管在何时何地浏览这个网页,看到的模式和内容都雷同,且只能浏览,用户无奈与网站进行互动。动态页面由HTML编写,扩展名个别为.htm, .html, .shtml, .xml等。与动静页面相比,动静网页是以.asp, .jsp, .php, .perl, .cgi等模式为后缀。 动静网页指网页的内容能够依据某种条件而主动扭转。 网页浏览器的工作原理采纳B/S构造,即浏览器/服务器构造,用户工作界面是通过www浏览器来实现的: 事务逻辑次要在服务器端实现,极少局部的事务逻辑在前端实现。大大简化了客户端的计算机载荷。加重了系统维护与降级的老本和工作量。升高了用户的总体老本。浏览器的工作原理: 浏览器通过HTML表单或超链接申请指向一个应用程序的URL。服务器收到用户的申请。服务器执行已接管创立的指定应用程序。应用程序通常基于用户输出的内容,执行所须要的操作。应用程序把后果格式化为网络服务器和浏览器可能了解的文档,即通常所说的HTML网页。网络服务器最初将后果返回到浏览器中。www的根底是HTTP协定,web浏览器就是用于通过url来获取并显示web网页的一种软件工具,url用于指定要获得的Internet上资源的地位与形式。 HTML和HTML5HTML是一种用来制作超文本文档的简略标记语言,用其编写的超文本文档称为HTML文档,它能独立于各种操作系统平台。 可扩大超文本标记语言XHTML: XHTML是不须要编译,能够间接由浏览器执行,是一种加强了的HTML。它的可扩展性和灵活性将适应将来网络应用的更多需要,是基于XML的利用。开发者在HTML4.0的根底上,用XML的规定对其进行一些扩大,由此失去了XHTML,所以,建设XHTML的目标是为了实现HTML向xml的过渡。 HTML5简化了:<!DOCTYPE html>,简化了DOCTYPE,简化了字符集申明,以浏览器的原生能力代替脚本代码的实现,简略而弱小的HTML5API。 HTML网页的构造文件扩展名是操作系统用来标记文件格式的一种机制。扩展名如同文件的身份阐明,区别了文件的类别和作用。 HTML网页的文件后缀名是.html或者.htm. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""xxx">申明的作用,通知浏览器所书写的HTML代码的版本。<meta>标签,是HTML文档<head>标签内的一个辅助性标签,meta标签分为2个重要的属性:name和http-equiv,通常用于可能优化页面被搜寻的可能性。 meta标签下name属性的应用: <head> <meta name="keywords" content="nine, twenty-three"> <meta name="description" content="..."> <meta name="generator" content="Dreamweaver"> <meta name="author" content="depp"> <meta name="robots" content="all"></head>keywords向搜索引擎阐明页面的关键字,在content后输出供搜寻的具体关键字。description向搜索引擎形容页面的次要内容。generator向页面形容生成的软件名,在content前面输出具体的软件名称。author网页的设计者,在content前面输出设计者的具体姓名。robots限度搜寻的形式,在content前面通常可输出all,one,index,noindex,follow,nofollow其中之一,不同的属性别离有不同的作用,限度页面被搜寻的形式。meta标签下的另一个属性http-equiv,其作用是反馈给浏览器一些明确的信息,帮忙浏览器更准确地展现页面。 <head> <meta http-equiv="content-type" content="text/html; charset=gb2312"/></head>refresh 对属性的具体形容,阐明是令页面主动跳转的成果。content 后跟期待的工夫,url后跟跳转的页面链接地址。link标签,定义了一个内部文件的链接,常常被用于链接内部css款式。 base标签为整个页面定义了所有链接的根底定位,其次要的作用是确保文档中所有的绝对url都能够被分解成确定的文档地址。 style标签用于定义css的款式。表明了在页面中引入一个.style的样式表。 script标签用于定义页面内的脚本。 titl题目标签,body体标签. 一个好的HTML文档应具备以下3个方面:代码应用标准规范,不应该有谬误的拼写代码构造清晰,使人高深莫测没有谬误或者多余不必要的代码呈现文本设计<br>..</br><p>...</p><p align=left>...</p><p align=center>...</p><p align=right>...</p>给文本加标注:<acronym title="">...</acronym>正文的内容放在title属性后的引号中,被正文的内容放在标签内。 无序列表:ul,li,有序列表:ol li 定义列表: <dl> <dt>...</dt> <dd>...</dd> <dt>...</dt> <dd>...</dd></dl>网页中的图像设计jepg格局的图像,该文件是常见的图像格式,.jpg后缀名,jpeg文件是通过压缩的一种图像。压缩的图像能够放弃为8位,24位,32位深度的图像,压缩比率能够高达100:1.jpeg能够很好地解决大面积色调的图像。png格局的图像,后缀名.png,这是一种能存储32位信息的位图图像,采纳的是一种无损压缩的形式。反对通明信息,指图像以浮现在其余页面文件或页面图像之上。gif格局的图像,是一种图像交互格局,后缀名.gif,只反对256色以内的图像,gif文件的图像成果是很差的。所以总的来说:jepg能够压缩图像的容量,png的品质较好,gif能够做动画。 矢量图说说矢量图和位图最大的区别: 无论是否对图像进行缩放,都不会影响矢量图的成果,但会影响图的品质。 设计者个别只违心将logo,ui图标,标识符号等简略图像存为矢量图。 图像的分辨率分辨率的单位是dpi即每英寸显示的线数。通常所指的分辨率有两种,屏幕分辨率和图片分辨率,屏幕分辨率即计算机显示器默认的分辨率。 个别目前大部分显示器的分辨率是1024px x 768px,图片分辨率定义是用于量度位图图像内数据量多少的一个参数。 ...

October 24, 2020 · 2 min · jiezi

关于html5:WebAPP或HybridApp实现自动更新热更新

前言APP上线发现重大bug,须要开发人员批改bug,从新打包,上传利用市场,期待审核,上架,这样节约了很多工夫、人力、物力。应答这个问题,这边反对自动更新,及时修复问题,升高更新代价。 1.登录中控易动官网(https://www.yd-mobile.cn),注册一个该平台的账号。 2.点击右上角控制台,进入到我的利用页面,创立利用。创立利用能够参考(web我的项目一键打包,可同时生成Android、ios端)创立利用能够创立在线利用和离线利用,都能够实现自动更新(热更新)。 ①在线利用热更新 在线利用是用户自行更新的,依据本人写的首页地址(对应本人前端工程搁置的地位,失常是在本人服务器存储)间接更新,很不便。②离线利用热更新 离线利用是在弱网或者无网路状况下能够拜访的利用。在有网络时,通过“更新离线资源”操作将新的离线资源压缩包上传到平台,APP能够实现实时更新平台最新的离线资源(热更新),且无需下载APP。这样很不便的实现利用的热更新。更新离线资源,实现WebAPP或HybridApp实现自动更新(热更新)介绍实现。

October 21, 2020 · 1 min · jiezi

关于html5:uniapp支持PC版

uni-app曾经反对iOS、Android、H5、微信小程序、阿里小程序、百度小程序、字节跳动小程序、QQ小程序、快利用、360小程序。 当初,uni-app终于官网反对PC宽屏! uni-app宽屏适配计划包含: 页面窗体级适配计划:leftWindow、rightWindow、topWindow组件级适配计划:match-media组件内容缩放拉伸的解决及rpx的控制策略通过各种弱小、灵便的屏幕适配工具,开发者能够极快的实现PC版和手机版的适配。 以DCloud提供的新闻模板示例为例,把for手机的利用适配为PC版,工作量不到半天。 并且后续保护降级,不须要手机和PC分版本升级,复用的业务只需单点更新。省心! 在适配PC时,能够适配为一般PC页面,还能够快捷的适配为左右分栏的页面,即在右边点列表,左边展示内容详情。这种利用更加像一个利用而不是网页,给予用户更好的应用体验。 聪慧如你,肯定想到了,既然有了PC版,那搭配electron,就能够打包为windows、mac、linux客户端利用了! 是的,开发者还能够随便调用electron的API,以调用更多操作系统的能力(为不便多端兼容,能够将这些PC端专用能力API写在自定义的条件编译里) 插件市场曾经封装好一批electron插件,详见 这些年利用平台的碎片化越来越重大,开发者始终吐槽心好累。 终于有个全平台都反对的框架了。 uni-app大满贯 来吧,当前不论做什么利用,uni-app一把梭! 点击右侧链接,理解uni-app的宽屏适配技术计划详情:https://uniapp.dcloud.net.cn/...

October 19, 2020 · 1 min · jiezi

关于html5:html之离线缓存

实例 - 残缺的 Manifest 文件 1,什么是应用程序缓存(Application Cache) HTML5 引入了应用程序缓存,这意味着 web 利用可进行缓存,并可在没有因特网连贯时进行拜访。 离线缓存: 离线缓存能够将站点的一些文件缓存到本地,它是浏览器本人的一种机制, 将须要的文件缓存下来,以便前期即便没有连贯网络,被缓存的页面也能够展现。 即便有网络,优先本地存储的资源 2,应用程序缓存为利用带来三个劣势: 离线浏览 - 用户可在利用离线时应用它们   * 速度 - 已缓存资源加载得更快   * 缩小服务器负载 - 浏览器将只从服务器下载更新过或更改过的资源。 * 【 在没有网络的时候能够拜访到缓存的对应的站点页面,包含html,js,css,img等等文件 在有网络的时候,浏览器也会优先应用已离线存储的文件,返回一个200(from cache)头。这跟HTTP的缓存应用策略是不同的 资源的缓存能够带来更好的用户体验,当用户应用本人的流量上网时,本地缓存不仅能够进步用户访问速度,而且大大节约用户的应用流量。    】 3,如何实现离线缓存: a)Cache Manifest 根底 如需启用应用程序缓存,请在文档的<html> 标签中蕴含 manifest 属性: * 在须要缓存的html根节点下面增加属性 manifest ,属性值是一个 . appcache 文件; Appcache 是一个管制缓存文件 * 在同目录下创立demo.appcache 文件,幷增加配置项 ...

October 19, 2020 · 1 min · jiezi

关于html5:app内嵌H5-webview-本地缓存问题

前文APP内嵌H5曾经很广泛了,然而每个app提供的webview体现都不太一样,在开发中遇到了一个十分辣手的缓存问题。APP启动时加载了咱们商城我的项目的H5代码,而后把index.html文件缓存到了本地。记录一下 问题体现H5我的项目打包上线后,因为动态资源js和css文件名前面都带了哈希值,这是webpack打包带上的,也是为了=避免缓存。然而在app启动后因为缓存了html申请的还是上个版本包的动态资源,导致index.a878n.js找不到404,页面吧白屏了。-----咱们H5我的项目打包上线后,服务器上上个版本的代码就清掉了。 解决办法咱们一开始给html加上了一段随机数,就是app加载到html时,在url前面加随机数,然而发现webview的html缓存,导致咱们的js批改是更新不上的。最初解决方案是,app端加载我的项目时在域名后加工夫戳并降级app才可。 为了防止这种问题呈现,那就是我的项目首次上线时就要在html内给url加上随机数,让webview不缓存html到本地。 前端大佬给举荐的是一开始就要配置nginx ,强制不缓存html location / { expires -1; add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'; try_files $uri $uri/ @router; index index.html; }

October 19, 2020 · 1 min · jiezi

关于html5:无米之炊-小程序内实现一个具有功能at功能的输入框

什么是at性能所谓的at性能,就是指的在聊天框中输出人的姓名等信息时,容许用户在输出"@"字符之后,能够调起一个选人控件,不便用户疾速输出人名。 例如:微博输入框,QQ空间的说说输入框。咱们能够在一个输入框内输出 "@" 字符,而后会调起一个选人浮层或全屏选人控件(在桌面端通常是个浮层,在挪动端通常是一个全屏控件)。 at性能的需要差别在接到 at 性能的需要时,咱们须要首先确定一个问题:即咱们at进去的人名,是否有重名的景象。即:在输入框中同时呈现 "@abc" 和 "@abc" 两个人名时,这俩人是否必然代表同一个人。 像新浪微博的场景下,其at进去的微博账户,必然是惟一的,因而其技术实现计划便可简化为:只需将用户从选人控件中抉择的人渲染到输入框即可。 而像QQ空间等需要场景下,咱们at选出来的一个用户昵称,实际上是能够重名的,这时,咱们的技术计划必须思考到:如何将一个输入框中的人名要跟他对应的账户信息一一映射起来。只有这样,当咱们把用户输出的音讯保留给后盾时,能力清晰的还原出两个"@abc"别离是哪个人。 如下是qq空间输入框,我能够输出2个同名的人,他别离能够给我两个不同的好友发送at音讯: 本文,我所探讨的是QQ空间这种可重名的场景。因而,咱们的技术计划须要思考如何将at人名与账户信息记录映射起来。 小程序: 难为无米之炊在 web 端,通常咱们应用 div 配合 contentediable,另外再配合 Range和Selection的光标管制 api 来实现相似聊天框里的 at 性能。 其中: contenteditable api容许咱们将html标签插入到编辑器当中,这样咱们便能够将账户信息“塞到”标签里,从而在提交后盾时,从标签里把账户信息还原进去range api提供了管制光标选取和设置选取内容的能力,这容许咱们在用户选完控件人名后,咱们将at字符删除,并把新抉择的人名标签渲染到输入框里。可是 小程序的输入框input和textarea并没有 web 那么多弱小的 API (比方 Range和Selection),也无奈在小程序内应用 contenteditable实现富文本。小程序仅有一个 bindinput 事件: 其事件返回3个参数: value: 以后输入框中最新的值。cursor: 以后光标的地位keyCode:以后输出事件的键盘按键思路咱们要在一个如此 奢侈 的输入框,利用仅有的 value\cursor\keyCode 3个参数实现 "at检测"、"人名渲染"、"删除检测"、"重名反对(即账户信息还原)"。 其最大的难点次要还是如何记录账户信息从而反对重名。 能想到的计划有3种: 每当输出at字符并抉择了人名后,咱们在另外一个数据结构中记录该账户信息。例如维持一个 persons: [] 数组。 然而咱们要在用户对输入框内容进行 增删改查 的同时对咱们的persons构造进行同步增删改查的更新,其批改难度会很简单。咱们想,是否在at人名填入到输入框的时候,把账户信息塞到输入框里。就像contenteditable一样。因而,咱们能够尝试应用一些不可见的字符,用这些字符来表白某个账户信息的标识。 但这种计划,想想就简单,例如咱们删除一个人名时是否能同步把不可见字符也删掉,是否会有光标问题都不好说。采纳了一种虚构层的思路。当用户输出任何字符时,咱们都对用户输出进行拦挡,拦挡到输出后,首先依照需要更新咱们外部虚构层的数据结构,在虚构层中咱们按肯定的构造保留好用户账户信息数据,而后将其渲染成文本再填到输入框中。最终,我抉择了采纳第三种计划实现,计划如图: 调用办法虚构层外部具体的计算逻辑封装到了 RichMessage 类中。小程序组件中,首先给input输入框绑定 input 事件: ...

October 19, 2020 · 3 min · jiezi

关于html5:02-HTML基础规划一个简单的网站1

效果图如下:源码在Github上能够下载,点击此链接即可。

October 12, 2020 · 1 min · jiezi

关于html5:前端培训中级阶段43-vue-2x-实战-CURD

前端最根底的就是 HTML+CSS+Javascript。把握了这三门技术就算入门,但也仅仅是入门,当初前端开发的定义曾经远远不止这些。前端小课堂(HTML/CSS/JS),本着晋升技术水平,打牢基础知识的中心思想,咱们开课啦(每周四)。 后面咱们根本学会了 Vue 的根本应用,那么明天咱们来尝试实现一个库存管理系统,因为没有学服务端(放前面 express 外面做接口),咱们临时就不思考服务端的实现了,间接存本地。 demo地址:https://www.lilnong.top/static/html/vue-erp-test.html。demo地址,批改为 vue@2.6.11,反对新的插槽语法:https://www.lilnong.top/static/html/vue-erp-test-vue@2.6.11.html 需要部门治理人员治理,人员须要和部门关联。库存治理,须要关联人员 能够补货能够被领用,须要有领用人和数量须要有操作记录 需要大略就是这样,上面说一下咱们的实现计划: 因为没有服务端,所以数据寄存在 localStroage 中。基本上就是 table + dialog table 负责展现数据dialog 负责新增批改数据初始化从 localStroage 读取数据,每次操作完保留 localStroage。实现table 列表代码如下,咱们来看一下外面都用到了那些货色 v-if 用来判断以后应该显示那个标签的内容 来个面试题 v-if 和 v-show 区别是什么?前端培训-中级阶段(35)- Vue 语法 之 Vue 自带的指令v-bind,缩写为 : size="mini" 用来传入了一个字符串,其实等价于 :size="'mini'"v-on,缩写为 @ @click="insertGroup" 用来实现单击时触发函数。插槽,用于父组件给子组件传递 DOM <el-button>新增部门</el-button>,el-button 是一个组件,外部接管到了一个 <slot name="default"> 的内容。<template slot-scope="scope"> 这里是一个作用域插槽,DOM 应用父级的,然而作用域应用子级的。当然 slot-scope 被废除了,应该用 2.6.0 减少的 v-slot<div v-if="navIdx == 1"> <div class="header">部门治理</div> <div class="search-box"> <el-button size="mini" type="primary" @click="insertGroup">新增部门</el-button> </div> <el-table :data="list1" style="width: 100%;padding-left: 10px;"> <el-table-column prop="id" label="编号" width="180"> </el-table-column> <el-table-column prop="name" label="名称" width="auto"> </el-table-column> <el-table-column label="操作" width="200"> <template slot-scope="scope"> <el-button size="mini" type="warning" @click="updateGroup(scope.row)">批改部门信息</el-button> </template> </el-table-column> </el-table></div>dialog代码如下,咱们来看一下外面都用到了那些货色 ...

October 5, 2020 · 2 min · jiezi

关于html5:2020年如何从传统开发模式转型为新型开发模式

传统开发模式也称作瀑布式开发,整个软件按循序开展,交付件单通道线性流动,个别分为需要-设计-编码-测试-验收几个阶段,所需的工程师也是要求最齐全的。 以古代的软件开发角度看,瀑布模式的项目管理形式曾经跟不上客户的要求了,当初互联网我的项目需要变动快、迭代快,再一步步剖析需要-设计-编码-测试-验收就有点难以承受了,老本大速度慢。 JNPF采纳的低代码是种全新的麻利式开发思路,从字面解读为缩小代码的编写量,一个软件我的项目中反复的代码和低级代码占了绝大多数,低代码将这类代码全副封装起来,在须要的时候间接调用就行了。 但低代码真正的价值却不在“低代码”上,少代码只是表象,真正的价值在于暗藏利用所依赖的基础架构,扭转利用交付形式和管理模式。 为什么呢?软件架构次要分为业务架构、利用架构、基础架构,业务架构次要着眼于管制业务的复杂性,基础架构着眼于解决分布式系统中存在的一系列问题,将程序员从基础架构中解放出来专攻业务性能。 低代码也是传统软件企业转型的最好形式,从传统的繁多交付形式到SaaS服务、PaaS服务等多种营销服务,从瀑布式的项目管理转型为麻利式项目管理,能够说低代码给软件开发行业带来更多的生机。

September 27, 2020 · 1 min · jiezi

关于html5:通过documentgetElementsBy和documentquerySelectorAll获取的对象长度变化

明天在解决一个款式批改时,打算应用js原生的办法选中元素而后批改他们的款式,而后应用了以下办法 const active:HTMLCollectionOf<Element> = document.getElementsByClassName('is-active')for (let i = 0; i < active.length; i++) { active[i].classList.remove('is-active')}而后发现总是会漏下一个元素没有批改,查阅了mdn之后发现,HTMLCollection是一个及时的对象,会随着其余对dom的批改而及时更新。解决的思路就是将HTMLCollection转化为数组或者应用while循环来做。在这里就将两种办法都记录下来,不过我更举荐应用while循环,这种办法写的比拟少,而且也不会额定去申请内存。1) const active:HTMLCollectionOf<Element> = document.getElementsByClassName('is-active')const array:Element[] = Array.from(active)for (let i = 0; i < array.length; i++) { array[i].classList.remove('is-active')}2) const active:HTMLCollectionOf<Element> = document.getElementsByClassName('is-active')while (active.length){ active[0].classList.remove('is-active')}

September 25, 2020 · 1 min · jiezi

关于html5:H5播放HLS之hlsminjs库

视频推流为了产生HLS视频,咱们能够借助srs来实现rtmp推流并生成HLS流,具体具体应用能够参考我之前的文章,这里不再赘述。 咱们要实现web端播放传统的音视频,最重要的实现就是rtmp实时视频推送至srs集群,为了演示我这里只启动一个srs简略利用,重点放在web端播放相干技术的解说,对于srs实时视频推送一块,我在《SRS直播集群计划》一文曾经做了很具体的介绍,这里不再赘述。 首先,咱们能够应用ffmpeg或者obs采集本地视频并推送到srs协转服务中,这里我应用obs进行采集与推送(ffmpeg每次都须要敲命令),关上obs=>起源一栏增加“视频捕捉设施”=>右下角“设置”,具体如图下所示。为了生成HLS流,咱们须要配置srs开启HLS直播,该配置如下: listen 1935;max_connections 1000;srs_log_tank file;srs_log_file ./objs/srs.log;http_api { enabled on; listen 1985;}http_server { enabled on; listen 8080; dir ./objs/nginx/html;}stats { network 0; disk sda sdb xvda xvdb;}vhost __defaultVhost__ { gop_cache off; queue_length 10; min_latency on; mr { enabled off; } mw_latency 100; tcp_nodelay on; hls { enabled on; hls_fragment 1; hls_window 6; hls_path ./objs/nginx/html; hls_m3u8_file [app]/[stream].m3u8; hls_ts_file [app]/[stream]-[seq].ts; hls_cleanup on;#是否清理过期ts文件片 hls_dispose 5;#清理过期文件工夫 }}这里的几个重要参数我感觉还是要略微阐明一下的: hls_fragment:秒,指定 ts 切片的最小长度。实际上 ts 文件的长度由以下公式决定:ts文件时长 = max(hls_fragment, gop_size)hls_fragment:配置文件中的长度。譬如:5秒。gop_size:编码器配置的 gop 的长度,譬如 ffmpeg 指定fps为20帧/秒,gop为200帧,则gop_size=gop/fps=10秒。那么,最终ts的时长为max(5, 10) = 10秒。这也是为什么有些流配置了hls_fragment,然而ts时长依然比这个大的起因。hls_td_ratio:倍数。管制 m3u8 的 EXT-X-TARGETDURATION,参考 Rewrite HLS写入ts局部hls_aof_ratio:倍数。纯音频时,当 ts 时长超过配置的 hls_fragment 乘以这个系数时就切割文件。例如,但hls_fragment 是 10 秒,hls_aof_ratio 是 2.0 时,对于纯音频,10s*2.0=20秒时就切割 ts 文件。hls_window:秒,指定 HLS 窗口大小,即 m3u8 中 ts 文件的时长之和,超过总时长后,抛弃第一个 m3u8 中的第一个切片,直到 ts 的总时长在这个配置项范畴之内。即 SRS 保障上面的公式hls_window >= sum(m3u8中每个ts的时长)hls_cleanup:是否删除过期的 ts 切片,不在 hls_window 中就是过期。能够敞开革除 ts 切片,实现时移和存储,应用本人的切片管理系统。hls_dispose:HLS 清理的过期工夫(秒),零碎重启或者超过这个工夫时,清理 HLS 的所有文件,包含 m3u8 和 ts。默认为 0,即不清理。hls_wait_keyframe:是否按 gop 切片,即期待到关键帧后开始切片。测试发现 OS X 和 android 上能够不必按 gop 切片。启动srs ...

September 21, 2020 · 2 min · jiezi

关于html5:本地缓存之localstrage之用法

HTML5中,新退出了一个localStorage个性,这个个性次要是用来作为本地存储来应用的,解决了cookie存储空间有余的问题(cookie中每条cookie的存储空间为4k),localStorage中个别浏览器反对的是5M大小,这个在不同的浏览器中localStorage会有所不同。 1.贮存数据,更改数据localStorage.setItem('Token', res.data.result.accessToken)localStorage.setItem('Token', res.data.result.newAccessToken)2.取出数据localStorage.getItem('Token')3.删除贮存数据localStorage.removeItem('Token')本地缓存之localstrage之用法

September 16, 2020 · 1 min · jiezi

关于html5:CSS3媒体查询Media-Queries与移动设备显示尺寸大全

最近在做公司官网,须要适配挪动端,于是联合本人以前总结的常识,以及在网上找到的相干材料供大家参考。举个栗子: <link rel="stylesheet" media="screen and (max-width: 375px)" href="solution_schoolNet.css" />此media属性值的意思是:当页页宽度小于或等于600px,就调用solution_schoolNet.css样式表来渲染页面。 media的语句中蕴含的内容: 1、screen:这个不用说大家都晓得,指的是一种媒体类型;2、and:被称为关键词,与其类似的还有not,only,稍后会介绍;3、(max-width:600px):这个就是媒体个性,说得艰深一点就是媒体条件。用css来示意: @media screen and (max-width: 375px) { div { width:100% } }罕用媒体查问如下表所示: 上面咱们一起来看看Media Queries的具体应用形式: 一、最大宽度Max Width <link rel="stylesheet" media="screen and (max-width:375px)" href="solution_schoolNet.css"/>下面示意的是:当屏幕小于或等于375px时,将采纳solution_schoolNet.css款式来渲染Web页面。 二、最小宽度Min Width <link rel="stylesheet" media="screen and (min-width:900px)" href="solution_smartCampus.css"/>三、多个Media Queries应用 <link rel="stylesheet" media="screen and (min-width:414px) and (max-width:736px)" href="solution_wifi.css"/>Media Query能够联合多个媒体查问,换句话说,一个Media Query能够蕴含0到多个表达式,表达式又能够蕴含0到多个关键字,以及一种Media Type。正如下面的其示意的是当屏幕在414px-736px之间时(6s plus)采纳style.css款式来渲染web页面。 四、设施屏幕的输入宽度Device Width<link rel="stylesheet" media="screen and (max-device-width: 480px)" href="iphone.css" type="text/css" />下面的代码指的是iphone.css款式实用于最大设施宽度为480px,比如说iPhone上的显示,这里的max-device-width所指的是设施的理论分辨率,也就是指可视面积分辨率 五、iPhone4 <link rel="stylesheet" media="only screen and (-webkit-min-device-pixel-ratio: 2)" type="text/css" href="iphone4.css" />下面的款式是专门针对iPhone4的挪动设施写的。 六、iPad<link rel="stylesheet" media="all and (orientation:portrait)" href="portrait.css" type="text/css" /> <link rel="stylesheet" media="all and (orientation:landscape)" href="landscape.css" type="text/css" />在大数状况下,挪动设施iPad上的Safari和在iPhone上的是雷同的,只是他们不同之处是iPad申明了不同的方向,比如说下面的例子,在纵向(portrait)时采纳portrait.css来渲染页面;在横向(landscape)时采纳landscape.css来渲染页面。 七、android// 240px的宽度<link rel="stylesheet" media="only screen and (max-device-width:240px)" href="android240.css" type="text/css" />// 360px的宽度<link rel="stylesheet" media="only screen and (min-device-width:241px) and (max-device-width:360px)" href="android360.css" type="text/css" />// 480px的宽度<link rel="stylesheet" media="only screen and (min-device-width:361px) and (max-device-width:480px)" href="android480.css" type="text/css" />咱们能够应用media query为android手机在不同分辨率提供特定款式,这样就能够解决屏幕分辨率的不同给android手机的页面重构问题。 ...

September 16, 2020 · 2 min · jiezi

关于html5:移动端兼容持续补充

本篇文章记录开发过程中在微信/手机浏览器下遇到的一些兼容问题,工作中是保护一个公众号页面同时反对挪动端浏览器应用。 style 款式问题ios设施placeholder不垂直居中问题解决方案:input的line-height设置为normal js交互问题微信sdk问题调用api提醒 invalid signature具体表现: 微信的sdk须要提前申请后端接口获取配置参数,而后在调用相干api前注册相干的api配置。而后安卓在关上后是采取了在每个相干页面调取注册ChooseImage(我我的项目里用到的)的办法,并且体现失常;ios则报错非法签名,官网文档里的办法试了并没有成果(官网里以及相干材料说的是url的问题以及带参数的问题多点,还有记得url做encodeURIComponent解决),开启debug:true后原地刷新可看到配置胜利,然而在页面里操作传图仍旧报错,后退在进入以后页面,性能失常(这里可能是我在上个页面和本页都反复注册了)。解决办法:ios设施只需在调用前注册一次,如果注册失败,需原地刷新window.location.reload(),尝试了在注册的办法谬误回调中从新走注册办法,失败,必须原地刷新,同时为了防止极其状况下,始终失败页面有限刷新的状况,我用了sessionStorage存储了一个变量标识符,进入我的项目前清掉,注册后在胜利调用处批改标识符,保障页面最多刷新一次(不想用工夫戳参数,参数解决url那边还得非凡解决)。

September 9, 2020 · 1 min · jiezi

关于html5:YApi-可视化接口管理平台-内网部署小计

前言 以前还是依据后盾的swagger手写mock数据,被本人蠢哭~,最近有点工夫了, 就钻研了下能不能动静的去弄这些mock数据,之后就找到了yapi,感觉大佬就是牛逼哈官网说有docker部署的形式,我试了, 始终不行,所以就用了比拟蠢的办法,手动装置各种环境 ????差不多就这样了,日常bb完结款式懒得改了,间接从幕布cv过去的,凑合着看把????yapi官网感激去哪儿前端团队的开源,大佬纲要 内网部署yapi 和swagger 的联合应用内网部署 官网阐明先决条件,环境要求,楼主比拟蠢,只会手动装置,什么docker 一毛钱都不会用Windows 手动装置 MongoDB 装置步骤 拜访 https://www.mongodb.com/try/download/community关上安装包开搞????抉择装置地位急躁期待,中途会要个权限,给他就是了装置结束创立数据库和账户,创立一个新的数据库给yapi部署应用 点开这个文件查看所有的数据库 show dbsuse [数据库名称] 有就间接切换,没有就给你创立一个查看以后数据库 db删除某个数据库 use [要删除的数据库]db.dropDatabase()创立一个数据库管理员账户 db.createUser({user: "admin",pwd: "123456",roles: [ { role: "userAdminAnyDatabase", db: "admin"}]})Navicat Premium 15 永恒破解激活装置yapi-cli 服务之后,执行如下命令 yapi server拜访 http://127.0.0.1:9090/输出邮箱,数据库名称,帐号等相干信息,而后点开始部署看到这个提醒阐明曾经部署胜利了, 9090端口能够敞开了提醒说让咱们切换到部署门路,执行相干命令~执行相干命令,就能够用了 node vendors/server/app.js拜访:http://127.0.0.1:3000/终于进去了, 美滋滋~yapi 和swagger 的联合应用 官网的阐明,记得看看哈 https://hellosean1025.github.io/yapi/documents/project.html#%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83创立一个我的项目我的项目 注册一个帐号创立一个我的项目swagger的设置 切换到swagger的同步设置找到后盾的地址: 输出下面,而后点保留,之后就急躁期待2分钟之后,yapi会主动同步如果呈现这种谬误,不必理睬,多点两下 他就会好了胜利触发yapi的同步工作胜利同步过去,如果同步的不现实, 就把swagger的同步设置改成全副笼罩就好了集成到业务零碎 设置申请上下文 找到上下文,配置mock数据, 把这个地址,放到反向代理的设置外面去,就会有数据了这些值就都是yapi 帮咱们mock的数据了,开心~~再也不必写mock数据了,以前本人好蠢 ????接口页面相干阐明 申请配置,自定义申请头和返回值 官网的阐明 https://hellosean1025.github.io/yapi/documents/project.html#%E8%AF%B7%E6%B1%82%E9%85%8D%E7%BD%AE你能够在这里设置1.申请头 2.依据不同状态,返回不同的数据格式等设置申请头 context.requestHeader.ergouzi=66666设置返回值 官网阐明 https://hellosean1025.github.io/yapi/documents/adv_mock.html#%E8%87%AA%E5%AE%9A%E4%B9%89-mock-%E8%84%9A%E6%9C%AC理论应用:默认所有接口都是ok的,咱们和后盾约定返回的数据格式是 {data:xxx,resultCode:xxx} 所有的数据都放在data 外面,resultCode 为1 示意申请胜利 ...

September 2, 2020 · 1 min · jiezi

关于html5:H5-ScreenShot方案

1、HTML2CanvasHtml2canvas 使您能够间接在用户浏览器上截取网页或局部网页的“屏幕快照”。屏幕截图基于DOM,脚本遍历加载页面的DOM,收集指标节点的所有元素信息,而后将其用于构建页面的示意模式。换句话说,它实际上并非是截取页面,而是依据它从DOM读取的属性来构建页面的表现形式,因而不能保障100%还原原图。官网文档:http://html2canvas.hertzen.com/documentation 2、应用办法 html2canvas(element).then(canvas => { // canvas 为转换后的Canvas对象 let oImg = new Image(); oImg.src = canvas.toDataURL(); // 返回base64 data图片url数据, 可在toDataURL()增加参数设置图片格式,默认png document.body.appendChild(oImg); // 将生成的图片增加到body})3、常见问题与解决方案 ##### 1\. 图片含糊问题问题:有时候咱们会发现,导出的图片部分有些图片看起来没有原图那么清晰。计划1:或者是因为指标节点内应用背景图片的起因,倡议应用<img>标签代替背景图款式计划2:如果还是会含糊,能够先将canvas画布放大,而后再将生成后图片等比缩放var width \= element.offsetWidth; var height \= element.offsetHeight; var canvas \= document.createElement(“canvas”); var scale \= 2; canvas.width \= width \* scale; // 放大画布 canvas.height \= height \* scale; // 放大画布 canvas.getContext(“2d”).scale(scale,scale); // 2d绘制且将canvas画布横坐标纵坐标各放大2倍。 var opts \= { scale: scale, canvas: canvas, width: width, height: height } html2canvas(element, opts).then(canvas \=> { var dataUrl \= canvas.toDataUrl(); // 生出图片base64格局url var newImg \= document.createElement(“img”); // 创立img元素 newImg.src \= dataUrl; // 给img元素指定门路 newImg.style.widht \= canvas.width/scale + ‘px’; // 等比缩放生出图片宽度 newImg.style.height \= canvas.height/scale + ‘px’; // 等不缩放生成图片高度 })计划3:另一种办法是给html2canvas增加配置项参数html2canvas(element, { scale: 2,  // 画布放大2倍 dpi: 300 // 依据须要将分辨率进步到特定的DPI(每英寸点数), 默认值为96 }).then(canvas \=> { // do something })##### 2\. 图片不显示问题问题:有时候可能莫名其妙地发现有些图片并没有呈现在导出的图片中计划:基本上是因为图片素材呈现跨域,应用html2canvas时增加以下两个配置项html2canvas(element, { allowTaint: true, // 是否容许跨域图像净化画布 useCORS: true // 是否尝试应用CORS从服务器加载图像 }).then(canvas \=> { // do something })##### 3\. PNG图片不通明问题问题:有时候可能用到通明的PNG图片作为背景图,可是后果最初生成的图片却并不通明,这是因为html2canvas生出的canvas背景色彩默认为红色的缘故,所以导出的图片背景色彩也是红色计划:应用html2canvas时增加backgroundColor配置项就好html2canvas(element, { backgroundColor: “transparent”, // 也能够是rgba(0,0,0,0) }).then(canvas \=> { // do something })##### 4\. 在IOS零碎局部浏览器中,用'<br/>'标签进行文字换行时,文本只显示第一行问题:在IOS零碎局部浏览器中,用<br/>标签进行文字换行时,文本只显示第一行计划:呈现该问题时,采纳其余块级标签元素对须要进行换行的文字别离包裹Html2canvas, <br/> 文本只显示第一行 可替换成 <ul\> <li\>html2canvas,</li> <li\>文本只显示第一行</li> </ul>##### 5\. 截图不全问题:在生成图片的时候,如果须要生成图片的节点很长(伴有滚动条),只能截取到以后区域计划1:找到须要生成截图的dom节点,在页面渲染实现之后,克隆一份备份节点,追加到body前面,这份备份节点不能是暗藏状态,设置备份节点的相对定位和图层级别// 获取节点高度,前面为克隆节点设置高度 var height \= document.getElementById (‘targetNode’). offsetHeight; // 克隆节点,默认为false,不复制办法属性,为true是全副复制 var cloneDom \= document.getElementById (‘targetNode’).cloneNode(true); // 设置克隆节点的css属性,因为之前的层级默认为0,咱们须要比被克隆的节点层级低 cloneDom.style.cssText \= “background\-color: white; position: absolute; top: 0; z\-index: \-1;” cloneDom.style.height \= height + ‘px’; // 将克隆节点追加到body前面 document.body.appendChild(cloneDom); html2cavans(cloneDom, { allowTaint: true, onrendered: function (canvas) { // do something } }) 计划2:在生出截图前,先把滚动条置顶window.pageYoffset \= 0; document.documentElement.scrollTop \= 0; document.body.scrollTop \= 0; 或者在配置列表增加参数配置 html2canvas(element, { scrollY: 0, }).then(canvas \=> { // do something })### 7\. 案例代码html2canvas(element, { backgroundColor: ‘transparent’, // 解决生出图片不通明问题 allowTaint: true,             // 解决图片跨域问题 useCORS: true,              // 解决图片跨域问题 scrollY: 0,                  // 解决截图不全问题 scale: 2,                   // 解决生出图片不清晰问题 dpi: 300,                   // 解决生出图片不清晰问题 }).then(canvas \=> { let img \= new Image();                   // 新建img节点 let url \= canvas.toDataURL(‘imgae/png’);     // 获取生出图片src门路 let aLink \= document.createElemtn(‘a’);      // 创立a标签 aLink.style.display \= ‘none’; aLink.href \= url; aLink.download \= ‘下载文件名xxx.png’; // 触发下载成果后移除节点 document.body.appendChild(aLink); aLink.click(); document.body.removeChild(aLink); })

August 31, 2020 · 2 min · jiezi

关于html5:Html5-Canvas生成淘宝客海报生成手机海报

当初海报曾经是很常见的,毕竟用来做引流推广都是十分不便的,所以咱们能够应用Canvas疾速绘制海报,上面是我写的一个实例。 <!DOCTYPE html><html><head> <title>Canvas</title> <meta charset="utf-8"></head><style type="text/css"> *{ margin:0; padding:0; } #myCanvas{ background: #eee; margin:50px auto; display: block; }</style><body> <canvas id="myCanvas"></canvas></body><script type="text/javascript"> var c = document.getElementById("myCanvas"); // 应用id来寻找canvas元素 var cxt = c.getContext("2d"); // 创立context对象 // 设置myCanvas的宽高 c.width = 320; //设置myCanvas的宽 c.height = 580; //设置myCanvas的高 // 绘制一个矩形,用来做全局背景色彩 cxt.fillStyle = "#fff"; // fillStyle办法将其染成红色 cxt.fillRect(0,0,c.width,c.height); // fillRect办法是创立一个矩形,x坐标、y坐标、宽度、高度 // 把图片绘制到myCanvas var img = new Image() img.src = "imgdemo.jpg" // 图片门路 // 为了避免图片还没加载实现就执行drawImage,须要提早10ms再执行drawImage setTimeout(function(){ cxt.drawImage(img,20,20,280,280); },10) // 绘制商品题目,主动换行 cxt.fillStyle="#333"; cxt.font = "15px bold 黑体"; var str = "火山泥岩洗面奶男士专用控油祛痘去黑头去油除螨虫学生补水洁面乳【包邮】" cxt.textBaseline = "middle"; cxt.textAlign = "left"; var lineWidth = 0; var canvasWidth = 280;//一行文字占用的宽度 var initHeight=320;//绘制字体间隔canvas顶部初始的高度 var lastSubStrIndex= 0; //每次开始截取的字符串的索引 for(let i=0;i<str.length;i++){ lineWidth+=cxt.measureText(str[i]).width; if(lineWidth>canvasWidth){ cxt.fillText(str.substring(lastSubStrIndex,i),20,initHeight);//绘制截取局部 initHeight+=20; //20为字体的高度 lineWidth=0; lastSubStrIndex=i; } if(i==str.length-1){ //绘制残余局部 cxt.fillText(str.substring(lastSubStrIndex,i+1),20,initHeight); } } // 绘制券后价底部背景色 cxt.fillStyle = "#ff0036"; // fillStyle办法将其染成红色 cxt.fillRect(220,360,80,40); // fillRect办法是创立一个矩形,x坐标、y坐标、宽度、高度 // 绘制券底部背景色 cxt.fillStyle = "#ff0036"; // fillStyle办法将其染成红色 cxt.fillRect(20,360,150,40); // fillRect办法是创立一个矩形,x坐标、y坐标、宽度、高度 // 绘制价格 cxt.fillStyle="#fff"; cxt.font = "normal bold 20px 黑体"; var str_price = "券后价 ¥32.90" cxt.textBaseline = "middle"; cxt.textAlign = "left"; cxt.fillText(str_price,26,380); // 绘制券面值 cxt.fillStyle="#fff"; cxt.font = "normal bold 15px 黑体"; var str_quan = "券 ¥9.90" cxt.textBaseline = "middle"; cxt.textAlign = "left"; cxt.fillText(str_quan,230,380); // 绘制二维码 var qrcode = new Image() qrcode.src = "qrcode.png" // 二维码图片门路 // 为了避免图片还没加载实现就执行drawImage,须要提早10ms再执行drawImage setTimeout(function(){ cxt.drawImage(qrcode,95,420,130,130); },10) </script></html>生成成果 ...

August 28, 2020 · 1 min · jiezi

关于html5:迷你世界3D小游戏版仅用2个月时间上线且实现数据互通

《迷你世界》作为国内第一的搁置类3D沙盒游戏,依附三四线城市的游戏市场及垂直媒体的流传路径,研发团队用了短短3年工夫就发明出了8000万沉闷玩家、5000万玩家原创作品,仅2020年上半年,对于《迷你世界》的短视频点击量已超600亿。在开发团队和玩家们的共同努力下,当初《迷你世界》曾经造成了一个十分残缺的游戏生态。 在小游戏成为新型流量入口的的明天,《迷你世界》开发团队也发现了这片“新的生态世界”,他们心愿在这个世界中持续连续发明之旅。 通过多方考查、慎重考虑,开发团队决定研发一款适宜小游戏平台的沙盒游戏,他们心愿这款小游戏不仅能够与《迷你世界》有所区别,同时能够与《迷你世界》实现互补、导流,可能成为《迷你世界》内容创作生态的一部分,进而买通手游、小游戏用户群的壁垒。 《迷你世界发明板》3D小游戏因而而诞生,开发团队从筛选小游戏引擎,决定应用白鹭引擎,到游戏开发上线大略用了两个月。 明天,咱们与《迷你世界发明板》研发团队接洽,一起聊聊这款小游戏的开发故事。 坚守初衷,精准获取用户群 随着小游戏引擎能力逐渐变强,开始反对了3D能力的研发,而《迷你世界》中“微缩方块”的性能特地受到玩家的欢送,研发团队在创作这个点上做更多不便、快捷、乏味的尝试。同时多维度的服务《迷你世界》内容生态中的游戏创作者与开发者,让他们可能纯正的领会到游戏乐趣,而不须要为工具发愁。 因而,在《迷你世界》游戏根底上衍生出的官网发明工具——《迷你世界发明板》,这款游戏研发的初衷次要是给宽广青少年提供一个更衰弱的像素场景搭建环境,脱离必须在游戏场景中进行像素作品的搭建枷锁,同时基于小游戏平台打造更便携的创作入口,即开即玩,并且更不便的将本人的作品分享给好友,共享创作乐趣。 《迷你世界发明板》外围用户群次要聚焦在:迷你世界的玩家和所有体素爱好者。 而我的项目团队成员则汇聚了领有各种我的项目经验的策动同学,制作多款小游戏的资深程序员,大家基于雷同的欲望和喜好汇集在一起,心愿共同开发一个乏味的创作平台,让泛滥玩家一起会因为喜好汇集在一起,分享本人的作品。 携手白鹭引擎进步开发效率、疾速上线 因为《迷你世界发明板》研发团队第一次应用白鹭引擎,对其相熟度并不高,这次做的又是兼容2D/3D发明场景的我的项目,因而研发团队在正式动工前曾经做出预判:过程不会特地的顺利,会遇到一些问题。 研发团队在确认引擎后的第一工夫就与白鹭引擎的技术支持团队分割并达成单干,心愿帮忙他们解决我的项目开发中的难题,从而进步开发效率,节约工夫进而压缩老本,实现我的项目疾速上线。 咱们通过具体开发问题实例来看下《迷你世界发明板》研发团队开发过程中遇到的问题及白鹭引擎技术支持团队给予的解决方案: 第一个是游戏的DrawCall过高导致游戏比拟卡的问题。 《迷你世界发明板》游戏中存在着大量的立方体对象,在最后的版本中,研发团队是将每一个立方体对象作为一个 GameObject 进行保护。因为游戏中的场景能够达到 100*100*100,这样的话 GameObject 的理论值就会高达一百万。研发团队在测试一个场景采纳60*60*60的尺寸时发现:游戏的DrawCall 曾经达到了二十万,根本无法渲染。 白鹭引擎技术支持依据此需要提供了定制技术Demo,倡议研发团队将立方体批改为应用自定义Mesh顶点绘制的形式来去实现。这样每个场景中的模型不再是一群立方体模型的汇合,而是仅一个通过算法自定义生成的模型。因为WebGL 1.0 版本一次绘制仅反对 65535 个顶点,所以最终绘制并不是一个模型,而是依据定点数量动静增加。 通过这项优化,在上述60*60*60的游戏场景中,DrawCall 从20万升高至60,游戏帧频能够60帧晦涩运行,顺利解决了此问题。 第二个是光影成果问题。 《迷你世界发明板》研发团队最开始采纳的是白鹭引擎官网提供的平行光源进行灯光暗影解决,然而这种形式在游戏场景中有些不协调。在白鹭引擎技术团队的帮忙及倡议下,咱们采纳了 Ambient Occlusion 的技术,并将其进行进一步的简化,通过自定义顶点信息和自定义Shader,实现了齐全不依赖于平行光实现了光影成果。具体的技术原理和成果预览如下所示: 第三个是 2D/3D渲染联合。 《迷你世界发明板》游戏中别离为用户提供了2D和3D的发明场景,因而研发团队对2D/3D游戏画面的兼容及相互切换要求比拟高。 而在Egret Pro 晚期提供的技术计划是在 3D 场景中创立一个Stage2D节点用于显示2D内容,这个2D节点中能够应用现有的 Egret2D API。然而这种形式联合 2D/3D代码书写绝对比拟僵硬,在一开始还有一些BUG。 为了改善这一开发体验,白鹭引擎技术支持团队提供了一种新的计划,将 Egret Pro 打包为一个库我的项目,而后在现有 2D 我的项目中能够间接援用这个库,这种形式咱们认为对开发体验改善十分大,将来的我的项目中咱们会持续采纳这种新计划。 此外,白鹭研发团队还将 Egret Inspector 适配到了 Egret Pro 中,大大改善了3D游戏场景中的2D UI的开发效率,带给咱们一个小小的惊喜!让咱们印象粗浅! 《迷你世界发明板》是 Egret Pro晚期版本用户,相比于初期版本,当初的Egret Pro在性能及公布平台反对方面曾经有了很大晋升,曾经能够同时反对公布Web 版本与微信小游戏、EgretNative,OPPO小游戏,vivo小游戏等多个平台,帮忙游戏企业多渠道获取用户。咱们也置信将来白鹭引擎研发及技术支持团队会一直的优化晋升开发体验。 ...

August 25, 2020 · 1 min · jiezi

关于html5:安卓video层级过高导致弹出视图被遮挡x5videoplayertypeh5失效

如果是Android微信版本7.0.13遇到同层生效的问题,能够让用户在微信里点开这个链接http://debugxweb.qq.com/?set_appbrand_config=WV_KIND_CW&set_grayvalue=1&check_xwalk_update& 点开链接后如果显示下载的话,等装置结束就能应用同层。

August 18, 2020 · 1 min · jiezi

关于html5:安卓video层级过高导致弹出视图被遮挡x5videoplayertypeh5失效

如果是Android微信版本7.0.13遇到同层生效的问题,能够让用户在微信里点开这个链接http://debugxweb.qq.com/?set_appbrand_config=WV_KIND_CW&set_grayvalue=1&check_xwalk_update& 点开链接后如果显示下载的话,等装置结束就能应用同层。

August 18, 2020 · 1 min · jiezi

关于html5:flashhtml中使用flash

最近看他人的一些代码,外面用到了flash,之前没有用过,这次就学习了下~ <!--[if IE]><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="1200" height="900" id="falshBox"> <param name="allowScriptAccess" value="sameDomain" /> <param name="move" value="movie.swf?aname=abc" /> <param name="FlashVars" value="aname=abc" /> <param name="quality" value="high" /> <param name="bgcolor" value="#fffff" /> <embed src="movie.swf" quality="high" bgcolor="#ffffff" width="1200" height="900" name="flash test" align="middle" allowScriptAcccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /></object><![endif]--><!--[if !IE]>--><object type="application/x-shockwave-flash" data="movie.swf?aname=abc" width="1200" height="900"> <param name="allowScriptAccess" value="sameDomain" /> <param name="move" value="movie.swf?aname=abc" /> <param name="FlashVars" value="aname=abc" /> <param name="quality" value="high" /> <param name="bgcolor" value="#fffff" /></object><!--<![endif]-->下面的代码写了IE浏览器的判断,是因为IE10开始根本和古代浏览器统一,如果不写两种判断,那么在不反对embed的浏览器上就会展现两个flash的盒子~ 次要说下FlashVars这个字段,很容易能够看出这个是向flash传参,同时也会看到param传入时在资源前面加了参数,然而在资源后加参数,有的浏览器不辨认,所以新增了FlashVars,为了兼容浏览器,最好是两个中央都加上参数~ 我这里就简略记录下吧,想要理解更多的,能够参考我之前查阅的材料~ html向flash传递参数Flash无关HTML参数详解

August 12, 2020 · 1 min · jiezi

关于html5:88日周汇报

前言 工夫过得并不慢,人不知;鬼不觉又到了周六晚汇报的时候了,这次我次要想写的是在好沉稳组合以来,我播种的那么一丢丢教训与教训。这次是写的从一开始到当初顺着咱们这个流程总结的。 Part1 我的项目1、理解我的项目是干什么,次要目标,外围性能,咱们既然要干,就得先晓得咱们干什么,要实现一个什么性能,以什么为外围,以什么为重点,我感觉这个货色也有点像写作文一样,都是须要主题,而后所表白的,实现的性能都是为这个核心服务的,比方咱们刚开始的时候,咱们探讨了一大堆,最初发现有一大部分都是无用功,就挺好受的,不过也算是长教训。2、弄清楚牵扯方面,比方咱们这次波及学生,老师,管理员和教室,因为搞清楚波及哪方面的话,性能也会更好的实现,因为我感觉搞清楚这些也能够对性能有进一步的意识。 Part2打算1、写一份详细分析这个我的项目的危险以及对资源的需要状况的报告,也就是所谓的需要剖析。需要剖析能够帮忙咱们更加明确咱们的目标,要实现的性能,比方咱们在写需要剖析的时候要画各种图,包含流程图,框架图等等,这些能够让咱们的需要更加直观,帮忙咱们打造出一个大的框架,帮忙咱们更好的了解,整顿思路,也能够让他人明确咱们要干什么,咱们的目标,批改起来也比拟不便。2、要做一个工夫布局这样的话就相当于咱们给了咱们短期的指标,这样咱们就会有力量,有干劲。 Part3单干1、在和他人探讨的时候,咱们既要表白分明咱们本人的观点,也要聆听他人的观点,不能自觉的去说本人的想法,或者只去听他人得想法,探讨的时候要做笔记2、调配的工作要及时做完,不然的话会拉进度,他人会等着本人3、要尽量及时察看团队的动静,在找人的时候,要在,音讯要及时看。 Part4原型设计在写V层的时候可能界面都要咱们本人去想,当然提前探讨进去会更好,只是可能会做很多无用功,所以咱们在写界面时,既要保障界面性能的欠缺,更要使界面不是很难看,界面尽量简洁、慷慨,没必要太花里胡哨,刚开始写V层的时候我找了很多背景图,最初还是感觉没用,因为切实不难看。肯定要把要的性能都展现进去,以什么样的形式展现,这样能力让他人判断界面是不是大家料想的。

August 8, 2020 · 1 min · jiezi

关于html5:88日周汇报

前言 工夫过得并不慢,人不知;鬼不觉又到了周六晚汇报的时候了,这次我次要想写的是在好沉稳组合以来,我播种的那么一丢丢教训与教训。这次是写的从一开始到当初顺着咱们这个流程总结的。 Part1 我的项目1、理解我的项目是干什么,次要目标,外围性能,咱们既然要干,就得先晓得咱们干什么,要实现一个什么性能,以什么为外围,以什么为重点,我感觉这个货色也有点像写作文一样,都是须要主题,而后所表白的,实现的性能都是为这个核心服务的,比方咱们刚开始的时候,咱们探讨了一大堆,最初发现有一大部分都是无用功,就挺好受的,不过也算是长教训。2、弄清楚牵扯方面,比方咱们这次波及学生,老师,管理员和教室,因为搞清楚波及哪方面的话,性能也会更好的实现,因为我感觉搞清楚这些也能够对性能有进一步的意识。 Part2打算1、写一份详细分析这个我的项目的危险以及对资源的需要状况的报告,也就是所谓的需要剖析。需要剖析能够帮忙咱们更加明确咱们的目标,要实现的性能,比方咱们在写需要剖析的时候要画各种图,包含流程图,框架图等等,这些能够让咱们的需要更加直观,帮忙咱们打造出一个大的框架,帮忙咱们更好的了解,整顿思路,也能够让他人明确咱们要干什么,咱们的目标,批改起来也比拟不便。2、要做一个工夫布局这样的话就相当于咱们给了咱们短期的指标,这样咱们就会有力量,有干劲。 Part3单干1、在和他人探讨的时候,咱们既要表白分明咱们本人的观点,也要聆听他人的观点,不能自觉的去说本人的想法,或者只去听他人得想法,探讨的时候要做笔记2、调配的工作要及时做完,不然的话会拉进度,他人会等着本人3、要尽量及时察看团队的动静,在找人的时候,要在,音讯要及时看。 Part4写V层在写V层的时候可能界面都要咱们本人去想,当然提前探讨进去会更好,只是可能会做很多无用功,所以咱们在写界面时,既要保障界面性能的欠缺,更要使界面不是很难看,界面尽量简洁、慷慨,没必要太花里胡哨,刚开始写V层的时候我找了很多背景图,最初还是感觉没用,因为切实不难看。肯定要把要的性能都展现进去,以什么样的形式展现,这样能力让他人判断界面是不是大家料想的。

August 8, 2020 · 1 min · jiezi

关于html5:H5-在ios上元素动态fixed失效

记录一下 有个需要,点击输入框,会弹出软键盘,此时输入框必须要在软键盘上方,所以用到fixed,然而ios怎么也找不到fixed后的input框,安卓和pc失常。代码如下: 解决办法: 切换input的class后,此时元素为fixed,让页面滚动到最底部,input就固定在键盘上了。

August 5, 2020 · 1 min · jiezi

关于html5:关于offsetXlayerXclientXscreenX以及pageX

【转载请注明出处】:https://blog.csdn.net/huahao1989/article/details/107775411 咱们都熟知,题目中的几个办法都是用来获取事件(event)的地位,然而他们有什么区别呢?就用一张图来阐明 offsetX: 指事件产生地位绝对触发元素左上角的程度坐标layerX: FF特有,鼠标相比拟于以后坐标系的地位,即从以后容器顺次往上寻找设置相对定位或绝对定位的元素为参考坐标系,以该容器的左上角来计算程度坐标clientX: 是指事件产生地位绝对可视区域的程度坐标(只是document展示的局部,不包含搜寻栏、书签栏等)screenX: 是指事件产生地位绝对电脑屏幕的程度坐标pageX: 是指事件产生地位绝对文档(document)的程度坐标(是指整个文档,当呈现滚动条时,暗藏的局部也会被算入pageX)欢送关注 “后端老鸟” 公众号,接下来会发一系列的专题文章,包含Java、Python、Linux、SpringBoot、SpringCloud、Dubbo、算法、技术团队的治理等,还有各种脑图和学习材料,NFC技术、搜寻技术、爬虫技术、举荐技术、音视频互动直播等,只有有工夫我就会整顿分享,敬请期待,现成的笔记、脑图和学习材料如果大家有需要也能够公众号留言提前获取。因为自己在所有团队中根本都处于攻坚和探路的角色,搞过的货色多,遇到的坑多,解决的问题也很多,欢送大家加公众号进群一起交流学习。【转载请注明出处】:https://blog.csdn.net/huahao1989/article/details/107775411

August 3, 2020 · 1 min · jiezi

关于html5:关于offsetXlayerXclientXscreenX以及pageX

【转载请注明出处】:https://blog.csdn.net/huahao1989/article/details/107775411 咱们都熟知,题目中的几个办法都是用来获取事件(event)的地位,然而他们有什么区别呢?就用一张图来阐明 offsetX: 指事件产生地位绝对触发元素左上角的程度坐标layerX: FF特有,鼠标相比拟于以后坐标系的地位,即从以后容器顺次往上寻找设置相对定位或绝对定位的元素为参考坐标系,以该容器的左上角来计算程度坐标clientX: 是指事件产生地位绝对可视区域的程度坐标(只是document展示的局部,不包含搜寻栏、书签栏等)screenX: 是指事件产生地位绝对电脑屏幕的程度坐标pageX: 是指事件产生地位绝对文档(document)的程度坐标(是指整个文档,当呈现滚动条时,暗藏的局部也会被算入pageX)欢送关注 “后端老鸟” 公众号,接下来会发一系列的专题文章,包含Java、Python、Linux、SpringBoot、SpringCloud、Dubbo、算法、技术团队的治理等,还有各种脑图和学习材料,NFC技术、搜寻技术、爬虫技术、举荐技术、音视频互动直播等,只有有工夫我就会整顿分享,敬请期待,现成的笔记、脑图和学习材料如果大家有需要也能够公众号留言提前获取。因为自己在所有团队中根本都处于攻坚和探路的角色,搞过的货色多,遇到的坑多,解决的问题也很多,欢送大家加公众号进群一起交流学习。【转载请注明出处】:https://blog.csdn.net/huahao1989/article/details/107775411

August 3, 2020 · 1 min · jiezi

关于html5:HTML5CSS3-2

2Dtransformtransform(转换)是css3新增的属性 能够实现元素的旋转 位移 缩放等成果二维坐标系2D转换是扭转元素在二维立体上形态和地位的一种技术 translate(位移)注意事项 所谓的位移 是沿着x轴和Y轴挪动地位不会影响到其它元素的地位对行内元素有效应用办法 translate(x,y)translateX(n):针对X轴translateY(n):针对Y轴translate(50%,50%) 这里的百分比是依据本身宽度和高度进行挪动<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> * { margin: 0; padding: 0; } div { width: 200px; height: 200px; background-color: red; margin: 20px 100px; } div[class="box"] { background-color: blue; transform: translate(200px, 50px); } </style></head><body> <div class="box"></div> <div></div></body></html> 让盒子实现程度和垂直居中对齐留神:盒子必须是块级元素和行内块元素。能够用tanslate实现,用定位和translate配合更佳 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> div { position: relative; width: 600px; height: 600px; margin: 200px auto; background-color: red; } p { position: absolute; left: 50%; top: 50%; width: 200px; height: 200px; background-color: blue; transform: translate(-50%, -50%); } </style></head><body> <div> <p></p> </div></body></html> ...

August 3, 2020 · 7 min · jiezi

关于html5:HTML5CSS31

HTML5HTML5作为html的第五次重大批改,作为新的HTML语言,具备新的元素,新的属性及行为。狭义的HTML5=HTML5自身+css+javascript HTML5具备兼容性,但具备发展趋势。 HTML5新增语义化标签header:头部标签nav:导航标签article:内容标签section:块级标签aside:侧边栏标签footer:脚部标签 注意事项 1.新增标签能够应用屡次 2.IE9以下的版本具备兼容性问题,须要转换成块级元素 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> header, nav, aside, article, section, footer { display:block; width: 100%; height: 100px; margin-top: 20px; color: #fff; background-color: purple; text-align: center; line-height: 100px; font-weight: 700; } </style></head><body> <header>头部</header> <nav>导航</nav> <aside>侧边栏</aside> <article>内容</article> <section>块级</section> <footer>脚部</footer></body></html> HTML5多媒体标签audio 音频标签 <audio>音频标签常见属性autoplay:自动播放controls:控件loop:有限次循环播放src:播放的地址<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title></head><body> <!-- 第一种办法 --> <audio src="./audio/Ngẫu_Hứng-Hoaprox-23817485.mp3" controls="controls" loop="loop" autoplay="autoplay"></audio> <!-- 第二种办法 --> <audio controls="controls" loop="loop" autoplay=“autoplay "> <source src="./audio/Ngẫu_Hứng-Hoaprox-23817485.mp3 "> 你的浏览器 不反对播放音乐 </audio></body></html> ...

August 3, 2020 · 4 min · jiezi

关于html5:HTML5CSS31

HTML5HTML5作为html的第五次重大批改,作为新的HTML语言,具备新的元素,新的属性及行为。狭义的HTML5=HTML5自身+css+javascript HTML5具备兼容性,但具备发展趋势。 HTML5新增语义化标签header:头部标签nav:导航标签article:内容标签section:块级标签aside:侧边栏标签footer:脚部标签 注意事项 1.新增标签能够应用屡次 2.IE9以下的版本具备兼容性问题,须要转换成块级元素 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> header, nav, aside, article, section, footer { display:block; width: 100%; height: 100px; margin-top: 20px; color: #fff; background-color: purple; text-align: center; line-height: 100px; font-weight: 700; } </style></head><body> <header>头部</header> <nav>导航</nav> <aside>侧边栏</aside> <article>内容</article> <section>块级</section> <footer>脚部</footer></body></html> HTML5多媒体标签audio 音频标签 <audio>音频标签常见属性autoplay:自动播放controls:控件loop:有限次循环播放src:播放的地址<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title></head><body> <!-- 第一种办法 --> <audio src="./audio/Ngẫu_Hứng-Hoaprox-23817485.mp3" controls="controls" loop="loop" autoplay="autoplay"></audio> <!-- 第二种办法 --> <audio controls="controls" loop="loop" autoplay=“autoplay "> <source src="./audio/Ngẫu_Hứng-Hoaprox-23817485.mp3 "> 你的浏览器 不反对播放音乐 </audio></body></html> ...

August 3, 2020 · 4 min · jiezi

关于html5:html-span和img共同居中

要达到这种成果: html <div class="flower" > <span class="flowerBox"> <span>"711同学"</span> <img class="flowerImg" src="改成在线图片URL" alt /> </span> </div>css .flower { align-content: center; text-align: center; .flowerBox { background: #F7F9FC; padding: 6px 12px; border-radius:2px; img { width: 20px; height: 20px; vertical-align: middle; } }

July 23, 2020 · 1 min · jiezi

关于html5:vue常用工具函数Utiljs

1,获取URL的参数,返回一个对象 getRequest() { const url = location.search; //获取url中"?"符后的字串 let theRequest = new Object(); if (url.indexOf("?") != -1) { let str = url.substr(1); let strs = str.split("&"); for (let i = 0; i < strs.length; i++) { theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]); } } return theRequest; }

July 23, 2020 · 1 min · jiezi

关于html5:H5分享截图方案优化

简介: 如何利用web实现挪动端高还原度富图文分享? 作者:闲鱼技术-苑振一 背景分享是流传流动,吸引用户最重要的一环。现有分享伎俩多是题目配合单张图片,利用点击的形式跳转到指标页面。在信息越来越丰盛的明天,单个题目和图片对用户的吸引力是无限的。而在对推广要求更高的营销场景和裂变过程中,咱们往往须要将页面内容一部分作为图片整体分享进来。间接利用手机原生的截屏性能会有几个问题:1)内容格局无奈自定义。2)翻页状况无奈解决。3)视窗区域不可控。本文通过探讨现有截屏的计划和闲鱼外部截屏计划,介绍如何利用web实现挪动端高还原度富图文分享。 现有计划Html2Canvas介绍html2canvas是一种基于canvas,将DOM构造绘制在canvas下面产生图片的第三方库。通过如下的形式能够将对应的DOM构造绘制成图片保留进去。劣势在于上手简略,使用方便。 绘制原理原理如下图所示。外围逻辑是克隆对应节点DOM构造,利用parse解析成数据,构建canvas进行内容绘制,返回对应的canvas。 理论应用过程中发现大略有如下几个问题图片跨域不反对。生成的图片存在跨域限度问题。绘制清晰度低。即便应用apiscale放大后绘制,又会因为生成base64格局图片内容过长导致无奈传输。圆弧计算精度低。因为html2canvas是计算像素后绘制到canvas上,而canvas展现又会通过浏览器绘制,导致像素精度升高。深度节点呈现彩色状况。因为DOM构造过深,通过像素计算后,会偶然呈现像素失落状况。SVG介绍该计划是利用svg能够包裹DOM构造的个性,将对应指标装载进去,之后将svg导出成base64格局的图片。应用形式如下。通过xmlns指定命名空间,避免多汇合下元素和属性的抵触。后缀中的svg和xhtml别离示意解析形式。利用不同的解析形式,实现了svg外部嵌入html的形式。 之后只有通过encodeURIComponent(svg)将对应的svg转换成base64就能够。劣势是容易上手且不依赖第三方库。 理论应用过程中发现大略有如下几个问题SVG无奈连贯到内部的资源。比方通过cdn引入的css以及html中的图片连贯都会被限度。不反对js执行。现如今SPA页面都须要执行JS后才会渲染对应的DOM节点,而SVG却不反对JS的执行。SVG地位和大小不确定。遇到须要及时展现的状况,须要实时计算地位才行。解决方案思路从下面能够看到,现有的两种支流挪动端截屏计划都有本人的有余。相比之下,利用canvas绘制的办法更适宜SPA利用。那么咱们须要解决的是html2canvas对应的几个问题:图片跨域,清晰度低,圆弧计算精度差,深层节点解析出错。 图片跨域通过new Image()的形式生成图片,在image.onload阶段应用canvas绘制图片。此时会产生跨域限度,须要通过crossOrigin = 'Anonymous'设置来解决这个问题。 进步清晰度在绘制中发现,如果采纳宽度375px的canvas将图片导出,会呈现图片含糊的状况。一种计划是进步原图片清晰度,然而加载速度会大大提高,用户体验不敌对。另一种形式是放大canvas,利用drawImage中的参数管制图片坐标和canvas中的绘制坐标。drawImage中蕴含几个参数:管制图片的sx, sy, sWidth, sHeight和管制canvas绘制的x, y, width, height。参数具体含意如图中所示。 将办法中width和height乘上ratio,放大图片,管制绘制坐标,就能在canvas特定地位上绘制出想要的内容。思考到小canvas在展现阶段清晰度足够,仅保留阶段须要放大三倍绘制的个性,采纳第二种办法在简直没有进步性能开销的前提下,进步清晰度。咱们以理论绘制截图来看一下成果。下图右边是一倍后果,右图是三倍后果。 圆弧精度晋升和深层DOM解析圆弧精度低和深层DOM解析出错问题实质上还是因为DOM构造过于简单,当采纳通用计划解决时,不免无奈笼罩。思考到挪动端内容无限,构造简略的特点。决定采纳特定DOM节点针对性绘制的计划解决深层DOM解析出错的问题。益处如下:1)办法原子化,保护简略。2)绘制高度自定义化,自在组织界面构造。3)拓展性强。在共事胖仔的帮忙下实现特定DOM节点绘制计划。计划构建过程中次要有如下几个难点:圆角矩形,文字主动换行。 圆角矩形:通过截断的形式绘制特定背景的圆角矩形。原理是通过createPattern的形式在canvas上获取图片内容,再利用Path的形式,绘制对应的路线,利用canvas.arc绘制圆弧局部,利用canvas.lineTo绘制直线局部,截取想要的内容,实现圆角矩形。 图片内容获取。 `context.createPattern(imgUrl, "no-repeat")`圆角矩形区域绘制 ![20200721115559.jpg](https://intranetproxy.alipay.com/skylark/lark/0/2020/jpeg/288128/1595303835739-f4f3bea5-562a-472a-9f45-f4599ed74997.jpeg) 绘制内容 ![20200721115612.jpg](https://intranetproxy.alipay.com/skylark/lark/0/2020/jpeg/288128/1595303848154-c0c9fe64-b092-47c5-b82c-20d6c10c5417.jpeg) 文本主动换行:思路是通过measureText取得以后文本宽度,每次增加一个字,比对此时文本宽度和行宽,超过时候绘制以后行,进行换行,y减少行高,反复这个过程。 成果实现了一套挪动端截屏办法。解决了现有第三方库html2canvas绘制清晰度低,圆弧计算精度低,深层DOM解析出错的问题。采纳原子化实现办法。反对截屏自定义绘制,而不是如html2canvas和svg只能通过复数次绘制不同DOM节点,来拼凑指标的形式。总结在互联网时代,尤其是5G马上要降临的明天。传统的分享模式,题目+单图片,逐步难以满足越来越丰盛的流动宣传要求。而流量的便宜化和短视频炽热的时下,富图文流传无疑能传递更多的信息。目前咱们曾经实现了根本DOM节点绘制计划,并在站内流动中应用富图文分享。置信在不久的未来,咱们可能利用挪动端截屏分享性能帮忙更多闲鱼用户高效率分享内容,让用户乐在闲鱼,玩在闲鱼。

July 21, 2020 · 1 min · jiezi

关于html5:关于外链嵌入页面通信问题postMessage解决跨域通信

说起来挺简略的,能够间接去查问postMessage推送和window.addEventListener接管应用形式,能本人搞明确是最好的,本文章也只是记录一下本人的应用形式应用postMessage推送和window.addEventListener接管原理: 发送方应用postMessage办法向接管方推送音讯,第一个参数为推送的内容,第二个参数是容许被拜访的域名; 接管方通过监听message的办法接收数据。 实现跨域就须要有两个不同源的服务器咯 开始 iframe引入页面(我也是应用这样形式)父页面(发送方) <script>//这里是发送监听 function btnClick(params) { console.log(1111) var iframe = document.getElementById("childframe") iframe.contentWindow.postMessage({ text:'你收到了没有呀(白天)', action : 'light' // action : 自定义动作参数,用于承受收音讯是的判断 }, 'http://localhost:8000/#/'); } function btnClick2(params) { console.log(2222) var iframe = document.getElementById("childframe") iframe.contentWindow.postMessage({ text:'你收到了没有呀(黑夜)', action : 'dark' // action : 自定义动作参数,用于承受收音讯是的判断 }, 'http://localhost:8000/#/'); //这是接管子页面返回的监听(过后也是被各种文章搞的很懵圈呀,如果只父页面发送音讯不须要在接管子页面的反馈能够不必写这些) window.addEventListener('message', function (e) { alert(e.data) const data = e.data; console.log(data,'接到你的页面了data') }) //上面这些都是踩过的坑 // var iwindow = iframe.contentWindow; // var idoc = iwindow.document; //  console.log("window",iwindow);//获取iframe的window对象 //  console.log("document",idoc); //获取iframe的document //  console.log("html",idoc.documentElement);//获取iframe的html //  console.log("head",idoc.head); //获取head //  console.log("body",idoc.body); //获取body // console.log(window.frames['myframe'].window) } </script><body> <button onclick="btnClick()">点击</button> <br/> <button onclick="btnClick2()">点击</button> <iframe name="myframe" src ="http://localhost:8000/#/home1?type=light" id="childframe" width="1400px" height="800px"></body>对于发送简略解释一波:<iframe name="myframe" src ="http://localhost:8000/#/home1?type=light" id="childframe" width="1400px" height="800px">这里外面的src是子页面的地址(这里是依据你本人写的路由或者那个页面要监听写的地址)。 ...

July 20, 2020 · 1 min · jiezi

关于html5:正则截取2个指定字符之间的内容

比方我当初要提取这个 id=" 到 ">之间的内容,即abc A 和 456。能够这么用正则判断。 var str = `<i id="abc A"></i>fffgggss<i id="456"></i>`;//先提取出每一个<i></i>str = str.replace(/<i.{0,}?>{0,}?<\/i>/g, function( a, b ){ a.replace( /id="(.+?)"/, function(a, b){ console.log("a: "+a); console.log("b: "+b) }) return a;});输入的后果: a: id="abc A"b: abc Aa: id="456"b: 456又或者能够替换到不须要的内容,只留须要的内容 var str = `<i id="abc A"></i>fffgggss<i id="456"></i>`;var result = str.match(/<i.{0,}?id="(.+?)".+?>{0,}?<\/i>/g);console.log(result);输入后果: [ '<i id="abc A"></i>', '<i id="456"></i>' ]具体的用法能够在这两个下面就行改变;

July 20, 2020 · 1 min · jiezi

前端如何玩转人脸识别

背景人脸识别技术在当下曾经非常成熟,但次要在挪动端和专有设施利用上较为遍及,而在Web端并不多见,本着学习的目标从零实现web端的人脸登录性能。 视频流:应用navigator.getUserMedia办法在浏览器中获取视频流+音频流(通过摄像头麦克风),未来能够用于获取任意数据流,比方光盘和传感器。 face_recognition:被称为世界上最简略的人脸识别库(应用的确超简略)。你能够通过Python援用或者命令行的模式应用它,来治理和辨认人脸。该软件包应用dlib中最先进的人脸识别深度学习算法,使得辨认准确率在《Labled Faces in the world》测试基准下达到了99.38%。它同时提供了一个叫face_recognition的命令行工具,以便你能够用命令行对一个文件夹中的图片进行辨认操作。 总体流程: 启动web服务,应用face_recognition将根底库图片进行建模,将建模后果(辨认到的人脸在图片中的地位和人脸特色)加载到内存。前端通过h5页面的getUserMedia办法调用摄像头获取视频流。通过canvas抓取一帧视频转化为图片(base64),应用http或websocket发送到后盾。后盾承受base64参数并转化为图片保留。调用face_recognition.locations和face_recognition.face_encodings进行图片建模。调用face_recognition.compare_faces将图片建模后果与根底库后果比对。依据定义的比对阈值(被称为容忍度,个别为0.6)返回比对后果,如果阈值小于该值,判断是该用户,认定容许登录,返回零碎界面。否则返回人脸识别失败的信息。功能模块图: 性能时序图: 效率: 经测试,最终实现能够底库数据为10人时,1s左右实现刷脸登录,辨认成果也能承受,在侧脸,半脸(鼻子到额头)测试后果能够通过。 理论利用可行性 在可视化我的项目中人脸识别联合传统的账号密码登录,可晋升零碎安全性和更好的用户体验。 限度: 浏览器调用摄像头只有在https协定、127.0.0.1、localhost下有权限,理论我的项目须要反对https。 兼容性 Desktop Mobile 留神: 本文只介绍了简略实现,零碎安全性没有过多思考,比方在这个简略零碎中,前端的数据获取流程,非注册用户应用注册用户的照片也能骗过零碎,在照片数据传输的过程中,也会有数据泄露的危险。前面将会针对这些状况进行一系列的优化。 代码https://github.com/James-Nie/... 阐明 装置 face-recognition 首先阐明,我的零碎是win10,python版本是python3.7,须要当时下载一下3个包并装置: 1、vs c++ 2015,必须是2015,不要问为什么 能够用这个链接:https://www.microsoft.com/zh-... 也能够用社区版 2、Boost C++ Libraries,能够用这个链接: https://dl.bintray.com/boosto... 抉择boost_1_66_0-msvc-14.0-64.exe,装置到C盘即可 3、cmake 能够用这个链接:https://cmake.org/download/ 抉择cmake-3.15.0-rc4-win64-x64.msi 留神!!!cmake在装置过程中切记抉择增加门路到环境变量中。 4、当下面3个都装置好之后,能够间接在命令窗口装置pip install face-recognition即可,在这过程中会主动装置好dlib,当然也能够先装置dlib,这就看各位情绪了。

July 16, 2020 · 1 min · jiezi