在响应式布局逐渐成为主流的今天,网页或者app的流式布局已经不算是一个新鲜的词汇了。今天我要讲的一个内容也是跟页面流式布局有关,如何让你的网页实现完美的缩放?
我们可以很快速的写出一个响应式布局的页面,首先看一下效果图。
网页布局
其中html部分的代码如下:
html部分代码
css中的item代码为:
css代码
通过以上代码,完成上述的流式布局后,在我们改变浏览器窗口大小时,div也会随之进行缩放。
But,你以为这就是我们想要的结果吗?
当然不是!在改变浏览器窗口大小时,我们发现虽然div的宽度是进行了缩放,但是高度却没变,因此div的宽高比并未保持原始比例,我们可以看下以下的效果。
缩放后宽高比
从上图中可以很容易看出,缩放后的div宽高比比之前小很多,这并不是我们想要的结果。
我们需要达到的效果是在改变浏览器窗口大小时,div也会随之进行等比例的缩放。
首先,可以使用Javascript代码去实现,这是没有问题的。但是绑定Javascript的onresize事件,在拖拽时可能会出卡顿现象,体验不是很好。
接下来我们通过CSS来实现以上的效果。
使用的核心属性是我们平时并不太注意的padding-bottom。
padding-bottom有一个很容易让人忽略的特性是,当取值为百分比形式时,其百分比的基数是父元素的宽度,而不是高度。
因此我们可以在不用给父元素设置高度的时候,就可以通过padding-bottom属性确定当前元素的高度。我们的做法如下。
将元素的height属性设为0,通过padding-bottom属性确定元素高度。
设置合理的padding-bottom值,例如上述的例子中,在宽度为21%时,如果需要高度是宽度的1.62倍,我们可以将padding-bottom取值为34%
修改后的CSS代码如下。
修改后的CSS
修改后,我们再次调整浏览器窗口的大小,就会发现div是等比例的进行缩放,完美达到了我们的要求。
修改后等比例缩放
在这里,可能会有人有疑问如果设置overflow:hidden;那么里面的文字会不会因为超过height,就会被隐藏了?
答案是不会的,根据CSS2.1的规范,overflow只会对处于padding外面的内容生效,即只有超出了 padding区域的内容才会被overflow属性隐藏掉。而在设置padding-bottom后,实际已经决定了元素的height属性,因此overflow:hidden;不会生效。
今天这篇文章主要讲解了利用CSS完成页面等比例缩放的最简单方式,你学会了吗?
果你发现,刚买来的电脑在运行一些程序的时候,程序界面总有一种发虚的感觉,那不是电脑屏幕的问题,也不是系统的问题,而是Windows 10的缩放机制不完善的问题。
在很多人的印象中,Windows系统对于高分屏的支持一直不佳,尤其是Windows 8阶段,很多传统exe应用的界面在系统的缩放机制下变得非常模糊,可用性很低。到了Windows 10,这一情况有没有改观呢?
这件事仅仅微软用力是不行的,还需要第三方软件对其进行优化。从笔者使用Windows 10来看,第三方软件已经没有那么不堪了,但与macOS的水平还有很大差距。
Windows 10的缩放机制
要更改Windows 10的缩放,需要在桌面右击,选择显示设置,在弹出的设置界面的“缩放与布局”能够对缩放比例进行直接更改,操作比Windows 7要方便很多。
我们直接按照系统推荐的缩放比例设置就可以了,但偶尔会遇到图标过大的情况。一般情况下,13.3英寸、1080P缩放比例设置为150%,14英寸、15.6英寸、1080P缩放比例设置为125%。这是推荐笔记本的缩放比例。
台式机外接显示器的话就不好说了,大家可以在设置中进行自行调整。需要注意一点,修改之后一定要注销,不然可能会出现界面卡顿等情况。
对于多屏用户而言,在调整缩放比例之前一定要看缩放比例对应的是哪块屏幕。可以先点选屏幕之后再进行缩放调整,缩放过程中不会影响到其他屏幕。
本文属于原创文章,如若转载,请注明来源:Windows 10学院之初中(08) 缩放机制http://nb.zol.com.cn/682/6828341.html
画布坐标、屏幕坐标的概念
几何变换:平移、缩放、旋转
Canvas 中的所有几何变换针对的不是绘制的图形,而是针对画布本身,也就是说,当移动、缩放、旋转画布之后,新的坐标系只对新的操作生效
参考:
示例代码
const canvas = document.getElementById("canvas");
const context = convas.getContext("2d");
context.fillRect(100, 100, 50, 50);
Canvas的绘制和html的绘制是不一样的,html的绘制是增量的,当变化时,只会重新绘制变化的部分,没有变化的部分是不会重新绘制的,但是canvas不一样,每次都是全量绘制的,如果一个canvas里有很多图形,当改变一个图形时,需要重新绘制所有图形才可以(当然,可以用clearRect擦除部分区域,但一般很少这么用)。
了解canvas的绘制规则之后,就很容易发现性能问题,如果canvas上绘制了大量的图形(成千上万个),每次重绘就需要很长的时间,如果重绘的频率很高,那么就会有性能问题
那么如何解决这个问题呢,目前有以下几种方案
图层的概念来自于PS,每一个图层都是一个canvas,既然在一个canvas上绘制太多图形会有性能问题,那么就分几个图层,每次仅重新绘制其中一个图层,每个图层的图形都不会很多,那么即使重绘的频率很高,也不会有性能问题。图层的概念图如下:
这里用背景颜色只是示意,实际上图层都是透明
代码实现
用一个父元素作为容器,把所有的元素设置成一样的宽高并放在里面重叠。
<div class="container">
<canvas width="500" height="500"></canvas>
<canvas width="500" height="500"></canvas>
<canvas width="500" height="500"></canvas>
<canvas width="500" height="500"></canvas>
<canvas width="500" height="500"></canvas>
</div>
绘制是很耗性能的,如果每次都清空画布然后重新画一次,那么性能会消耗很大(即使分了几个图层),我们应区分“变”与“不变”的部分,只对“变”的部分重新渲染,“不变”的部分不渲染,将经常变化的部分抽离到临时图层,这样仅需要渲染临时图层,临时图层有几种实现思路,一种是使用操作图层(俗称高性能图层),一种是使用隐藏图层(不绘制到界面上的)
高性能图层
一般高频(实时响应鼠标、键盘等事件)的操作会放在高性能图层,等操作完成之后,再将最终结果保存到其它图层,比如绘制、拖拽、缩放一个(或一批)shape
隐藏图层
有些图层是不用给用户看的,这些canvas仅存在于内存中,不会插入html的dom中,用完就销毁,比如常见的canvas to image。
还有一种实现方式是离屏渲染(OffscreenCanvas),先在一个offCanvas操作,然后再将结果渲染到界面上(有点像虚拟dom操作),一般会结合webworker或webassembly
const canvas = document.createElement("canvas");
const context = canvas.getContext("2d");
// 绘制图片,或其它操作
context.drawImage();
// 转成base64图片
convas.toDataUrl();
影响canvas性能的除了绘制频率,还有一个重要的是像素点操作,一般图像处理会涉及到大量的像素点操作,如果放在主线程计算,那么会卡住其它操作,造成页面卡顿,特别影响用户体验,这些涉及大量计算的一般会单独开个线程来操作,而在浏览器中有这个能力的就只有webworker了。
有了webworker可能还不够,因为始终是在js上执行,js执行效率天生就比其它语言慢,所以一般的会使用webassembly,执行效率比js快很多,而且还能用到更丰富的图像处理库
如果还有更高的性能要求,那么普通的2d canvas可能就无法满足了,这个时候可以使用webgl,性能更高(当然学习成本也更高),再结合wasm,就可以有无限想象力了,鼎鼎大名的figma就是用webgl + wasm(rust)实现的,另外google doc在线文档也使用了webgl,飞书文档将来也会替换成wegbl,基于浏览器的渲染始终有诸多限制,一般有能力的都会实现自己的渲染引擎。
假设canvas大小为(867,350)
图片的大小为(768,576)
将上面这张图片放到canvas中,图片贴边处理,也即图片太大就缩小,图片太小就放大。那么我们如何实现这种效果呢?
总结一下,总共分为几步:
canvas的执行细节如下:
*请认真填写需求信息,我们会在24小时内与您取得联系。