什么是css缩放器?
其实就是针对背景图片进行缩放,因为是跟样式捆绑的,所以我们叫样式缩放器。
主要针对无线端,目前无线端高清屏幕越来越多,为了让网页得到更好的用户体验,我们往往需要为高清 屏幕提供2倍大小的背景图片。
但是,有时候用户所在的网络环境不理想,加载非高清版本,能够让内容更快的呈现出来, 于是我们又需要提供一份非高清版本的样式,根据用户网络情况进行切换。
于是,我们需要维护两份相似度很高的样式表,这样便带来了一定的维护成本。
如何解决样式表针对不同的终端带来的维护成本问题?
默认只提供高清版本,普通版本自动生成如何?
Excellent, 此程序就是用来实现此方案的。
-
安装npm包。
npm install -g fis-prepackager-css-scale
-
配置
fis-conf.js
,对scale.css进行条件缩放。// 启用此css-scale插件 fis.config.set('modules.prepackager', fis.config.get('modules.prepackager') + ',css-scale'); // 配置规则, 支持数组 fis.config.set( 'settings.prepackager.css-scale', { include: /scale\.css$/i, condition: '$condition' });
注意settings.prepackager.css-scale
, 可以通过include, exclude来命中文件。
(支持正则,glob语法),插件针对命中的文件进行缩放。另外此配置项支持数组数据,对数组里面的所有规则都进行处理。
如果命中的是css类文件,所有对其引用都会加上缩放并条件引用。
- link标签
-
源码
... <link rel="stylesheet" type="text/css" href="/static/css/scale.css"> ...
-
输出结果
... {%if $condition%}<link rel="stylesheet" type="text/css" href="/static/test/css/scale.css">{%else%}<link rel="stylesheet" type="text/css" href="/static/test/css/scale_0.5x.css">{%/if%} ...
-
- @import规则
-
源码
... <style type="text/css"> @import url(/static/css/scale.css); /*其他样式*/ .ruler { width: auto; } </style> ...
-
输出结果
... <style type="text/css"> {%if $condition%}@import url(/static/test/css/scale.css);{%else%}@import url(/static/test/css/scale_0.5x.css);{%/if%} /*其他样式*/ .ruler { width: auto; } </style> ...
-
- require smarty插件
-
源码
... {%require name="test:static/css/scale.css"%} ...
-
输出结果
... {%if $condition%}{%require name="test:static/css/scale.css"%}{%else%}{%require name="test:static/css/scale_0.5x.css"%}{%/if%} ...
-
如果命中的是html类文件,此页面里面的所有内联style样式都会进行缩放。
页面的中内联样式。(也支持{%style%}格式,这里不另外给出了。)
-
源码
... <style type="text/css"> .ruler { background: url(/static/test/images/iphone.png?xxx); -webkit-background-size: 508px 899px; -moz-background-size: 400px 500px; } .ruler { background: url(/static/test/images/iphone.png); }</style> ...
-
输出结果
{%if $condition%}<style type="text/css"> .ruler { background: url(/static/test/images/iphone.png?xxx); -webkit-background-size: 508px 899px; -moz-background-size: 400px 500px; } .ruler { background: url(/static/test/images/iphone.png); }</style>{%else%}<style type="text/css"> .ruler { background: url(/static/test/images/iphone_0.5x.png?xxx); -moz-background-size: 400px 500px; } .ruler { background: url(/static/test/images/iphone_0.5x.png); background-size: 1017px 1798px; }</style>{%/if%}
默认只会有两个分支if condition
rawelse
raw(scale x 0.5) /if
。
如果这样已经满足你的需求了,只需要修改condition里面的变量值就ok.
如果不满足,可以配置tpl, 这个时候condition配置项已经失效了。如:
fis.config.set( 'settings.prepackager.css-scale', {
include: /scale\.css$/i,
tpl: '#if $ios#__placeholder__#elseif $android#__placeholder__x0.75#else#__placeholder__x0.5#endif#'
});
这里__placeholder__
表示原始内容,__placeholder__x0.5
表示将原始内容缩小了0.5倍。这个数值可以随意配置。
其实进不进行缩放是根据tpl来的,tpl设置为__placeholder__x0.5
, 这样所有的内容就使用0.5缩放版本了。
针对高清屏幕的样式,我们往往会这么写。
.ruler {
background: url('xxx_200x200.png');
background-size: 100px 100px;
}
把它转成普通版本的样式,需要两步。
- 把图片
xxx_200x200.png
,通过photoshop
缩小一倍, 变成xxx_100x100.png
。 - 去掉
background-size
一条。
最终变成。
.ruler {
background: url('xxx_100x100.png');
}
当然还有更多细节处理,这里不列出来!
完全不用担心,效果与photoshop
缩放的效果非常接近。
scale 0.2倍。
默认样式表中所有图片,在此样式缩放的时候都会跟着缩放。如果某个图片不想被缩放,怎么办?
设置一个noScale属性就ok了。如下:
.ruler {
background: url(xxx.png?__noscale);
}