是否可以在CSS中创建一个角形角?

时间:2013-10-08 13:00:51

标签: css css3 css-shapes

我想知道是否有任何方法可以使用纯CSS创建此形状。为了进一步扩展这个问题,这个形状需要将图像剪切在里面(将其视为一个蒙版 - 但灰色边框必须是可见的)。

enter image description here

或者我最好在canvas / svg中创建它?

4 个答案:

答案 0 :(得分:33)

保持边框有点困难,但我设法使用:before和:after元素与父容器(:之前和之后:在img标签上工作之后)实现了近距离效果

  1. 为容器添加边框

  2. 添加一个以阻挡角落并偏移-1以覆盖边框

  3. 在之后添加一个稍微偏移的内容,以便在切断内部创建一条

  4. 如您所见,45度线的厚度有点问题:

    
    
    .cutCorner {
        position:relative; background-color:blue; 
        border:1px solid silver; display: inline-block;
    }
    
    .cutCorner img {
        display:block;
    }
    
    .cutCorner:before {
        position:absolute; left:-1px; top:-1px; content:'';
        border-top: 70px solid silver;
        border-right: 70px solid transparent;
    }
    
    .cutCorner:after {
        position:absolute; left:-2px; top:-2px; content:'';
        border-top: 70px solid white;
        border-right: 70px solid transparent;
    }
    
    <div class="cutCorner">
        <img class="" src="https://www.google.co.uk/logos/doodles/2013/william-john-swainsons-224th-birthday-5655612935372800-hp.jpg" />
    </div>
    &#13;
    &#13;
    &#13;

    JSFiddle

答案 1 :(得分:12)

<强> SEE THE DEMO

您可以使用伪,以及border-widthborder-color来执行此操作,请参阅以下代码,了解如何完成此操作。

HTML

<div class="cut"></div>

CSS

.cut {
    position:relative;
    width:500px;
    height: 200px;
    padding:20px;
    color:#000;
    background:#ccc;
}

.cut:before {
    content:"";
    position:absolute;
    top:0;
    left:0;
    border-width:30px 30px 0px 0px;
    border-style:solid;
    border-color:#fff transparent transparent #fff ;
}

使用此jQuery脚本进行跨浏览器支持的另一种解决方案。 - &gt; http://jquery.malsup.com/corner/

<强> SEE THE DEMO HERE

HTML

<div class="cut"></div>

CSS

.cut {
    position:relative;
    width:500px;
    height: 200px;
    padding:20px;
    color:#000;
    background:#ccc;
}

JS

$(".cut").corner("bevel tl 50px");

答案 2 :(得分:10)

使用CSS:

使用CSS可以实现确切的形状。我们的想法是在左上角有一个border-radius的元素,沿着Y轴倾斜它,然后将它放在矩形之前。这样做会使看起来好像矩形元素在顶部有一个带有一个弯曲边缘的三角形切口。

如果形状的内部只有一种颜色(实心或透明),那么只用一个元素就可以实现。但是,如果需要在形状内添加图像(如上所述),那么我们需要多个元素,因为我们必须反转图像上的skew效果,如果没有子元素,这是不可能的

.shape,
.shape-image {
  position: relative;
  height: 150px;
  width: 400px;
  border-bottom: 2px solid crimson;
  overflow: hidden;
}
.shape:before,
.shape:after,
.shape-image:after {
  position: absolute;
  content: '';
  top: 0px;
  height: 100%;
  z-index: -1;
}
.shape:before,
.shape-image .before {
  left: 0px;
  top: -2px;
  width: 50px;
  border: 2px solid crimson;
  border-width: 3px 0px 0px 2px;
  border-top-left-radius: 8px;
  transform-origin: right bottom;
  transform: skewY(-45deg);
}
.shape:after,
.shape-image:after {
  left: 52px;
  width: calc(100% - 54px);
  border: 2px solid crimson;
  border-left: none;
}
.shape:after,
.shape:before {
  background: aliceblue;
}
.shape.semi-transparent:after,
.shape.semi-transparent:before {
  background: rgba(150, 150, 150, 0.5);
}
.shape-image .before {
  position: absolute;
  top: 0px;
  height: 100%;
  overflow: hidden;
}
.shape-image .before .img {
  height: 100%;
  width: 100%;
  border-top-left-radius: 8px;
  background: url(http://lorempixel.com/400/150);
  transform-origin: right bottom;
  transform: skewY(45deg);
}
.shape-image:after {
  background: url(http://lorempixel.com/400/150);
  background-position: -50px 0px;
}

/* Just for demo */

body{
  background-image: radial-gradient(circle, #3F9CBA 0%, #153346 100%);
}
.shape{
  margin: 10px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div class="shape"></div>
<div class="shape semi-transparent"></div>
<div class="shape-image">
  <div class="before">
    <div class="img"></div>
  </div>
</div>

使用SVG:

另外,使用SVG可以更加轻松地实现相同的功能,如下面的代码段所示。

.vector {
  height: 150px;
  width: 410px;
  padding-left
}
svg {
  height: 100%;
  width: 100%;
}
path {
  stroke: crimson;
  stroke-width: 2;
  fill: none;
}
polygon {
  fill: url(#bg);
}

/* Just for demo */

body {
  background-image: radial-gradient(circle, #3F9CBA 0%, #153346 100%);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div class='vector'>
  <svg viewBox='0 0 400 150' preserveAspectRatio='none'>
    <defs>
      <path d='M50,2 h 342 v144 h-390 v-90 a6,12 0 0,1 3,-9 z' id='p' />
      <clipPath id='clipper'>
        <use xlink:href='#p' />
      </clipPath>
      <pattern id='bg' width='400' height='150' patternUnits='userSpaceOnUse'>
        <image xlink:href='http://lorempixel.com/400/150' height='150' width='400' />
      </pattern>
    </defs>
    <polygon points='2,2 392,2 392,148 2,148' clip-path='url(#clipper)' />
    <use xlink:href='#p' />
  </svg>
</div>
<h3>Original Image</h3>
<img src='http://lorempixel.com/400/150' />

<强>截图:

enter image description here

答案 3 :(得分:3)

可以这样做,但它是一个CSS3解决方案,因此不适用于我不认为的旧浏览器。

我所做的是,我创造了两个div,一个有一个边框,另一个只有底部边框。使用translate然后我将该div旋转45度以遮盖另一个div的角落,从而产生所需的效果。

<强> HTML

<div class="holder">
    <div class="main"></div>
    <div class="corner"></div>
</div>

<强> CSS

.holder { 
    position:relative;
    width: 180px;
    margin:30px
}

.main {
    width: 160px;
    height: 40px;
    border: 1px solid grey;
    position:absolute; 
    left:0;
    z-index: 1;
}
.corner { 
    border-bottom: 1px solid grey;
    width:30px; 
    height: 41px; 
    position:absolute;
    top:-25px;
    right:0;
    z-index:2;
    background:#fff;

    /* Safari */
    -webkit-transform: rotate(45deg);    
    /* Firefox */
    -moz-transform: rotate(45deg);    
    /* IE */
    -ms-transform: rotate(45deg);    
    /* Opera */
    -o-transform: rotate(45deg);
}

<强>输出

Clipped corner

请参阅Fiddle