如何在图像上制作纯净的CSS全高度和真正透明的折叠效果?

时间:2017-09-20 11:49:06

标签: html css layout transparency transparent

this linkthis link的启发,我试图通过两个要求制作纯CSS折叠效果:

  1. 完全透明的背景,在其后面显示<IMAGE>(!)
  2. 能够使用其中<DIV>元素的全高(!)
  3. 我试过让我的工作,但正确的角落不会变得透明。如果我替换......

    border-top: 60px solid red;
    

    border-top: 60px solid transparent;
    

    然后通过它出现矩形框的背景。有没有办法用纯CSS解决方案来解决这个问题?如果有,怎么样?如果没有,那么他们接近CSS的替代方案是什么?代码/协调应该是人类可读,可解释和易于更改的,而无需基于矢量的程序,如inkscape。

    我被困住的演示:
    https://jsfiddle.net/cg7hoyt3/

2 个答案:

答案 0 :(得分:3)

正如评论中所建议的那样,可以使用剪贴蒙版来完成:

clip-path: polygon(0 0, 210px 0, 100% 60px, 100% 100%, 0 100%);

虽然这看起来相当令人生畏,但它实际上很容易理解:只需从左上​​角开始一个一个地读取点。这些点在可见周围绘制一个多边形。

请注意,clip-mask仅适用于现代浏览器(不包括IE + Edge)。有关最新的浏览器支持,请参阅Can I use;有关最新的开发状态,请参见Mozilla Plotform Status

以下是代码:

body {background-image: url("http://hdbackgroundspic.com/wp-content/uploads/2017/09/drop-of-water-background.jpg")}
.page {
  width: 230px;
  height: 230px;
  margin: 50px auto;
  background: gold;
  padding: 20px;
}
.fold {
  position: relative;
  -webkit-box-shadow: -5px 7px 5px rgba(0,0,0,0.8);
  -moz-box-shadow: -5px 7px 5px rgba(0,0,0,0.8);
  box-shadow: -5px 7px 5px rgba(0,0,0,0.8);
  -webkit-clip-path: polygon(0 0, 210px 0, 100% 60px, 100% 100%, 0 100%);
  clip-path: polygon(0 0, 210px 0, 100% 60px, 100% 100%, 0 100%);
}
.fold:before, .fold:after {
  content: "";
  position: absolute;
  top: 0%;
  right: 0%;
  width: 0px;
  height: 0px;
}
.fold:before {
  border-bottom: 60px solid #BBB;
  border-right: 60px solid transparent;
  -webkit-box-shadow: -5px 5px 5px 5px rgba(0,0,0,0.1);
  -moz-box-shadow: -5px 5px 5px 5px rgba(0,0,0,0.1);
  box-shadow: -5px 5px 5px 5px rgba(0,0,0,0.1);
}
.fold:after {
  border-top: 60px solid transparent;
  border-left: 60px solid yellow;
}
<div class="page fold">
  <h2>Dear Bettie</h2>
  Will you please erase that darn red corner from this folded note love?<br><br>
  Thanks xxx<br>Sandra
</div>

答案 1 :(得分:3)

也许使用linear-gradient代替纯色作为主要div的背景。

边框宽度和渐变色标的比率为1 / sqrt(2) = .7071

如果您正在使用CSS自定义属性或CSS预处理器,这将变得更加简单。

Codepen Demo of variable use

&#13;
&#13;
body {
  background-image: url("http://hdbackgroundspic.com/wp-content/uploads/2017/09/drop-of-water-background.jpg");
}

div {
  width: 230px;
  height: 230px;
  margin: 50px auto;
  background: linear-gradient(-135deg, transparent, transparent 45px, gold 45px, gold);
  position: relative;
}

div::after {
  content: " ";
  position: absolute;
  top: 0;
  right: 0;
  height: 0px;
  width: 0px;
  z-index: 2;
  border-width: 30px; /* note .7071 of gradient-stop */
  border-style: solid;
  border-color: transparent transparent yellow yellow;
  filter: drop-shadow(-2px 6px 6px rgba(0, 0, 0, .5));
}
&#13;
<div></div>
&#13;
&#13;
&#13;