Як я можу відображати лише частину зображення в HTML / CSS?


140

Скажімо, я хочу спосіб відображення лише центру 50x50px зображення, розміром 250x250px у HTML. Як я можу це зробити. Також, чи є спосіб зробити це для посилань css: url ()?

Мені відомо про кліп у CSS, але це, здається, працює лише при використанні з абсолютним позиціонуванням.


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

1
Використовуйте спрайт - дивіться тут w3schools.com/css/css_image_sprites.asp

Відповіді:


116

Один із способів зробити це - встановити зображення, яке ви хочете відображати як фон у контейнері (td, div, span тощо), а потім відрегулювати позицію фону, щоб отримати потрібний спрайт.


1
Просто для уточнення, ви повинні встановити ширину та висоту контейнера td, div, span або що-небудь до 50px, щоб зробити цю роботу.
Пол Д. Уейт

7
@Espo, це здається досить стандартним підходом, але що робити, якщо у вас є спрайтове зображення, яке містить кілька окремих зображень розміром 32x32, і ви хочете відобразити 1 з них на div, span тощо, що перевищує 32x32. .встановлення фонового положення більше не працює.
Меттью Лейтон

2
@ series0ne Ви могли б, можливо, поєднатись ізbackground-size
Штійн де Вітт

163

Як згадувалося в цьому питанні, існує 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
дивовижна знахідка, велике спасибі :) Просто FYI, це не так обмежено, як можна було б подумати. Якщо навколо тега img є контейнер зображень div (id = "img_container"), просто зробіть позицію img_container відносною та зробіть img абсолютним, ви можете вирізати зображення таким чином
FurtiveFelon

"позиція: абсолютна; (що соромно")
Санкет Саху

Не те, що я знаю, ні.
Девід каже повернути Моніку

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

3
хоча кліп застарілий, багато сучасні браузери ще не підтримують кліп-шлях. developer.mozilla.org/en-US/docs/Web/CSS/clip-path
barrypicker

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
Хоча це біт-хакі, він має і плюси, що це працює у всіх браузерах (кліп застарілий, а кліп-шлях не працює в IE) і що він працює, коли ви намагаєтеся надрукувати веб-сторінку (фонові зображення пропускаються за замовчуванням )
Рауні Ліллемець

Це єдиний по-справжньому метод браузерів. Усі інші способи мають проблеми. "Кліп" амортизований, а положення фону не читається точно в усіх браузерах.
Kareem
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.