我需要将CSS的字体缩写格式解析成单独的组件(字体系列、字体大小、字重等)。这种缩写格式看起来相当复杂。以下是两个示例:
10px sans-serif
bold italic small-caps 1em/1.5em verdana,sans-serif
在我开始编写解析器之前,是否已经存在可以使用的解析器(最好是用JavaScript编写的)?
我需要将CSS的字体缩写格式解析成单独的组件(字体系列、字体大小、字重等)。这种缩写格式看起来相当复杂。以下是两个示例:
10px sans-serif
bold italic small-caps 1em/1.5em verdana,sans-serif
在我开始编写解析器之前,是否已经存在可以使用的解析器(最好是用JavaScript编写的)?
以下是一种"使用jQuery的css()函数和临时DOM元素"的解决方案:
http://jsfiddle.net/thirtydot/tpSsE/2/
var $test = $('<span />');
$test.css('font', 'bold italic small-caps 1em/1.5em verdana,sans-serif');
alert($test.css('fontWeight'));
alert($test.css('fontStyle'));
alert($test.css('fontVariant'));
alert($test.css('fontSize'));
alert($test.css('lineHeight'));
alert($test.css('fontFamily'));
$test
指向 body
元素(你的示例删除了 body
元素)。你需要使用 var $test = $('<span />').appendTo('body')
。 :) - alex$test
元素插入DOM(第一行的.appendTo('body')
部分)。因此,您也不再需要$test.remove()
语句。这并不是什么大问题,只是更加简洁,可能会带来非常小的性能提升。 - Bill Dami纯粹的自由范围Javascript版本:
var parsedStyleForCSS = function(cssString){
var el = document.createElement("span");
el.setAttribute("style", cssString);
return el.style; // CSSStyleDeclaration object
};
var parsedStyle = parsedStyleForCSS("font: bold italic small-caps 1em/1.5em verdana,sans-serif");
console.log(parsedStyle["fontWeight"]); // bold
console.log(parsedStyle["fontStyle"]); // italic
console.log(parsedStyle["fontVariant"]); // small-caps
console.log(parsedStyle["fontSize"]); // 1em
console.log(parsedStyle["lineHeight"]); // 1.5em
console.log(parsedStyle["fontFamily"]); // verdana, sans-serif
function parseFont(font)
{
var fontFamily = null,
fontSize = null,
fontStyle = "normal",
fontWeight = "normal",
fontVariant = "normal",
lineHeight = "normal";
var elements = font.split(/\s+/);
outer: while (element = elements.shift())
{
switch (element)
{
case "normal":
break;
case "italic":
case "oblique":
fontStyle = element;
break;
case "small-caps":
fontVariant = element;
break;
case "bold":
case "bolder":
case "lighter":
case "100":
case "200":
case "300":
case "400":
case "500":
case "600":
case "700":
case "800":
case "900":
fontWeight = element;
break;
default:
if (!fontSize)
{
var parts = element.split("/");
fontSize = parts[0];
if (parts.length > 1) lineHeight = parts[1];
break;
}
fontFamily = element;
if (elements.length)
fontFamily += " " + elements.join(" ");
break outer;
}
}
return {
"fontStyle": fontStyle,
"fontVariant": fontVariant,
"fontWeight": fontWeight,
"fontSize": fontSize,
"lineHeight": lineHeight,
"fontFamily": fontFamily
}
}
24px
(或任何实际的px
值)代替1.5em
的line-height
是否可接受?你介意使用像 jQuery 这样的 JavaScript 库吗? - thirtydot