У изображений CSS Sprite должно быть X объем пространства между каждым элементом?

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

Я пытаюсь использовать изображение в качестве спрайта для списка UL. Он должен показывать значок рядом с ним, и значок, и текст должны быть связаны где-то.

В моем первом примере посмотрим, как я хочу, чтобы это было. Если для параметра font-size установлено значение 10px, оно выглядит нормально... sprite ok

Как только я изменяю font-size от 10px до 16px...

sprite not ok

Вот CSS и HTML

CSS

#post-meta-wrapper{
    list-style: none;
    margin:20px 0 20px 20px;
    width:400px;
}

#post-meta-wrapper li {
    width:100%;
    color: #44495B;
    border-top: 1px dotted #CCC;
    color: #999;
    font-size: 10px;
    line-height: 28px;
    margin: 0px 0px 0px 0px;
    padding: 0px 0px 0px 0px;
    text-indent: 0px;
}
#post-meta-wrapper li a{
    background: url(http://i.imgur.com/Bcps8.png) no-repeat 0px -183px;
    padding-left:15px;
}

#post-meta-wrapper .meta-img {
    background:#fff;
    width: 15px;
    height: 10px;
    margin: 0px 0px 0px 0px;
    padding: 0px 0px 0px 8px;
    overflow: hidden;
}

#post-meta-wrapper a:hover,
#post-meta-wrapper .active{
    background: url(http://i.imgur.com/Bcps8.png) no-repeat 0px -195px;
    width: 15px;
    height: 10px;
}

HTML

<ul id="post-meta-wrapper">
    <li class="author">
        <a href="#"><span class="meta-img">Test link</a>
    </li>
    <li class="author">
        <a href="#" class="active"><span class="meta-img">Test link</a>
    </li>
    <li class="author">
        <a href="#"><span class="meta-img">Test link</a>
    </li>
    <li class="author">
        <a href="#"><span class="meta-img">Test link</a>
    </li>
    <li class="author">
        <a href="#"><span class="meta-img">Test link</a>
    </li>
    <li class="author">
        <a href="#"><span class="meta-img">Test link</a>
    </li>

</ul>

Примеры JSFiddle

Это первая с font-size: 10px http://jsfiddle.net/jasondavis/Mt87G/4/

Это MESSED UP с font-size: 16px http://jsfiddle.net/jasondavis/Mt87G/5/

Помогите мне?

Хорошо. Я знаю, что могу просто изменить изображение спрайта, чтобы иметь огромные пространства вокруг каждого объекта на изображении, и тогда вы не заметили бы эту проблему, но я бы очень хотел, чтобы эта проблема была решена правильно. Я имею в виду, можно ли делать то, что я пытаюсь сделать только с помощью CSS, или изображение должно быть разнесено? Я видел другие изображения спрайтов, где они находятся рядом, как у меня, и я видел некоторые места, где все походит на 100 пикселей.

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

Ответ 1

  • Закройте диапазон
  • Установите width, height, float и margin-top этого диапазона для выравнивания с базой высоты строки

Попробуйте следующее: http://jsfiddle.net/Mt87G/19/

CSS

#first a{
     font-size: 10px;
     padding-left: 5px;
     line-height: 12px;
}
#second a{
    font-size: 22px;
    line-height: 25px;
    padding-left: 5px; 
}
.meta-img{
    background: url(http://i.imgur.com/Bcps8.png) no-repeat 0px -183px;
    width: 13px;
    height: 12px;
    float: left;
}
#first .meta-img{
    margin-top: 4px
}
#second .meta-img{
    margin-top: 7px
}

HTML

<p id="first">
    <a href="#">
        <span class="meta-img"></span>Test link
    </a>  
</p>    

<p id="second">
    <a href="#">
        <span class="meta-img"></span>Test link
    </a> 
</p>

Ответ 2

Я бы предложил использовать элемент: before pseudo. Добавьте класс в ссылку привязки или элемент списка и создайте элемент pseduo, чтобы сохранить изображение спрайта. Это дает тот же эффект, что и возможность устанавливать определенный размер на пролете без необходимости дополнительной разметки.

<li class="icon">
    <a href="#">Test Link<a/>
<li>

.icon:before{
    content: '';
    width: 10px;
    height: 10px;
    display: block;
    background: url(http://i.imgur.com/Bcps8.png) no-repeat 0px -183px;
    /* other css for positioning */
}

Если вы хотите, чтобы значок был частью ссылки, перед этим должен стоять якорь. Если подчеркивание подчеркнуто, будет подчеркнуто.

Если вы положите его на li, ссылка все равно может быть подчеркнута без подчеркивания значка, но чтобы сделать его доступным для кликабе, вам нужно использовать магию с дополнением на якорях.

Примечание. Как упоминалось jimplode, это не будет работать в IE <= 7 Итак, если вам нужно, чтобы там (грустно для вас) работала лучше, используйте дополнительную разметку.

Ответ 3

Хорошо написанный вопрос! Я упростил ваши два образца скриптов в одну скрипку:

http://jsfiddle.net/Mt87G/6/

Похоже, что в варианте 16px изображение просто немного больше, так как высота линии становится больше из-за большего размера шрифта.

Отредактировано: очевидно, что SO использует спрайты, см., например, это изображение. Если я использую firebug для увеличения высоты линии для кнопки "проголосовать", например, в какой-то момент появляется следующий спрайт.

Итак, если вы будете следовать их примеру, кажется, вы могли:

  • установить фиксированную высоту на элементе
  • Оставьте некоторое пространство между спрайтами, просто убедитесь, что

Строгий ответ, хотя на ваш вопрос тогда кажется "нет, не нужно".

Ответ 4

Я думаю, вы можете дать больше пробелов между изображениями. Если у вас есть отдельные изображения, вы можете использовать http://spritegen.website-performance.org/ для создания спрайтов, и вы можете предоставить пользовательское пространство между изображениями спрайтов.

Если вы изменяете размер шрифта динамически, вы также можете использовать спрайт с большим пространством и можете только изменить положение фона.

Ответ 5

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

Ответ 6

Обычно я оставляю несколько пикселей между спрайтами из-за ошибок округления, которые я видел на мобильном Safari. Если между спрайтами находится всего один пиксель, иногда на краю элемента имеется луч ширины волос следующего спрайта. Добавление немного более буферной комнаты позволяет избежать этой проблемы. Если вы используете PNG файлы, на самом деле не так много дополнительного размера файла (чрезвычайно небольшое увеличение) с большим интервалом из-за того, как они сжимаются.