前段时间做了一个自适应的小工具(autofit.js)
经过一段时间的试用,同学们发现了工具存在的一些问题,我自己也发现了一些,这篇文章是针对这些问题撰写的。
autofit.js是一款可以让你的项目一键自适应的工具。
autofit.js npm 主页
autofit.js github 主页
npm i autofit.js
import autofit from 'autofit.js'
autofit.init({
designHeight: 929,
designWidth: 1920,
renderDom:"#app",
resize: true
})
一般按照1080的设计稿开发时,直接调用autofit.init()
即可。插件会自动计算缩放后撑满浏览器窗口所需的宽高。
因为autofit.js使用的是scale方案,transform: scale()
缩放时,dom元素在文档中的实际占位是不变的
这样下方就出现了白边,右侧还出现了滚动条
解决此问题将body设置超出隐藏即可:
body{
overflow: hidden;
}
在设置超出隐藏后,滚动条和白边都不见了。
出现这种问题的原因很明显,你需要将内容元素做一个简单的适配定位,因为autofit.js只做了缩放和填充部分。如果你的页面元素没有做均匀分布的位置,也是会出现这种情况的。
以上图为例
如果出现了这个问题,推荐使用flex进行布局即可。
display:flex;
justify-content: space-between;
或者直接使用定位,将三块内容定位到左上、中间、右上。
.left, .right {
position: fixed;
width: 25%;
height: 100%;
top: 0;
padding-top: 70px;
z-index: 9999;
}
这个问题按说不会是因为autofit.js引起的(前提是你没有使用百分比),但是既然有人提到了,这里说一下解决办法。
echarts图表拉伸,说明你的echarts外层容器变大或者变小的,导致canvas元素拉伸了,解决办法为:
window.addEventListener('resize', this.redraw, false);
redraw() {
this.myChart.clear();
this.myChart.resize();
this.draw();
},
像我这样,监听resize事件,并重绘echarts即可。
这个问题属于autofit.js的一个bug,目前在最新版本已经修复了。
造成Bug的代码
if (clientWidth / clientHeight < designWidth / designHeight) {
scale = (clientWidth / designWidth)
document.querySelector(renderDom).style.height = `${clientHeight / scale}px`;
} else {
scale = (clientHeight / designHeight)
document.querySelector(renderDom).style.width = `${clientWidth / scale}px`;
}
造成这个bug的原因是,全屏时的宽高比不小于(因为是等于)设计图宽高比,导致高度没有被重新设置。
所以在曾经设置过高度(即基于宽度px不变的缩放),再最大化的情况,高度不会变。在这种逻辑下,宽度有时也会失效。
修改后的代码(1.0.8):
let scale = (clientWidth / clientHeight < designWidth / designHeight) ? (clientWidth / designWidth) : (clientHeight / designHeight)
dom.style.height = `${clientHeight / scale}px`;
dom.style.width = `${clientWidth / scale}px`;
dom.style.transform = `scale(${scale})`;
这样无论是怎样的宽高比,它都会同时设置宽度和高度。
造成这种问题的原因大概率是你同时使用了其他自适应工具,或者使用了相对单位,导致你的网站进行了双重适配。
解决方式也很简单,autofit.js不需要任何其他辅助工具,如果想体验autofit.js一行搞定,关闭其他插件,且不要使用任何相对单位即可!
autofit.js仅推荐使用px进行开发。
不要手动设置:transform-origin,因为autofit.js将它设置成了 0 0
,即以左上角为基准点缩放,这可以保证dom元素不会偏移。
如果你使用的地图是基于canvas绘制的,那么有可能会出现偏移现象(往往伴随着拉伸),那么和上面的echarts的解决方式一样,只需要重绘就可以了。
如果是基于svg绘制的,那么不应该会出现这个问题,如果你的svg绘制的地图也出现了热区偏移现象,欢迎来私信捶我。
我的使用案例
正常状态 :1920*929
笔记本缩放150%:1280*569
笔记本缩放175%:1098*460
可以看到,这些缩放基本上影响不到我们,看起来甚至没有任何区别?(越看越牛逼啊铁子们)
Q:autofit.js可以做局部自适应吗?
A:不可以
Q:除了大屏项目外,autofit.js可以适配其他项目吗?
A:可以,autofit.js适用于任何PC项目
Q:autofit.js可以向上兼容吗
A:可以是可以,但是你看看哪个大傻子这么干?向上兼容可能会出现模糊的现象,如果你希望能在更高分辨率的屏幕上展示,还是建议按照高分辨率的设计稿开发。
Q:autofit.js会影响性能吗?
A:会,但是微乎其微,如果你不希望autofit.js过多的干预dom,可以把resize设置为false,这样它只会在启动时运行一次。
Q:autofit.js相对于其他自适应工具有什么区别?
A:没有什么本质区别,autofit.js和所有使用scale方案的工具都是一个原理,只不过autofit.js多了一个自动充满全屏的功能,且调用比较简单。
Q:你为什么又要重复造轮子?
A:看不惯那么多复杂繁多的工具,我只需要二十行代码。
Q:使用autofit.js需要学习其他知识吗?
A:需要个屁。
大家好,又见面了,我是你们的朋友全栈君。本人学习笔记,仅供自己查阅Java类中serialVersionUID作用是什么?serialVersionUID适用于Java的序列化机制。简单来说,Java的序列化机制是通过类的serversionUID来验证版本一致性的。在反序列化时,JVM会将传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException。serialVersionUID有两种显示的生成方式:一是默认的1L,比如:privatestaticfinallongserialVersionUID=1L;二是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:privatestaticfinallongserialVersionUID=xxxxL;对象的序列化主要有两种用途:1)把对象的字节序列永久地保存到磁盘上,通常存放在一个文件中;2)在网络上传送对象的字节序列。java
es集群的磁盘存储过小的话,常常会遇到磁盘存储超90%,甚至100%。此时就需要清理一部分过期的数据释放磁盘空间,或者扩容磁盘容量。清理索引通过kibana可以通过登录腾讯云es控制台,点击对应es集群的Kibana进入Kibana登录页面,输入用户名和密码再点击DevTools(一个扳手的图标)通过命令查看es集群中的索引#查看es集群中的全部索引 GET_cat/indices?v #其中参数v表示返回详细的输出 #查看es集群中按照索引排序后的全部索引 GET_cat/indices?v&s=index:asc #其中参数s表示输出的列进行排序,默认按照升序排序。其中desc为倒叙复制清理索引命令#清理单个索引 DELETEnginx-log_2020.01.22 #清理通配符匹配到的索引,清理前需要开启通配符 DELETEnginx-log_2020.01.* #开启使用通配符 PUT_cluster/settings { "transient":{ "action.destructive_requires_name":
动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。针对二进制文件有用的命令查看文件类型file复制查看二进制文件链接到哪些库ldd复制查看二进制文件里面所包含的symbol,T表示加载,U表示undefinedsymbolnm复制读二进制文件里面的信息readelf-asmu.o复制将二进制文件转换为汇编objdump-dsum.o复制动态链接库的生成sum.c#include<stdio.h> #include<stdlib.h> intsum(intx){ inti,result=0; for(i=0;i<=x;i++){ result+=i; } if(x>100) exit(-1); returnresult; }; voiddisplay(char*msg){ printf(&q
用python写一个程序,然后在命令行上执行,看不到界面(UI),这种程序很常见了,叫命令行程序。然而很多人,特别是不懂程序的人,更需要看到的是一个有界面的,能通过鼠标操作的程序,毕竟已经迈进“窗口”的时代,虽然Dos还存在。所以,怎么用python弄出有界面的程序呢?界面也是一个工具,所以,有没有界面工具库呢?必须得有,而且有很多个,你搜索“python界面库”就可以看到很多这方面的介绍,而我要介绍的,是python最早就有的tkinter,通过它来实现界面程序。tkinter内置在python中,所以不用再安装,直接import进来使用就是了。沿用上一节介绍的文本转语音的程序,我现在要写一个界面程序,上面有两个按钮,一个用来选择文本文件,一个是“转换成语音”,来看看怎么实现吧。(1)TTS的GUI程序fromtkinterimport* importtkinter.messageboxasmsgbox importtkinter.filedialogasfiledlg importos importpyttsx3 frompydubimportAudioSegment import
你好,我是梁松华,今天想和你聊的话题是可复用架构之分离关注点。可复用架构的本质就是分和合。先打散再组合起来,只对外暴露各个场景下业务逻辑的调用入口。就好比,一个模型中有多个对象,这些对象只有整体出现才有意义,我们不能只暴露对各个对象进行操作的方法,那样缺乏封装性,无法保证稳定性,没有稳定性就谈不上可复用了。刚刚说的分有多种含义,包括服务的拆分,也包括单个服务各种模块的分层设计,它们划分的目的都是一样的,让自已专注解决某个层次的问题,职责单一。而组合通常就是为了隐藏内部细节,只暴露入口,使用者传进来的参数只能先通过这个大门的检查才能触发功能逻辑,或者直接使用系统提供的默认参数,选择开箱即用。说到这里,是时候给分离关注点下一个定义了。我们实现需求时,需要关注功能性需求,比如业务逻辑、数据持久化,还要关注非功能性需求,比如性能、监控、安全、日记,还要关注软件设计是否能灵活更换依赖的类等等。可以看到系统是一系列关注点的组合,这些关注点如果横跨系统多个模块的话,每个模块设计时都要考虑一大堆的关注点细节,关注细节太多,主干逻辑就有可能考虑欠佳,导致留下不易发现的问题。也就是说,如果不把关注点分离,
介绍大家都知道,Endnote可以插入参考文献,对参考文献进行有序排列。无论你是怎么样的顺序插入的,Endnote都会以某一特定的顺序对其进行排序,方便文章的投稿,那么这个功能只是涉及到了文字部分。而大多数时候,我们的文章中不仅有参考文献,也会有大量的图片,而图片的顺序也会发生变化,调整位置。那么这个时候,我们从开始,就可以将图片使用Endnote插入进去,删除中间任意一张图,或者添加任意一张图,Endnote都会将其自动排序,如同参考文献一般,这样,就大大方便了我们的投稿以及文章的撰写。(当然,对于少量的参考文献,亦或者是图片,如一些SCI论文,总共就两张图或者五六个参考文献,数量少的可怜,这种情况,直接复制参考文献纯文本就可以了,或者手动嵌入就好了。)软件EndnoteX9.2视频教程不会了看看视频呗图文介绍1.直接打开我们的Endnote数据库,此时只有参考文献信息2.新建一个图片分组,可以用来专门存储我们的图片3.新建一个参考文献4.选择插入参考文献形式为Figure,写上标题,为了区分5.在Caption处写上文中需要的图表注释6.点击×,退出,参考会自动保存7.将我们的图片
SpringCloud实战项目全套学习教程连载中PassJava学习教程简介PassJava-Learning项目是PassJava(佳必过)项目的学习教程。对架构、业务、技术要点进行讲解。PassJava是一款Java面试刷题的开源系统,可以用零碎时间利用小程序查看常见面试题,夯实Java基础。PassJava项目可以教会你如何搭建SpringBoot项目,SpringCloud项目采用流行的技术,如SpringBoot、MyBatis、Redis、MySql、MongoDB、RabbitMQ、Elasticsearch,采用Docker容器化部署。更好的阅读体验文档地址:http://www.jayh.club备用地址:https://jackson0714.github.io/PassJava-Learning文档连载目录打造一款刷Java知识的小程序打造一款刷Java知识的小程序(二)01.五分钟搞懂分布式基础概念02.快速搭建Linux环境-运维必备03.配置虚拟机网络04.安装Docker05.Docker安装mysql06.Docker安装redis07.本地开发环境配置
撤销在未进行gitpush前的所有操作,都是在“本地仓库”中执行的。我们暂且将“本地仓库”的代码还原操作叫做“撤销”情况一:文件被修改了,但未执行gitadd操作(workingtree内撤销)(modifyfile)<==>gitcheckout<filename>/.gitcheckoutfileName gitcheckout.复制情况二:同时对多个文件执行了gitadd操作,但本次只想提交其中一部分文件gitadd<==>gitresetHEAD<filename>$gitadd* $gitstatus #取消暂存 $gitresetHEAD<filename>复制情况三:文件执行了gitadd操作,但想撤销对其的修改(index内回滚)(modifyfileandadd)<==>gitresetHEAD<filename>&&gitcheckout<filename>#取消暂存 gitresetHEADfileName #撤销修改 gitcheckoutfileNa
你有两年以上的前端开发经验吗?你会用Sass和Autoprefixer等高级的CSS辅助技能吗?你的JavaScript知识是否融汇贯通,你是否喜欢使用Gulp,npm和jQuery?如果是这样,根据AshleyNolan的前端问卷调查,你是一个典型的前端开发工程师。谎言,该死的谎言,统计数字和调查问卷愚人码头注:谎言,该死的谎言,统计数字(英文:Lies,damnedlies,andstatistics),是一句著名的西方谚语。主要描述数字的说服能力,特别是用来讽刺一些使用统计数字支持、但毫无说服力的分析报告,以及人们倾向于贬低那些不支持其立场的统计结论。维基百科诸如此类的调查有助于你发现新工具和你的知识短板。至本文撰写时,本次问卷调查收到了5,254份答复,这是比大多数民意调查更具有样本价值。但是,调研结果是否代表真相还是应该抱审慎态度。。。全球性的统计结果这次问卷调查是全球性的,但将主要来自英语国家。在其他地方开发或使用的流行工具可能被忽略。开发人员知识本次问卷调查呼吁经验丰富的开发人员对调研问题有深刻理解并且有时间,有兴趣去完成本次调查。83%的受访者有两年或两年以上的前端技术
鉴于当今分散的存储基础架构,审计人员能如何评估企业数据的使用?总之,很难! 今年早些时候,Windocks成为第一个整合数据库克隆的容器引擎。SQLServer容器与数据库克隆的组合。因为支持了开发/测试(Dev/Test)和报告需求,这个组合一面世就收到了欢迎。一个复杂的Terabyte类数据库可以在几秒钟内交付,并且只需要增量的40MB的存储空间。 SQLServer容器和数据库克隆的组合对于开发/测试和报告来说非常有用,对于数据治理和法规合规性来说,这个组合也是一个巨大的进步。在这篇文章中,我们将探索这个设计是如何提供一个版本化的,可审计的企业数据库,以满足审计和合规性的需求。 企业数据环境的数据映像 数据映像使用完全或差异SQLServer备份,快照和SQLServer增量日志传送进行构建,并在图像构建过程中,与SQLServer脚本结合实现数据屏蔽。生成的映像是可以跨越多个物理(或虚拟)磁盘和大型数据集的虚拟磁盘形式的数据的全字节副本。 虚拟磁盘又支持创建可写克隆的Windows“差异磁盘”。克隆在几秒钟内交付,只需要40MB或更少的存储空间。 图像由Dockerfile构建
在SpringMVC的基础框架搭建起来后,我们测试了springmvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/qixiaoyizhan/p/5819392.html 今天我们来讲讲springmvc中的文件上传和下载的几种方法。 首先附上文件目录->我们需要配置的我做了记号-> 一、文件上传 首先为了方便后续的操作,以及精简代码,我们在Utils包下封装一个文件上传下载的帮助类:Files_Helper_DG Files_Helper_DG 代码 1packageUtils; 2 3importorg.springframework.web.multipart.MultipartFile; 4 5importjavax.servlet.http.HttpServletRequest; 6importjavax.servlet.http.HttpServletResponse; 7importjava.io.*; 8importjava.text.S
一、宝付私钥加密,公钥解密 由于对RSA加密解密原理不是很熟悉,宝付也没有Golang的Demo提供。Go语言库里一般都是私钥解密、公钥加密,或者私钥签名、公钥验签。宝付需要反过来,这里也到好找到了https://github.com/farmerx/gorsa的实现,但始终宝付那边提示签名验证失败。然后就继续找其他的实现了,这就惨了各种Google完全无解。最后回过头来只能,使用加解密原文,跟.Net平台的结果进行比对。一通折腾或者叫折磨之后,发现其实只是每次加密多了117个字节的全是0,后面的加密结果居然是跟其他平台一样的。由此对armerxgorsa做了如下修改,成功。 这个前后花了3天时间。虽然解决问题的方式最终很简单,但是找到这条路的过程可真是披荆斩棘。 二、通联密钥解析 宝付的密钥直接使用Go语言包就可以解析了,但是通联的就棘手了。给出的P12文件是Windows下的,继续Bing。好在很快就有了结果,当然还是最大同性交流平台https://github.com/ikaiguang/go-allinpay。虽然参考代码有了,不过还是遇到麻烦事。让朋友Mac电脑
js报错Cannotreadproperty'forEach'ofundefined 数组未定义或者不存在,解决方法: if(datas&&datas.length){ datas.forEach(function(item,index){ console.log(index); }) } //或者 if(!datas||!datas.length)return; datas.forEach(function(item,index){ console.log(index); }) 复制 也可以根据实际情况简写为 (datas||[]).forEach(function(item){ }); 复制 .footer-body*{ box-sizing:border-box; } .footer-bodyblockquote{ margin:20px0!important; background-color:#f5f8fc; padding:1rem; color:#8796a8; line-height:30px; } .footer-bodya,.foote
目录: 0.前言 处理方案 简单例子 前言 有的时候,你可能需要在Spring环境中放入一些配置,但这些配置无法写死在配置文件中,只能运行时放入。那么,这个时候该怎么办呢? Apollo就是搞配置的,那么自然会遇到这个问题,他是如何处理的呢? 处理方案 首先要知道Spring环境中,一个配置的数据结构是什么? 是抽象类PropertySource<T>,内部是个keyvalue结构。这个T可以是任意类型,取决于子类的设计。 子类可以通过重写getProperty抽象方法获取配置。 Spring自身的org.springframework.core.env.MapPropertySource就重写了这个方法。 publicclassMapPropertySourceextendsEnumerablePropertySource<Map<String,Object>>{ publicMapPropertySource(Stringname,Map<String,Object>source){ super(name,source);
\(n\)个点\(m\)条边的连通图,每个点有第\(c_i\)种权值为\(val_i\)的宝藏,问从\(x\)点出发只通过边权小于等于\(y\)的边可以获得的宝藏最大权值,每种宝藏权值只能算一遍。宝藏权值带修改。每种宝藏最多有10个。 建出克鲁斯卡尔重构树,考虑在节点上维护答案。发现每种宝藏最多有10个,所以可以建出每一种宝藏的虚树,在虚树上暴力修改。需要链上修改单点查询,树上差分之后成为单点修改,查询子树和。故使用树状数组维护克鲁斯卡尔重构树的\(dfs\)序即可。 (因为克鲁斯克鲁斯卡尔重构树的结构特殊,虚树代码有锅但是过了) #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<vector> usingnamespacestd; #defineintlonglong constintN=201000; vector<int>vec[N]; intread
追求完美不服输的我,一直在与各种问题斗争的路上痛并快乐着 上一篇文章Django实现WebSSH操作KubernetesPod最后留了个问题没有解决,那就是terminal内容窗口的大小没有办法调整,这会导致的一个问题就是浏览器上可显示内容的区域太小,当查看/编辑文件时非常不便,就像下边这样,红色可视区域并没有被用到 RESIZE_CHANNEL 前文说到kubectlexec有两个参数COLUMNS和LINES可以调整tty内容窗口的大小,命令如下: kubectlexec-i-t$1envCOLUMNS=$COLUMNSLINES=$LINESbash 复制 这实际上就是将COLUMNS和LINES两个环境变量传递到了容器内,由于Kubernetesstream底层也是通过kubernetesexec实现的,所以我们在启动容器时也将这两个变量传递进去就可以了,就像这样 exec_command=[ "/bin/sh", "-c", 'exportLINES=20;exportCOLUMNS=100;' 'TERM=xterm-256color;exportTERM;[-x/
1.运行环境:eclipse 2.我的结对小伙伴是:12陈帝燊http://www.cnblogs.com/cds94/ 封装: 概念 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private实现封装。什么是封装?封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。 作用 1、良好的封装能够减少耦合。 2、类内部的结构可以自由修改。 3、可以对成员进行更精确的控制。 4、隐藏信息,实现细节。 步骤: 1、修改属性的可见性来限制对属性的访问。(通常将类的成员变量声明为private) 2、为每个属性创建一对赋值方法和取值方法,用于对这些属性的访问。 &n
Thread 线程状态:新建(new),就绪(start),运行(run),阻塞,死亡 start方法内部调用了run方法,start会开启线程,run只是内部方法; sleep会占用锁,休眠时间到在重新运行; stop停止线程比较暴力,对锁的对象进行强制解锁,线程资源因此得不到正常释放; interrupt不会立马停止线程,只能中断阻塞状态的线程,可以捕获到一个异常来处理,加上标识判断是否中断; join 等待该线程完成后,才能继续往下执行; yield线程让步,让自己或者其他线程运行,并不能保证其它线程就一定能获得执行权; wait进入阻塞状态,释放锁,需要在synchronized使用(获取锁后); notify唤起线程(随机),notifyAll唤起所有线程,释放锁,需要在synchronized使用(获取锁后),调用notify和wait的必须是作用同一个对象; 创建方式 //第一种 newThread().start(); //第二种 newThread(Runnable实现类).start();复制 ThreadLocal 线程局部变量,为线程提供变量副本
Givenanon-negative index k where k ≤ 33,returnthe kth indexrowofthePascal'striangle. Notethattherowindexstartsfrom 0.  InPascal'striangle,eachnumberisthesumofthetwonumbersdirectlyaboveit. Example: Input:3 Output:[1,3,3,1] Followup: Couldyouoptimizeyouralgorithmtouseonly O(k)extraspace? //usedpascaltriangle1,wonderingiftheywantmetooptimizespace classSolution{ publicList<Integer>getRow(introwIndex){ returngenerate(rowIndex+1).g
自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中也积累了一些开源的组件,就目前想到的先整理于此,如果再想到,就继续补充这篇日志,日积月累,就能形成一个自己的组件经验库。 分布式缓存框架: MicrosoftVelocity:微软自家分布式缓存服务框架。 Memcahed:一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度。 Redis:是一个高性能的KV数据库。 它的出现很大程度补偿了Memcached在某些方面的不足。 EnyimMemcached:访问Memcached最优秀的.NET客户端,集成不错的分布式均衡算法。 开源的.NET系统推荐: OXITE:微软ASP.NETMVC案例演示框架。 PetShop:微软ASP.NET宠物商店。 Orchard:国外一个MVC开源的博客系统。 SSCLI:微软在NETFramework2.0时代的开源代码。 DasBlog:国外一个基于ASP.NET的博客系统。 BlogEngine.NET:国外一款免费开源的博客系统。 D