前端TIps —通过正则表达解析css的font参数

1、css font

font 属性可以用来作为 font-style, font-variant, font-weight, font-size, line-height 和 font-family 属性的简写,或将元素的字体设置为系统字体。

font: 1.2em "Fira Sans", sans-serif;
font: italic 1.2em "Fira Sans", serif;
font: italic small-caps bold 16px/2 cursive;
font: small-caps bold 24px/1 sans-serif;

在这里插入图片描述

参考:https://developer.mozilla.org/zh-CN/docs/Web/CSS/font

2、解析 font

const fontRegEx = new RegExp(
  [
    '^\\s*(?=(?:(?:[-a-z]+\\s*){0,2}(italic|oblique))?)',
    '(?=(?:(?:[-a-z]+\\s*){0,2}(small-caps))?)',
    '(?=(?:(?:[-a-z]+\\s*){0,2}(bold(?:er)?|lighter|[1-9]00 ))?)',
    '(?:(?:normal|\\1|\\2|\\3)\\s*){0,3}((?:xx?-)?',
    '(?:small|large)|medium|smaller|larger|[\\.\\d]+(?:\\%|in|[cem]m|ex|p[ctx]))',
    '(?:\\s*\\/\\s*(normal|[\\.\\d]+(?:\\%|in|[cem]m|ex|p[ctx])?))',
    '?\\s*([-,\\"\\\'\\sa-z]+?)\\s*$',
  ].join(''),
  'i'
);
const fontRegExMatchIndex = [
  'style',
  'variant',
  'weight',
  'size',
  'lineHeight',
  'family',
];

/**
 * Get the list of font families from a font spec.  Note that this doesn't work
 * for font families that have commas in them.
 * @param {string} fontSpec The CSS font property.
 * @return {FontParameters} The font parameters (or null if the input spec is invalid).
 */
export const getFontParameters = function (fontSpec) {
  const match = fontSpec.match(fontRegEx);
  if (!match) {
    return null;
  }
  const style = /** @type {FontParameters} */ ({
    lineHeight: 'normal',
    size: '1.2em',
    style: 'normal',
    weight: 'normal',
    variant: 'normal',
  });
  for (let i = 0, ii = fontRegExMatchIndex.length; i < ii; ++i) {
    const value = match[i + 1];
    if (value !== undefined) {
      style[fontRegExMatchIndex[i]] = value;
    }
  }
  style.families = style.family.split(/,\s?/);
  return style;
};

来源:openlayers的css.js文件

3、测试

JSON.stringify(getFontParameters('1.2em "Fira Sans", sans-serif'));

{"lineHeight":"normal","size":"1.2em","style":"normal","weight":"normal","variant":"normal","family":"\"Fira Sans\", sans-serif","families":["\"Fira Sans\"","sans-serif"]}

JSON.stringify(getFontParameters('italic 1.2em "Fira Sans", serif'));
{"lineHeight":"normal","size":"1.2em","style":"italic","weight":"normal","variant":"normal","family":"\"Fira Sans\", serif","families":["\"Fira Sans\"","serif"]}

JSON.stringify(getFontParameters('italic small-caps bold 16px/2 cursive'));
{"lineHeight":"2","size":"16px","style":"italic","weight":"bold","variant":"small-caps","family":"cursive","families":["cursive"]}

JSON.stringify(getFontParameters('small-caps bold 24px/1 sans-serif'));
{"lineHeight":"1","size":"24px","style":"normal","weight":"bold","variant":"small-caps","family":"sans-serif","families":["sans-serif"]}

JSON.stringify(getFontParameters('caption'));

说明:不适用于系统字体:

font:  caption | icon | menu | message-box | small-caption | status-bar;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值