如何制作纯CSS南瓜

最近制作了这个 100% CSS 南瓜来融入恐怖的季节精神,有些人想知道它是怎么做成的。

在 CodePen 上。

那么让我来解释一下它是如何工作的。对于那些只想要代码而不想看到过程的人,这里是 CodePen。

我以前从来没有做过这样的事情所以我的第一个目标是 3 个橙色椭圆形。

因此我从 HTML 开始。




    
    
    CSS Pumpkin
    


    

HTML 现在实际上没有改变任何东西,但它还没有显示任何东西。现在是 CSS 的时间了。

body {
display: flex;
justify-content: center; 
align-items: center;
height: 100vh;
}
.pumpkin {
position: relative;
display: flex;
align-items: center;
}  
.left{
width: 110px;
height: 160px;
background: rgb(255, 117, 24);
border-radius: 50%;
}
.right{
width: 110px;
height: 160px;
background: rgb(255, 117, 24);
border-radius: 50%;
}  
.center{
width: 110px;
height: 160px;
background: rgb(255, 117, 24);
border-radius: 50%;
}

这将输出 3 个并排的完美橙色椭圆。这是怎么回事?首先,我们使用 body 标签将南瓜 div 置于页面中心。我们用前 3 行来实现这一点。接下来,我们使用 `height: 100vh;` 来告诉代码 body 标签占据了 100% 的屏幕。如果没有这个,body 标签将只与内容一样大,这意味着椭圆将位于页面顶部的中心。所以它看起来是这样的。

# Orange Ovals

接下来,我们想让圆圈重叠,这可以通过赋予左右椭圆一个负边距来轻松实现。

.left{
width: 110px;
height: 160px;
background: rgb(255, 117, 24);
border-radius: 50%;
margin-right: -45px;
}
.right{
width: 110px;
height: 160px;
background: rgb(255, 117, 24);
border-radius: 50%;
margin-left: -45px;
}

因此,我们将右侧椭圆向左移动 45 像素,将左侧椭圆向右移动 45 像素。(我不会添加此阶段的照片,因为我还没有办法存储照片)

现在到了更难的部分(有些,好吧,很多谷歌都被用到了)

.stem {
position: absolute;
top: -30px;
left: 50%;
transform: translateX(-50%); /* Center the stem horizontally with in the contanter */
width: 30px;
height: 60px;
background-color: brown;
border-radius: 3px;
z-index: -1;
}
.curve{
position: absolute;
top: -47px;
left: 43%;
transform: translateX(-50%); /* Center the stem horizontally with in the contanter */
transform: rotate(-15deg);
width: 30px;
height: 30px;
background-color: brown;
border-radius: 3px;
z-index: -1;
}

因此,`width`、`height`、`border-radius` 和 `background-color` 是非常不言自明的。所以我将跳过它。从 `position: absolute;` 开始,它所做的是从网站流中移除 div。相反,它基于最近的锚点。`position: absolute;` 可以放置在任何元素上。接下来,为了将 Stem 水平居中,我们使用 `left: 50%` 和 `transform: TranslationX(-50%);`,当你考虑它时它是有意义的,但是你必须考虑它才能开始 `left: 50%` 将南瓜 div 内茎的左边缘居中。我希望茎的中心位于南瓜的中心。`transform: TranslationX(-50%);` 将茎向左移动茎大小的一半。`top: -47px;` 几乎按照您的预期进行操作。它将顶部边缘向上移动 47 像素。 `z-index` 是我最近发现的一个东西,基本上就是元素的高度。我希望 z-index 位于南瓜后面,所以我给它一个 `z-index : -1`,而南瓜的默认索引为 0。这就是它的样子。

Pumpkin

最后是眼睛、嘴巴和背景。我们从眼睛开始,

.left_eye {
left: 70%;
top: 25px;
transform: translateX(-50%);
position: absolute;
border-style: solid;
border-width: 0  30px  41px  50px;
border-color: transparent  transparent  #000000  transparent;
}
.right_eye {
left: 30%;
top: 25px;
transform: translateX(-50%);
position: absolute;
border-style: solid;
border-width: 0  50px  41px  30px;
border-color: transparent  transparent  #000000  transparent;
}

所以这看起来比实际情况更可怕 `border-width: 0 50px 41px 30px;` 所以这里我们设置正方形每边的长度。它从顶部开始按顺时针方向旋转。所以正方形顶部的长度为 0。这是因为三角形有 3 条边,这个技巧让我们可以移除其中一条边来构成三角形。然后右边长 50px,底部长 50px,左边长 30px。对于右眼,我们翻转左右值,使其指向另一个方向。`border-color: transparent transparent #000000 transparent;` 所以你可能想知道为什么有这么多透明的。你看这里实际上有 3 个三角形(其中一个由于宽度为 0 而不存在)我们只想给底部三角形上色,所以我们将其他 3 个设置为透明。`border-style: solid;` 我们希望三角形有实心填充,所以我们必须将样式设置为 Solid。我们并没有真正填满三角形,而是有一个很大的边框,所以看起来就像填满了一样。完成所有这些之后,我们现在有了眼睛。

EYES

最后一步是微笑。

.smile {
position: absolute;
width: 80px;
height: 25px;
top: 90px;
left: 25%;
background-color: rgb(0, 0, 0);
border-top-left-radius: 110px;
border-top-right-radius: 110px;
border: 5px  solid  rgb(0, 0, 0);
border-bottom: 0;
transform: rotate(190deg)
}

`border-top-left-radius: 110px;` 和 `border-top-right-radius: 110px;` 定义顶角的圆度。这是形成半圆的部分,但这也会将曲线置于顶部。为了解决这个问题,我添加了 `transform: rotate(190deg)` 将其旋转为微笑,并使用 `left: 25%;` 使其略微偏离中心。所以这是最终结果。

查看 micfun123 (@micfun123) 的笔

在 CodePen 上。

我承认这不是最漂亮或最有效的解决方案,但这是我第一次尝试用 CSS 绘制一些东西,我对此相当满意。一如既往,欢迎在 Discord 或 reddit 上给我留下反馈。