实现一个折角效果的方法很多,可以使用纯CSS,也可以用Canvas,并附上动态特效。

用CSS实现折角效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<!DOCTYPE html>
<html>
<header>
<style type="text/css">
.cont {
width:200px;
height:200px;
background-color: green;
position: relative;
overflow:hidden;
}
.corner {
position: absolute;
right: 0;
top: 0;
background-color: orange;
width: 0;
height: 0;
border-radius: 0 0 0 10px;
overflow: hidden;
transition: 1s all;
}
.corner-bg {
background-color: black;
position: absolute;
right: 29.3%;
top: 29.3%;
width: 141.4%;
height: 141.4%;
overflow: hidden;
transform: rotate(45deg);
z-index: 10;
}
.cont:hover .corner {
width: 100px;
height: 100px;
}
.new {
position: absolute;
right: 17px;
top: 17px;
color: white;
transform: rotate(45deg);
z-index: 9;
}
</style>
</header>
<body>
<div class="cont" >
<div class="corner">
<p class="new">NEW</p>
<div class="corner-bg"></div>
</div>
</div>
</body>
</html>

设计思路:

最后加上过渡效果,当鼠标移上去的时候慢慢出现即可。

用Canvas实现折角效果

实例demo: http://output.jsbin.com/rereqes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Document</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
<style>
</style>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<div class="container">
<canvas id="myCanvas" width="100" height="100"></canvas>
</div>
<script>
var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext('2d');
var cw = 100;
var ch = 100;
ctx.moveTo(50, 0);
ctx.quadraticCurveTo(55 , 5 , 55 , 25); // 可以理解为从(50,0)这个点划线到(55,25)这个点 , 中间会受到(55,5)这个点将直线想磁铁一样"吸"成曲线;
ctx.lineTo(55 , 40);
ctx.arc(60 , 40 , 5 , Math.PI , Math.PI / 2 , true);
ctx.lineTo(75 , 45);
ctx.quadraticCurveTo( 95 , 45 , 100 , 50 );
ctx.lineTo(50 , 0);
var gradient = ctx.createLinearGradient(50 , 50 , 75 , 75);
gradient.addColorStop(0 , '#ccc');
gradient.addColorStop(0.7 , '#111');
gradient.addColorStop(1 , '#000');
ctx.fillStyle = gradient;
ctx.fill();
ctx.beginPath();
ctx.moveTo(50,0);
ctx.lineTo(100,50);
ctx.lineTo(100,0);
ctx.lineTo(50,0);
ctx.closePath();
ctx.fillStyle = '#ff6600';
ctx.fill();
var deg = Math.PI / 180;
ctx.globalCompositeOperation = 'source-atop'; //canvas层叠模式
ctx.beginPath();
ctx.font = '14px Arial'; //设置字体大小 字体
ctx.textAlign = 'center'; // 字体对齐方式
ctx.translate(78 , 22); // 移动canvas画布圆点
ctx.rotate(45 * deg); // 旋转画布
ctx.fillStyle = '#fff'; // 设置文字颜色
ctx.fillText('NEW' , 0 , 0); //文字绘制动作
ctx.closePath();
ctx.globalCompositeOperation = 'source-atop'; //canvas层叠模式
</script>
</body>
</html>

参考资料

简单的canvas翻角效果