web-dev-qa-db-fra.com

Découper / recadrer l'image de fond avec CSS

J'ai ce code HTML:

<div id="graphic">lorem ipsum</div>

avec ce CSS:

#graphic { background-image: url(image.jpg); width: 200px; height: 100px;}

L'image d'arrière-plan que j'applique est 200x100 px, mais je souhaite uniquement afficher une partie recadrée de l'image d'arrière-plan de 200x50 px.

background-clip ne semble pas être la bonne propriété CSS pour cela. Que puis-je utiliser à la place?

background-position ne doit pas être utilisé, car j’utilise le CSS ci-dessus dans un contexte Sprite où la partie de l’image que je veux montrer est plus petite que l’élément sur lequel le CSS est défini.

67
Dahie

Vous pouvez placer le graphique dans un pseudo-élément avec son propre contexte dimensionnel:

#graphic {
  position: relative;
  width: 200px;
  height: 100px;
}
#graphic::before {
  position: absolute;
  content: '';
  z-index: -1;
  width: 200px;
  height: 50px;
  background-image: url(image.jpg);
}
#graphic {
    width: 200px;
    height: 100px;
    position: relative;
}
#graphic::before {
    content: '';
    
    position: absolute;
    width: 200px;
    height: 50px;
    z-index: -1;
    
    background-image: url(http://placehold.it/500x500/); /* Image is 500px by 500px, but only 200px by 50px is showing. */
}
<div id="graphic">lorem ipsum</div>

La prise en charge du navigateur est bonne, mais si vous devez prendre en charge IE8, utilisez un seul signe deux-points :before. IE ne prend en charge aucune de ces syntaxes dans les versions antérieures à cela.

92
Brent

peut-être que vous pouvez écrire comme ceci:

#graphic { 
 background-image: url(image.jpg); 
 background-position: 0 -50px; 
 width: 200px; 
 height: 100px;
}
8
sandeep

Une autre option consiste à utiliser linear-gradient() pour masquer les bords de votre image. Notez que c'est une solution stupide, donc je ne vais pas faire beaucoup d'efforts pour l'expliquer ...

.flair {
  min-width: 50px; /* width larger than Sprite */
  text-indent: 60px;
  height: 25px;
  display: inline-block;
  background:
    linear-gradient(#F00, #F00) 50px 0/999px 1px repeat-y,
    url('https://championmains.github.io/dynamicflairs/Riven/spritesheet.png') #F00;
}

.flair-classic {
  background-position: 50px 0, 0 -25px;
}

.flair-r2 {
  background-position: 50px 0, -50px -175px;
}

.flair-smite {
  text-indent: 35px;
  background-position: 25px 0, -50px -25px;
}
<img src="https://championmains.github.io/dynamicflairs/Riven/spritesheet.png" alt="spritesheet" /><br />
<br />
<span class="flair flair-classic">classic Sprite</span><br /><br />
<span class="flair flair-r2">r2 Sprite</span><br /><br />
<span class="flair flair-smite">smite Sprite</span><br /><br />

J'utilise cette méthode sur cette page: https://championmains.github.io/dynamicflairs/Riven/ et je ne peux pas utiliser ::before ou ::after éléments parce que je les utilise déjà pour un autre hack.

3
Mingwei Samuel