【问题标题】:CSS Single Div Drawing - ShapesCSS 单 div 绘图 - 形状
【发布时间】:2018-06-09 17:40:56
【问题描述】:

我正在尝试使用 CSS 渐变和单个 div 进行绘制。

不幸的是,没有足够的信息,所以我需要通过阅读其他人的代码来自己学习。以下是一些示例:

https://codepen.io/PButcher/pen/JMRKpG

https://codepen.io/jkantner/pen/zdeJYg

https://codepen.io/jkantner/pen/ppjRBP

https://codepen.io/jkantner/pen/XMLVXa

到目前为止,我只学会了如何创建几个基本形状:

div
{
    height: 20em;
    width: 20em;
    
    background:
        linear-gradient( 0deg, #000 0%, #000 100% ) 1em 1em / 5em 5em,
        radial-gradient( circle at center, #000 70%, transparent 70% ) 1em 7em / 5em 5em,
        linear-gradient( 45deg, #000 0%, #000 50%, transparent 50% ) 1em 13em / 5em 5em,
        linear-gradient( -45deg, #000 0%, #000 50%, transparent 50% ) 7em 1em / 5em 5em,
        linear-gradient( 135deg, #000 0%, #000 50%, transparent 50% ) 7em 7em / 5em 5em,
        linear-gradient( -135deg, #000 0%, #000 50%, transparent 50% ) 7em 13em / 5em 5em,
        radial-gradient( 100% 100% at top, #000 50%, transparent 50% ) 14em 1em / 5em 5em,
        radial-gradient( 100% 100% at bottom, #000 50%, transparent 50% ) 14em 2em / 5em 5em,
        linear-gradient( 45deg, #000 0%, #000 50%, transparent 50% ) 14em 7em / 4em 7em,
        radial-gradient( 100% 50%, #000 0%, #000 50%, transparent 50% ) 14em 14em / 5em 5em;

    background-repeat: no-repeat;
}
<div></div>

但是,我想创建更复杂的形状,例如,这只鹰的喙和羽毛,或者它上面的阴影。

可以用 CSS 和单个 div 来实现吗?

【问题讨论】:

  • 我会说是的...因为您可以应用多个渐变、旋转它们、调整位置等...您还可以添加 2 个伪元素来应用相同的东西...但是你需要能够找到如何将图像切割成不同的元素来做到这一点
  • @TemaniAfif 我知道我可以添加多个渐变,但是如何旋转它们?另外,我知道我需要剪切图像,我只是不知道如何创建这个羽毛形状。我尝试了圆形和三角形,但没有运气..
  • 除了 Temani 的回答之外,别忘了,如果您只缺少一个元素,您还可以使用 ::before::after 伪元素。
  • @agrm 我还谈到了伪元素 :)
  • @TemaniAfif 你确实做到了!我浏览了您的代码示例而没有看到它们,但一定错过了您的第四段:o)

标签: css gradient linear-gradients radial-gradients


【解决方案1】:

正如我上面所说,我们可以使用多种技术来实现这样的目标:

  1. radial-gradient 使用 circleellipse 并通过调整 sizeposition

.elem {
 width:300px;
  height:200px;
  border:1px solid;
  background:
       radial-gradient(ellipse at center, red 15%,transparent 15%),
       radial-gradient(circle at 40px 120px, #ffc20f 20%,transparent 20%),
       radial-gradient(circle at right bottom, #000 25%,transparent 25%);
}
<div class="elem"></div>
  1. Linear-gradient 我们可以旋转和调整大小位置

.elem {
  width:300px;
  height:200px;
  border:1px solid;
  background:
       linear-gradient(20deg,transparent 20%,#ffc20f 20%,#ffc20f 30%,transparent 30%) no-repeat 98px -50px / 51px 151px,
       linear-gradient(-20deg,transparent 20%,#ffc20f 20%,#ffc20f 30%,transparent 30%) no-repeat 98px -50px /51px 151px,
       linear-gradient(30deg,red 20%,transparent 20%) no-repeat 10px 30px / 50px 50px,
       linear-gradient(to right,blue 20%,transparent 20%) no-repeat 70px 20px / 50px 60px,
       linear-gradient(40deg,#000 20%,transparent 20%) no-repeat 200px 20px / 15px 100px,
       linear-gradient(-40deg,#000 20%,transparent 20%) no-repeat 200px 20px / 15px 100px;
              

}
<div class="elem" ></div>
  1. 还有clip-path可以帮助你剪切元素和调整全局形状。这也将允许您将元素置于任何背景之上。 (但这个功能在所有浏览器中都是not yet supported):

body {
  background: #f2f2f5;
}

.elem {
  background: #000;
  width: 300px;
  height: 200px;
  -webkit-clip-path: polygon(3% 39%, 13% 21%, 26% 13%, 47% 14%, 69% 21%, 83% 25%, 90% 33%, 72% 37%, 87% 45%, 62% 49%, 87% 58%, 72% 61%, 58% 62%, 42% 62%, 29% 59%, 17% 64%, 18% 50%, 21% 42%, 10% 48%, 5% 59%);
  clip-path: polygon(3% 39%, 13% 21%, 26% 13%, 47% 14%, 69% 21%, 83% 25%, 90% 33%, 72% 37%, 87% 45%, 62% 49%, 87% 58%, 72% 61%, 58% 62%, 42% 62%, 29% 59%, 17% 64%, 18% 50%, 21% 42%, 10% 48%, 5% 59%);
}
<div class="elem"></div>
  1. 您还可以使用伪元素,最多可以添加 2 个新元素,您可以在这些元素上应用上述 3 种技术以及其他 CSS 属性,如 box-shadow、opacity、filter、transform 等。这将让您更轻松地分割形状。

那么主要的技巧就是将它们相互叠加使用以获得最终的形状。


这是一个的开始,表明如果您能够将设计切割成不同的部分并计算不同的尺寸/位置,这是可能的:

body {
  background: red;
}

.eagle {
  width: 300px;
  height: 200px;
  position: relative;
  background: radial-gradient(circle at 100px 70px, #000 2.5%, transparent 2.5%), linear-gradient(10deg, transparent 20%, #000 20%, #000 29%, transparent 30%) no-repeat 98px -8px / 142px 86px, linear-gradient(6deg, transparent 20%, #ffc20f 20%, #ffc20f 35%, transparent 35%) no-repeat 98px -50px / 141px 168px, radial-gradient(circle at 150px 100px, #000 15%, transparent 15%), radial-gradient(circle at 110px 130px, #000 15%, transparent 15%), radial-gradient(circle at 100px 100px, #ffc20f 20%, transparent 20%), radial-gradient(circle at 100px 100px, #000 25%, transparent 25%), #ffffff;
  clip-path: polygon(18% 35%, 23% 27%, 43% 14%, 64% 10%, 81% 27%, 79% 41%, 62% 66%, 48% 74%, 63% 49%, 46% 47%, 43% 53%, 33% 53%, 34% 52%, 29% 64%, 31% 77%, 20% 69%, 20% 69%, 17% 62%, 15% 52%, 16% 41%);
  ;
}

.eagle:before {
  content: "";
  position: absolute;
  top: 17%;
  left: 60%;
  height: 22px;
  width: 30px;
  border-radius: 50%;
  background-image: radial-gradient(circle at center, #000 29%, #ffc20f 20%);
}

.eagle:after {
  content: "";
  position: absolute;
  top: 36%;
  left: 58%;
  height: 84px;
  width: 27px;
  transform: rotate(45deg) skewY(-61deg);
  background-image: linear-gradient(to right, #000 29%, #ffc20f 20%, #ffc20f 80%, #000 80%);
}
<div class="eagle"></div>

【讨论】:

  • 我知道我可以把它们放在一起,我已经做到了(忘了提,抱歉)。我看到你用一个白色的圆圈在那里创建了“圆角三角形”,但我不喜欢人们使用这样的解决方案。如果我想放一个身体背景图片怎么办?
  • @StyleShit 正在尝试提供主要功能 :) 正如我所说,这是一个 开始,我使用白色来隐藏黑色......但它可以也可以透明地完成,这将需要时间来完成。我们只需要了解不同的特征,尝试将图像分成不同的部分,然后对其进行编码;)...顺便说一下,我在答案中添加了更多方法
  • 看到你添加的方式。剪辑路径看起来不错,我会检查一下。谢谢!
  • @StyleShit 我还更新了我丑陋的解决方案,所以你可以添加背景;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
相关资源
最近更新 更多