Como posso exibir apenas uma parte da imagem em HTML / CSS?

140

Digamos que eu queira uma maneira de exibir apenas o centro de 50x50px de uma imagem com 250x250px em HTML. Como eu posso fazer isso. Além disso, existe uma maneira de fazer isso para referências css: url ()?

Estou ciente do clipe em CSS, mas isso parece funcionar apenas quando usado com posicionamento absoluto.

Hafthor
fonte
A List Apart deve estar na lista anyones de locais para visitar com / CSS problemas HTML / JS: Aqui está uma maneira de fazer sprites , e aqui está outro usando JS .
graham.reeds 11/09/08
1
Use um sprite - veja aqui w3schools.com/css/css_image_sprites.asp

Respostas:

116

Uma maneira de fazer isso é definir a imagem que você deseja exibir como plano de fundo em um contêiner (td, div, span etc.) e depois ajustar a posição do plano de fundo para obter o sprite desejado.

Espo
fonte
1
Apenas para esclarecer, você definiria a largura e a altura do contêiner td, div, span ou qualquer outra coisa como 50px para fazer isso funcionar.
2133 Paul Paul Waite
7
@ Espo, esta parece ser uma abordagem bastante padrão, no entanto, e se você tiver uma imagem de sprite que contenha várias imagens individuais de tamanho 32x32, e quiser exibir 1 delas em uma div, span etc. que seja maior que 32x32 .. A configuração da posição de segundo plano não funciona mais.
Matthew Layton 30/05
2
@ series0ne Você provavelmente poderia combinar combackground-size
Stijn de Witt
163

Como mencionado na pergunta, existe a clippropriedade css, embora não exigem que o elemento que está sendo cortada é position: absolute;(que é uma vergonha):

.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>

Demonstração JS Fiddle , para experimentação.

Para complementar a resposta original - um pouco tardiamente - estou editando para mostrar o uso de clip-path, que substituiu a clippropriedade agora obsoleta .

A clip-pathpropriedade permite uma variedade de opções (mais do que o original clip), de:

  • inset- formas retangulares / cubóides, definidas com quatro valores como 'distância à distância' (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- definido por uma série de x/ ycoordenadas em relação à origem do elemento no canto superior esquerdo. À medida que o caminho é fechado automaticamente o número mínimo de pontos realista para um polígono deve ser de três, qualquer menos (duas) é uma linha ou (um) é um ponto: polygon(x-coordinate1 y-coordinate1, x-coordinate2 y-coordinate2, x-coordinate3 y-coordinate3, [etc...]).
  • url - pode ser um URL local (usando um seletor de id CSS) ou o URL de um arquivo externo (usando um caminho de arquivo) para identificar um SVG, embora eu ainda não tenha experimentado (ainda). não pode oferecer informações sobre seus benefícios ou ressalvas.

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>

Demonstração JS Fiddle , para experimentação.

Referências:

David diz para restabelecer Monica
fonte
14
descoberta incrível, muito obrigado :) Apenas para sua informação, não é tão limitado quanto se poderia pensar. Se você tem um recipiente div imagem (id = "img_container") em torno tag img, basta fazer a posição img_container relativo, e fazer img absoluta, você pode cortar a imagem dessa forma
FurtiveFelon
"position: absolute; (o que é uma pena)"
Sanket Sahu 19/03/14
Não que eu saiba, não.
David diz que restabelece Monica
6
clipestá obsoleto . Mais recente clip-pathnão requer posicionamento
eagor
3
Embora o clipe esteja obsoleto, muitos navegadores modernos ainda não suportam o caminho do clipe. developer.mozilla.org/pt-BR/docs/Web/CSS/clip-path
barrypicker:
37

Outra alternativa é a seguinte, embora não seja a mais limpa, pois assume que a imagem é o único elemento em um contêiner, como neste caso:

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

Você pode usar o recipiente como uma máscara com o tamanho desejado e cercar a imagem com uma margem negativa para movê-la para a posição correta:

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

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

A demonstração pode ser vista neste JSFiddle .

Apenas parece funcionar no IE> 9, e provavelmente em todas as versões significativas de todos os outros navegadores.

Vincent
fonte
2
Embora seja um bitc hacky, ele tem o lado positivo de que isso funciona em todos os navegadores (o clipe está obsoleto e o caminho do clipe não funciona no IE) e funciona quando você tenta imprimir a página da Web (as imagens de plano de fundo são ignoradas por padrão )
Rauni Lillemets
Este é o único método de navegação verdadeiramente verdadeiro. Todas as outras formas têm problemas. O "clipe" foi depreciado e a posição do plano de fundo não é lida com precisão em todos os navegadores.
Kareem