仅使用一个元件的细长六角形按钮

时间:2014-08-22 10:40:53

标签: html css css3 css-shapes pseudo-element

我想在不使用其他元素的情况下使用CSS创建一个像这样的按钮。

按钮图片

enter image description here

由于该按钮附加了border,我认为我通常需要同时使用:before:after元素在一侧创建一个箭头。因此,要在每一侧制作一个箭头,我需要链接中的另一个span元素。

我尝试的第二种方法是你在下面看到的方法。但是使用这种解决方案,他们没有正确居中,箭头的每一边长度都不同。

有人有解决方案吗?



/* General Button Style */

.button {
  display: block;
  position: relative;
  background: #fff;
  width: 300px;
  height: 80px;
  line-height: 80px;
  text-align: center;
  font-size: 20px;
  text-decoration: none;
  text-transform: uppercase;
  color: #e04e5e;
  margin: 40px auto;
  font-family: Helvetica, Arial, sans-serif;
  box-sizing: border-box;
}
/* Button Border Style */

.button.border {
  border: 4px solid #e04e5e;
}
.button.border:hover {
  background: #e04e5e;
  color: #fff;
}
/* Button Ribbon-Outset Border Style */

.button.ribbon-outset.border:after,
.button.ribbon-outset.border:before {
  top: 50%;
  content: " ";
  height: 43px;
  width: 43px;
  position: absolute;
  pointer-events: none;
  background: #fff;
}
.button.ribbon-outset.border:after {
  left: -3px;
  margin-top: -40px;
  transform-origin: 0 0;
  box-sizing: border-box;
  border-bottom: 4px solid #e04e5e;
  border-left: 4px solid #e04e5e;
  transform: rotate(57.5deg) skew(30deg);
}
.button.ribbon-outset.border:before {
  right: -46px;
  margin-top: -40px;
  transform-origin: 0 0;
  box-sizing: border-box;
  border-top: 4px solid #e04e5e;
  border-right: 4px solid #e04e5e;
  transform: rotate(57.5deg) skew(30deg);
}
.button.ribbon-outset.border:hover:after {
  background: #e04e5e
}
.button.ribbon-outset.border:hover:before {
  background: #e04e5e
}

<a href="#" class="button ribbon-outset border">Click me!</a>
&#13;
&#13;
&#13;

CodePen Demo

4 个答案:

答案 0 :(得分:10)

这是另一种仅使用一个元素完成此任务的方法。

这种方法的工作原理如下:

  1. 两个伪元素:before:after,大约是主borders元素大小的一半(包括.button)。每个伪元素的高度在一侧(顶部/底部)为34px + 4px边界,在另一侧为2px。
  2. 使用:before元素实现形状的上半部分,而使用:after元素实现下半部分。
  3. 使用rotateXperspective来实现倾斜效果和定位以放置这两个元素,使它们形成预期的形状。
  4. &#13;
    &#13;
    /* General Button Style */
    
    .button {
      position: relative;
      display: block;
      background: transparent;
      width: 300px;
      height: 80px;
      line-height: 80px;
      text-align: center;
      font-size: 20px;
      text-decoration: none;
      text-transform: uppercase;
      color: #e04e5e;
      margin: 40px auto;
      font-family: Helvetica, Arial, sans-serif;
      box-sizing: border-box;
    }
    .button:before,
    .button:after {
      position: absolute;
      content: '';
      width: 300px;
      left: 0px;
      height: 34px;
      z-index: -1;
    }
    
    .button:before {
      transform: perspective(15px) rotateX(3deg);
    }
    .button:after {
      top: 40px;
      transform: perspective(15px) rotateX(-3deg);
    }
    
    /* Button Border Style */
    
    .button.border:before,
    .button.border:after {
      border: 4px solid #e04e5e;
    }
    .button.border:before {
      border-bottom: none; /* to prevent the border-line showing up in the middle of the shape */
    }
    .button.border:after {
      border-top: none; /* to prevent the border-line showing up in the middle of the shape */
    }
    
    /* Button hover styles */
    
    .button.border:hover:before,
    .button.border:hover:after {
      background: #e04e5e;
    }
    .button.border:hover {
      color: #fff;
    }
    &#13;
    <!-- Library included to avoid browser prefixes -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
    
    <a href="#" class="button ribbon-outset border">Click me!</a>
    &#13;
    &#13;
    &#13;

    Fixed Width Demo | Dynamic Width Demo

    输出屏幕截图:

    enter image description here

    这是在Chrome v24 +,Firefox v19 +,Opera v23 +,Safari v5.1.7,IE v10中测试的。


    按原样,这会在IE 8和IE 9中很好地降级为带边框的方形按钮。但是,由于borderborder-bottom :beforeborder-top :after)无效,因此会留下一个白色区域(类似于删除线)线)在中间。这可以通过添加几个IE&lt;使用this demo中的条件注释的10种特定样式。

    <!--[if IE]>
      <style>
        .button.border:after{
          top: 38px;
        }
        .button.border:hover:before, .button.border:hover:after {
          border-bottom: 4px solid #e04e5e;
        }
      </style>
    <![endif]-->
    

    输出IE 9和IE 8的屏幕截图:

    enter image description here

答案 1 :(得分:3)

这只是哈利回答的一个更简单的替代方案。

此方法使用scale()rotate(45deg)转换。使用这种方法,您可以非常轻松地改变左右V形的角度。

<强> Fiddle

div {
    height: 70px;
    width: 200px;
    margin-left: 40px;
    border-top: 4px solid #E04E5E;
    border-bottom: 4px solid #E04E5E;
    position: relative;
    text-align: center;
    color: #E04E5E;
    line-height: 70px;
    font-size: 21px;
    font-family: sans-serif;
}
div:before, div:after {
    content:'';
    position: absolute;
    top: 13px;
    height: 40px;
    width: 40px;
    border: 4px solid #E04E5E;
    -webkit-transform: scale(0.8,1.25) rotate(45deg);
    -moz-transform: scale(0.8,1.25) rotate(45deg);
    -ms-transform: scale(0.8,1.25) rotate(45deg);
    transform: scale(0.8,1.25) rotate(45deg);
}
div:before {
    left: -22px;
    border-top: 0px solid transparent;
    border-right: 0px solid transparent;
}
div:after {
    right: -22px;
    border-bottom: 0px solid transparent;
    border-left: 0px solid transparent;
}
div:hover, div:hover:before, div:hover:after {
    background-color: #E04E5E;
    color: #EEE;
}
<div>HELLO!</div>

想要更宽的箭头?只需降低scale()转换的xFiddle (wide)

较窄的一个?增加scale()转换的xFiddle (narrow)


注意: IE 8及更低版本不支持CSS转换(9支持-ms-前缀),因此您可以查看此网站以获得支持: {{ 3}}

答案 2 :(得分:1)

我把你的笔分开了

Codepen Demo

基本的变化是我从主按钮上移除了边框(因为它们是超级的

/* Button Border Style */
.button.border {
    border-top: 4px solid #e04e5e;
   border-bottom: 4px solid #e04e5e;
}

并更改了几个值以将其全部调整到位

/* Button Ribbon-Outset Border Style */
.button.ribbon-outset.border:after,
.button.ribbon-outset.border:before {
        top: 50%;
        content: " ";
        height: 43px;
        width: 43px;
        position: absolute;
        pointer-events: none;
}

.button.ribbon-outset.border:after {
        left:0;
        margin-top:-40px;
        transform-origin:0 0;
        box-sizing:border-box;
        border-bottom:4px solid #e04e5e;
        border-left:4px solid #e04e5e;
        transform:rotate(57.5deg) skew(30deg);
    }
    .button.ribbon-outset.border:before {
        right:-43px;
        margin-top:-40px;
        transform-origin:0 0;
        box-sizing:border-box;
        border-top:4px solid #e04e5e;
        border-right:4px solid #e04e5e;
        transform:rotate(57.5deg) skew(30deg);
    }

答案 3 :(得分:1)

我自己得到了答案。这是:before和:after元素的transform属性的问题。

CSS改变了:

/* Button Border Style */
.button.border {
    border-top:4px solid #e04e5e;
    border-bottom:4px solid #e04e5e;
}
/* Button Ribbon-Outset Border Style */
.button.ribbon-outset.border:after, .button.ribbon-outset.border:before {
    height: 42px;
    width: 42px;
}
.button.ribbon-outset.border:after {
    left:0;
    border-bottom:5px solid #e04e5e;
    border-left:5px solid #e04e5e;
    transform:rotate(45deg) skew(19deg,19deg);
}
.button.ribbon-outset.border:before {
    right:-42px;
    border-top:5px solid #e04e5e;
    border-right:5px solid #e04e5e;
    transform:rotate(45deg) skew(19deg,19deg);
}

Updated Codepen