• 网站、网页与HTML文档笔记分享
    网站>网站用于集中提供各种相关的网页。网页>主页,指网站中的首页,通常命名为index.*。当URL中不包含文件名时,即访问网站的主页。HTML文档>      超文本标记语言或超文本链接标示语言(标准通用标记语言下的一个应用)HTML(HyperText Mark-up Language)是一种制作万维网页面的标准语言,是万维网浏览器使用的一种语言,它消除了不同计算机之间信息交流的障碍。      它是目前网络上应用最为广泛的语言,也是构成网页文档的主要语言。HTML文件是由HTML命令组成的描述性文本,HTML命令可以说明文字、图形、动画、声音、表格、链接等。HTML文件的结构包括头部(Head)、主体(Body)两大部分,其中头部描述浏览器所需的信息,而主体则包含所要说明的具体内容。<!DOCTYPE html><html><head><meta   charset="UTF-8"><title>页面标题</title></head><body>我是快乐的小男孩<img src="images/boy.gif"   /></body></html>经浏览器解析后呈现为超媒体页面,如图:
  • [问题求助] 关于开发 vxml版本自助语音流程时,服务器缓存问题
    【问题来源】黑龙江农信社【问题简要】开发 vxml 版本自助语音流程时,本地修改代码后,服务器疑似存在缓存问题【问题类别】vxml 版本自主语音流程开发【AICC解决方案版本】AICC 版本:AICC 8.0.71【问题现象描述】在本地开发 vxml 版本自助语音流程时,通过华为配置管理系统,将流程文件连接到本地项目。华为服务器疑似存在缓存问题。如:在原有main请求响应代码中,播放音频文件 1050.wav,本地修改代码为 busy.wav后,通过电话拨号。提示音依旧播放的是 1050.wav 内容重启华为服务器 或过了不确定时长的时间后,才能生效变成 busy.wav还有个问题,如下图:经常不定时的出现 这个错误,造成电话直接挂机麻烦帮忙定位下造成这两个问题的原因,谢谢
  • [技术干货] window.open 打开新页面失效
    在开发h5项目的时候 经常需要使用window.open 来打开新页面,但有时会出现失效的情况。 问题复现: 在接口请求完成后,根据返回的结果调用window.open 失效 原因:浏览器出于安全的考虑,会拦截掉非用户操作打开的新页面;实际上,在异步的方法中以及非用户操作打开的新页面都会被拦截(不同浏览器不同版本表现不同,不是所有情况都会被拦截,但是任然需要做兼容处理) 例如: fetch(url,option).then(res=>{ window.open('http://www.test.com')})setTimeout(() => { window.open(this.url, '_blank')}, 100)。。。if (success) window.open(data);解决方案:1、尽量让将调用window.open的方法 写在用户事件中,例如: if (success) { Dialog.alert({ content: '即将跳转单证链接', onConfirm: () => { window.open(data); }, }); }交互上的小修改,这样写需要用户手动确定才会跳转2、 使用a标签进行跳转ajax().then(res => { asyncOpen(res.url)})function asyncOpen(url) { var a = document.createElement('a') a.setAttribute('href', url) a.setAttribute("target", "_blank"); a.setAttribute("download", 'name'); document.body.appendChild(a); a.click(); a.remove();}3、使用中转页面一定要把window.open定义在接口请求的外部,保证新开空白窗口不会被拦截。var newWin = window.open('loading page') ajax().then(res => { newWin.location.href = 'target url'}).catch(() => { newWin.close()})———————————————— 版权声明:本文为CSDN博主「MissXu666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/MissXu666/article/details/129210313
  • [技术干货] 文件预览kkFileView安装及使用【转】
    1 前言 网页端一般会遇到各种文件,比如:txt、doc、docx、pdf、xml、xls、xlsx、ppt、pptx、zip、png、jpg等等。 有时候我们不想要把文件下载下来,而是想在线打开文件预览 ,这个时候如果每一种格式都需要我们去写代码造轮子去实现预览功能就太复杂了,并且自己实现的话会有很多兼容性问题。 这个时候 kkFileView 的出现就解决了我们的问题。 2 kkFileView介绍 kkFileView为文件文档在线预览解决方案,该项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 kkFileView 官网 kkFileView 码云地址官网 kkFileView github地址官网 3 kkFileView安装 自 v4.1.0 版本开始 kkFileView 不再免费提供 Windows 和 Linux 的发行安装包了,以前旧版本的安装包也取消了下载入口,要下载安装包还要花99块钱进那个KK开源社区群获取。不过我之前下载过 v4.0.0 版,也够用了,为了方便大家我已经上传百度云了,你可以通过下面文章中的链接进行下载,本文的安装使用教程也是基于 v4.0.0 版本进行操作 。 部署指南参考kkFileView - 在线文件预览 下面介绍Windows、Linux、docker三种安装方式。 3.1 下载Windows或Linux的 v4.0.0 安装包 3.1.1 Windows安装包下载 链接:https://pan.baidu.com/s/1YsuYcYB7oGK4w-byM5VUuQ 提取码:jer1 3.1.2 Linux安装包下载 链接:https://pan.baidu.com/s/1saGMphibd7434GNy5L5Lfw 提取码:axnu 3.2 在Windows或Linux上安装 3.2.1 Windows上安装 第一步:下载的 zip 压缩包解压后进入 bin 目录,双击 startup.bat 启动 kkFileView,如图: 第二步:30秒后进入 log 目录查看 kkFileView.log 日志,打印【kkFileView 服务启动完成,耗时:26.8350973s,演示页请访问: http://127.0.0.1:8012 】则说明启动成功。  3.2.2 Linux上安装(centos为例) 第一步:root用户下将 kkFileView-4.0.0.tar.gz 上传到服务器 ,使用命令 tar -zxvf kkFileView-4.0.0.tar.gz 解压,开放 8012 端口。 第二步:root用户下解压后进入 kkFileView-4.0.0/bin 目录,执行 ./startup.sh 开始安装和启动,安装过程中会下载需要的组件需要输入y 第三步:安装字体。若不安装字体转化出的pdf文件可能会因为缺少字体乱码。字体下载(链接:http://kkfileview.keking.cn/fonts.zip)或者 百度云下载(链接:https://pan.baidu.com/s/1TESdE8Xi02NqtnnKlp0BvQ 提取码:lfw5 ) 将下载的字体fonts.zip上传到 /usr/share/fonts 目录解压后执行命令 mkfontscale 若 mkfontscale 提示没有命令则先 yum install mkfontscale 安装命令 再分别依次执行 mkfontscale、mkfontdir、fc-cache 命令。 第四步: 安装完成后 kkFileView-4.0.0/bin/ 目录下使用命令 ./showlog.sh 查看日志 如果出现: 【kkFileView 服务启动完成,耗时:5.99157928s,演示页请访问: http://127.0.0.1:8012 】,则表示安装启动成功。 第五步: 如果日志提示报错信息【找不到office组件,请确认’office.home’配置是否有误 】,则需要下载LibreOffice组件安装。 LibreOffice下载 (链接:https://downloadarchive.documentfoundation.org/libreoffice/old/7.1.4.2/rpm/x86_64/) 或者 百度云下载(链接:https://pan.baidu.com/s/1aRY66KlzZD9UJSo8Gjf2Fg 提取码:6exh ) 将 LibreOffice_7.1.4.2_Linux_x86-64_rpm.tar.gz 上传服务器,然后解压后进入RPMS目录执行 yum localinstall *.rpm 进行安装。 第六步:如果日志提示报错信息【Caused by: java.lang.IllegalStateException: a process with acceptString ‘socket,host=127.0.0.1,port=2001’ is already running】 (1)用 ps -ef|grep java 命令查询出Java相关运行的进程,然后关闭kkFileView相关的进程, 并查看2001和2002端口的进程并关闭该进程。然后再执行 ./startup.sh 启动并查看日志。 (2)如果是安装在Linux上并且关闭了kkFileView相关的进程以及2001和2002端口,启动日志任 然存在该问题,那么可能是你远程连接服务器的软件导致的这个问题,改用window的cmd, 用ssh连接服务器启动程序尝试。 第七步: 如果日志提示报错信息【Caused by: org.artofsolving.jodconverter.office.OfficeException: could not establish connection】,可参考 centos下启动失败:启动office组件失败,请检查office组件是否可用 3.2.3 通过docker安装 第一步:拉取镜像: docker pull keking/kkfileview 第二步:运行: docker run -dit -p 8012:8012 keking/kkfileview 第三步:进入运行起来的容器中,然后可以进入 /opt/kkFileView-4.1.0-SNAPSHOT/bin 安装目录, 运行命令 ./showlog.sh 查看日志 4 kkFileView的配置修改 4.1 修改启动脚本 测试发现如果 kkfileview 安装在 Windows 上预览 txt 文件会乱码,所以需要修改 kkfileview 的 bin 目录下的 startup.bat 脚本。 在最后一行的 java 后添加 -Dfile.encoding=UTF-8 修改后如下:  @echo offset "KKFILEVIEW_BIN_FOLDER=%cd%"cd "%KKFILEVIEW_BIN_FOLDER%"echo Using KKFILEVIEW_BIN_FOLDER %KKFILEVIEW_BIN_FOLDER%echo Starting kkFileView...echo Please check log file in ../log/kkFileView.log for more informationecho You can get help in our official homesite: https://kkFileView.keking.cnecho If this project is helpful to you, please star it on cid:link_0/stargazersjava -Dfile.encoding=UTF-8 -Dspring.config.location=..\config\application.properties -jar kkFileView-4.0.0.jar -> ..\log\kkFileView.log4.2 关闭演示页面 kkFileView安装启动成功后可以打开 http://安装的ip:8012 (或者本机 http://127.0.0.1:8012) 查看演示页面上传文件以及查看预览效果。  如果项目上线后为了安全要关闭演示页面,可以在修改kkFileView安装目录的config文件夹中的 application.properties配置文件,将file.upload.disable设置为false禁用演示首页文件上传。 其他配置可根据 官网配置说明 进行配置。 5 kkFileView的使用 只需要创建一个html文件,再加上如下代码:  <html> <head> <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/js-base64@3.6.0/base64.min.js"></script> </head> <script> var url = 'https://public.fuyingy.com/79e5c202204201011493290.jpg'; //图片随便写了一个 window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(url))); </script></html>转载自https://blog.csdn.net/qq_37284798/article/details/129377354?spm=1001.2014.3001.5502
  • [技术干货] ES6中的箭头函数详细梳理-转载
     一、箭头函数的介绍 1.1 什么是箭头函数 ES6中允许使用=>来定义函数。箭头函数相当于匿名函数,并简化了函数定义。  1.2 基本语法 // 箭头函数 let fn = (name) => {     // 函数体     return `Hello ${name} !`; };  // 等同于 let fn = function (name) {     // 函数体     return `Hello ${name} !`; }; 箭头函数在语法上比普通函数简洁多。箭头函数就是采用箭头=>来定义函数,省去关键字function。  函数的参数放在=>前面的括号中,函数体跟在=>后的花括号中  1.3 箭头函数的参数 ①如果箭头函数没有参数,写空括号  //没有参数,写空括号     let fn = () => {         console.log('hello');     }; ②如果箭头函数有一个参数,也可以省去包裹参数的括号  //只有一个参数,可以省去参数括号     let fn = name => {         console.log(`hello ${name}!`)     }; ③如果箭头函数有多个参数,将参数依次用逗号(,)分隔,包裹在括号中。      let fn = (val1, val2, val3, val4) => {         return [val1, val2, val3, val4];     } 1.4 箭头函数的函数体 ①如果箭头函数的函数体只有一句执行代码,简单返回某个变量或者返回一个简单的js表达式,可以省去函数体花括号{ }  //返回某个简单变量val let f = val => val; // 等同于 let f = function (val) { return val };  //返回一个简单的js表达式num1+num2 let sum = (num1, num2) => num1 + num2; // 等同于 let sum = function(num1, num2) {   return num1 + num2; }; ②如果箭头函数的函数体只有一句代码,返回的不是变量和简单的js表达式,而是一个对象。  //错误写法—花括号会被解释为函数体     let getItem = id => {         id: id,         name: 'gaby'     }; //正确写法     let getItem = id => ({         id: id,         name: 'gaby'     }); ③如果箭头函数的函数体只有一条语句且不需要返回值(最常用于回调函数),加上void关键字  let fn = () => void doesNotReturn(); 1 箭头函数用于回调函数,常见简洁  //栗子1 //普通函数     [1, 2, 3].map(function (x) {         return x + x;     }); //ES6箭头函数 [1, 2, 3].map(x => x + x); //栗子2 //普通函数     var result = [2, 4, 5, 1, 6].sort(function (a, b) {         return a - b;     }); //ES6箭头函数     var result = [2, 4, 5, 1, 6].sort((a, b) => a - b); 二、箭头函数的this指向规则 2.1 箭头函数没有原型prototype,因此箭头函数没有this指向     let fn = () => {         console.log('Hello World !')     };     console.log(fn.prototype); // undefined 2.2 箭头函数不会创建自己的this,如果存在外层第一个普通函数,在定义的时候会继承它的this 箭头函数没有自己的this指向,它会捕获自己定义所处的外层执行环境,并且继承这个this值。箭头函数的this指向在被定义的时候就确定了,之后永远都不会改变。(!永远)  (1)栗子1     var id = 'Global';     //普通函数     function fn1() {         setTimeout(function () {             console.log(this.id)          }, 1000);     }     //箭头函数     function fn2() {         setTimeout(() => {             console.log(this.id)         }, 1000);     }      fn1.call({         id: 'obj'     });//Global      fn2.call({         id: 'obj'     });//obj 解析:普通函数的setTimeout 一秒后执行是在全局作用域,所有this指向window对象,this.id指向了全局变量id,输出Golbal。箭头函数的this在定义的时候就确定了,继承fn2的执行环境中的this,fn2的this指向被call方法改变绑定到obj这个对象  (2)栗子2     var id = 'Global';     var obj = {         id: 'OBJ',         a: function () {             console.log(this.id)         },//方法a普通函数定义         b: () => {             console.log(this.id)         }//方法b用箭头函数定义     };     obj.a();//OBJ     obj.b();//Global 解析:普通函数作为对象的方法调用,this指向所属的对象(谁调用它就指向谁),this.id 就是obj.id;箭头函数继承定义它的执行环境的this,指向window对象,指向全局变量,输出Global。花括号{}无法形成一个单独的执行环境,所有它依然在全局中。  2.3 箭头函数的this是继承而来的永远不会变,call/apply/bind也无法改变 .call()/.apply()/.bind()方法可以用来动态修改函数执行时this的指向,但由于箭头函数的this定义时就已经确定且永远不会改变      var name = 'gaby'     var person = {         name: 'gabrielle',         say: function () {             console.log('say hello', this.name)         }, //普通函数         say2: () => {             console.log('say2 hello', this.name)         } //箭头函数     }     person.say.call({         name: 'Mike'     })     person.say2.call({         name: 'Amy'     }) 解析:say的普通函数通过call调用已经改变this指向。say2箭头函数调用call绑定尝试改变this指向,但是仍然打印出外一层普通函数的this指向,window对象的全局变量name。  2.4 箭头函数this指向只能间接修改 间接修改:修改被继承的普通函数的this指向,箭头函数的this指向也会跟着改变。  箭头函数的this指向定义时所在的外层第一个普通函数,跟使用的位置没有关系。      let al     let aObj = {         msg: 'a的this指向'     };     bObj = {         msg: 'b的this指向'     };     a.call(aObj); //将a的this指向aObj     b.call(bObj); //将b普通函数的this指向bObj 箭头函数内部的this指向也会指向bObj      function b() {         al();     }      function a() {         al = () => {             console.log(this, 'this指向定义时外层第一个普通函数 ')         };     } 2.5 箭头函数外层没有函数,严格模式和非严格模式下它的this都会指向window全局对象 箭头函数的this指向继承自外层第一个普通函数的this,那么如果没有外层函数,它的this指向哪里?  this的绑定规则:非严格模式下,默认绑定的this指向全局对象,严格模式下this指向undefined。  如果箭头函数外层没有普通函数继承,箭头函数在全局作用域下,严格模式和非严格模式下它的this都会指向window(全局对象)  2.6 多层嵌套函数this指向 箭头函数中的this引用的是最近作用域中的this,是向外层作用域中,一层层查找this,直到有this的定义。  2.7 箭头函数不能作为构造函数使用new 构造函数做了什么?  ①JS内部首先会先生成一个对象  ②再把函数中的this指向该对象  ③然后执行构造函数中的语句  ④最终返回该对象实例  箭头函数没有自己的this,this继承外层执行环境中的this,且this永远不会改变。new会报错      let fn = (name, age) => {         this.name = name;         this.age = age;     };      let person = new fn('gaby', 20)  2.8 箭头函数不支持new.target ES6新引入的属性,普通函数可以通过new调用,new.target返回该函数的引用。用于确定构造函数是否为new调用。箭头函数并不能作为构造函数使用new,自然也不支持new.targer。  (1)箭头函数的this指向全局对象,在箭头函数中使用箭头函数会报错     let fn = () => {         console.log(new.target)     };     fn() (2)箭头函数的this指向普通函数,它的new.target就是指向该普通函数的引用     new fn2();      function fn2() {         let fn = () => {             console.log(new.target)         };         fn();     } 三、箭头函数的arguments规则 3.1 箭头函数没有自己的arguments (1)箭头函数处于全局作用域中 箭头函数的this指向全局对象,会报arguments未声明的错。      let fn = name => {         console.log(arguments)     }     let fn2 = function (name) {         console.log(arguments)     }     //fn()     fn2()     let fn = name => {         console.log(arguments)     }     let fn2 = function (name) {         console.log(arguments)     }     fn()     fn2()  解析:普通函数可以打印arguments,箭头函数报错。因为箭头函数处于全局作用域中,在全局作用域没有arguments的定义,箭头函数本身没有arguments,所以报错。  (2)箭头函数的this如果指向普通函数,它的argumens继承于该普通函数     let fn2 = function (name) {         console.log('fn2:', arguments)         let fn = name => {             console.log('fn:', arguments)         }         fn()     }     fn2('gaby') 解析:两个函数打印的argument相同,都是fn2函数的arguments。  总结  箭头函数没有自己的arguments对象。在箭头函数中访问arguments实际上获得的是外层局部(函数)执行环境中的值。  3.2 可以用rest替代,rest参数获取函数的多余参数 rest是ES6的API,用于获取函数不定数量的参数数组。这个API可以用来替代arguments。  (1)基本用法     //形式是...变量名      let fn = (first, ...arr) => {         console.log(first, arr);     }     fn(1, 2, 3, 4);  解析:rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。获取函数的第一个确定的参数,以及用一个变量接收其他剩余函数的实例。  (2)使用注意事项 ①rest必须是函数的最后一位参数      let a = (first, ...rest, three) => {         console.log(first, rest, three);     };     a(1, 2, 3, 4); ②函数的length属性不包括rest  (3)rest和arguments函数比较 ①箭头函数和普通函数都可以使用rest参数,而arguments只能普通函数用。  ②接收参数rest比arguments更加灵活,完全可以自定义。  ③rest是一个真正的数组可以使用数组API,arguments只是一个类数组。  3.3 箭头函数不支持重复函数参数的名称     function fn(name, name) {         console.log('fn2:', name)     }     let fn2 = (name, name) => {         console.log('fn:', name)     }     fn('wang', 'gaby')     fn2('wang', 'gaby')  3.4 箭头函数不能用作Generator,不能使用yeild关键字 四、箭头函数的注意事项 ①函数箭头一条语句返回对象字面量,需要加括号。  ②箭头函数在参数和箭头之间不能换行  ③箭头函数的解析顺序相对||靠前  五、箭头函数不适用场景 (1)对象方法,且方法使用了this 对象无法构造单独的作用域      var name = 'gaby'     var person = {         name: 'gabrielle',         say: function () {             console.log('say hello', this.name)         }, //普通函数         say2: () => {             console.log('say2 hello', this.name)         } //箭头函数     }     person.say()     person.say2()  解析:person.say2()方法是一个箭头函数,调用person.say2()的时候this指向全局对象,达不到预期。对象无法构成单独的作用域,定义say2()箭头函数的时候作用域在全局作用域。  (2)回调函数的动态this     var button = document.querySelector('.btn');     button.addEventListener('click', () => {         this.classList.toggle('on');     });  解析:报错。按钮点击是一个回调函数,而箭头函数内部的this指向外一层普通函数的this,在这里就是window,所以报错。改成普通函数就不会报错  六、箭头函数与普通函数简单区别总结 (1)箭头函数语法更简洁清晰,快捷。  (2)箭头函数没有原型prototype,并不会自己创建this,并且this不能被修改,call等都不能修改到。只能间接修改被继承的this  (3)箭头函数的this在定义时就定了,继承外一层的普通函数  (4)如果箭头函数外一层再外一层都不能找到普通函数,在严格和非严格情况下都会指向window对象  (5)箭头函数的this指向全局,使用arguments会报未声明的错误  (6)箭头函数的this指向外一层的普通函数,使用argument继承该普通函数  (7)箭头函数不能构造函数,不能new.target,不能new,没有constructor  (8)箭头函数不支持重复命名参数,普通函数可以重复命名参数 ———————————————— 版权声明:本文为CSDN博主「傲娇味的草莓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_45709829/article/details/123931582 
  • [技术干货] 【HTML+CSS+JS】模仿QQ登录界面-转载
     部分代码不法暂时 某尾有原文链接前言 学了HTML、CSS和JS有了一个月了,JS还未学完,偷懒写一个小项目,用了一个下午,顺便巩固一下所学知识。(内容比较简陋,适合新手)  源代码:https://github.com/yeziyuhai/QQ-login-interface  简介 左边是我的,右边是官方的。没有设计稿和素材,只能自己找,所以是无法做到一模一样的,不够这样子也差不多了。  布局思路 很明显,简陋的做法是上下两个盒子,中间头像可以定位上面的父级也可以定位下面的父级,这里我选择的是上面,中间内容用一个表单包裹。注册账号和二维码使用定位,父级是大盒子。 .html      <!-- 登录界面 -->     <div>         <div class="login">             <!-- 顶部 -->             <div class="top">                 <div class="left">                     <span class="iconfont icon-QQ"></span>QQ                 </div>                 <div class="right">                     <span class="iconfont icon-shezhi"></span>                     <span class="iconfont icon-jianhao"></span>                     <span class="iconfont icon-chenghao"></span>                 </div>                 <div class="head">                     <div class="green"></div>                 </div>             </div>             <!-- 底部 -->             <div class="bottom">                 <!-- 表单 -->                 <form action="javascript:;">                     <div class="input">                         <div class="text">                             <label for=""><span class="iconfont icon-QQ"></span></label>                             <label for=""><span class="iconfont icon-xiala"></span></label>                             <input type="text" placeholder="QQ号码/手机/邮箱" name="uname">                         </div>                         <div class="password">                             <label for=""><span class="iconfont icon-suoding_huaban"></span></label>                             <label for=""><span class="iconfont icon-jianpan_o"></span></label>                             <input type="password" placeholder="密码">                                                        </div>                     </div>                                          <div class="check">                         <!-- 点击文字也可以选中 -->                         <label><input type="checkbox" >自动登录</label>                          <label><input type="checkbox">记住密码</label>                          <a href="https://accounts.qq.com/find?aquin" target="_blank">找回密码</a>                     </div>                                          <input type="submit" value="登录" class="loginBtn">                 </form>                 <!-- 其他 -->                 <a href="https://ssl.zc.qq.com/v3/index-chs.html?from=client&regkey=1720F6EE975B2AFF081EC88BCAE91F145C04012178E039924F1CC17DB69AC184&ADUIN=0&ADSESSION=0&ADTAG=CLIENT.QQ.5929_NewAccount_Btn.0&ADPUBNO=27255" class="signup" target="_blank">注册账号</a>                 <span class="iconfont icon-ico"></span>                 <!-- 手机登录二维码 -->                 </div>                 <div class="mobile">                     <img src="./images/erweima.png" alt="">                     <p>用QQ手机版扫描二维码安全登录</p>                      <button class="back">返回</button>                 </div>                 <!-- 设置 -->                 <div class="setup">                     <p>懒得弄了</p>                      <button class="back">返回</button>                 </div>         </div>     </div>相关代码 颜色渐变动画 思路是渐变45度角倾斜,之后动画改变定位,当然和官方的不一样,做出差不多效果就行。 .css  .login .top {   position: relative;   width: 100%;   height: 40%;   background: linear-gradient(-45deg, #23A6D5, rgba(106, 103, 255), rgba(158, 81, 255), #23A6D5, #23D5AB);   background-size: 400% 400%;   animation: bg 4s infinite linear forwards;   color: #fff; }  @keyframes bg {   0% {     background-position: 0 50%;   }   50% {     background-position: 100% 50%;   }   100% {     background-position: 0 50%;   } 头像 头像绝对定位,顶部相对定位,小绿点绝对定位。  .login .top .head {   position: absolute;   left: 50%;   top: 100%;   width: 50px;   height: 50px;   border-radius: 50%;   border: 2px solid #fff;   transform: translate(-50%, -50%);   box-shadow: 0px 5px 10px 0px rgba(118, 118, 118, 0.4);   background-image: url(/images/head.png);   background-size: contain;   background-repeat: no-repeat;   background-color: rgba(234, 28, 39); } .login .top .head .green {   position: absolute;   right: -10px;   bottom: -8px;   width: 14px;   height: 14px;   border-radius: 50%;   border: 2px solid #fff;   transform: translate(-50%, -50%);   box-shadow: 0px 5px 10px 0px rgba(118, 118, 118, 0.4);   background-color: rgba(9, 241, 117); } 表单区域 直接搬.less过来,清除一些。这里面挺多细节的,先说好字体大小浏览器最小只能是12px,除非你把自己浏览器最小字号调到10px,视觉上好看一些,不然下面复选框的字会换行。  添加了textChange类,因为需要点击输入框之后样式的改变。  这里耗费我比较多的时间,挺多细节,毕竟我这个人追求完美。 .less  form {             position: absolute;             left: 50%;             top: 50%;             transform: translate(-50%, -50%);                          text-align: center;             margin-top: 8px;             .input {                 .text {                     position: relative;                     width: 100%;                     border-bottom: 1px solid #ccc;                     margin-bottom: 5px;                      .icon-QQ {                         position: absolute;                         left: 0;                         top: 0;                         color: rgba(184, 186, 188);                     }                      .icon-xiala {                         position: absolute;                         right: 0;                         top: 0;                     }                 }                  .password {                     position: relative;                     width: 100%;                     border-bottom: 1px solid #ccc;                      .icon-suoding_huaban {                         position: absolute;                         left: 2px;                         top: 4px;                         font-size: 12px;                         color: rgba(184, 186, 188);                     }                      .icon-jianpan_o {                         position: absolute;                         right: 0;                         top: 0;                     }                 }                  // 要放在后面,不然层叠                 .textChange {                     border-bottom: 1px solid rgba(28, 196, 252);                     .icon-QQ {                         color: rgba(28, 196, 252);                     }                 }                 .passWordChange {                     border-bottom: 1px solid rgba(28, 196, 252);                     .icon-suoding_huaban {                         color: rgba(28, 196, 252);                     }                 }                  input {                     width: 80%;                     height: 20px;                     /* 去掉默认边框样式 */                     border: 0;                     outline: none;                  }             }              .check {                 display: flex;                 justify-content: space-between;                 width: 100%;                 margin: 5px 0;                 font-size: 10px;                 color: rgba(166, 166, 166);                  // 多选框大小                 input {                     // ohhhhhhhhhhh                     float: left;                     transform: scale(.8);                 }                  label {                     position: relative;                     margin-right: 12px;                 }                  a {                     color: rgba(166, 166, 166);                 }                  a:hover {                     color: rgba(166, 190, 177);                 }             }              // 点击登录             .loginBtn {                 width: 100%;                 height: 28px;                 border-radius: 3px;                 background-color: rgba(28, 196, 252);                 color: #fff;                 font-size: 12px;             }              .loginBtn:active {                 background-color: rgba(34, 174, 250);             }         }          .signup {             position: absolute;             left: 0;             bottom: 0;             margin: 5px;             font-size: 10px;             color: rgba(166, 166, 166);         }         .signup:hover {             color: rgba(166, 190, 177)         }  JS相关 拖拽界面、界面关闭、输入框显示、点击二维码使用手机登录  部分代码不法暂时 某尾有原文链接 .js  // window.onload是窗口(页面)加载事件,当文档内容完全加载完成会触发该事件(包括图像,脚本文件,CSS文件等),就调用的处理函数。 window.addEventListener('load', function() {     // 1.登录界面     // 关闭     var jianhao = this.document.querySelector('.icon-jianhao');     var chenghao = this.document.querySelector('.icon-chenghao');     var login = this.document.querySelector('.login');     jianhao.addEventListener('click', function() {         login.style.display = 'none';     })     chenghao.addEventListener('click', function() {         login.style.display = 'none';     })      // 输入框     var text = this.document.querySelector('.text');     var password = this.document.querySelector('.password');     var textInput = text.querySelector('input');     var passwordInput = password.querySelector('input');          textInput.addEventListener('focus', function() {         this.placeholder = '';         text.className = 'text textChange';     })     textInput.addEventListener('blur', function() {         this.placeholder = 'QQ号码/手机/邮箱';         text.className = 'text';     })      passwordInput.addEventListener('focus', function() {         this.placeholder = '';         password.className = 'password passWordChange';     })     passwordInput.addEventListener('blur', function() {         this.placeholder = '密码';         password.className = 'password';     })       // 拖拽界面     // 新的坐标 = 鼠标离盒子内距离 - 鼠标距离在网页距离     var top = this.document.querySelector('.top');     top.addEventListener('mousedown', function(e) {         var x = e.pageX - login.offsetLeft;         var y = e.pageY - login.offsetTop;         document.addEventListener('mousemove', move);         function move(e) {             login.style.left = e.pageX - x + 'px';             login.style.top = e.pageY - y + 'px';         }         document.addEventListener('mouseup', function() {             document.removeEventListener('mousemove', move);         })     })      // 手机登录     var ico = this.document.querySelector('.icon-ico');     var mobile = this.document.querySelector('.mobile');     var bottom = this.document.querySelector('.bottom');     var head = this.document.querySelector('.head');     var back = this.document.querySelector('.back');     ico.addEventListener('click', function() {         mobile.style.display = 'block';         bottom.style.display = 'none';         head.style.display = 'none';     })     back.addEventListener('click', function() {         bottom.style.display = 'block';         head.style.display = 'block';         mobile.style.display = 'none';     }) }) 总结 多动手技术才会提升,写代码才会熟练,之后也会更新这一系列文章。 ———————————————— 版权声明:本文为CSDN博主「叶子与海」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/btufdycxyffd/article/details/127507693 
  • [技术干货] HTML爱心网页制作[樱花+爱心]-转载
     部分代码无法暂时 某尾有原文链接可查HTML+CSS+JavaScript实现 先点赞后观看,养成好习惯 “不想动手的小伙伴可以直接拿网盘成品” 阿里云盘------提取码: 0d5j  效果图  注:任意浏览器都可以,建议使用谷歌浏览器  代码部分 代码如下仅供参考 可以直接拿去复制粘贴  <!DOCTYPE html> <html>   <head>     <title></title>     <script src="js/jquery.min.js"></script>   </head>   <style>     * {       padding: 0;       margin: 0;     }     html,     body {       height: 100%;       padding: 0;       margin: 0;       background: #000;     }      .aa {       position: fixed;       left: 50%;       bottom: 10px;       color: #ccc;     }      .container {       width: 100%;       height: 100%;     }     canvas {       z-index: 99;       position: absolute;       width: 100%;       height: 100%;     }   </style>   <body>     <!-- 樱花 -->     <div id="jsi-cherry-container" class="container">       <audio autoplay="autopaly">         <source src="renxi.mp3" type="audio/mp3" />       </audio>       <img class="img" src="./123.png" alt="" />       <!-- 爱心 -->       <canvas id="pinkboard" class="container"> </canvas>     </div>    </body> </html> 
  • [技术干货] 如何让单选框选中后下次进入后还能保持选中啊?
    如何让单选框选中后下次进入后还能保持选中啊?或者如何让网页自动判断单选框被选择过?
  • HTML小游戏4 —— 简易版英雄联盟(附完整源码)-转载
    给大家安利一个免费且实用的前端刷题(面经大全)网站,👉点击跳转到网站。  本节教程我会带大家使用 HTML 、CSS和 JS 来制作一个 简易版英雄联盟小游戏  本节示例将会实现如下所示的效果:  在线演示地址:https://code.haiyong.site/moyu/damaoxian/ 源码也可在文末进行获取  ✨ 项目基本结构 大致目录结构如下(共27个子文件):  ├── css │   └── style.css ├── js │   ├── Base64Images.js │   ├── cocos2dtgme.js │   └── app2.js ├── res │   ├── bg │   │   ├── map1_01.jpg │   │   ├── map1_02.jpg │   │   ... │   │   └── map1_09.jpg │   ├── npc.png     │   ... │   └── start.png └── index.html 场景展示   HTML源码 <img src='share.png' width=1 height=1 /> <div class="orient" id="orient"><p>请在竖屏情况下使用</p></div> <div id="loadicon"><img id="img1"/><br/><img id="img2"/><br/><img id="img3"/></div> <canvas id="gameCanvas" width="445" height="700"></canvas> CSS 源码 html,body  html, body {     background-color: #191919;     margin: 0;     padding: 0;     width: 100%;     height: 100%;     text-align: center } id 为 loadicon 的 div  #loadicon {     margin-top: 250px; } id 为 orient 的 div  #orient {     margin-top: 50px; } 1 2 3 p 标签  p {     color: #FFFFFF;     font-size: 24 } JS 源码 js 代码较多,这里提供部分,完整源码可以在文末下载  横屏提示  function orientationChange() {     if (window.orientation == 90 || window.orientation == -90) {         document.getElementById("gameCanvas").style.display = "none"         document.getElementById("orient").style.display = "block"     } else {         document.getElementById("gameCanvas").style.display = "block"         document.getElementById("orient").style.display = "none"     } } document.getElementById("orient").style.display = "none"; orientationChange()  window.addEventListener("onorientationchange" in window ? "orientationchange" : "resize", orientationChange, false);  function trace(v) {     //    console.log(v) } var ccConfig = {     "debugMode": 0,     "showFPS": false,     "frameRate": 30,     "id": "gameCanvas",     "renderMode": 1,     "engineDir": "./../",     "modules": ["cocos2d"],     "jsList": [] } document["ccConfig"] = ccConfig; document.getElementById("img2").src = cc._loadingImage; document.getElementById("img3").src = cc.tgideasLogo; var GD = {} GD.GETNUM = 0; GD.SCORE = 0; GD.isApp = true,     GD.isWin = false; GD.MAXHITUM = 0; GD.SHARE = "我没能完成勘探新召唤师峡谷的,你行你来啊!" GD.MAXTIME = 60; GD.SOUND = false; GD.USETIME = 0;  function complete() {     orientationChange();     document.getElementById("loadicon").style.display = "none";     cc.game.run(); }  Base64Images.js  var cc = cc || {};  cc.barWidth=265; cc.barHeight=25; cc.barColor=[255,255,0,255];  cc.barBgColor=[41,41,41,255]; cc.bglayerColor=[25,25,25,255] cc.tglogotexture2d=null; cc._loadingImage = "data:image/gif;base64,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"   cc.tgideasLogo="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJ4AAAA1CAYAAACwXlJWAAASXklEQVR4nO2deZhWxbHGf8UMyCIoixiCgiIiohKCoiQXxajghhohuBujcY9xuSiKeHNd4gp6FaJRcQFcICGij1FzIyJxuRrRaBD3ABcMUdSIENlkmTd/VJ+ZnjPn22BYxO99nvPMnD69d3V1dXdVfUYZ33hI2groDewIGDAbeMXMFm/UipWxeUPS1ZLelrRE0nJJf5c0UdKOG7tuZWyGkFQpaZJyY4WknTZ2PcvYzCDpJEkr8xBelaR7JFXWd9kN6jvDMr4ekFQBHA7kIyoLcbas7/LrnZLL+NqggprNxO+B94F2QEfgVaAJcAbQKsStV2z2HE9S5zC71yWPNvVVn00Mq8PfbwM/ApoD/wB+ALTG6aMK0Eap3dcZkq6RNGJdiE/SCZJmStq2Puu2MSGpgaTbghyXD29JqveldrPneMCHwLnAzZLWtr0Lgd2A+yQ1r7eabUSYWRW+xH6VJ1oV8FtgaX2Xv0FkvMBtmhYZvQHwZeiYJH0lsEURac3MlqTDQtkXAE0lXWRma9ORBhwGvCTpIDP7pNQMJFWY2ZoS05iZlbTUSTJcRsvCGjNLiK0V3t9J/hbF+wp4Abix1PKLwXonvEA01+An48VgLnARsCikbw7cBHQqkK4BMFVSuqMaR///BGgSiO+fRdYnjd2BhyQdV0oeks4HGki6rdiBlNQQuFLSGDObW2SaRsAVQI8cUeYldQEOAF4OT1ugO95fs4EngftKnSibBCQ1kfTHIuSIBM+F2ZqkbyVpVpHpn8qSRSTtn4pXJemuEttxSCqPdyV1KCH9ZaHcNZKGFZmmsaRnQrr3JDUuIk2lpNsL9NfLcvnOJLVN9bdp7cWRTQOS2kmaLGl1EUSjEPdbUfqOckIsRHSrJD0gqWWOepikMyUti9Lcnqfe7SX1T4WlCe8dSdsX2Q+XS/oylf6XykNIkppK+l2q796U9N08aVpIGqX8B8KS9KK+7sSVC5J2kTSnCKJJMFFSiyh9J/l9YaH0VfIZnpcbSKqQdKj8CkiSbskT9xlJiyX9OApbF8I7S9LSVPoVkkbnSbOVpL9mtHWepDoih6QtJT0i56iFMFObAOGtLxnvX8BgYFkUtiL8TRNJFTDHzFZBtWA8DNguijMBuDmjHAFvmdnKOh+8cwcAtwFnAf8LHAfcT0a7AyH9BvheCLpVLp+Oz9nK4jAm/P0FfkBr+EbpPEkCLk9viMxssaRjgbHUyMYGdADekHS4mb0Y6t0QuB04mtqbg0XAw8DnqfrMYxM4l1svhGdmHwMfx2GSDgJ2N7Nbi8giLdB+amZ/KbEah+CD3hYfwFOAx4FzgM6purUGJgL7RMEtgauBxwoVJKk3EHPA181stqQ98U3RfHzyXEjtW4AVnlxHUDMhq4CnzOx9SceENhwcpWkBnCrppbDzb4gf/MZEtxK4FLgnPh34RkJSf0n/knR8gXgm6Y7U8jBKkRBcRFkDcywzA5U6SJbfbHyaEXeWgkylAkutfHmOMTSEP5ajHsskXRviVKi2XFalaOMilzmnp9Lfq2i5lNRS0pPh20JJg6NvbbQeLvnXFRtyrV+Dz8zRks5TCYSUIAxS4/C/yXdnleGJ2/IOzt3S+DVwYipsH2CbVNgM4Dgze6PIqqWPVRIR49Mc8a8KT4JF0f9rcK4HgJn9A5iar3Az+wI/KroPOMvMJgFI2g34A368sklhQ86EhNBaA7cCW6rumVsuJHGaAg9K6gMsD3lWhuc/gXEAZvaepBPw5XNAlE9bYJykSjO7L4StSpX1DjDAzOaX1Lrs+qb7dw1wupmNLTJ9gvQkrdNnZvYZ8NPqCFIP4CX8IHkv+VHTJevjMHhtsLF2NxX4DC3mNgKgysxkZl8CQ/AObY9fbrfFT+Br3YyE24lTgQdwmSdG3zxlzcAvytcFyc3I67hsNwEX9H9aJNEtKxAn3zUX8hOCh6h9e3EO8F8F8t1g2Jjb6lKE3n0ltQUws1nAyfjJeozV6UThZuEMfLcaI9+VWSXrrgZ0SPj7a3yCJU8xO+QK4MACcXqSf7VaAkyi9iatKTBcec4wNyQ2JOGly8rH8tMDvyfwhKRuAGa2CPgx8AQZBJfCSuCzEuqpAnXLQsPU+7GSxgDNzGxleFblWOZE7SOmBsAkSWfIj0qy8u8NPCepMxkIO9mrcTlyYfSpEXC6pOu0kZUdNiThrSgcBcLg/Iq6gnkvYKKkXUO8hfi53Hice+a7U8x1YZ71LYs4CokEY6g9wOATY2yhHWUgkvszPo0Azg7/349r2cToDUyW1BWqr8taJA+uNXwdTnxx3zcCLgb2KNCmzQdya6bkFP9t5b822kZ+ep++vZgjqWuyK5bfB0+XdHmevH6k2kcmd0TftpffhSblLJXfEHwo6X35nWkbSS/Jr+ekjJsLSYPDUUYaUxVdBeaoX1O5bUPWzcNFkhpK2kF+6xBjhqRdQh6Hyi3E0s+nUb2T9l1Y7JhtFgiDOCx0wExJeTmJpC6SXs0YjHmSDo7itVaBS3tJfSXNDul/lfq2rVzJIE3kyyU1CXGaSbpLfn/6tjKuzCT9QD4xYkxXEWaC8muvX6jmWi/BAwrXiZK6qeYq7U+KllpJAzL6KY2lkk6Va7B88yDpwkAE+ZbAOP4LqssNlkvaWyVoFkvqJekjSXWWNrkmzFsp4lsS11F+bvhwILxMQpe0n5zLVMkv9gtqlaTyHy7nUKslTcqIs6WkB9PEI+nwAkS3WNKRxdZls4RcHjmlBMLrID+tfzL1PC2pV4llHyLnLHXkW/kNwEOS5sq56qwswpFz7fZ5yugj6T4VqUiQSlsp12i5RVKzEtIdKOn1HM90ScdmtXljoeTbg/qCStSslQvpWdxt9Vpo9ebUBJbvJKtFgAyNZiQ1KHQHKj+kLrTjrrf0gahycVeZ2fK1rUsZZZRRRhlllFFGGWWUUUYZZZRRRhlllFFGGWWUUUYZZZSx4SHXd6tzR1rqhbNSVmVpBYGgHVKU8ZHc0r4Uc8eGcv2+OmnkunA5NVzkunj16hEzV98FJYWCfRDqXLSzSLl1XovCMfPm0ayUPi+EypBpZ9wFV4LxwMlmNhrXYr0rFNrTzB4KcYZKGotr8B6RI//xQU0d4Ei54fQ4XJV7qKTrzWyl/HcW7gF+RsoQPAfGAZdLOhEYVYTLsAHAZbjG8v+nvp0N/Ak3zMnC9cBdwGtZHyXtDbQ3s0fDew9gvyjKSuCJlNXaUEljzWxBKrvJuNH3jALtORIYhHtrKAYdgWsl/Sxobq8NhgH/Q13PBNWQK+PmUnr9ArgpcRGXzLzvAmfiVu+34qaDx0s6E1ex3gYYSW37hsbAFFyVuiXQDe+MluG5GbcAS/AMcB5u0b8mlJV8PwnYGthV0gGSdpK0haQrU0/ikXPvUBcB05THY2XQNhkC/A03jWwtV/xM7Fp3wO19kfR9ud5f9QOcBrwS3hOPT1MjDtIEN5lMFFP7An2ifjgW6JKqVmNgSka9eyV1KYBm1LUFzgkzm4OP9X6F4kK19vfFqeDO+FgncW5UULuP8H3gOXwCpZ/dicwMYrb+LjAa+Dmuj/8KTpDbAfviPtM6StrVzN7FbQK2xU0Pr5Jb3Q82s6tCxS5LNX6p3AvT2bjpXeL77TOcI02hxgb2WdzGIDHSaYHbzd4d3hO3DaNDvXoAL2Z04LeAW4CngBtxIrojPLul4lbgvvk6hnqcEMpcgKtj9Qf6AcPxibkmtOs5SUfjBAzQBhhrZk+FfLOWuBG41dcBZBuex/VqDAyk9iTeB2ivuirsE9LcX9I1wC9xHzIjJE0pwjHlFtSdLGl0x8clxlLgZTP7KFUHwy0DqxETXmtqnPm9gw/U/ripXGL8LGAxVBPSBVkOc9IIM3s43gGjcQOUWcDvcCeMr+AuT8EH9G/4DN0SJ5xdcc6xh6RzcU6SDNgXwHxJPzSzaqMWSa1wW9YPgJvNbI1c83hlyC+NlqHNiR+SBqGeq8J7S9yedUSIfzdO0OATpUJuiHQUcGeUbxPguMAdHjWzj0PfDaewhRw4d7sYd06ZYHFoR7xUDwP+D/gkTKLu+JLdE584bwLPA1tL+g4wxMwGFVH+ekFMeF1wr0qGN7QvToh/xomiHfA2wRIfXzIXSjoL75ytgcZB6E0T43LgE3ygTsJnRltgJ5zID8FlsG3wJfso3Gh7J+B0nPu9iXO6ucBf8aX/cXzCfBYTXcDOoZweuAdPcC7zHj77D4ojBxvck+UmlP3INppuAGxlZtcDSLoUOCa0pRcuC14HxDN+JG5xtjXQXNKtoc5TgGdDHgm2AK6RlMhRfyA4DTKziUmkoJncNRV2WpRPk1CPo6P2LcGJE3lnfE9SPzObktFOgG1VW1W+PdBf0hfhfeuMNKuA34a+TuMTIq8NMeG9jA/+B7h3pf/AOcY43FJ/KO7D4+mQbiXu1PoEfFPQJFRmf2A6kbZw4Daj8M5ONhu7hTImm9nxgWDvxjv6VTNbLemGkGYmvow8ASCpH87pVuEC75nUNZ+cDtyLL5eXhLA+uPiQD93xCfBIxrdtQ59cH95H4TLNJDNbIOlJfPKeker8583sujBhL8UnbTKRL4niHYqLAclGZjFrpyXeg9RAxzCzjyRdDRwj6dkMbexFuM1y/HNSzXAxpFV4H09dk8tzyG0MXwV8mbzEhLcVsEv4f3R4bxUya4dzvl74bL0K331Wmdm9wL2RjHc5gKRTiIRRM6uStBBfXnbFNzF9gJ3lThC74AO7ECfIZ8xsjqQrQn2GRHWdHerxc9wFWJ1fGTQzSVqFE+SHgfi7kd/+NsEpZO/UK4mEfzNbLunL6PsDuPw1jhqu1x93tUFQZZ8bOFpLM1tGtMsOnOhjM4vDWoe/yRIPLqh3SoXtHP1/BvBGaHOuNo7DXXy0wYk0xlfAI/EOWNI+wJjggi7huhXh/+/gm8lk8jfF/V6/h/uvSfpoK0lXmtnUmPBa4psKA84HpuGzbxG+G2qM+wB5KQxqrgbF6Ai8Fb3fCdyA+5JL+wdJfIakLfmX40vsfjjBgW8k/hufhf0K2FwYcJKkfUN9xuSJm2Ae3mlpNCOPE/DASZ4CDjOzs+RuN/rjXG5tsQYXL6ZFYQ3xpS8O6wKsCPL0YeRpp6TuuNgwGd8UpQlve1w8uDJPvfrjK9z9uCzemBrufVz41gifgIl8ehNOZ9Ucz4A5uLB/He7R8w5qOnkJzqkexJeqag4jqSnZflCeB0zS47hMNQ1fApbhnZQ0dp6ZjQ/nYS0iL05I2g5f9ofi53aP4RNhUeicbma2KAjqD5rZvIx6CBcR5uAD2B7nWg/Xiei7r6dx2aorvsQ/jzvbmRGWSklqlToPs7D8r8a53tnhuOYA/Azvzxn1SgyYeprZ9KzvUO2uY2AqXTugR7JzDkh20a1DnTPPHQP6A53M7Nwc3yuou2NNowm1HSUtS9y6hUme4J9ReLU7tuQcrzt+zpYg64fTnsZnX0J0DXBZaDz+E0RpzMQJrStOKEfh1N8DmGFmfw/p52a1Su7b42bcB8g9uMw1EF9eR+I730MDyx9CbjcVjcxsvpm9EMo8H+hvZpMDocUyyYn4xOsKjAxL4RDczZeFb3sCEyQlS1sHXCQZiE+m5jgnGRbCn1GND5QYO+Lc4uiMb2sNM/vczAZFm62WRNZncnvcvfDNW32ikdxhesdQZoLmUXg1oVbKf490f/yo4zxcZppEDTc8EN+S/wRYZDW/2twT54gX4PJf91RFRuLCcwvc7ddpwF9wNjxG0qP47vFJSXfju9k3o/SDcXlvVJBVrsBn9XJ8J9kUn9nJgfQHGZ3xBdA7LH9fhTTdgVGS7sRl157APYHQr8UnyHKgg/ynAVbjk+y2kP51fFOxE078i/DJ8Bq+sRiEb2z2wjneRGCBpIm4jLQy9Nt+uIyV9npV31gGvC8pWZUMdyR5UoF0Z8pvhhK0AA6M8tkCPyJL0AlfJcFFmmQs+0bhPQl+YizMgGT5PBTfZVYvWfIroCNwwXFCcvUj6dtAEzObHd53APYxs99EafsBXczsdkkDQid0wA+Qj8R3Re/iA5AItJ+HtBbyXxbl1wn4JDkADe+nA9NyHQtI6osL0Alexwn6hBA+y8wmhLito/IH45yvOiv8YLiOw8ZwbnYOvow/jDsEV/jWHCfGzsBVZrZK0h7AguBMMc7nfuAGM3s/qy1RvP2Bfc3smnzxQtxmuFiSrG5VwPwse+EoTSNSfqIzsD3wuZm9JqkLMCg6ZjoY7+MPgN5m9scQPgh4J1xAlFEfUD1eoH8T8G/S6hUOQv7wEwAAAABJRU5ErkJggg=="; cc._fpsImage = "data:image/png;base64,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"; cc._loadingbar="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQwAAAAZCAYAAADE4BAPAAABcUlEQVR4nO3bsUpcURSF4X8rA8EHMMGnEGxEEVLmNVIFC0sxYKtFgoUkVZr4JoEYAmkF30AQsVMQBpLMtnAax+2MxdzJifxfd9n7wqoWl8s5IEmSJEmS1L6YtJCZc0/Zk/TfSiAjIictPloEw6JYBnaBVWBpavEktWIAnAHHwMeIOB23XBZGZi4A29yVRW/aCSU1J4FrYA84jIg/1dKDwsjMeeAzsNlpPEkt6gOfImKnGt4rjMwM4DXwrftckhp1BbyJiF+jg7ni+d1MIklq1QvgbTWoCmOj8ziSWtYD1qvBaGEAvOo2i6TGBbBYDarCkKRSVRgXM08hqSUJXFaD0cIYAD86jyOpZb+Bn9WgKowvnceR1LI+cFQN7hXG8Cz5MfB1BqEktacPHFVnMKD4hxERf4Et4AN3XxySnr8EboB94P1jS+Mun80DK8OX14CXUw4o6d8bAOfAd+AAOBl3a9Xr7ZKefL1dkiRJkiRJkp6VW+6FRsNvbjMxAAAAAElFTkSuQmCC";  cc._loaderImage = "data:image/png;base64,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" /*  |xGv00|0cb03e49192ffd9f81ac0947222ee14e */ 图片资源 一共两百多张图片,全都打包放在文末的下载链接里了。   源码下载 1.CSDN资源下载(需要VIP):https://download.csdn.net/download/qq_44273429/86861932 2.从学长的资源网下载(更优惠):https://code.haiyong.site/579/ ———————————————— 版权声明:本文为CSDN博主「鲸落✗」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_53544522/article/details/127609148 
  • [技术干货] 鼠标放上去超链接的文字逐个加色效果【转】
    HTC实现鼠标放上去超链接的文字逐个加色效果link.htc      css文件中的调用方法 A {      FILTER: progid:dximagetransform.microsoft.gradientwipe(duration=1); BEHAVIOR: url(jcss/link.htc); HEIGHT: 1px; TEXT-DECORATION: none  } 
  • [技术干货] hta 实现的五子棋界面【转】
    保存为 五子棋.hta,运行即可看到效果  五子棋界面 - zh159   ID="MyhyliApp" APPLICATIONNAME="五子棋界面 - zh159" BORDER="thin" BORDERSTYLE="" VERSION="1.0" SCROLL="no" ICON="C:\WINDOWS\System32\wuauclt.exe" INNERBORDER="no" CONTEXTMENU="no" CAPTION="yes" MAXIMIZEBUTTON="no" MINIMIZEBUTTON="yes" SHOWINTASKBAR="yes" SINGLEINSTANCE="yes" SYSMENU="yes" WINDOWSTATE="normal" NAVIGABLE="yes" />                                     电脑先下直接点击为玩家先下            
  • [技术干货] Python实现读取HTML表格 pd.read_html()【转】
    目录Python读取HTML表格pd.read_html读取数据不完整问题解决办法Python读取HTML表格数据部门提供的数据是xls格式的文件,但是执行读取xls文件的脚本报错。xlrd报错:xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'<html xm'读取xlrd的脚本123456789101112131415161718data_lines = read_excel_file(self.file_path) def read_excel_file(file_path):    """    读取excel文件    """    import xlrd    print('[Info] excel file: {}'.format(file_path))    book = xlrd.open_workbook(file_path)    sheet = book.sheet_by_index(0)    data_lines = []    for row in range(0, sheet.nrows):        line_data = []        for column in range(0, sheet.ncols):            val = sheet.cell(row, column).value            line_data.append(val)        data_lines.append(line_data)    return data_lines  # 二维数组原因是文件格式是HTML表格,参考python xlrd unsupported format, or corrupt file.使用pandas的read_html读取文件,同时替换nan为空字符,数据格式保持一致。1234567891011121314151617def read_html_table(file_path):    """    读取html表格    """    import pandas as pd    pd_table = pd.read_html(file_path)    df = pd_table[0]    # num_col = df.shape[1]    # num_row = df.shape[0]    df_data = df.values.tolist()    df_data = df_data[1:]    for r_idx, row in enumerate(df_data):        for c_idx, value in enumerate(row):            # 判断nan,参考https://stackoverflow.com/questions/944700/how-can-i-check-for-nan-values            if value != value:                df_data[r_idx][c_idx] = ""    return df_data读取问题解决。pd.read_html读取数据不完整问题问题:有一个较大的表格数据存在了html中,打算用read_html直接取出来这部分数据,但后来发现read_html读取的数据不完整,后来检查html的table都没有任何问题解决办法pd.read_html的默认解析器为 'lxml' ,添加参数flavor='bs4'便可解决
  • [技术干货] html2canvas 使用总结
    话不多说,在实际项目中生成截图是很常见的需求,而一般的,我们都会选择使用js库来自动生成(从头造轮子太难了...),比如今天的主角:html2canvas使用先来看下如何在 vue 项目中应用的import html2canvas from "html2canvas"; // 生成快照 const convertToImage = (container, options = {}) => { // 设置放大倍数 const scale = window.devicePixelRatio; // 传入节点原始宽高 const _width = container.offsetWidth; const _height = container.offsetHeight; let { width, height } = options; width = width || _width; height = height || _height; // html2canvas配置项 const ops = { scale, // width, // height, useCORS: true, allowTaint: false, ...options }; return html2canvas(container, ops).then(canvas => { // 返回图片的二进制数据 return canvas.toDataURL("image/png"); }); } // 调用函数,取到截图的二进制数据,对图片进行处理(保存本地、展示等) const imgBlobData = await convertToImage(element);仅此而已~~~遇到的问题如果只是这样就结束了,那这也太简单了吧,但是人无完人,再美的东西也会有瑕疵,下面列举一些 html2canvas 的问题及解决办法1、图片跨域解决方案:设置配置项 allowTaint: falsecanvas 的 CanvasRenderingContext2D 属于浏览器的对象,如果渲染过跨域资源,浏览器就认定 canvas 已经被污染了 Taint:污点设置配置项 useCORS: false表示允许跨域资源共享,注意不能与 allowTaint 同时配置为 trueimg 标签中添加 crossOrigin = "anonymous"anonymous:如果使用这个值的话就会在请求 header 中带上 Origin 属性,但请求不会带上 cookie 和客户端 ssl 证书等其他的一些认证信息图片服务器配置 Access-Control-Allow-Origin: *重要的配置项,是跨域问题的根本源泉,需要后端配合2、截图锯齿解决方案:根据设备像素比进行缩放// 设置放大倍数 const scale = window.devicePixelRatio;3、截图不全解决方案:截图之前将页面滚动到顶部document.body.scrollTop = document.documentElement.scrollTop = 0; const imgBlobData = await convertToImage(element);4、对 css3 支持不好html2canvas 暂不支持的 CSS 样式属性:background-blend-mode、background-clip: text、box-decoration-break、repeating-linear-gradient()、font-variant-ligatures、mix-blend-mode、writing-mode、writing-mode、border-image、box-shadow、filter、zoom、transform解决方案:对于一些必要的样式,可以选择使用图片做兜底实现box-shadow 可以参考 这个pr,修改源码解决,但是,实际效果也不是太理想……5、svg 标签问题原因:vue-lottie 动画库渲染的标签是 svg(也可能是你自己写的 svg 标签)html2canvas 对于 svg 标签的支持也不尽人意,解决办法同样是用图片做兜底在项目中,我们是用 svg 做动画,截图的时候把动画换成一张静态图,这样只要设置要静态图的样式,截图效果还是可以接受的6、其他建议:在页面开发前尽量跟产品确认好这个页面到底要不要截图,如果需要截图,那么搬砖的时候就要注意不要使用以上 css3 特性了,否则,就后期就只能含着眼泪、咬着牙修 bug 了不要问我是怎么知道的~~~原文链接:https://www.jianshu.com/p/e74dab30ea2c
  • [技术干货] nginx编译安装操作手册
    1:从官网下载nginx压缩包;nginx.org2:移动到linux系统中3:解压xxx.tar.gz 文件 tar -xzf nginx-1.20.2.tar.gz -xzftar命令 https://blog.csdn.net/qq_36697196/article/details/1240468024:查看文件结构5: 查看文件的类型使用file命令,file configureconfigure: POSIX shell script, ASCII text executable中文翻译:POSIX shell脚本,ASCII文本可执行;说明这是一个可执行的文件 名词解释:POSIX:可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX )POSIX是Unix的标准。ASCII (American Standard Code for Information Interchange):美国信息交换标准代码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。 6:编译安装,因为是用C语言写的,所以需要编译安装一次,它不像java一样随时都能跑起来。也有编译好的版本可供选择,这里我选择使用源码编译安装。  命令:./configure --prefix=/usr/local/nginx--prefix 源码安装,告诉我安装到什么地方。我这里安装到了usr/local/nginx现在安装的是最赤裸,最纯粹的nginx。7:  错误提示:./configure: error: the HTTP rewrite module requires the PCRE library.You can either disable the module by using --without-http_rewrite_moduleoption, or install the PCRE library into the system, or build the PCRE librarystatically from the source with nginx by using --with-pcre=<path> option.HTTP重写模块需要PCRE库。如果你不需要这个PCRE这个类库可以使用--without-http_rewrite_module禁用这个模块。两种选择1:不用这个模块 2:将这个模块加上。8:安装PCRE类库:yum  install  -y pcre pcre-devel9:然后继续执行:./configure --prefix=/usr/local/nginx10:又报错:./configure: error: the HTTP gzip module requires the zlib library.You can either disable the module by using --without-http_gzip_moduleoption, or install the zlib library into the system, or build the zlib librarystatically from the source with nginx by using --with-zlib=<path> option.这次是HTTP gzip模块缺少zlib 类库,所以需要安装一下11:安装zlib库:yum install -y zlib zlib-devel 12:继续执行:./configure --prefix=/usr/local/nginx输入的内容有安装的地址,日志等路径信息。Configuration summary  + using system PCRE library  + OpenSSL library is not used  + using system zlib library   nginx path prefix: "/usr/local/nginx"  nginx binary file: "/usr/local/nginx/sbin/nginx"  nginx modules path: "/usr/local/nginx/modules"  nginx configuration prefix: "/usr/local/nginx/conf"  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"  nginx pid file: "/usr/local/nginx/logs/nginx.pid"  nginx error log file: "/usr/local/nginx/logs/error.log"  nginx http access log file: "/usr/local/nginx/logs/access.log"  nginx http client request body temporary files: "client_body_temp"  nginx http proxy temporary files: "proxy_temp"  nginx http fastcgi temporary files: "fastcgi_temp"  nginx http uwsgi temporary files: "uwsgi_temp"  nginx http scgi temporary files: "scgi_temp"13:执行make,make命令是GNU工程化中的一个编译工具。下图make后的输出 14:然后执行make install 完成后的输出 15:检查:cd /usr/local/nginx/,发现这个目录下已经有了目录 Conf:放配置文件Html:放静态页面Logs:放日志shin:放可执行文件16:启动 cd sbin/   发现下面有一个可执行文件。可以使用file命令查看一下,看是不是一个可执行文件。然后执行 ./nginx 启动   17:输入IP地址,访问nginx,发现无法访问。 18:关闭防火墙,让nginx可以访问: systemctl stop  firewalld.service。注意:Centos6和centos7关闭防火墙的命令是不一样的。 19:输入IP地址,访问nginx,可以正常访问了 20:将nginx启动安装成系统启动的服务创建服务脚本vi /usr/lib/systemd/system/nginx.service 服务脚本内容 [Unit] Description=nginx - web server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop ExecQuit=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target    21:重新加载系统服务 这个命令执行完,systemctl daemon-reload,我们就可以通过脚本停止和启动我们的服务了。现在nginx是正在运行的中的,我们先停掉它。先用sbin目录下的nginx停掉,因为现在是用nginx启动的。   22:使用脚本启动nginx systemctl start nginx.service 查看nginx的目前的启动状态 systemctl status nginx.service   23:设置为开机启动: systemctl enable nginx.serviceCreated symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service. 24:重启系统:reboot重启过程中请求nginx发现已经不能访问了。系统启动成功后,直接访问nginx可以进入欢迎界面      
  • [页面编排] html模板拼接了几张图片,并且加了class属性,但是怎么去修改他们的样式
    html模板拼接了几张图片,并且加了class属性,但是怎么去修改他们的样式