首页 > 解决方案 > 使用javascript编写CSS特异性函数

问题描述

我需要编写一个 javascript 函数,它比较传入的两个参数。它们将是字符串。并代表 CSS 类。

该函数的目的是加权 CSS 特异性。因此,如果传入的参数是 CSS ID,则应该返回它而不是第二个参数。(例如,如果 a = '#id',它将击败 b = '.red')。

有点迷失在我的 javascript 函数的最佳方法上。不确定是使用 if/else 语句还是 switch/case。无论哪种方式,它都会变得混乱,需要一些指示。

这是我正在尝试做的事情:

标签: javascriptcss-selectorsstring-comparisoncss-specificity

解决方案


我最近在一次求职面试中遇到了这个确切的问题,我能够像这样弄清楚:

function compare(a, b) {
  let aItems = a.split([" "]);
  let aRating = [0, 0, 0];

  aItems.forEach((i) => {
    if (i.split("#").length > 1) {
      aRating[0] = aRating[0] + (i.split("#").length - 1);
    }

    if (i.split(".").length > 1) {
      aRating[1] = aRating[1] + (i.split(".").length - 1);
    }

    if (!i.startsWith("#") && !i.startsWith(".")) {
      aRating[2] = aRating[2] + 1;
    }
  });

  let bItems = b.split([" "]);
  let bRating = [0, 0, 0];

  bItems.forEach((i) => {
    if (i.split("#").length > 1) {
      bRating[0] = bRating[0] + (i.split("#").length - 1);
    }

    if (i.split(".").length > 1) {
      bRating[1] = bRating[1] + (i.split(".").length - 1);
    }

    if (!i.startsWith("#") && !i.startsWith(".")) {
      bRating[2] = bRating[2] + 1;
    }
  });

  if (aRating[0] > bRating[0]) {
    return a;
  } else if (bRating[0] > aRating[0]) {
    return b;
  }

  if (aRating[1] > bRating[1]) {
    return a;
  } else if (bRating[1] > aRating[1]) {
    return b;
  } else if (
    bRating[0] === aRating[0] &&
    bRating[2] === 0 &&
    aRating[2] === 0
  ) {
    return b;
  }

  if (aRating[2] > bRating[2]) {
    return a;
  } else if (bRating[2] > aRating[2]) {
    return b;
  }
}

但是有一个问题,假设您正在比较tagnames(即,htmlbody具体,特异性越高),那么您可能会遇到一些困难。我能够通过一系列 if else 测试破解我的方式。


推荐阅读