I'm following the mozilla documentation on using css clip-path
property to apply an svg clipPath
to an HTMLElement
. But for some reason, it doesn't work for me, not in div's and not in images.
In the documentation, it says you can easily clip an element with this code:
<style>.target { clip-path: url(#c1); }</style>
<svg:svg height="0">
<svg:clipPath id="c1" clipPathUnits="objectBoundingBox">
<svg:circle cx="0.25" cy="0.25" r="0.25" id="circle"/>
<svg:rect x="0.5" y="0.2" width="0.5" height="0.8"/>
</svg:clipPath>
</svg:svg>
And I've tried that, but it doesn't work. The clip-path
property works with predefined methods like polygon() and ellipse() but it won't work with a linked svg.
I made a JSFiddle illustrating my problem, hopefully you can find my mistake :)
Put your clipPath
in defs
tags. Use foreignObject
to import the HTML elements that needs to be clipped and apply inline clip-path
for maximum browser support.
#kitten {
width: 250px;
}
#kittenReplica {
width: 250px;
height: 187.5px;
background-color: lightblue;
}
<svg width="500px" height="187.5px">
<defs>
<clipPath id="path" clipPathUnits="objectBoundingBox">
<circle cx="0.25" cy="0.25" r="0.25" id="circle" />
<rect x="0.5" y="0.2" width="0.5" height="0.8" />
</clipPath>
</defs>
<foreignObject clip-path="url(#path)" width="50%" height="100%">
<img src="http://i.imgur.com/tzPv43g.jpg" id="kitten" class="clipped" />
</foreignObject>
<foreignObject x="250" clip-path="url(#path)" width="50%" height="100%">
<div id="kittenReplica" class="clipped"></div>
</foreignObject>
</svg>
Your problem was that you were using elements with the "svg" namespace prefix, but not defining the svg namespace. If you remove the "svg:" from each element, it works.
For example, change <svg:svg ...>
to <svg ...>
.
If you look at the original Firefox example you copied from, you will see that the svg namespace is defined in the <html>
element: xmlns:svg="http://www.w3.org/2000/svg"
.
Below is a version of that sample that works on Firefox and Chrome.
And here is an updated version of your fiddle that works.
body {
background:#ccc;
font-size:30px;
}
p {
width:300px;
border:1px solid black;
display:inline-block;
margin:1em;
}
b {
outline:1px dotted blue;
}
.target {
-webkit-clip-path: url(#c1);
clip-path: url(#c1);
}
<p class="target" style="background:lime;">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.
</p>
<img src="http://i.imgur.com/tzPv43g.jpg" id="kitten" class="target" />
<svg height="0">
<defs>
<clipPath id="c1" clipPathUnits="objectBoundingBox">
<circle cx="0.25" cy="0.25" r="0.25" id="circle"/>
<rect x="0.5" y="0.2" width="0.5" height="0.8"/>
</clipPath>
</defs>
</svg>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With