Как я могу масштабировать изображение в спрайте CSS - PullRequest
149 голосов
/ 12 марта 2010

В этой статье, http://css -tricks.com / css-sprites / , рассказывается о том, как можно обрезать меньшее изображение из одного большего изображения. Подскажите, пожалуйста, возможно ли это / как я могу обрезать уменьшенное изображение, а затем масштабировать обрезанную область, прежде чем выложить ее?

Вот пример из этой статьи:

A
{
  background-image: url(http://www.jaredhirsch.com/coolrunnings/public_images/3deb155981/spriteme1.png);
  background-position: -10px -56px;
}

Я хотел бы знать, как я могу масштабировать это изображение после того, как я обрезал его из spriteme1.png

Вот URL примера: http://css -tricks.com / примеры / CSS-спрайты / Example1After /

Итак, я хотел бы знать, смогу ли я сделать значки рядом с Item1,2,3,4 меньше?

Ответы [ 14 ]

123 голосов
/ 18 апреля 2013

Вы можете использовать background-size , так как он поддерживается большинством браузеров (но не всеми http://caniuse.com/#search=background-size)

background-size : 150% 150%;

или

Вы можете использовать комбо zoom для webkit / ie и transform: scale для Firefox (-moz-) и Opera (-o-) для кросс-браузерного рабочего стола & мобильный

[class^="icon-"]{
    display: inline-block;
    background: url('../img/icons/icons.png') no-repeat;
    width: 64px;
    height: 51px;
    overflow: hidden;
    zoom:0.5;
    -moz-transform:scale(0.5);
    -moz-transform-origin: 0 0;
}

.icon-huge{
    zoom:1;
    -moz-transform:scale(1);
    -moz-transform-origin: 0 0;
}

.icon-big{
    zoom:0.60;
    -moz-transform:scale(0.60);
    -moz-transform-origin: 0 0;
}

.icon-small{
    zoom:0.29;
    -moz-transform:scale(0.29);
    -moz-transform-origin: 0 0;
}
29 голосов
/ 18 марта 2010

Когда вы используете спрайты, вы ограничены размерами изображения в спрайте. Свойство background-size CSS, упомянутое Стивеном, пока широко не поддерживается и может вызвать проблемы с браузерами, такими как IE8 и ниже, и, учитывая их долю на рынке, это нереальный вариант.

Еще один способ решить эту проблему - использовать два элемента и масштабировать спрайт, используя его с тегом img, например:

<div class="sprite-image"
     style="width:20px; height:20px; overflow:hidden; position:relative">
    <!-- set width/height proportionally, to scale the sprite image -->
    <img src="sprite.png" alt="icon"
         width="20" height="80"
         style="position:absolute; top: -20px; left: 0;" />
</div>

Таким образом, внешний элемент (div.sprite-image) обрезает изображение размером 20x20 пикселей из тега img, которое действует как масштабированный background-image.

19 голосов
/ 31 мая 2012

Попробуйте это: Эластичные спрайты - Кросс-браузерное адаптивное изменение размера / растяжения изображений спрайтов CSS

Этот метод масштабирует спрайты «быстро», чтобы ширина / высота регулировалась в соответствии с размером окна вашего браузера. не использует background-size в качестве поддержки , так как в старых браузерах этого не существует.

CSS

.stretchy {display:block; float:left; position:relative; overflow:hidden; max-width:160px;}
.stretchy .spacer {width: 100%; height: auto;}
.stretchy .sprite {position:absolute; top:0; left:0; max-width:none; max-height:100%;}
.stretchy .sprite.s2 {left:-100%;}
.stretchy .sprite.s3 {left:-200%;}

HTML

<a class="stretchy" href="#">
  <img class="spacer" alt="" src="spacer.png">
  <img class="sprite" alt="icon" src="sprite_800x160.jpg">
</a>
<a class="stretchy s2" href="#">
  <img class="spacer" alt="" src="spacer.png">
  <img class="sprite" alt="icon" src="sprite_800x160.jpg">
</a>
<a class="stretchy s3" href="#">
  <img class="spacer" alt="" src="spacer.png">
  <img class="sprite" alt="icon" src="sprite_800x160.jpg">
</a>
10 голосов
/ 10 декабря 2016

transform: scale(); заставит оригинальный элемент сохранить его размер.

Я нашел, что лучший вариант - использовать vw. Это работает как шарм:

https://jsfiddle.net/tomekmularczyk/6ebv9Lxw/1/

#div1,
#div2,
#div3 {
  background:url('//www.google.pl/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png') no-repeat;
  background-size: 50vw;   
  border: 1px solid black;
  margin-bottom: 40px;
}

#div1 {
  background-position: 0 0;
  width: 12.5vw;
  height: 13vw;
}
#div2 {
  background-position: -13vw -4vw;
  width: 17.5vw;
  height: 9vw;
  transform: scale(1.8);
}
#div3 {
  background-position: -30.5vw 0;
  width: 19.5vw;
  height: 17vw;
}
<div id="div1">
  </div>
  <div id="div2">
  </div>
  <div id="div3">
  </div>
7 голосов
/ 07 октября 2011

Вот что я сделал, чтобы сделать это. Имейте в виду, что он не будет работать на IE8 и ниже.

#element {
  width:100%;
  height:50px;
  background:url(/path/to/image.png);
  background-position:140.112201963534% 973.333333333333%;
}

Ширина фонового изображения будет уменьшаться при уменьшении родительского элемента #element. Вы можете сделать то же самое с его высотой, если вы конвертируете height в процент. Единственный сложный момент - вычислить проценты для background-position.

Первый процент - это ширина целевой области спрайта при нормальной ширине, деленная на общую ширину спрайта и умноженная на 100.

Второй процент - это высота целевой области спрайта перед масштабированием, деленная на общую высоту спрайта и умноженная на 100.

Формулировка этих двух уравнений немного неаккуратна, поэтому дайте мне знать, если вам нужно, чтобы я объяснил это лучше.

5 голосов
/ 01 мая 2015

Старый пост, но вот что я сделал, используя background-size:cover; (отзыв на @Ceylan Pamir) ...

ПРИМЕР ИСПОЛЬЗОВАНИЯ
Горизонтальный круговой флиппер (наведите курсор на изображение на лицевой стороне, переверните назад на другое изображение).

ПРИМЕР СПРАЙТ
480px x 240px

ПРИМЕРНЫЙ КОНЕЧНЫЙ РАЗМЕР
Одно изображение @ 120px x 120px

ОБЩИЙ КОД
.front {width:120px; height:120px; background:url(http://www.example.com/images/image_240x240.png); background-size:cover; background-repeat:no-repeat; background-position:0px 0px;}

.back {width:120px; height:120px; background:url(http://www.example.com/images/image_240x240.png); background-size:cover; background-repeat:no-repeat; background-position:-120px 0px;}

Сокращенный футляр FIDDLE
http://jsfiddle.net/zuhloobie/133esq63/2/

4 голосов
/ 03 августа 2016

Мне понадобилось время, чтобы найти решение этой проблемы, которой я был доволен:

Проблема:

  • SVG-спрайт иконок - скажем, 80px x 3200px

  • Мы хотим масштабировать каждое их использование в селекторах контента (: до /: после) в разных местах по разным размерам без переопределения ко-ордов каждого спрайта в зависимости от используемого размера.

Таким образом, это решение позволяет вам использовать те же спрайт-коорды в <button>, что и <menuitem>, в то же время масштабируя его.

[data-command]::before {
    content: '';
    position: absolute;
    background-image: url("images/sprite.svgz");
    background-repeat: no-repeat;
    background-size: cover;
}

button[data-command]::before {
  width: 32px;
  height: 32px;
}

menuitem[data-command]::before {
  width: 24px;
  height: 24px;
}

[data-command="cancel"]::before {
  background-position: 0% 35%;
}

[data-command="logoff"]::before {
  background-position: 0% 37.5%;
}

Используя проценты (до 2 десятичных разрядов) в background-position, а не background-size, как предлагают другие здесь, вы можете масштабировать одно и то же объявление значка до любого размера, без необходимости его повторного объявления.

Процентная доля y представляет собой исходную высоту спрайта / высоту иконки в виде% - в нашем случае здесь 80px * 100 / 3200px == каждый спрайт представлен y-позицией 2,5%.

Если у вас есть состояния наведения / наведения мыши, вы можете удвоить ширину спрайта и указать координату position-x.

Недостаток этого подхода состоит в том, что добавление большего количества значков на более позднем этапе изменит высоту спрайта и, следовательно, y-position%, но если вы этого не сделаете, ваши координаты спрайта будут нуждаться в изменении для каждого масштабированного разрешения. вам требуется.

4 голосов
/ 12 марта 2010

попробуйте использовать размер фона: http://webdesign.about.com/od/styleproperties/p/blspbgsize.htm

Что-то мешает вам рендерить изображения в нужном вам размере?

2 голосов
/ 06 октября 2018

2018 здесь. Использовать фоновый размер с процентом.

ЛИСТ:

Это предполагает один ряд спрайтов. Ширина вашего листа должна быть числом , которое делится равномерно на 100 + ширина одного спрайта . Если у вас 30 спрайтов размером 108x108 пикселей, добавьте дополнительное свободное место в конец, чтобы окончательная ширина составила 5508 пикселей (50 * 108 + 108).

CSS:

.icon{
    height: 30px;  /* Set this to anything. It will scale. */
    width: 30px; /* Match height. This assumes square sprites. */
    background:url(<mysheeturl>);
    background-size: 5100% 100%; /*  5100% because 51 sprites. */
}

/* Each image increases by 2% because we used 50+1 sprites. 
   If we had used 20+1 sprites then % increase would be 5%. */

.first_image{
    background-position: 0% 0;
}

.ninth_image{
    background-position: 16% 0; /* (9-1) x 2 = 16 */
}

HTML:

<div class ="icon first_image"></div>
<div class ="icon ninth_image"></div>
2 голосов
/ 05 февраля 2018

Используйте transform: scale(...); и добавьте соответствующий margin: -...px для компенсации свободного пространства от масштабирования. (вы можете использовать * {outline: 1px solid}, чтобы увидеть границы элементов).

...