Использование Css-спрайтов и фонового положения
У меня есть элемент div, например ширина 200px и высота 200px. Мне нужно небольшое изображение, которое появится в верхнем правом углу div. Как обычно это делалось бы с помощью
background: url(/images/imagepath.png) top right;
Однако проблема в том, что я загружаю изображение из спрайта и когда я использую что-то вроде
background: url(/web/images/imagepath.png) -215px -759px top right;
спрайт, похоже, не выбирает его из нужного места. Загружается другая часть спрайта. Можно ли загрузить изображение из спрайта и использовать атрибут background-position. Спасибо заранее...
Ответы
Ответ 1
Вам нужно указать координаты для позиции вашего элемента и положения фона двумя разными способами.
#yourimage {
background-image: url(/web/images/imagepath.png);
/* background coordinates */
background-position: -215px -759px;
/* element coordinates */
position:absolute;
left: 0; /* 0px from the left */
top: 0; /* 0px from the top */
}
С помощью background-position
вы указываете фоновые координаты. Для координат вашего элемента вам необходимо установить свойства left
и right
.
Имейте в виду, что для использования спрайтов ваш элемент должен иметь правильный размер. Изображение, которое вы используете в качестве фона, должно иметь достаточно места, чтобы покрыть ширину и высоту элемента, а не больше, иначе вы увидите более одного изображения из изображения спрайтов.
Если вы хотите отобразить изображение, меньшее, чем ваш элемент, вам понадобится меньший элемент внутри большого.
<div id="container">
<div class="background"></div>
my content here
</div>
Затем в вашем CSS
#container {
position:relative;
width: 200px; /* size of your big element */
height: 200px;
}
#container .background {
background: url(/web/images/imagepath.png) -215px -759px;
width: 50px; /* width and height of the sprite image you want to display */
height: 50px;
position: absolute;
top: 0;
left: 0;
}
Ответ 2
Вы можете использовать :before
pseudoclass следующим образом:
.element:before {
content:"";
position:absolute;
right:0;
top:0;
width:20px;
height:20px;
background: url(/web/images/imagepath.png) -215px -759px;
}
но это пока слабо поддерживается.
Мой совет состоит в том, чтобы сделать еще один элемент внутри вашего обертки и разместить его абсолютно так же, как выше :before
, но, например, real div
ИЗМЕНИТЬ
Другим сложным способом использования спрайтов в углах окна является описанный здесь.
Ответ 3
Если вы можете использовать препроцессор, такой как SCSS:
(обновлено, чтобы ответить на заданный вопрос, а также посмотреть живой пример)
// ----------- only things you need to edit { ---------------
$sprite-size: 16px; // standard sprite tile size
$sprite-padding: 0px; // if you have padding between tiles
// ----------- } only things you need to edit ---------------
// basic sprite properties (extension-only class)
%sprite {
width:$sprite-size; height:$sprite-size; // must restrict viewport, otherwise other sprites may "bleed through"
// could set shared standard tilesheet `background-image: url(...)`
// other standard styles, like `display:inline-block` or `position:absolute`
}
// helper for assigning positioning using friendlier numbers like "5" instead of doing the math
@mixin sprite-offset($xoffset:0, $yoffset:0, $increment:$sprite-size, $padding: $sprite-padding) {
background-position: -($xoffset*($increment + $padding)) -($yoffset*($increment + $padding));
}
Чтобы "плавать" фон из спрайта, например ответ @jose-faeti, указывает, что вы должны включить элемент-заполнитель
<div class="float-bg">
<div class="bg"></div>
<p>Lorem ipsum dolor si...</p>
</div>
со стилем вроде:
.float-bg .bg {
@extend %sprite; // apply sizing properties
background-image: url(...); // actually set the background tiles
@include sprite-offset(4);
// specific configuration per accepted answer
position:absolute;
top: 0;
right: 0;
}
В моем первоначальном ответе создать список кнопок, вы могли бы:
// list out the styles names for each button
$buttons: 'help', 'font', 'layerup', 'layerdown', 'transform', 'export', 'save', 'clear', 'move-left', 'move-right', 'move-up', 'move-down', 'png', 'jpg', 'svg', 'funky';
.btns > * { @extend %sprite; background-image:... } // apply sizing properties, bg
// autoassigns positioning
@for $i from 1 through length($buttons) {
$btn: nth($buttons, $i);
.btn-#{$btn} {
// @extend .sprite;
@include sprite-offset( $i - 1 );
}
}
будет работать над что-то вроде:
<ul class="btns">
<li class="btn-help">...</li>
<li class="btn-font">...</li>
<li class="btn-save">...</li>
<li class="btn-export">...</li>
<li class="btn-etc">...</li>
<li class="btn-etc">...</li>
</ul>
Ответ 4
Вы указываете либо top right
, либо точное положение пикселя, а не оба.
Кроме того, вы не можете загрузить небольшую часть спрайта изображения, чтобы использовать его в качестве фона для большего элемента. Вам нужно будет вставить в него небольшой элемент с размером спрайта.
Ответ 5
проверить, используя background-origin вместо background-position.
у вас может быть только одно заданное положение фона, и сейчас у вас есть два (-215px -759px) и (вверху справа).