6

分享一个高级CSS面试题:在CSS中实现if-else!

 2 years ago
source link: https://www.fly63.com/article/detial/11929
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
英文 | https://medium.com/frontend-canteen/an-advanced-css-interview-question-implement-if-else-in-css-bb681d786d76
翻译 | 杨小爱

我的一个朋友在最近的一次面试中遇到了一个有趣的 CSS 面试问题。当我第一次看到这个问题时,我认为这是一个常见的CSS问题。然而,经过仔细研究,我发现了这个问题的有趣部分。

面试题:请用CSS实现如下效果:

62da1933b5b86.jpg

页面上有一些数字显示文章阅读的数量。如果数字小于 100,则数字的颜色为灰色。如果数字大于或等于 100,则数字为棕色,而且这种颜色可以动态调整,而不是提前预设。

62da19a64a6ca.gif

最后面试官要求用纯CSS来解决这个问题,你知道如何达到这个效果吗?

题目分析

这个问题的本质是什么?

这个问题的本质很简单,也就是说,这实际上是一个 if-else 问题。

如果我们用伪代码描述这个问题,它应该是这样的:

let color;
if (reads < 100){
  color = 'gray'
} else {
  color = 'brown'
}

所以现在问题变成了:我们如何在 CSS 中实现这个 if-else 逻辑?请记住,CSS 中没有 if-else 关键字之类的东西。

在 CSS 中实现 if-else

在 CSS 中实现 if-else 的逻辑是本题考查的核心技能。让我们在下面完成这个逻辑。如果你学会了这个技巧,你可以用它来实现许多强大的 CSS 效果。

首先,让我们了解一个叫做clamp的函数

clamp() CSS 函数将一个值限制在上限和下限之间。clamp() 允许在定义的最小值和最大值之间的值范围内选择中间值。

基本语法格式:

clamp(min, var, max)

我们可以将clamp函数理解为这样的伪代码:

funciton clamp(min, var, max){
  if(var <= min){
    return min
  }

  if(var >= max){
    return max
  }

  if(var > min && var < max){
    return var
  }
}

clamp(10, 13, 20) → 13

clamp(10, 2, 20) → 10

clamp(10, 30, 20) → 20

用法示例:

62da19c3d7a5c.gif

font-size 的值不会超过 20px,也不会低于 10px。

这是clamp的基本用法。

如果您对clamp仍有疑问,可以参考 MDN 文档。

接下来,我们在 CSS 中实现这个功能。

result的值根据 var 的值而变化:

当 var 的值小于 100 时,结果的值为 10;

当 var 的值大于等于 100 时,结果变为 20。

如果我们用伪代码描述这个问题,它应该是这样的:

let result;
if(var < 100){
  result = 10
} else {
  result = 20
}

这个要求和clamp函数类似,但又不一样。clamp可以将 var 的值限制在一个范围内,但我们现在希望结果的值是 10 或 20。

那我们怎么做?

有一个特殊的技巧:我们可以放大 var 的变化,使其值要么达到区间的上限,要么达到区间的下限。

let result = clamp(10, (var-99) * 20, 20)

这会产生一个效果:

  • 如果 var 的值为 99,则表达式变为:clamp(10, 0, 20), takes 10.
  • 如果 var 的值为 100,则变为:clamp(10, 20, 20), takes 20.

用一张图解释:

62da19cd88483.jpg

同样,如果我们希望:

当 var 的值小于 50 时,result的值为 5。

当 var 的值大于等于 50 时,result的值为 15。

我们只需要这样写:

let result = clamp(5, (var-49) * 15, 15)

你有没有注意到:这实际上是 if-else 的效果,我们做到了。

62da19d2926e7.jpg

在 CSS 中切换颜色

回到最初的面试问题。

为了让我们后面可以使用 CSS 进行变量计算,我们需要将值放在一个 CSS 变量中,所以 html 可以这样写:

<num>1<span>reads</span></num>
<num>99<span>reads</span></num>
<num>102<span>reads</span></num>

如果我们不需要考虑 HTML 语义或 seo 因素,这里的“数字”和“读取”都可以由伪元素生成:

<head>
  <style>
    num::before {
      counter-reset: num var(--num);
      content: counter(num);
    }

    num::after {
      content: 'reads';
    }
</style>
</head>

<body>
  <div>
    <num></num>
    <num></num>
    <num></num>
  </div>
</body>

如果对 content 和 counter-reset 不熟悉,可以查看 MDN 文档。

具体的演示效果,可以通过以下地址查看:

棕色为#aa540e,用HSL颜色表示为hsl(27, 50%, 36%),如下:

62da19d928779.jpg

它的饱和度控制颜色的鲜艳程度。饱和度越高,颜色越鲜艳,饱和度越低,颜色越暗。当饱和度降低到0时,就变成了完全的灰色,如下:

62da19dd6e102.jpg

在灰色和棕色之间切换颜色,即在 hsl(27, 85%, 36%) 和 hsl(27, 85%, 36%) 之间切换。

于是就有如下代码:

num{
  --s: clamp(0%,(var(--num) - 99) * 99%,85%);/* >100 */
  color: hsl(27 var(--s) 36%);
}

最终的演示:

总结

我们通过clamp函数在CSS中实现if-else效果,最后让颜色根据变量的值进行切换。

其实原面试题还有另外一部分,简单来说就是:让颜色在多个值之间切换。仅使用 if-else 不足以满足此要求,有兴趣的话,可以留言交流学习。

链接: https://www.fly63.com/article/detial/11929


Recommend

  • 76
    • 掘金 juejin.im 6 years ago
    • Cache

    几道高级前端面试题解析

    目前自己组建的一个团队正在写一份面试图谱,将会在七月中旬开源。内容十分丰富,第一版会开源前端方面知识和程序员必备知识,后期会逐步写入后端方面知识。因为工程所涉及内容太多(目前已经写了一个半月),并且还需翻译成英文,所以所需时间较长。本篇的一些知...

  • 54
    • 掘金 juejin.im 6 years ago
    • Cache

    Java高级面试题及答案

    List和Set比较,各自的子类比较对比一:Arraylist与LinkedList的比较1、ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。2、因为地址连续, ArrayList要

  • 32
    • www.jianshu.com 6 years ago
    • Cache

    iOS高级开发面试题 - 简书

    iOS面试题目100道 1.线程和进程的区别。 进程是系统进行资源分配和调度的一个独立单位,线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。线程基本不拥有系统资源,拥有自己的栈空间,它与同属一个进程的其他线程共享进程所...

  • 57
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    出一套 iOS 高级面试题

  • 65

    如今安卓开发不像前几年那么热门,但是高级人才依然紧缺,大家看着这句话是不是很熟悉,因为 web 高级人才也紧缺,c++ 高级人才一样紧缺,那么到了人工智能时代,人工智能时代的高级人才也同样会紧缺!似乎是高级人才的人在其他领域也是高级人才,而不是因为选择了...

  • 10

    CSS Is Finally Getting If/Else Statements!Kenton de Jong on 2021-10-09

  • 5
    • segmentfault.com 2 years ago
    • Cache

    CSS,我可以写 if/else 语法了?

    CSS,我可以写 if/else 语法了?发布于 10 月 28 日作者:Kenton de Jong译者:前端小智来源:codingnconcept

  • 3
    • www.wisdomgeek.com 2 years ago
    • Cache

    Writing conditionals in CSS: when/else

    CSS already has had conditionals in the form of @media queries or @support queries to selectively apply styling to the document. But there is a new proposal called when/else which takes it to a different level.At the time of writi...

  • 2

    CSS Houdini:用浏览器引擎实现高级CSS效果 vivo 互联网前端团队-Wei Xing Houdini被称之为Magic of styling and layout on the web,看起来十分神秘,但实际上,Houdini并非什么神秘组织或者神奇魔法,...

  • 1

    做一个程序员面试题分享的网站能行么 - V2EX V2EX = way to explore V2EX 是一个关于分享和探索的地方 这是一个专门讨论 idea 的地方。每个人的时间,资源是有限的,有的时候你或许能...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK