Как я могу отобразить только часть изображения в HTML / CSS?


145

Допустим, мне нужен способ отображать только центральную часть изображения размером 50 x 50 пикселей размером 250 x 250 пикселей в HTML. Как мне это сделать. Кроме того, есть ли способ сделать это для ссылок css: url ()?

Мне известно о клипе в CSS, но, похоже, это работает только при использовании с абсолютным позиционированием.


List Apart должен быть в любом списке сайтов для посещения с проблемами HTML / CSS / JS: вот один способ создания спрайтов , а вот другой - с использованием JS .
graham.reeds

1
Используйте спрайт - см. Здесь w3schools.com/css/css_image_sprites.asp

Ответы:


118

Один из способов сделать это - установить изображение, которое вы хотите отображать в качестве фона в контейнере (td, div, span и т. Д.), А затем настроить background-position, чтобы получить нужный спрайт.


2
Чтобы уточнить, вы должны установить ширину и высоту контейнера td, div, span или чего-то еще на 50 пикселей, чтобы это работало.
Пол Д. Уэйт,

7
@Espo, это кажется довольно стандартным подходом, но что, если у вас есть изображение спрайта, которое содержит несколько отдельных изображений размером 32x32, и вы хотите отобразить одно из них в div, span и т. Д., Которое больше 32x32 .. .setting the background-position больше не работает.
Мэтью Лейтон

2
@ series0ne Вы, наверное, могли бы совместить сbackground-size
Stijn de Witt

167

Как упоминалось в этом вопросе, существует clipсвойство CSS, хотя это требует, чтобы элемент обрезаемый position: absolute;(который является позором):

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

Демо JS Fiddle для экспериментов.

Чтобы дополнить исходный ответ - несколько с опозданием - я редактирую, чтобы показать использование clip-path, которое заменило теперь устаревшее clipсвойство.

clip-pathСвойство позволяет ряд вариантов (более-так чем оригинал clip), из:

  • inset- прямоугольные / кубовидные формы, определяемые четырьмя значениями как «расстояние от» (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- определяется серией x/ yкоординат относительно начала элемента в верхнем левом углу. По мере того как путь закрывается автоматически реалистическое минимальное количество точек для многоугольника должно быть три, любое меньшее количество (два) представляет собой линию или (один) является точкой: polygon(x-coordinate1 y-coordinate1, x-coordinate2 y-coordinate2, x-coordinate3 y-coordinate3, [etc...]).
  • url - это может быть либо локальный URL-адрес (с использованием селектора идентификатора CSS), либо URL-адрес внешнего файла (с использованием пути к файлу) для идентификации SVG, хотя я не экспериментировал ни с одним из них (пока), поэтому я не могут предложить никаких сведений об их пользе или предостережениях.

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>

Демо JS Fiddle для экспериментов.

Ссылки:


14
потрясающая находка, большое спасибо :) К вашему сведению, это не так ограничено, как можно было бы подумать. Если у вас есть контейнер с изображением div (id = "img_container") вокруг тега img, просто сделайте положение img_container относительным, а img абсолютным, вы можете обрезать изображение таким образом
FurtiveFelon

«позиция: абсолют; (что позор)»
Санкет Саху

Не то, чтобы я в курсе, нет.
Дэвид требует восстановить Монику

6
clipявляется устаревшим . Более новое clip-pathне требует позиционирования
eagor

3
Хотя clip устарел, многие современные браузеры еще не поддерживают clip-path. developer.mozilla.org/en-US/docs/Web/CSS/clip-path
barrypicker 09

37

Другой альтернативой является следующее, хотя и не самое чистое, поскольку предполагается, что изображение является единственным элементом в контейнере, например, в этом случае:

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

Затем вы можете использовать контейнер в качестве маски желаемого размера и окружить изображение отрицательным полем, чтобы переместить его в правильное положение:

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

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

Демо можно увидеть в этом JSFiddle .

Кажется, работает только в IE> 9 и, вероятно, во всех значимых версиях всех других браузеров.


2
Хотя это бит-хакерство, у него есть положительная сторона, заключающаяся в том, что это работает во всех браузерах (clip устарело, а clip-path не работает в IE) и что он работает, когда вы пытаетесь распечатать веб-страницу (фоновые изображения по умолчанию пропускаются )
Рауни Лиллеметс

Это единственный метод, полностью совместимый с браузерами. У всех других способов есть проблемы. "Клип" обесценился, и фоновое положение не читается точно во всех браузерах.
Карим

2

отрегулируйте background-position для перемещения фоновых изображений в разные позиции div

div { 
       backgroud-image: url('image url')
       background-position: 0 -250px; 
    }

Тип: backgroud-image-> background-image. Мне было интересно, почему мой браузер не знает об этом свойстве CSS, и, наконец, я понял, что это связано с типом.
Eerik Sven Puudist
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.