Comment puis-je afficher juste une partie d'une image en HTML / CSS?

141

Disons que je veux un moyen d'afficher uniquement le centre 50x50px d'une image de 250x250px en HTML. Comment puis je faire ça. Aussi, y a-t-il un moyen de faire cela pour les références css: url ()?

Je connais le clip en CSS, mais cela ne semble fonctionner que lorsqu'il est utilisé avec un positionnement absolu.

Hafthor
la source
Une liste à part devrait être dans la liste des sites à visiter avec des problèmes HTML / CSS / JS: Voici une façon de faire des sprites , et en voici une autre en utilisant JS .
graham.reeds
1
Utilisez un sprite - voir ici w3schools.com/css/css_image_sprites.asp

Réponses:

116

Une façon de le faire est de définir l'image que vous souhaitez afficher comme arrière-plan dans un conteneur (td, div, span, etc.), puis d'ajuster la position de l'arrière-plan pour obtenir le sprite souhaité.

Espo
la source
1
Juste pour clarifier, vous définiriez la largeur et la hauteur du conteneur td, div, span ou autre à 50px pour que cela fonctionne.
Paul D.Waite
7
@Espo, Cela semble être une approche assez standard, mais que se passe-t-il si vous avez une image de sprite qui contient plusieurs images individuelles de taille 32x32, et que vous voulez en afficher 1 sur un div, une étendue, etc. qui est plus grand que 32x32 ... Le réglage de la position de l'arrière-plan ne fonctionne plus.
Matthew Layton
2
@ series0ne Vous pourriez probablement combiner avecbackground-size
Stijn de Witt
164

Comme il est mentionné dans la question, il y a la clippropriété css, bien qu'il ne nécessite que l'élément clipsage est position: absolute;( ce qui est dommage):

.container {
  position: relative;
}
#clip {
  position: absolute;
  clip: rect(0, 100px, 200px, 0);
  /* clip: shape(top, right, bottom, left); NB 'rect' is the only available option */
}
<div class="container">
  <img src="http://lorempixel.com/200/200/nightlife/3" />
</div>
<div class="container">
  <img id="clip" src="http://lorempixel.com/200/200/nightlife/3" />
</div>

Démo JS Fiddle , pour expérimentation.

Pour compléter la réponse originale - un peu tardivement - je modifie pour montrer l'utilisation de clip-path, qui a remplacé la clippropriété désormais obsolète .

La clip-pathpropriété permet une gamme d'options (plus que l'original clip), de:

  • inset- formes rectangulaires / cuboïdes, définies avec quatre valeurs comme «distance-de» (top right bottom left).
  • circle- circle(diameter at x-coordinate y-coordinate).
  • ellipse- ellipse(x-axis-length y-axis-length at x-coordinate y-coordinate).
  • polygon- défini par une série de coordonnées x/ ypar rapport à l'origine de l'élément du coin supérieur gauche. Comme le chemin est fermé automatiquement le nombre minimum de points réaliste pour un polygone doit être trois, tout moins (deux) est une ligne ou (un) est un point: polygon(x-coordinate1 y-coordinate1, x-coordinate2 y-coordinate2, x-coordinate3 y-coordinate3, [etc...]).
  • url - cela peut être soit une URL locale (en utilisant un sélecteur d'id CSS) ou l'URL d'un fichier externe (en utilisant un chemin de fichier) pour identifier un SVG, bien que je n'ai pas expérimenté l'un ou l'autre (pour le moment), donc je ne peut offrir aucun aperçu de leur avantage ou de leur mise en garde.

div.container {
  display: inline-block;
}
#rectangular {
  -webkit-clip-path: inset(30px 10px 30px 10px);
  clip-path: inset(30px 10px 30px 10px);
}
#circle {
  -webkit-clip-path: circle(75px at 50% 50%);
  clip-path: circle(75px at 50% 50%)
}
#ellipse {
  -webkit-clip-path: ellipse(75px 50px at 50% 50%);
  clip-path: ellipse(75px 50px at 50% 50%);
}
#polygon {
  -webkit-clip-path: polygon(50% 0, 100% 38%, 81% 100%, 19% 100%, 0 38%);
  clip-path: polygon(50% 0, 100% 38%, 81% 100%, 19% 100%, 0 38%);
}
<div class="container">
  <img id="control" src="http://lorempixel.com/150/150/people/1" />
</div>
<div class="container">
  <img id="rectangular" src="http://lorempixel.com/150/150/people/1" />
</div>
<div class="container">
  <img id="circle" src="http://lorempixel.com/150/150/people/1" />
</div>
<div class="container">
  <img id="ellipse" src="http://lorempixel.com/150/150/people/1" />
</div>
<div class="container">
  <img id="polygon" src="http://lorempixel.com/150/150/people/1" />
</div>

Démo JS Fiddle , pour expérimentation.

Références:

David dit de réintégrer Monica
la source
14
trouvaille incroyable, merci beaucoup :) Juste pour info, ce n'est pas aussi limité qu'on pourrait le penser. Si vous avez un conteneur d'image div (id = "img_container") autour de la balise img, rendez simplement la position img_container relative et rendez img absolu, vous pouvez
découper
"position: absolue; (ce qui est dommage)"
Sanket Sahu
Pas que je sache, non.
David dit de réintégrer Monica
6
clipest obsolète . Le plus récent clip-pathne nécessite pas de positionnement
eagor
3
tandis que le clip est obsolète, de nombreux navigateurs modernes ne prennent pas encore en charge le chemin de clip. developer.mozilla.org/en-US/docs/Web/CSS/clip-path
barrypicker
37

Une autre alternative est la suivante, mais pas la plus propre car elle suppose que l'image est le seul élément d'un conteneur, comme dans ce cas:

<header class="siteHeader">
  <img src="img" class="siteLogo" />
</header>

Vous pouvez ensuite utiliser le conteneur comme masque avec la taille souhaitée, et entourer l'image avec une marge négative pour la déplacer dans la bonne position:

.siteHeader{
    width: 50px;
    height: 50px;
    overflow: hidden;
}

.siteHeader .siteLogo{
    margin: -100px;
}

La démo peut être vue dans ce JSFiddle .

Ne semble fonctionner que dans IE> 9, et probablement toutes les versions importantes de tous les autres navigateurs.

Vincent
la source
2
Bien que ce soit un piratage bitc, il a le côté positif que cela fonctionne dans tous les navigateurs (le clip est obsolète et le chemin du clip ne fonctionne pas dans IE) et que cela fonctionne lorsque vous essayez d'imprimer la page Web (les images d'arrière-plan sont ignorées par défaut )
Rauni Lillemets
Il s'agit de la seule méthode réellement utilisée par les navigateurs. Tous les autres moyens ont des problèmes. "Clip" a été déprécié et la position de l'arrière-plan n'est pas lue correctement dans tous les navigateurs.
Kareem le