其实关于scale,我之前是用他来搞一些css3的特效的放大缩小啊,玩的也挺6666,而*zoom:1之前是用来做css的hack,也就是触发IE6/7的haslayout清除浮动的。终于某天,好事的UE说1px的线在retina的屏幕下显得膀大腰圆要我们修复这个bug。参考 http://www.tuicool.com/articles/ZRv6bun,在做了一系列的实验之后采取了使用scale的方案,顺便验证了android真的不支持0.5px这个理论。

本来用着scale的这个解决方案还蛮好,只是后来为了解决一些奇葩的布局问题发现这个zoom,scale其实有点料可挖的。

一、分别讲下scale与zoom

我们先看一下scale,scale是隶属于transform的2d转换的王牌军,IE9+、firefox、opera、safari、chrome基本现代浏览器都支持。scale同时支持scaleX,scaleY以及scale,默认是从左上角开始缩放且scale的取值可以为负值,当scale的值为负值scale相对于右下角进行缩放。但是scale只支持数值,normal、百分比均为无效值。最重要的是scale并不会引起整个页面的重绘,因为scale在生效的时候该元素本身的大小是没有发生变化的,只是在当前元素上进行重绘。

我们看一段测试代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>scale测试</title>
  6. <style>
  7. .s1, .s2 {
  8. height: 200px;
  9. width: 200px;
  10. background-color: #d0d0d0;
  11. }
  12.  
  13. .s3 {
  14. float: left;
  15. height: 80px;
  16. width: 80px;
  17. border: 1px solid #000;
  18. font-size: 12px;
  19. }
  20.  
  21. .s1 .s3 {
  22. transform: scale(.5);
  23. tranform-origin: 0 0;
  24. background-color: yellow;
  25. }
  26.  
  27. .s2 .s3 {
  28. background-color: pink;
  29. }
  30.  
  31. </style>
  32. </head>
  33. <body>
  34. <div class="s1">
  35. <div class="s3">我是小小鸟</div>
  36. <div class="s3">rtrtrt</div>
  37. </div>
  38. <div class="s2">
  39. <div class="s3">我是小小鸟</div>
  40. <div class="s3">rtrtrt</div>
  41. </div>
  42.  
  43. </body>
  44. </html>

  

由代码和效果图可知,scale虽然能在当前元素进行重绘,但实际上该元素所占的空间是没有发生变化的。但是包括border在内的所有属性确实是被缩放了,下面我们再看下zoom。

把上面的代码.s1 .s3改成如下:

  1. .s1 .s3 {
  2. zoom: .5;
  3. background-color: yellow;
  4. }

  

我们可以看见改成zoom的时候,不仅是被zoom的元素发生了重绘,页面中其他元素也发生了重绘从而导致了页面整个布局的改变且zoom缩放就是相对于左上角而scale默认则是居中缩放。还有一点是zoom对元素的border-width和font-size看起来并没有效果。

zoom可以支持的值类型有百分比值,数值和normal关键字,但是需要注意虽然Chrome/Sarari支持zoom属性,但其实zoom并不是标准属性

二、zoom与scale的区别总结

1、兼容性的差异:zoom为非标准属性,除firefox浏览器已在其他浏览器中得到了良好支持,scale已经是标准属性除IE8-外现代浏览器均能较好的支持;

2、取值差异:zoom的合法值可以为数值、百分比以及normal而scale则只能为数值;

3、缩放中心点差异:zoom缩放中心点为左上角,而scale默认为中心点但可以通过transform-origin进行改变;

4、重绘差异:zoom的缩放改变了元素占据空间的大小会引起整个页面的重绘而scale缩放所占据的原始尺寸不变,只在当前元素进行重绘;

5、渲染计算方法可能有差异:zoom为锐化,而scale为模糊;

6、对文字的缩放规则不一致:zoom的缩放依然受限于最小12px的中文大小限制;而scale就是纯粹就图形进行比例控制,文字50%原来尺寸;

7、这点应该是与上一条相似,border为1px的时候zoom受限于浏览器最小显示1px;而scale就纯粹进行比例控制,不受限。

三、总结&鸣谢

综上,想改变移动端1px在retina屏看起来较粗的问题还得使用scale,scale突破了浏览器的最小显示限制,让你自由飞翔。

感谢张鑫旭大大的博文,地址如下 http://www.zhangxinxu.com/wordpress/2015/11/zoom-transform-scale-diff/ 是我参考的重要来源,对元素渲染计算方法的差异如果不是张鑫旭大大的博文我自己是没有注意的。

以上,如有错误欢迎指出~

关于scale和zoom的区别的更多相关文章

  1. scale 和 zoom,以及zoom的一些变态用法

    zoom和scale这两个东西都是用于对元素的缩放,一下是其中一些区别: 1.scale的缩小是以图片的中心,zoom的缩小是以图片的左上角. 2.zoom的缩放改变了元素占据的空间大小:而scale ...

  2. 2D转换下的zoom和transform:scale的区别

    一.什么是zoom 在我们做项目和查看别人的网页的时候总会在一些元素的样式里,看到有一个家伙孤零零的待在那里,它到底是谁呢? 它的名字叫zoom,zoom的意思是“变焦”,虽然在摄影的领域经常被提到, ...

  3. zoom和transform:scale()的区别

    zoom和transform:scale()都可以用于缩放,目前移动端存在各种各样不同屏幕大小的手机,为了兼容不同宽度的屏幕,我们可以基于某一屏幕宽度大小(比如iPhone5的320,这个根据设计稿来 ...

  4. zoom与scale的异同

    zoom与scale的异同点 作为一名前端,尤其是页面要兼容ie浏览器的前端,肯定对着两个属性都很熟悉. zoom和scale都是css中常用的放大和缩小一个元素的方法,在scale还没有成为css3 ...

  5. D3js-绘制地图时出现过小, 设置scale还是无效 的解决方法

    使用d3绘制某个地市的地图时,把scale成非常大但是还是无法达到想要的效果. //---------------------------------------------------------- ...

  6. 谈谈关于CSS中transform属性之scale

    谈谈关于scale属性 scale是什么? 根据W3C定义 ,scale主要是进行缩放和转化: scale能做什么? 1.1px细线 <div class="wrap"> ...

  7. 微信小程序-修改单选框和复选框大小的方法

    方法有两种: 一:采用css的zoom属性 zoom缩放会将元素保持在左上角,并且会有毛边,可能会稍稍改变元素原来的形状. 二:采用css3的transform:scale属性 zoom缩放会将元素保 ...

  8. SDK截图程序(二):保存截图

    怎样将我们上一篇截取的位图保存在文件夹里.根据MSDN,思路是这样的,用CreateFile函数在磁盘建立一个bmp文件,用WriteFile填充该bmp文件的文件头.信息头,像素等信息.之前我们只有 ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(十三):地图相关接口说明

    为了方便大家开发LBS应用,SDK对常用计算公式,以及百度和谷歌的地图接口做了封装. 常用计算: 用于计算2个坐标点之间的直线距离:Senparc.Weixin.MP.Helpers.Distance ...

随机推荐

  1. PHP中常见的提示对照表

    .Notice: Undefined variable: 变量名 in 注:使用了一个没有被定义的变量 .Parse error: syntax error, unexpected T_ELSE in ...

  2. 用Xcode 安装ipa,查看程序资源文件夹

    Xcode中的Devices工具就能够提供以上2项功能,不需要安装其他第三方工具了,见下面的截图:

  3. Python3.5在Windows 7下连接ORACLE数据库

    1.首先需要安装好oracle数据库,本机适用plsql连接数据库正常,记录下数据库名称 2.安装cx_oracle模块 pip install cx_Oracle 3.python中引入模块 imp ...

  4. 应用市场中包名(package name)的唯一性

    一般的应用商店,在开发者上传应用(APP)的时候,都会对应用的包名进行唯一性的校验.如果此时,用户上传的应用的包名与数据库中的已有的APP的包名一样,那么正常情况下,该应用就不能上传,而弹出提示说,该 ...

  5. theano学习

    import numpy import theano.tensor as T from theano import function x = T.dscalar('x') y = T.dscalar( ...

  6. Gnome_Terminal

    快捷键 ctrl shift m 我自定义的快捷键,可以给终端命名 ctrl shift t 新建标签页,并且目录为当前目录 ctrl shift pageup 标签页往前移 ctrl shift p ...

  7. SQL批量增加修改数据

    insert into A表(字段1,字段2) select 字段1,字段2 From B表 [注:字段类型.字段数应相同] --批量进行修改ID值 declare @i int begin )) F ...

  8. Python实现简单的Web完整版(一)

    在拖了一周之后,今天终于在一个小时之内将一个迷你的Web写出来了,最近改其它项目的bug头好大,但是好喜欢这样的状态. 黑色的12月,所有的任务都聚集在了12月,然后期末考试也顾不上好好复习了,但是但 ...

  9. JSP复习整理(五)JavaBean生命周期

    一.创建一个JavaBean UserBean.java package jsp.test; public class UserBean { private String userName; priv ...

  10. MySQL NoInstall 配置

    1.下载 mysql-mysql-5.1.55-win32.zip 2. 解压缩到任何一个目录,最好目录名称不要有空格: 例如:C:\mysql 3. 删除Embedded,include,lib,m ...