Несколько фоновых изображений и фонового цвета

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

Я могу использовать несколько фоновых изображений:

div.arrow{
    background: url('arrowtail.png') left no-repeat, url('arrowhead.png') right no-repeat;
}

html:

<div class="arrow">This text is on a transparent background</div>

Это дает мне div с головой стрелки и хвостом и прозрачным средним сектором. Не представляется возможным указать цвет в средней части.

Только с одним фоновым изображением вы можете сделать это:

div.arrow{ background: red url('some_image.png') no-repeat; }

Я знаю, что это выполнимо многими способами, но действительно ли свойство background-color действительно потеряно из сокращенного определения?

Ответ 1

Нет, это не совсем потеряно из сокращенной декларации. Вы все же можете указать цвет фона, но только для последнего (среднего) уровня (независимо от того, помещаете ли вы изображение):

div.arrow {
    background: url('arrowtail.png') left no-repeat, 
                url('arrowhead.png') right no-repeat, 
                red;
}

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

jsFiddle demo


Объявление background-color отдельно, однако, может быть намного лучше для вашего сценария, поскольку оно позволяет использовать разные цвета на основе тех же фоновых изображений (если вы хорошо с прозрачными пикселями на частях ваших изображений, которые должны быть заполнены цвет фона CSS):

div.arrow {
    background: url('arrowtail.png') left no-repeat, 
                url('arrowhead.png') right no-repeat;
}

/* Assuming your red arrow has this ID */
#red {
    background-color: red;
}

jsFiddle demo

Ответ 2

Я считаю использование нескольких фоновых изображений проблематичным для таких вещей. Считаете ли вы использование элементов: before и: after? Я написал быстрый пример:

<style>
    .arrow { display:block; margin:0; padding:0; width:200px; height:45px; line-height:45px; text-align:center; background:#ddd; }
    .arrow:before { float:left; display:block; margin:0; padding:0; width:25px; height:45px; background:#ccc; content:''; }
    .arrow:after { float:right; display:block; margin:0; padding:0; width:25px; height:45px; background:#ccc; content:''; }
</style>

<div class="arrow">This text is on a transparent background</div>

Просто замените цвет фона в: перед и: после объявлений на нужные вам стрелки.