【问题标题】:Concave shape boundary凹形边界
【发布时间】:2015-07-13 08:35:52
【问题描述】:

我正在尝试在 CSS/SVG 中创建这个形状:

问题是白色部分需要透明。我如何在 CSS/SVG 中做到这一点?我还需要将鼠标悬停在形状上。

#shape {
  height: 400px;
  width: 400px;
  background: black;
  overflow: hidden;
}
#circle1,
#circle2,
#circle3,
#circle4 {
  background: white;
  height: 800px;
  width: 800px;
  border-radius: 50%;
  position: relative;
}
#circle1 {
  top: -200px;
  right: -340px;
}
#circle2 {
  top: -1000px;
  left: -740px;
}
#circle3 {
  top: -2350px;
  left: -200px;
}
#circle4 {
  top: -2050px;
  left: -200px;
}
#shape:hover {
  background: red;
}
<div id="shape">
  <div id="circle1">
  </div>
  <div id="circle2">
  </div>
  <div id="circle3">
  </div>
  <div id="circle4">
  </div>
</div>

【问题讨论】:

  • 我想 SVG 会更好地创建这种形状的孩子。
  • 是的,但是我们该怎么做呢?
  • 您需要使用 Adob​​e Illustrator 或 Inkscape 等矢量图程序来创建 SVG。

标签: css svg hover css-shapes


【解决方案1】:

您可以使用 svg 二次贝塞尔路径来创建这样的形状。

<svg version="1.1" height="400" width="400" viewBox="0 0 10 10">
  <defs>
    <style type="text/css">
      path:hover {
        fill: blue;
        transition: 0.5s ease;
      }
      path {
        transition: 0.5s ease;
      }
    </style>
  </defs>
  <path d="M0 0 Q5 3 10 0 7 5 10 10 5 7 0 10 3 5 0 0" stroke="none" fill="red" />
</svg>

【讨论】:

  • 不错的一个。 SVG 在此类形状上的悬停效果方面要好得多。
【解决方案2】:

这需要一些调整,但你也许可以使用这样的东西。

它使用两个元素(父元素和子元素)来生成您正在寻找的形状。这适用于渐变背景,尽管由于其生成方式,命中测试会有些偏离。

.one {
  height: 100px;
  width: 100px;
  margin: 100px;
  position: relative;
  overflow: hidden;
}
.two {
  position: absolute;
  top: 25%;
  left: 25%;
  height: 50%;
  width: 50%;
  background: red;
}
.one:before {
  content: "";
  position: absolute;
  width: 100%;
  left: 0%;
  height: 50%;
  top: -42%;
  border-radius: 50%;
  border-bottom: 30px solid red;
}
.two:before {
  content: "";
  position: absolute;
  height: 200%;
  top: -50%;
  width: 100%;
  left: -136%;
  border-radius: 50%;
  border-right: 30px solid red;
}
.two:after {
  content: "";
  position: absolute;
  height: 200%;
  top: -50%;
  width: 100%;
  right: -136%;
  border-radius: 50%;
  border-left: 30px solid red;
}
.one:after {
  content: "";
  position: absolute;
  width: 100%;
  left: 0%;
  height: 50%;
  bottom: -42%;
  border-radius: 50%;
  border-top: 30px solid red;
}

/*FOR DEMO ONLY*/


.one:hover:before{border-bottom-color:blue;}
.one:hover:after{border-top-color:blue;}
.one:hover .two{background:blue;}
.one:hover .two:before{border-right-color:blue;}
.one:hover .two:after{border-left-color:blue;}
.one,.two,.one:before,.one:after,.two:before,.two:after{transition:all 0.6s;}

html {
  height: 100%;
  background: rgb(79, 79, 79);
  background: -moz-radial-gradient(center, ellipse cover, rgba(79, 79, 79, 1) 0%, rgba(34, 34, 34, 1) 100%);
  background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgba(79, 79, 79, 1)), color-stop(100%, rgba(34, 34, 34, 1)));
  background: -webkit-radial-gradient(center, ellipse cover, rgba(79, 79, 79, 1) 0%, rgba(34, 34, 34, 1) 100%);
  background: -o-radial-gradient(center, ellipse cover, rgba(79, 79, 79, 1) 0%, rgba(34, 34, 34, 1) 100%);
  background: -ms-radial-gradient(center, ellipse cover, rgba(79, 79, 79, 1) 0%, rgba(34, 34, 34, 1) 100%);
  background: radial-gradient(ellipse at center, rgba(79, 79, 79, 1) 0%, rgba(34, 34, 34, 1) 100%);
  filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#4f4f4f', endColorstr='#222222', GradientType=1);
}
<div class="one">
  <div class="two"></div>
</div>

【讨论】:

    猜你喜欢
    • 2013-02-24
    • 2013-04-29
    • 2017-12-24
    • 2012-04-30
    • 2010-10-16
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2016-02-18
    相关资源
    最近更新 更多