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.
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.
peut-être que vous pouvez écrire comme ceci:
#graphic {
background-image: url(image.jpg);
background-position: 0 -50px;
width: 200px;
height: 100px;
}
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.