发表日期: 2021-05-08 10:23:30 浏览次数:75
宜阳网站制作要多少钱【域名企业邮箱服务器注册申请办理】宜阳网络优化公司哪家好、宜阳软件开发外包价格、宜阳高端企业网站页面制作设计专业公司、宜阳微信公众号小程序购物支付搭建制作公司
宜阳县,隶属于河南省洛阳市,位于洛阳市西部,介于东经111°45′~112°26′北纬34°16′~34°42′之间,属暖温带大陆性季风气候。截至2019年,宜阳县总面积1616.8平方公里。截至2019年,宜阳县下辖12镇4乡,县政府驻城关镇 [1] 。 [2-3]
宜阳县地域,夏、商时属于豫州雒西地,战国为韩国宜阳邑。1986年4月,洛阳专区撤销,宜阳县改属洛阳市。 [4] 宜阳县境内省道八官线、安虎线横穿东西,省道南车、县道宜新路和宜白路贯穿南北,洛阳市西南环绕城高速、郑西高速铁路客运专线穿境而过。 [5]
2020年,宜阳县完成地区生产总值315亿元,增长3%;固定资产投资增长6.6%;规上工业增加值增长3.6%;一般公共预算收入14.5亿元,增长4.6%; [30]
做一个8帧的逐帧动画,每帧的尺寸为:360×540。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | .steps_anim { position: absolute; width: 9rem; height: 13.5rem; background: url(//misc.aotu.io/leeenx/sprite/m.png) 0 0 no-repeat; background-size: 45rem 13.5rem; top: 50%; left: 50%; margin: –5.625rem 0 0 –5.625rem; animation: step 1.2s steps(5) infinite; } @keyframes step { 100% { background-position: –45rem; } } |
观察在主流(手机)分辨率下的播放情况:
iPhone 6 (375×667) | iPhone 6+ (414×736) | iPhone 5 (320×568) | Android (360×640) |
---|---|---|---|
四种分辨率下,可以看到除了 ip6
其它的三种分辨率都发生了抖动。(ip6
不抖动的原因是适配方案是基本于 ip6
的分辨率订制的。)
图像由终端(屏幕)显示,而终端则是一个个光点(物理像素)组成的矩阵,换句话说图片也一组光点矩阵。为了方便描述,笔者假设终端上的一个光点代表css中的1px。
以下是一张 9px * 3px
的sprite:
每帧的尺寸为 3px * 3px
,逐帧的取位过程如下:
把 sprite 的 background-size 的宽度取一半,那么终端会怎么处理?
9 / 2 = 4.5
终端的光点都是以自然数的形式出现的,这里需要做取整处理。取整一般是三种方式:round/ceil/floor
。假设是 round ,那么 background-size: 5px
,sprite 会是以下三种的一个:
情况一 | 情况二 | 情况三 |
---|---|---|
理论上,5 / 3 = 1.666...
。但实际上光点取整后,三个帧的宽度都不可能等于 1.666...
,而是有一个帧的宽度降级为 1px
(亏),另外两个宽度升级为 2px
(盈),笔者把这个现象称作「盈亏互补」。
再看一下盈亏互补后,逐帧的取位过程:
情况一 | 情况二 | 情况三 |
---|---|---|
可以看到由于盈亏互补导致了三个帧的宽度不一致,亏的那一帧在动画中的表示就是抖动。
笔者总结抖动的原因是:sprite在尺寸缩放后,帧与帧之间的盈亏互补现象导致动画抖动
附注:1px 由几个光点表示是由以终端的 dpr 决定
「盈亏互补」也可以说是「盈亏不一致」,如果尺寸在缩放后「盈亏一致」那么抖动现象可以解决。
笔者根据「盈亏一致」设计了「解决构想一」:
根据上图,其实很容易就联想到一个简单的方案:不用雪碧图(即一帧对应一张图片)。
这个方案确实是可以解决抖问题,不过笔者并不推荐使用它,因为它有两个负面的东西:
KB变大与请求数增多
多余的 animation 代码
这个方案很简单,这里就不赘述了。
把逐帧取位与图像缩放拆分成两个独立的过程,就是笔者的「解决构想二」:
实现「构想二」,笔者首先想到的是使用 transform: scale()
,于是整理了一个实现方案A:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | .steps_anim { position: absolute; width: 360px; height: 540px; background: url(//misc.aotu.io/leeenx/sprite/m.png) 0 0 no-repeat; background-size: 1800px 540px; top: 50%; left: 50%; transform-origin: left top; margin: –5.625rem 0 0 –5.625rem; transform: scale(.5); animation: step 1.2s steps(5) infinite; } @keyframes step { 100% { background-position: –1800px; } } /* 写断点 */ @media screen and (width: 320px) { .steps_anim { transform: scale(0.4266666667); } } @media screen and (width: 360px) { .steps_anim { transform: scale(0.48); } } @media screen and (width: 414px) { .steps_anim { transform: scale(0.552); } } |
这个实现方案A存在明显的缺陷:scale 的值需要写很多断点代码。于是笔者结全一段 js 代码来改善这个实现方案B:
css:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | .steps_anim { position: absolute; width: 360px; height: 540px; background: url(“//misc.aotu.io/leeenx/sprite/m.png”) 0 0 no-repeat; background-size: 1800 540px; top: 50%; left: 50%; transform-origin: left top; margin: –5.625rem 0 0 –5.625rem; animation: step 1.2s steps(5) infinite; } @keyframes step { 100% { background-position: –1800px; } } |
javascript:
1 2 3 4 5 6 7 8 9 | // 以下代码放到 <head></head> 中 <script> document.write(“<style id=’scaleStyleSheet’>.steps_anim {scale(.5); }</style>”); function doResize() { scaleStyleSheet.innerHTML = “.steps_anim {-webkit-transform: scale(“ + (document.documentElement.clientWidth / 750) + “)}”; } window.onresize = doResize; doResize(); </script> |
通过改善后的方案 CSS 的断点没了,感觉是不错了,不过笔者觉得这个方案不是个纯粹的构建方案。
我们知道 <img>
是可以根据指定的尺寸自适应缩放尺寸的,如果逐帧动画也能与 <img>
自适应缩放,那就可以从纯构建角度实现「构想二」。
SVG
刚好可以解决难题!!!SVG
的表现与 <img>
类似同时可以做动画。以下是笔者的实现方案C。
html:
1 2 3 | <svg viewBox=“0, 0, 360, 540” class=“steps_anim”> <image xlink:href=“//misc.aotu.io/leeenx/sprite/m.png” width=“1800” height=“540” /> </svg> |
css:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | .steps_anim { position: absolute; width: 9rem; height: 13.5rem; top: 50%; left: 50%; margin: –5.625rem 0 0 –5.625rem; image { animation: step 1.2s steps(5) infinite; } } @keyframes step { 100% { transform: translate3d(-1800px, 0, 0); } } |
实现方案C很好地解决了方案A和方案B的缺陷,不过方案C也有它的问题:不利于自动化工具去处理图片。
自动化工具一般是怎么处理图片的?
自动化工具一般是扫描 CSS 文件找出所有的 url(...)
语句,然后再处理这些语句指向的图片文件。
如果 <image>
可以改用 CSS 的 background-image
就可以解决这个问题,不过 SVG
不支持 CSS 的 background-image
。但是,SVG
有一个扩展标签:foreignObject
,它允许向 <svg></svg>
插入 html
代码。在使用它前,先看一下它的兼容情况:
iOS 与 Android 4.3 一片草绿兼容情况算是良好,笔者实机测试腾讯 X5
内核的浏览器兼容仍旧良好。以下是改良后的方案。
html:
1 2 3 4 5 | <svg viewBox=“0, 0, 360, 540” class=“steps_anim”> <foreignObject class=“html” width=“360” height=“540”> <div class=“img”></div> </foreignObject> </svg> |
css:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | .steps_anim { position: absolute; width: 9rem; height: 13.5rem; top: 50%; left: 50%; margin: –5.625rem 0 0 –5.625rem; } .html { width: 360px; height: 540px; } .img { width: 1800px; height: 540px; background: url(//misc.aotu.io/leeenx/sprite/m.png) 0 0 no-repeat; background-size: 1800px 540px; animation: step 1.2s steps(5) infinite; } @keyframes step { 100% { background-position: –1800px 0; } } |
宜阳网站制作要多少钱【域名企业邮箱服务器注册申请办理】宜阳网络优化公司哪家好、宜阳软件开发外包价格、宜阳高端企业网站页面制作设计专业公司、宜阳微信公众号小程序购物支付搭建制作公司
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: https://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 昌平殡葬| 朝阳殡葬|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878