Как масштабировать изображение в CSS-спрайте

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

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

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/examples/CSS-Sprites/Example1After/

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

Ответ 1

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

background-size : 150% 150%;

Или

Вы можете использовать комбо масштабирования для 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;
}

Ответ 2

Когда вы используете спрайты, вы ограничены размерами изображения в спрайте. Свойство 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) обрезает 20x20px изображение из тега img, который действует как масштабированный background-image.

Ответ 3

Попробуйте это: Stretchy Sprites - кросс-браузер, адаптивное изменение размера/растяжение изображений спрайтов 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>

Ответ 4

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>

Ответ 5

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

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

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

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

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

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

Ответ 6

Старый пост, но здесь то, что я сделал, используя 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/

Ответ 7

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

есть ли что-то, что мешает вам отображать изображения с нужным вам размером в первую очередь?

Ответ 8

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

Проблема:

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

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

Таким образом, это решение позволяет использовать одни и те же спрайтовые координаты в <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 знаков после запятой) в фоновой позиции, а не в размере фона, как предлагается другими здесь, вы можете масштабировать одно и то же объявление значка до любого размера без необходимости его повторного использования.

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

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

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

Ответ 9

Ну, я думаю, нашел более простое решение для масштабирования изображений: например, скажем, есть изображение с 3 спрайтами одинакового размера, которые вы хотели бы использовать, используйте CSS для масштабирования изображения

background-size : 300% 100%;

а затем укажите пользовательскую высоту и ширину, которые должны быть применены к вашему элементу html, например:

 width :45%;
 height:100px;

Пример кода будет выглядеть примерно так:

.customclass {
    background: url("/sample/whatever.png") 0 0 no-repeat ;
    background-size : 300% 100%;
    width :45%;
    height:100px;
}

im довольно новый для css, а стиль - не моя лучшая область, это может быть неправильным способом сделать это.. но это сработало для меня в Firefox/Chrome/Explorer 10, надеюсь, что он работает и в более старых версиях..

Ответ 10

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

Ответ 11

2018 здесь. Используйте background-size с процентом.

ПРОСТЫНЬ:

Это предполагает один ряд спрайтов. Ширина вашего листа должна быть числом, которое делится на 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>

Ответ 12

Кажется, это работает для меня.

Если спрайты находятся в сетке, задайте для background-size значение 100% от числа спрайтов и 100% от количества спрайтов. Затем используйте background-position -<x*100>% -<y*100>% где x и y - спрайт на основе нуля

Другими словами, если вы хотите, чтобы 3-й спрайт слева и 2-й ряд, что 2 выше и 1 вниз так

background-position: -200% -100%;

Например здесь спрайт лист 4х2 спрайты

enter image description here

И вот пример

div {
  margin: 3px;
  display: inline-block;
}
.sprite {
  background-image: url('/img/58591081be040ab8f5ef439069534d18.png');
  background-size: 400% 200%;  /* 4x2 sprites so 400% 200% */
}
.s0x0 { background-position:    -0%   -0%; }
.s1x0 { background-position:  -100%   -0%; }
.s2x0 { background-position:  -200%   -0%; }
.s3x0 { background-position:  -300%   -0%; }
.s0x1 { background-position:    -0%  -100%; }
.s1x1 { background-position:  -100%  -100%; }
.s2x1 { background-position:  -200%  -100%; }
.s3x1 { background-position:  -300%  -100%; }
<div class="sprite s3x1" style="width: 45px; height:20px"></div>
<div class="sprite s3x1" style="width: 128px; height:30px"></div>
<div class="sprite s3x1" style="width: 64px; height:56px"></div>
<div class="sprite s2x1" style="width: 57px; height:60px"></div>
<div class="sprite s3x0" style="width: 45px; height:45px"></div>
<div class="sprite s0x1" style="width: 12px; height:100px"></div>

<br/>
<div class="sprite s0x0" style="width: 45px; height:20px"></div>
<div class="sprite s1x0" style="width: 128px; height:45px"></div>
<div class="sprite s2x0" style="width: 64px; height:56px"></div>
<div class="sprite s3x0" style="width: 57px; height:60px"></div>
<br/>
<div class="sprite s0x1" style="width: 45px; height:45px"></div>
<div class="sprite s1x1" style="width: 12px; height:50px"></div>
<div class="sprite s2x1" style="width: 12px; height:50px"></div>
<div class="sprite s3x1" style="width: 12px; height:50px"></div>

Ответ 13

Используйте transform: scale(0.8); с нужным вам значением вместо 0,8

Ответ 14

Установите ширину и высоту в обертку элемента спрайта. Используйте этот css.

{
    background-size: cover;
}

Ответ 15

Простота... Использование двух копий одного и того же изображения с разной шкалой на листе спрайта. Установите Coords и размер в логике приложения.