Pour ce faire, on peut utiliser un gradient radial (exemple divisé en plusieurs lignes pour faciliter la lecture).
background-image: radial-gradient(
/* Position the circle at the center, 40px from the top */
circle at center 40px,
/* The center of the radius should be dark */
rgba(0,0,0,0.4) 0%,
/* This is the inner edge of the circle, we transition from dark-transparent between pixels 30 and 31 */
rgba(0,0,0,0.4) 30px, rgba(0,0,0,0) 31px,
/* This is the outer edge of the circle, we transition back from transprent-dark between pixels 34 and 35*/
rgba(0,0,0,0) 34px, rgba(0,0,0,0.4) 35px,
/* Everything outside of the circle should be dark */
rgba(0,0,0,0.4) 100%
);
Donde circle at center 40px
définit la position du cercle par rapport à l'élément parent (centré horizontalement, 40px vers le bas à partir du haut). N'oubliez pas qu'il s'agit de la position du centre du cercle et que vous devez tenir compte de son rayon.
Et nous utilisons de très petits pas entre le gradient pour qu'il ressemble à une ligne solide plutôt qu'à un gradient flou (je trouve qu'un 1px
La différence permet d'éviter l'aliasing sur la ligne et rend le tout beaucoup plus lisse).
Vous pouvez ajuster la taille du cercle ou l'épaisseur de la ligne en changeant les paramètres de l'outil. 30px
, 31px
, 34px
y 35px
dans le gradient.
Exemple de travail :
.item {
position: relative;
width: 200px;
height: 200px;
background: url(https://picsum.photos/seed/picsum/200/200);
}
.item:before {
position: absolute;
content: '';
top: 0;
left: 0;
bottom: 0;
right: 0;
z-index: 1;
/* This is the ring itself, you can adjust it's size using the pixel values, leaving 1px differnce usually leaves the best result for smooth edges */
background-image: radial-gradient(circle at center 40px, rgba(0, 0, 0, 0.4) 0%, rgba(0, 0, 0, 0.4) 30px, rgba(0, 0, 0, 0) 31px, rgba(0, 0, 0, 0) 34px, rgba(0, 0, 0, 0.4) 35px, rgba(0, 0, 0, 0.4) 100%);
}
<div class="item"></div>
(Cette méthode est un navigateur compatible avec à peu près tous les navigateurs publiés depuis 2010)