【问题标题】:Beveled corner on a rounded button圆形按钮上的斜角
【发布时间】:2016-06-21 21:49:52
【问题描述】:

我需要创建一个带有像这样的信息徽章的圆形按钮:

如何在红色信息徽章周围的绿色按钮上制作斜角?

不能在红色徽章周围使用普通的白色边框(如下面的 sn-p 所示),因为它必须是透明的并显示页面背景颜色。

.shape {
  position: relative;
  height: 50px;
  width: 50px;
  border-radius: 50%;
  background: rgb(0, 199, 158);
  margin: 25px;
}
.shape:after {
  position: absolute;
  content: '';
  top: -10px;
  right: -10px;
  height: 25px;
  width: 25px;
  border-radius: 50%;
  border: 3px solid white;
  background: rgb(255, 67, 0);
}
body {
  background: chocolate;
}
<div class='shape'></div>

【问题讨论】:

  • 我在问题中添加了一个虚拟代码(带有白色边框的那个),因为没有代码的问题往往会被关闭(即使问题中的代码不是强制性的)。这是为了防止关闭一个原本很好的问题。如果您对我的编辑不满意,请随时回滚 :)

标签: html css border css-shapes


【解决方案1】:

使用盒子阴影:

一种方法是在伪元素上使用box-shadow,如下面的sn-p。在这里,一个伪元素 (.shape:before) 被放置在圆的右上角稍高一点的位置,然后它的盒子阴影被用来填充父元素 (.container) 所需的背景颜色。徽章是通过 .container 元素上的另一个伪元素添加的。

这比radial-gradient 方法具有更好的浏览器支持,因为它适用于IE8+。缺点是它只能支持主圆圈的纯色背景颜色,因为阴影不能是渐变或图像。此外,它似乎需要两个元素(我正在尝试减少它,如果成功将其添加到答案中)。

.container {
  position: relative;
  height: 50px;
  width: 50px;
  border-radius: 50%;
  margin: 25px;
}
.shape {
  position: absolute;
  height: 100%;
  width: 100%;
  top: 0px;
  left: 0px;
  border-radius: 50%;
  overflow: hidden;
}
.shape:before {
  position: absolute;
  content: '';
  height: 60%;
  width: 60%;
  top: -20%;
  right: -20%;
  border-radius: 50%;
  box-shadow: 0px 0px 0px 50px rgb(0, 199, 158);
}
.container:after {
  position: absolute;
  content: '2';
  height: 50%;
  width: 50%;
  right: -20%;
  top: -20%;
  background: rgb(255, 67, 0);
  color: white;
  line-height: 25px;
  text-align: center;
  border-radius: 50%;
}

/* just for demo */

*, *:after, *:before {
  transition: all 2s;
}
.container:hover {
  height: 100px;
  width: 100px;
}
.container:hover .shape:before {
  box-shadow: 0px 0px 0px 100px rgb(0, 199, 158);  
}
.container:hover:after {
  line-height: 50px;
}
body {
  background-image: radial-gradient(circle, #3F9CBA 0%, #153346 100%);
  min-height: 100vh;
}
<div class='container'>
  <div class='shape'></div>
</div>

使用径向渐变:

另一种选择是将radial-gradient 用于background-image,就像下面的sn-p 一样,并定位背景,使其在右上角产生一个斜角。完成后,添加徽章圈并对其进行定位应该相当简单。

box-shadow 方法相比,这对浏览器的支持较差,因为它仅适用于 IE10+。如果需要响应性,那么使用渐变将是更好的选择,因为它们可以采用与框阴影不同的百分比值。

.shape {
  position: relative;
  height: 50px;
  width: 50px;
  border-radius: 50%;
  background-image: radial-gradient(60% 60% at 92.5% 7.5%, transparent 49.5%, rgb(0,199,158) 50.5%);
  margin: 25px;
}
.shape:after {
  position: absolute;
  content: '2';
  height: 50%;
  width: 50%;
  right: -20%;
  top: -20%;
  background: rgb(255,67,0);
  color: white;
  line-height: 25px;
  text-align: center;
  border-radius: 50%;
}

/* just for demo */

*, *:after {
  transition: all 1s;
}
.shape:hover {
  height: 100px;
  width: 100px;
}
.shape:hover:after {
  line-height: 50px;
}
body {
  background-image: radial-gradient(circle, #3F9CBA 0%, #153346 100%);
}
&lt;div class='shape'&gt;&lt;/div&gt;

使用 SVG:

另一种可能性是利用 SVG 创建斜面圆,如下面的 sn-p 所示。

.shape {
  position: relative;
  height: 50px;
  width: 50px;
  border-radius: 50%;
  margin: 25px;
}
svg {
  position: absolute;
  height: 100%;
  width: 100%;
}
svg path {
  fill: rgb(0, 199, 158);
}
.shape:after {
  position: absolute;
  content: '2';
  height: 50%;
  width: 50%;
  right: -25%;
  top: -5%;
  background: rgb(255, 67, 0);
  color: white;
  line-height: 25px;
  text-align: center;
  border-radius: 50%;
}

/* just for demo */

*, *:after {
  transition: all 2s;
}
.shape:hover {
  height: 100px;
  width: 100px;
}
.shape:hover:after {
  line-height: 50px;
}
body {
  background-image: radial-gradient(circle, #3F9CBA 0%, #153346 100%);
}
<div class='shape'>
  <svg viewBox='0 0 60 60'>
    <path d='M55,30 A25,25 0 0,1 5,30 A25,25 0 0,1 42.5,8.34 A16,16 0 0,0 55,30' />
  </svg>
</div>

注意:我为徽章使用了伪元素只是为了说明,但由于您需要在其中添加动态内容,我建议将其替换为子元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多