您不能使用纯 CSS 来执行此操作,因为所有浏览器尚不完全支持剪辑(如果交叉兼容性很重要)。
您需要将 SVG 剪辑路径与 CSS 剪辑结合起来,最终得到的解决方案并不那么优雅。
但是,您可以做的是使用画布创建背景图像。所有支持 HTML5 的主要浏览器都支持 Canvas。使用画布的回溯是您需要做更多的编码来创建形状。可以使用可选的图像来代替,但使用画布可以让您保持一切清晰(并且在拉伸时不会像图像那样模糊)。
以下解决方案将产生此结果(我添加了红色边框以显示透明区域)。您可以调整参数以使其看起来完全符合您的需要,并使用参数扩展它以定义凹槽的大小、透明区域的宽度等。代码自动采用作为参数给出的元素的大小。
要添加一个缺口,只需调用:
addNotch(element);
在线演示在这里
代码直截了当,执行速度很快:
function addNotch(element) {
/// some setup
var canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d'),
/// get size of element in pixels
cs = window.getComputedStyle(element),
w = parseInt(cs.getPropertyValue('width') || '0', 10),
h = parseInt(cs.getPropertyValue('height') || '0', 10),
/// pre-calculate some values
hh = h * 0.5,
nw = 20, /// notch size
nh = nw * 0.5;
canvas.width = w;
canvas.height = h;
/// draw the main shape
ctx.moveTo(0, 0);
ctx.lineTo(w - nw, 0);
ctx.lineTo(w - nw, hh - nh);
ctx.lineTo(w - nw - nh, hh);
ctx.lineTo(w - nw, hh + nh);
ctx.lineTo(w - nw, h);
ctx.lineTo(0, h);
ctx.closePath();
ctx.fillStyle = '#7c7058';
ctx.fill();
/// draw the white arrow
ctx.beginPath();
ctx.lineWidth = 2;
ctx.strokeStyle = '#eee';
ctx.moveTo(w - nw - nw * 0.33, hh - nw * 0.75);
ctx.lineTo(w - nw - nw * 1.1, hh);
ctx.lineTo(w - nw - nw * 0.33, hh + nw * 0.75);
ctx.stroke();
/// convert canvas to image and set background of element
/// with this image
element.style.background = 'url(' + canvas.toDataURL() +
') no-repeat left top';
}