Закругленная форма изображения с использованием clip-path
Я хочу иметь css clip-path, как на изображении ниже
Кто-нибудь может мне помочь?
img {
clip-path: polygon(53% 0%, 100% 1%, 100% 50%, 100% 100%, 55% 100%, 42% 65%, 0% 52%, 44% 36%);
border-radius:0 100% 100% 0
}
<img src="https://picsum.photos/id/1012/800/800">
Свободный перевод вопроса Rounded image shape using clip-path от участника @Suresh R.
Ответы (4 шт):
Маска легко может это сделать. Было бы сложно получить кривую с clip-path
img {
width:50%;
border-radius:50%;
-webkit-mask:
radial-gradient(circle at top left,transparent 45%,#fff 45.5%) top,
radial-gradient(circle at bottom left,transparent 45%,#fff 45.5%) bottom;
-webkit-mask-size:100% 50%;
-webkit-mask-repeat:no-repeat;
}
<img src="https://picsum.photos/id/1012/800/800">
Другой синтаксис:
img {
width:50%;
border-radius:50%;
-webkit-mask:
radial-gradient(51% 51% at 0 0 ,transparent 99%,#fff),
radial-gradient(51% 51% at 0 100%,transparent 99%,#fff);
-webkit-mask-composite: destination-in;
mask-composite:intersect;
}
<img src="https://picsum.photos/id/1012/800/800">
Свободный перевод ответа от участника @Temani Afif.
Если размеры картинки в пикселях фиксированы, можно использовать clip-path: path(), благо поддерживается всеми современными браузерами (Opera, думаю, подтянется совсем скоро, когда обновит свою версию Blink).
Беда только в том, что clip-path: path() совершенно не адаптивный и задаёт координаты только в пикселях, так что придётся или фиксировать размер картинки в пикселях, или страдать, или ждать появления адаптивного shape() (то есть тоже страдать).
(Фигуру я нарисовал в Inkscape, потом просто скопировал получившийся path из SVG-кода.)
img {
clip-path: path("M 200 0 A 200 200 0 0 1 0 200 A 200 200 0 0 1 200 400 A 200 200 0 0 0 400 200 A 200 200 0 0 0 200 0 Z");
}
<img src="https://picsum.photos/id/1012/800/800" width="400" height="400" alt="" />
Вариант с 4 секторами
<svg id="svg1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="420" height="420" viewBox="0 0 420 420" version="1.1">
<rect width="100%" height="100%" fill="#111111" />
<g id="G1" transform="translate(10 -5)" fill="gold" stroke-width="3" stroke="orangered">
<path d="M299.3 119.6A99.6 100.4 90 0 1 198.8 219.2 99.6 100.4 90 0 1 299.3 318.7 99.6 100.4 90 0 0 399.7 219.2 99.6 100.4 90 0 0 299.3 119.6ZM299.3 318.7" />
<path d="m299.3 318.7a99.6 100.4 1 0 1-97.9-102.1 99.6 100.4 1 0 1-101.2 98.8 99.6 100.4 1 0 0 97.9 102.1 99.6 100.4 1 0 0 101.2-98.8z" />
<path d="M98.9 316.6A100.4 99.6 1.2 0 1 201.4 219.2 100.4 99.6 1.2 0 1 103 117.5 100.4 99.6 1.2 0 0 0.5 215 100.4 99.6 1.2 0 0 98.9 316.6Z" />
<path d="M101.4 119.4A99.6 100.4 0.1 0 1 200.8 220 99.6 100.4 0.1 0 1 300.6 119.7 99.6 100.4 0.1 0 0 201.1 19.1 99.6 100.4 0.1 0 0 101.4 119.4Z" />
</g>
</svg>
Вариант с 2 секторами + маска + анимация
Каждый раз, разная картинка
<svg id="svg1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="420" height="420" viewBox="-15 10 420 420" version="1.1">
<defs>
<mask id="msk" >
<rect width="100%" height="100%" fill="red" />
<g id="G1" fill="white" stroke-width="1" stroke="white">
<path d="1M299.3 119.6A99.6 100.4 90 0 1 198.8 219.2 99.6 100.4 90 0 1 299.3 318.7 99.6 100.4 90 0 0 399.7 219.2 99.6 100.4 90 0 0 299.3 119.6ZM299.3 318.7" />
<path d="m299.3 318.7a99.6 100.4 1 0 1-97.9-102.1 99.6 100.4 1 0 1-101.2 98.8 99.6 100.4 1 0 0 97.9 102.1 99.6 100.4 1 0 0 101.2-98.8z" />
<path d="1M98.9 316.6A100.4 99.6 1.2 0 1 201.4 219.2 100.4 99.6 1.2 0 1 103 117.5 100.4 99.6 1.2 0 0 0.5 215 100.4 99.6 1.2 0 0 98.9 316.6Z" />
<path d="M101.4 119.4A99.6 100.4 0.1 0 1 200.8 220 99.6 100.4 0.1 0 1 300.6 119.7 99.6 100.4 0.1 0 0 201.1 19.1 99.6 100.4 0.1 0 0 101.4 119.4Z" />
</g>
</mask>
<animateTransform
href="#G1"
attributeName="transform"
type="rotate"
begin="svg1.click"
dur="8s"
values="
0 200 218;
360 200 218;
360 200 218;
0 200 218;
0 200 218"
repeatCount="indefinite"
restart="whenNotActive" />
</defs>
<image id="img" mask="url(#msk)" href=" https://placeimg.com/480/480/nature" width="100%" height="100%"/>
</svg>
Вариант с 4 секторами + анимация
<svg id="svg1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="420" height="420" viewBox="-15 10 420 420" version="1.1">
<defs>
<mask id="msk" >
<rect width="100%" height="100%" fill="red" />
<g id="G1" fill="white" stroke-width="4" stroke="red">
<path d="M299.3 119.6A99.6 100.4 90 0 1 198.8 219.2 99.6 100.4 90 0 1 299.3 318.7 99.6 100.4 90 0 0 399.7 219.2 99.6 100.4 90 0 0 299.3 119.6ZM299.3 318.7" />
<path d="m299.3 318.7a99.6 100.4 1 0 1-97.9-102.1 99.6 100.4 1 0 1-101.2 98.8 99.6 100.4 1 0 0 97.9 102.1 99.6 100.4 1 0 0 101.2-98.8z" />
<path d="M98.9 316.6A100.4 99.6 1.2 0 1 201.4 219.2 100.4 99.6 1.2 0 1 103 117.5 100.4 99.6 1.2 0 0 0.5 215 100.4 99.6 1.2 0 0 98.9 316.6Z" />
<path d="M101.4 119.4A99.6 100.4 0.1 0 1 200.8 220 99.6 100.4 0.1 0 1 300.6 119.7 99.6 100.4 0.1 0 0 201.1 19.1 99.6 100.4 0.1 0 0 101.4 119.4Z" />
</g>
</mask>
<animateTransform
href="#G1"
attributeName="transform"
type="rotate"
begin="svg1.click"
dur="8s"
values="
0 200 218;
360 200 218;
360 200 218;
0 200 218"
repeatCount="indefinite"
restart="whenNotActive" />
</defs>
<image id="img" mask="url(#msk)" href="https://placeimg.com/480/480/nature" width="100%" height="100%"/>
</svg>
Можно и без clip-path, но тогда придётся фальш-вырезам задавать такой же цвет, как и основной странице, например, чтобы смотрелось органично
<style>
.img {
width: 300px;
height: 300px;
position: relative;
margin: auto;
background-image: radial-gradient(circle at 0 100%, white 150px, transparent 10px),
radial-gradient(circle at 0 0, white 150px, transparent 10px);
border-radius: 0 50% 50% 0;
}
.img:after {
content: "";
width: 300px;
height: 300px;
background-image: url("https://dynamic-media-cdn.tripadvisor.com/media/photo-o/15/33/fb/43/tanzania.jpg?w=1600&h=900&s=1");
background-size: cover;
background-repeat: no-repeat;
background-position: center;
position: absolute;
z-index: -1;
border-radius: 0 50% 50% 0;
}
</style>
<div class="img"><div>
