const SPEEDX_STYLE_W3C = 1; //表示支持这一属性或支持这一属性值的浏览器都是采取标准格式,即不带浏览器前缀的书写办法;
const SPEEDX_STYLE_MOZ = 2; //火狐浏览器内核(-moz-):表示支持这一属性或属性值的火狐浏览器在书写格式上要带\"大众-moz-\"大众前缀;
const SPEEDX_STYLE_WEBKIT = 4; //Chrome和Safari浏览器内核:表示支持这一属性或属性值的浏览器在CSS书写格式上要带\"大众-webkit-\"大众前缀;

const SPEEDX_STYLE_MS = 8; //IE浏览器内核:IE支持的CSS特性,要加\"大众-ms-\"大众前缀
const SPEEDX_STYLE_O = 16; //Opera浏览器内核:对付兼容部分Opera浏览器,CSS特性前要加\"大众-o-\公众前缀
const SPEEDX_STYLE_ALL = 31; //所有兼容模式,为了兼容大部分主流浏览器的不同版本,要加上上面所有的前缀。
为什么我们定义这样的常量都因此2的指数形式定义。缘故原由很大略,属性叠加后还能还原。我们末了定义的一个常量SPEEDX_STYLE_ALL是前面几个常量的总和,表示全部支持以上属性。那么如何拆解这个值还原成各个属性值呢。方法有很多,但是我们要找到效率和性能最高的那个方法。我们知道一个以2为基数幂次方(X)的二进制表示是第1位为1,别的为0,而这个数的X-1的二进制表示则是第1位为0,其它位则为1,如果我们将这两个数用位运算相与,则得到的结果必定为0,否则必定大与0。以这个特性,我们就能判断数X是不是2的幂次方。如下所示:
$dec = (($num & ($num - 1)) === 0) ? true : false;
这样当$dec为true时,$num为2的幂次方。根据这个思路,数值31是由哪些2的指数幂叠加的呢,我们只要逐次递减循环判断就可以。当判断到16时,就可以将16存储,再用前一次循环的最大值减去这个值,即31 - 16 = 15,再用15连续递减循环判断,以此类推就能得到所有的原始叠加值。其完全的实当代码如下:
/
二进制分解,用于属性叠加
/
function decomposeBinary($number){
$numList = [];
if(!is_int($number)) return $numList;
$max = $number;
while($max > 0){
if($max === 1){
$numList[] = 1;
$max = 0;
break;
}
if(($number & ($number - 1)) === 0 ? true : false){
$numList[] = $number;
$max = $max - $number;
$number = $max;
}else{
$number--;
}
}
return $numList;
}
现在,用这个函数就可以拆解到我们所须要的属性了,当我们这样做时:
$attrList = decomposeBinary(SPEEDX_STYLE_ALL);
var_dump($attrList),就会得到我们想要的属性数组了。
再根据这个属性列表,我们写一个前面所提到的输出不同浏览器所支持的样式属性时,就很随意马虎做了。
根据得到的数据,我们做相应的前缀添加。如下所示:
$brw = decomposeBinary($pa);
$key = [];
foreach($brw as $val){
if($val === SPEEDX_STYLE_W3C)$key[] = \"大众 \公众;
if($val === SPEEDX_STYLE_MOZ)$key[] = \"大众moz\"大众;
if($val === SPEEDX_STYLE_WEBKIT)$key[] = \公众webkit\"大众;
if($val === SPEEDX_STYLE_MS)$key[] = \"大众ms\公众;
if($val === SPEEDX_STYLE_O)$key[] = \"大众o\公众;
}
这样,$key里便是所有浏览器对应的样式属性支持的前缀列表了。我们来写一个大略的函数:
function echocss($attr,$brw){
$brw = decomposeBinary($brw);
$key = [];
foreach($brw as $val){
if($val === SPEEDX_STYLE_W3C)$key[] = \"大众\公众;
if($val === SPEEDX_STYLE_MOZ)$key[] = \"大众-moz-\"大众;
if($val === SPEEDX_STYLE_WEBKIT)$key[] = \公众-webkit-\"大众;
if($val === SPEEDX_STYLE_MS)$key[] = \公众-ms-\公众;
if($val === SPEEDX_STYLE_O)$key[] = \"大众-o-\公众;
}
$_css_attr = \"大众\公众;
foreach($key as $val){
$_css_attr .= $va l. $attr;
}
return$_css_attr;
}
用这个函数我们来测试一下看看能不能得到我们想要的结果:
var_dump(echocss(\公众width:100px;\公众,SPEEDX_STYLE_ALL));
得出的结果如下:
\公众-o-width:100px;-ms-width:100px;-webkit-width:100px;-moz-width:100px;width:100px;\"大众
很完美是不是,
当然,这里所做的只是个示例,其功能并不符合实际需求。
如果真有这方面的需求的朋友们,请关注我的头条号,最近我在写一个speedx小项目,能以php的方法完美实现CSS、js及html的完美功能,并且天生的代码压缩率很高哦。