我正在尝试重新创建Google Maps's icon (2020)。色彩缤纷的背景和甜甜圈洞很简单:我只需要一些渐变和蒙版。
下面是一个片段,展示了我目前的努力(如果你想玩的话,还有a codepen):
:root {
--1-3: calc(100% / 3);
--2-3: calc(100% / 3 * 2);
--sqrt-2: 1.4142135624;
--hole-diameter: calc(100% / var(--sqrt-2) / 3);
--red: #ea4335;
--yellow: #fbbc04;
--green: #34a853;
--blue: #1a73e8;
--azure: #4285f4;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
}
#wrapper {
margin: 3em auto;
width: 10em;
background: linear-gradient(90deg, #c0392b, #8e44ad);
}
#icon {
--mask: radial-gradient(
circle at center,
transparent calc(var(--hole-diameter) - 1px),
#000 calc(var(--hole-diameter) + 1px)
);
border-radius: 50% 50% 50% 0;
aspect-ratio: 1 / 1;
background:
linear-gradient(
180deg,
var(--red) var(--1-3),
var(--yellow) var(--1-3) var(--2-3),
var(--green) var(--2-3)
),
linear-gradient(
180deg,
var(--blue) var(--1-3),
var(--azure) var(--1-3) var(--2-3),
var(--green) var(--2-3)
) calc(100% - 1px);
background-size: 50% 100%;
background-repeat: no-repeat;
-webkit-mask: var(--mask);
mask: var(--mask);
rotate: -45deg;
}
<div id="wrapper">
<div id="icon"></div>
</div>
然而,我无法理解它的奇特形状。是否可以只使用CSS创建这样的形状?
很明显,我不是在寻找基于SVG的解决方案。我这样做是一个宠物项目,所以我只需要的东西,在至少一个浏览器的作品。
1条答案
按热度按时间cgfeq70w1#
这是我能想到的最好的,通过滥用多个
radial-gradient
,-webkit-mask-image
,-webkit-mask-image-composite
,不幸的是:“pointy-bit”的兄弟元素,而不是能够扩展原始#icon
,也不使用::after
元素(因为::after
元素将被其父元素的掩码裁剪)。(我想这可以重新组织,使顶部的圆形部分使用
::before
,点状部分使用::after
,否则#icon
只作为它的两个伪元素子元素的容器和边界,但这是留给读者的练习)。这就是它在Chrome中的样子。我没有在其他浏览器中测试过: