army8735 / more

a css pre-compiler&agressive compressor
http://army8735.me/more
68 stars 4 forks source link

unbox在font-family(value)不一致 #21

Closed army8735 closed 9 years ago

army8735 commented 9 years ago
a{font-family:~"arail,宋体"}

~""为unbox语法。

fn的param、vardecl的赋值都是去除引号,而style的value中则多了split(',')的逻辑,考虑是否保持一致

army8735 commented 9 years ago

简而言之,变量声明、函数参数:

$a = ~"margin:0;padding:0";
div {
  $fn(~"margin:0")
}

都是去除外层引号,unbox的作用就是如此:字符串中可以出现本来不可出现的,和;等特殊符号——它们会干扰语法解析。

font-family中原本的特殊逻辑:

a{font-family:~"arail, 宋体"}

没有去除引号,而是按,split了下。

a{font-family:"arail", "宋体"}

如果统一unbox逻辑,则会对低版本浏览器造成伤害。

a{font-family:arail,宋体}

当字体出现空格和非英文时,记得低ie下有问题。

army8735 commented 9 years ago

@hax 我又来打扰你了

hax commented 9 years ago

unbox本身的作用我没搞明白。 $a = ~"margin:0;padding:0"; 跟没有~$a = "margin:0;padding:0"; 的区别是?

army8735 commented 9 years ago

普通是

$a : 0;
$a = margin:0;
$a = 1px 2px 3px 4px;

没引号的,引号是字符串了。变量可以是数字等基础变量,也可以是样式的值或整个样式这种复合变量。

变量申明以;结尾,以,分隔。

如果出现;就认为结束了。于是当后面的值中出现;,这样的符号时会影响解析。比如声明了2个样式,中间自然有个;。

同理在fn参数中:

$fn(rgba(0,0,0,0.5))

整个应该是一个参数,但因为参数以,分隔,导致解析到第一个0后发生错误。此时unbox就是把整个用~""包含起来,于是里面可以出现特殊符号不影响解析。

$fn(~"rgba(0,0,0,0.5)")
hax commented 9 years ago

以我的理解,这本来可以用更简单的 \ 来escape嘛: $a = margin:0\; padding:0

但就本身这个case而言,我理解为 font-family 的赋值带有特别的 serialize 规则。本身和unbox的行为并不矛盾。