【问题标题】:CSS3 hexagonal button with border and rounded corners带边框和圆角的 CSS3 六角按钮
【发布时间】:2015-07-27 05:43:37
【问题描述】:

我有图像,它的形状很奇怪:带边框和圆角的扁平六边形。我想用 CSS 来制作它。
我试图用 CSS 来制作它,以便它可以动态扩展更长的文本,但它不适合我。

这是图片

【问题讨论】:

  • 你这样做的目的是什么?旧版浏览器不支持它。
  • 坦率地说,我会使用 SVG bg 图片。
  • 这是一个类似的六边形图像问题的副本

标签: css button svg css-shapes


【解决方案1】:

CSS :

你可以用 2 个 3d 转换的伪元素来实现这个形状:

div {
  display: inline-block;
  position: relative;
  padding: 20px 50px;
  perspective: 30px;
}
div:after,div:before {
  content: '';
  position: absolute;
  top: 0;
  width: 100%; height: 100%;
  z-index: -1;
  background: orange;
  border: 2px solid darkorange;
  box-sizing: border-box;
}
div:before {
  right: 50%;
  transform-origin: 100% 0;
  transform: rotateY(-10deg);
  border-radius: 10px 0 0 10px;
  border-width: 3px 0 3px 5px;
}
div:after {
  left: 50%;
  transform-origin: 0 0;
  transform: rotateY(10deg);
  border-radius: 0 10px 10px 0;
  border-width: 3px 5px 3px 0;
}
body{text-align:center;}
<div>some text</div><br/><br/>
<div>some longer text</div>

请注意,您需要添加适当的供应商前缀以最大限度地支持浏览器。请参阅canIuse 了解更多信息。


SVG:

另一种选择是使用带有多边形元素的内联 svg:

div{
    display:inline-block;
    position:relative;
    padding:20px 50px;
}
svg{
    position:absolute;
    top:0; left:0;
    z-index:-1;
    min-width:100%; min-height:100%;
}
<div class="btn">
    some text
    <svg viewbox="0 0 100 30">
        <polygon points="2 8 50 2 98 8 98 22 50 28 2 22" stroke-linejoin="round" stroke-width="2" stroke="darkorange" fill="orange" />
    </svg>
</div>
<div class="btn">
    some longer text
    <svg viewbox="0 0 100 30">
        <polygon points="2 8 50 2 98 8 98 22 50 28 2 22" stroke-linejoin="round" stroke-width="2" stroke="darkorange" fill="orange" />
    </svg>
</div>

【讨论】:

  • 您好,感谢您的快速回答。 Safari 浏览器会发生什么?如您所知,Safari 不支持“CSS3 转换”
  • @SamIR 如果您检查 canIuse for 3d transforms,您将看到带有 -webkit- 供应商前缀的 safari 支持它们。
  • 我刚刚创建了带有供应商前缀代码的演示 html 页面,但它仍然不能帮助我制作这些按钮。请在 safari 中检查这个小提琴。 jsfiddle.net/vnonx5yj
  • @SamIR 请检查您的 safari 版本(特别是如果您使用 Windows)是否超过 4?
  • 是的,我正在检查我的 Windows 电脑,Safari 版本是 5.1.7
【解决方案2】:

我从 here 复制了样式,并稍作更改以大致匹配您的按钮外观:

#hexagon {
width: 200px;
height: 30px;
background: orange;
position: relative;}

#hexagon:before {
content: "";
position: absolute;
top: -15px;
left: 0;
width: 0;
height: 0;
border-left: 100px solid transparent;
border-right: 100px solid transparent;
border-bottom: 15px solid orange;}

#hexagon:after {
content: "";
position: absolute;
bottom: -15px;
left: 0;
width: 0;
height: 0;
border-left: 100px solid transparent;
border-right: 100px solid transparent;
border-top: 15px solid orange;}

六边形代表形状的中间部分

Hexagon:after 是形状的底部

Hexagon:before 用于形状的顶部

#hexagon 中指定的宽度需要匹配 :before 和 :after 中的左边框 + 右边框 即(200px = 100px+100px)

#hexagon 中指定的高度需要匹配 :before 和 :after 的边框顶部 + 边框底部,即 (30px = 15px + 15px)

HTML 就是

&lt;div id="hexagon"&gt;

到目前为止,我还没有看到如何使用您正在使用的边框效果,但如果有人可以扩展到此,我认为这是可能的。

【讨论】:

  • 您的解决方案对我不起作用。因为我需要根据文本动态更改其宽度的按钮。对此感到抱歉。你建议的是静态宽度。
猜你喜欢
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2013-10-14
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多