HOME

使用 CSS 绘制 Ruby 可爱的红宝石标志

有一次偶然逛 Dribbble,发现了这个可爱的红宝石标志。

Ruby 的标志本来就很好看,加上这个配色,更加好看了。

正好我一直想抽个时间做一个 Ruby 首页,自然是需要一个 Logo 的,于是就收藏了这张图片。本来想到时候简单的把图片贴上去就行了。没想到的是,我在逛 CodePen 的时候,竟然发现了一个用 CSS 写的一模一样的 Logo。有意思,当时一时没想明白是怎么实现的。正好那几天要考试,没时间研究源码,今天正好考完微积分,好好研究了一下。

看完了源码,其实用到的技术特别简单,就是利用 CSS 来产生三角形,然后定位组合。关于 CSS 怎么产生三角形,这个很早之前我就研究过了,主要是利用 border 的一些性质。仔细观看 Ruby 那个 Logo 可以发现,其实就是由好多三角形构成,上面有五个,下面有三个,然后一个 Shadow。利用很简单的技术,可以做出很 amazing 的效果,其实,很多时候,缺的不是技术,是想法。

今天下午我自己重新动手写了一个,本来觉得会很难,写完发现其实不难,但是首先要搞到一点数据。就是宝石中各个三角形的长宽高比例。这个难倒我了,我去 Google 变着关键词想把宝石的数学比例搜索出来,很遗憾,没找到,可能是太心急了,太过数学的文章都看不进去。只能投机取巧了,直接使用原作者的比例数据。因为如果比例弄错了,做出来的宝石会相当难看。

一会我会贴出我“参考”源作者代码的数据。

现在首先要知道 CSS 的 border 模型,就是如果一个元素的 width 和 height 都为 0 的时候,你设置了他的 border,会是一个什么情况。

<div class="test_1"></div>
<div class="test_2"></div>
<div class="test_3"></div>
<div class="test">Love is everything</div>
.test_1 {
  width: 0;
  height: 0;
  border: solid;
  border-width: 80px;
  border-color: #64b5c9  #89c7d7 #afd9e4 #d5ebf1;
}

.test_2 {
  width: 0;
  height: 0;
  border: solid;
  border-width: 0 80px 80px 80px;
  border-color: transparent #bc42a8 #d88ccc #f2d8ee;
}

.test_3 {
  width: 0;
  height: 0;
  border: solid;
  border-width: border-width:0 0 80px 80px;
  border-color: transparent transparent #5342bc #dbd8f2;
}

.test {
  width: 200px;
  border: solid 30px;
  border-color: #e9c2c6 #c6e9eb  #ede1ca #efefcf;
}

从上面示例可以看出,border 并不是大家可能想象以为的方形,其实上,border 的形状是一个梯形(如果元素有宽度和高度的话),当元素宽度和高度为零的时候,梯形变为三角形。上面展示的代码分别产生了四个,三个,两个三角形以及四个梯形。

当三角形形成后,你可能只想用一个,利用颜色为 transparent 便可以隐去其他三角形,是不是很简单?

当然,注意观察会发现,border 只能产生特定形状的三角形。而不是能产生任意形状。

现在来贴数据,从上到下,从左到右,给八个三角形分别命名为 1-8 号。我来分别列出各自的数据。数据以三角形顶点为中心,分别为顶点左边长度,顶点右边长度,以及顶点到对边的高。

序号 顶点左边长度 顶点右边长度
1 63 26 60
2 26 62.5 60
3 62.5 62.5 60
4 62.5 26 60
5 26 62.5 60
6 0 151.5 150
7 62.5 62.5 150
8 0 151.5 150

现在我们来分析这个大大的红宝石。上面是五个三角形,我们可以设置两个 div,class 分别为 top_1top_2。然后第一个 div 负责形成三个三角形,利用 :before:after 伪元素便可以。第二个 div 负责形成两个三角形。只要一个 :after 就可以了。

下面是三个三角形,一个 div 搞定。class 是 bottom。当然,下面左右边的三角形都是 border 不能直接产生的,我们利用产生大的直角三角形。然后定位,利用 z-index 覆盖。如果看不懂,参考源码。先贴出超级简单的 HTML 代码。

<div class="top_1">
<div class="top_2">
<div class="bottom">

然后便是对着上面表格中的数据写 CSS 了。

.top_1 {
  width: 0;
  height: 0;
  border: solid;
  /* 
    最最核心的便是这个数据,一定要按照表格中的数字来
    如果这个比例不多,图形会丑到你不忍直视
    这个故事告诉我们,比例非常重要
  */
  border-width: 60px 62.5px 0 26px;   
  border-color: #d94e4e transparent transparent transparent;
  position: absolute;
  left: 100px;
}

.top_1:before {
  /* 不要忘记了这个,非常关键,忘记了就什么都看不见了 */
  content: "";  
  width: 0;
  height: 0;
  border: solid;
  border-width: 0 26px 60px 63px;
  border-color: transparent transparent #ffb9b9 transparent;
  position: absolute;
  /* 定位数据需要自行调试 */
  top: -60px;   
  left: -89px;  
}

.top_1:after {
  content: "";
  width: 0;
  height: 0;
  border: solid;
  border-width: 0 62.5px 60px 62.5px;
  border-color: transparent transparent #eb7474 transparent;
  position: absolute;
  top: -60px;
}

.bottom {
  width: 0;
  height: 0;
  border: solid;
  border-width: 150px 62.5px 0 62.5px;
  border-color: #c54040 transparent transparent transparent;
  position: absolute;
  left: 125px;
  top: 60px;
}

.bottom:before {
  content: "";
  width: 0;
  height: 0;
  border: solid;
  border-width: 150px 151.5px 0 0;
  border-color: #a02828 transparent transparent transparent;
  position: absolute;
  z-index: -2;
  top: -150px;
}

OK,一个大大的萌萌的 Ruby 标志就搞定了~