Tuesday, January 23, 2018

Clip path is not working for Firefox, IE, or Edge

Leave a Comment

I am using a carousel for displaying images with some content. For showing the image I am using clip path. It shows perfectly in Chrome, but it does not work in IE, Edge, or Firefox.

.carousel-inner>.item>a>img,  .carousel-inner>.item>img,  .img-responsive,  .thumbnail a>img,  .thumbnail>img {    display: inline-block;    max-width: 100%;    height: auto;  }    body {    background-image: url('../../Images/Plain-BG.PNG');    background-size: cover;    background-repeat: no-repeat;    font-family: Kamban !important;  }    footer {    background-image: url(../../Images/DT-Logo.png);    background-size: contain;    background-repeat: no-repeat;    background-position: right;    position: absolute;    right: 10%;    top: 85%;    width: 100%;    padding-top: 5%;  }    .news-img {    width: 42.5%;    margin-top: 13%;    clip-path: polygon(6% 4%, 94% 11%, 94% 91%, 5% 92%);    margin-left: 8.5%;  }    .title {    margin: 0px;    width: 40%;    position: absolute;    top: 43%;    height: auto;    left: 57%;    color: #fff;    word-break: break-word;  }    .carousel-inner>.item>a>img,  .carousel-inner>.item>img,  .img-responsive,  .thumbnail a>img,  .thumbnail>img {    height: auto !important;  }    .title p {    line-height: 1.7em;    font-size: 2.5em;    text-align: center;    word-break: break-word;  }    header {    background-image: url(../../Images/Mukkiya-Seithigal.png);    background-size: contain;    background-repeat: no-repeat;    background-position: right;    position: absolute;    top: 18%;    right: 4%;    width: 100%;    padding-top: 5%;  }
<div class="Maindiv">    <header></header>    <article>      <div id='carousel-container'>        <div class="carousel slide" data-ride="carousel">          <div class="wholediv carousel-inner">          </div>        </div>      </div>    </article>    <footer></footer>  </div>

I am getting the image URL and its content from my feed URL via a script. So I am binding details through the script only.

3 Answers

Answers 1

Consider using SVG with your image as a pattern and your clip-path as points.

<svg height="186px" width="300px">    <defs>      <pattern id="pattern" height="100%" width="100%" patternUnits="userSpaceOnUse" viewBox="0 0 1 1" preserveAspectRatio="xMidYMid slice">        <image height="1" width="1" xlink:href="https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Crossing_the_River_Styx.jpg/300px-Crossing_the_River_Styx.jpg"  preserveAspectRatio="xMidYMid meet"></image>      </pattern>    </defs>    <polygon points="18 7, 282 20, 282 150, 15 171" fill="url(#pattern)"></polygon>  </svg>

It is possible also to use some script to "convert" a dynamically loaded image into SVG. For example:

function clip() {    let img = document.querySelector('img');      let svg = document.querySelector('svg');    svg.setAttribute('height', img.clientHeight + 'px');    svg.setAttribute('width', img.clientWidth + 'px');    svg.querySelector('pattern image').setAttribute('xlink:href', img.src);      let pointsRaw = img.getAttribute('data-points').split(/,\s/);    let points = '';    for (let i = 0; i < pointsRaw.length; i++) {      let coord = pointsRaw[i].replace(/%/g, '').split(' ');      let x = img.clientWidth * coord[0] / 100;      let y = img.clientHeight * coord[1] / 100;      points += Math.round(x) + ' ' + Math.round(y) + ' ';    }    svg.querySelector('polygon').setAttribute('points', points);      img.style.display = 'none';    document.querySelector('button').style.display = 'none';  }
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Crossing_the_River_Styx.jpg/300px-Crossing_the_River_Styx.jpg" data-points="6% 4%, 94% 11%, 94% 80%, 5% 92%">    <svg height="0" width="0">    <defs>      <pattern id="pattern" height="100%" width="100%" patternUnits="userSpaceOnUse" viewBox="0 0 1 1" preserveAspectRatio="xMidYMid slice">        <image height="1" width="1" xlink:href="" preserveAspectRatio="xMidYMid meet"></image>      </pattern>    </defs>    <polygon fill="url(#pattern)"></polygon>  </svg>    <button onclick="clip()">Clip</button>

Answers 2

Currently clip-path does not have full browser-support. More info at: https://caniuse.com/#search=clip-path

enter image description here

As it shows in the notes, SVG is supported... if using embedded or object elements. See: https://caniuse.com/#feat=svg

Answers 3

add -webkit-clip-path: polygon(6% 4%, 94% 11%, 94% 91%, 5% 92%); for its support in safari and moz as in edge its still not supported

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment