【问题标题】:How to draw a heart using css only? [duplicate]如何仅使用 css 绘制一颗心? [复制]
【发布时间】:2018-07-07 00:25:31
【问题描述】:

如何仅使用 css 属性和 html 来绘制心形?
我遇到了一些代码来绘制它,但不明白为什么他们使用 beforeafter 属性

css代码

.heart {  
     background-color: red;  
      height: 30px;  
      transform: rotate(-45deg);  
      width: 30px;  
}  
.heart:before,  
.heart:after {    
      content: "";  
      background-color: red;  
      border-radius: 50%;  
      height: 30px;  
      position: absolute;  
      width: 30px;  
}  
.heart:before {    
      top: -15px;  
      left: 0;  
}

beforeafter 属性如何工作?
如果有人能想出替代方法会很有帮助:)

编辑:- 我只是想知道我们为什么要使用 beforeafter 属性,以及它如何帮助创建这种心形。
我也在寻找一些简单的代码(仅使用 css)来获得这个形状。

【问题讨论】:

  • 将您的 HTML 添加到此,以便我们了解您的工作方式。另外, before 和 after 需要一个 display 属性。
  • @PierreBurton 他们不需要显示属性 .. position:absolute 足以让他们默认阻止
  • 为什么要添加显示属性?
  • 设置为绝对的位置是公平的:)
  • 心脏与脉冲动画:youtu.be/Jq4diUd10Zs

标签: html css css-shapes


【解决方案1】:

你可以用伪元素做到这一点

了解更多关于伪元素的信息

body{
  padding-left:50px;
}

div {
  position: relative;
  width: 100px;
  height: 175px;
  background-color: green;
  -webkit-border-radius: 50px 50px 0 0;
  -moz-border-radius: 50px 50px 0 0;
  border-radius: 50px 50px 0 0;
  -webkit-transform: rotate(315deg);
  -moz-transform: rotate(315deg);
  -ms-transform: rotate(315deg);
  -o-transform: rotate(315deg);
  transform: rotate(315deg);
}

div:before {
  position: absolute;
  width: 175px;
  height: 100px;
  left: 0;
  bottom: 0;
  content: "";
  background-color: green;
  -webkit-border-radius: 50px 50px 0 0;
  -moz-border-radius: 50px 50px 0 0;
  border-radius: 0 50px 50px 0;
}
<div></div>

希望这会有所帮助:)

【讨论】:

  • 我希望我能支持这个答案,但我没有足够的声誉来支持这个:(
  • @3251_ali 感谢队友的赞赏..不用担心,当您将来有访问权限时请投票..希望尽快;)
【解决方案2】:

这是一个只有背景,代码较少的想法:

.heart {
  width:200px;
  height:200px;
  background:
   radial-gradient(circle at 50% 83%, red 29%, transparent 30%) -40px -100px/100% 100%,
   radial-gradient(circle at 50% 83%, red 29%, transparent 30%) 40px -100px/100% 100%,
   linear-gradient(to bottom left,red 43%,transparent 43%) bottom left/50% 50%,
   linear-gradient(to bottom right,red 43%,transparent 43%) bottom right/50% 50%;
  background-repeat:no-repeat;
}
<div class="heart">
</div>

您可以集成 CSS 变量来控制尺寸:

.heart {
  --d:200px;
  width:var(--d);
  height:var(--d);
  background:
   radial-gradient(circle at 50% 83%, red 29%, transparent 30%) calc(-1 * var(--d)/5) calc(-1 * var(--d)/2)/100% 100%,
   radial-gradient(circle at 50% 83%, red 29%, transparent 30%) calc(var(--d)/5) calc(-1 * var(--d)/2)/100% 100%,
   linear-gradient(to bottom left,red 43%,transparent 43%) bottom left/50% 50%,
   linear-gradient(to bottom right,red 43%,transparent 43%) bottom right/50% 50%;
  background-repeat:no-repeat;
  display:inline-block;
}
<div class="heart">
</div>
<div class="heart" style="--d:100px;">
</div>
<div class="heart" style="--d:50px;">
</div>

【讨论】:

  • 1+,但圆圈的位置似乎有点偏离,因为它们会产生某种边缘,也许某些值需要稍微调整。
  • 但这并不像我想要的那么完美:(
  • @Maharkus 我们可以随时调整 ;) 这是一个避免大量代码的简单快速的想法
  • 是的,我知道我在吹毛求疵,但我很确定 OP 没有足够的 CSS 渐变知识,这就是我提到它的原因:)
  • @Maharkus 我已更新以使其更好;)
【解决方案3】:

beforeafter 标签是所谓的伪元素。 Here's 一个有用的资源,其中包含更多信息。基本上,它创建了一个在实际 DOM(HTML 结构)中不存在的元素,并允许您对其应用 CSS 样式。

在这种情况下,beforeafter 是两个圆圈。

在您的情况下,单个伪元素的外观如下:

body {
  padding: 15px
}

.heart {
  background: green;
  width: 50px;
  height: 50px;
}

.heart:after {
  content: "";
  background-color: red;
  border-radius: 50%;
  height: 30px;
  position: absolute;
  width: 30px;
}

.heart:after {
  left: 15px;
  top: 0px;
}
&lt;div class="heart"&gt;&lt;/div&gt;

这是完整的心脏本身:

body {
  padding: 15px;
}

.heart {
  background-color: green;
  height: 30px;
  transform: rotate(-45deg);
  width: 30px;
}

.heart:before,
.heart:after {
  content: "";
  background-color: red;
  border-radius: 50%;
  height: 30px;
  position: absolute;
  width: 30px;
}

.heart:before {
  left: 0;
  top: -15px;
}

.heart:after {
  left: 15px;
  top: 0;
}
&lt;div class="heart"&gt;&lt;/div&gt;

如果你旋转主块,你会得到一个旋转的正方形。如果每个元素的位置合适,则作为圆形的两个伪元素会用 div 本身创建一个心形。你的心脏不能正常工作的原因是伪元素没有正确放置。将after 元素推到左边可以解决这个问题。

【讨论】:

  • 他们有什么替代方法来绘制它吗?
  • 是的,@Temani_Afif 用渐变覆盖了这一点,或者,正如已经建议的那样,SVG 也是一种可能的方法。
猜你喜欢
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多