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

use*_*706 33 css css3 css-shapes

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

在此输入图像描述

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

Mat*_*t.C 33

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

  1. 向容器添加边框

  2. 添加一个before来阻挡一个角并偏移-1以覆盖边界

  3. 添加一个稍微偏离之前的内容,在切断内部创建一条线

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

.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;
}
Run Code Online (Sandbox Code Playgroud)
<div class="cutCorner">
    <img class="" src="https://www.google.co.uk/logos/doodles/2013/william-john-swainsons-224th-birthday-5655612935372800-hp.jpg" />
</div>
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

  • +1,与我即将发布的内容非常相似([小提琴](http://jsfiddle.net/hari_shanx/qHUUG/1/)),所以后置答案流程中止:D (2认同)

Vik*_*dke 12

看看演示

您可以通过使用伪做到这一点,随着border-widthborder-color看到下面的代码,看看它是如何做.

HTML

<div class="cut"></div>
Run Code Online (Sandbox Code Playgroud)

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 ;
}
Run Code Online (Sandbox Code Playgroud)

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

在这里看看演示

HTML

<div class="cut"></div>
Run Code Online (Sandbox Code Playgroud)

CSS

.cut {
    position:relative;
    width:500px;
    height: 200px;
    padding:20px;
    color:#000;
    background:#ccc;
}
Run Code Online (Sandbox Code Playgroud)

JS

$(".cut").corner("bevel tl 50px");
Run Code Online (Sandbox Code Playgroud)

  • 好的,但如果父母的背景是图像怎么办? (2认同)

Har*_*rry 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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


使用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%);
}
Run Code Online (Sandbox Code Playgroud)
<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' />
Run Code Online (Sandbox Code Playgroud)

截图:

在此输入图像描述