Прозрачное фоновое изображение с градиентом - PullRequest
25 голосов
/ 16 апреля 2011

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

Может быть, лучше объяснить через код, который, как я думал, может сработать:

#mydiv .isawesome { 
    /* Basic color for old browsers, and a small image that sits in the top left corner of the div */
    background: #B1B8BD url('../images/sidebar_angle.png') 0 0 no-repeat;

    /* The gradient I would like to have applied to the whole div, behind the PNG mentioned above */
    background: -moz-linear-gradient(top, #ADB2B6 0%, #ABAEB3 100%);
    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ADB2B6), color-stop(100%,#ABAEB3));
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ADB2B6', endColorstr='#ABAEB3',GradientType=0 );
}

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

Я знаю, что некоторые из парней здесь скажут "просто примените градиент к PNG, который вы делаете" - но это не идеально, потому что div будет поддерживать динамическую высоту - иногда очень короткую, иногда очень высокую. Я знаю, что этот градиент не необходим , но я подумал, что, возможно, стоит спросить вас, что вы думаете.

Возможно ли иметь фоновое изображение, сохраняя остальную часть фона в качестве градиента?

Ответы [ 5 ]

41 голосов
/ 16 апреля 2011

Имейте в виду, что CSS-градиент на самом деле является значением изображения , а не значением цвета, как некоторые могут ожидать. Следовательно, он соответствует background-image конкретно, а не background-color или всей сокращенной записи background.

По сути, вы действительно пытаетесь наложить на слои два фоновых изображения: растровое изображение поверх градиента. Для этого вы указываете их обоих в одном объявлении, разделяя их запятыми. Сначала укажите изображение, а затем градиент. Если вы укажете цвет фона, этот цвет всегда будет закрашен под самым нижним изображением, что означает, что градиент будет хорошо покрывать его, и он будет работать даже в случае отступления.

Поскольку вы включаете префиксы вендоров, вам придется делать это один раз для каждого префикса, один раз для без префиксов и один раз для аварийного (без градиента). Чтобы избежать необходимости повторения других значений, используйте сокращенные свойства 1 вместо сокращения background:

#mydiv .isawesome { 
    background-color: #B1B8BD;
    background-position: 0 0;
    background-repeat: no-repeat;

    /* Fallback */
    background-image: url('../images/sidebar_angle.png');

    /* CSS gradients */
    background-image: url('../images/sidebar_angle.png'), 
                      -moz-linear-gradient(top, #ADB2B6 0%, #ABAEB3 100%);
    background-image: url('../images/sidebar_angle.png'), 
                      -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ADB2B6), color-stop(100%, #ABAEB3));
    background-image: url('../images/sidebar_angle.png'), 
                      linear-gradient(to bottom, #ADB2B6, #ABAEB3);

    /* IE */
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ADB2B6', endColorstr='#ABAEB3', GradientType=0);
}

К сожалению, это не работает правильно в IE, поскольку он использует filter для градиента, который он всегда рисует над фоном.

Чтобы обойти проблему IE, вы можете поместить filter и фоновое изображение в отдельные элементы. Тем не менее, это устранит мощь CSS3 с несколькими фонами, поскольку вы можете просто создавать слои для всех браузеров, но это компромисс, который вам придется сделать. Если вам не нужно поддерживать версии IE, которые не поддерживают стандартизированные CSS-градиенты, вам не о чем беспокоиться.


1 Технически, объявления background-position и background-repeat применяются здесь к обоим слоям, потому что пропуски заполняются повторением значений вместо фиксированных, но поскольку background-position является его начальное значение и background-repeat не имеют значения для градиента, охватывающего весь элемент, это не имеет большого значения. Подробности того, как обрабатываются слоистые фоновые объявления, можно найти здесь .

8 голосов
/ 06 июня 2017

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

background: linear-gradient(to right, rgba(255,255,255,0) 20%,
              rgba(255,255,255,1)), url(http://foo.com/image.jpg);

enter image description here

8 голосов
/ 14 февраля 2013

Порядок изображения и градиента очень КЛЮЧЕВЫЙ здесь, я хочу прояснить это.Комбинирование градиента / изображения работает лучше всего так ...

background: -webkit-gradient(linear, top, rgba(0,0,0,0.5), rgba(200,20,200,0.5)), url('../images/plus.png');

background-image также будет работать ...

background-image: -webkit-gradient(linear, top, rgba(0,0,0,0.5), rgba(200,20,200,0.5)), url('../images/plus.png');

градиент должен стоять первым ... идтинаверху.Абсолютный ключ здесь - то, что градиент использует по крайней мере 1 цвет RGBA ... цвет (ы) должен быть прозрачным, чтобы позволить изображению проходить.(* 1 010 *).Поместив градиент первым в вас, CSS помещает градиент поверх изображения, поэтому, чем ниже значение альфа на RGB, тем больше вы видите изображение.

Теперь, с другой стороны, если вы используете обратный порядок,PNG должен иметь прозрачные свойства, такие как градиент, чтобы градиент просвечивал.Изображение идет сверху, поэтому ваш PNG должен быть сохранен как 24-битный в фотошопе с альфа-областями ... или 32-битный в фейерверке с альфа-областями (или gif, я думаю ... barf), так что вы можете увидетьградиент снизу.В этом случае градиент может использовать HEX RGB или RGBA.

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

Надеюсь, это поможет, извините за упрощение,

0 голосов
/ 04 июня 2012

Прозрачные изображения еще не являются стандартом CSS, но они поддерживаются большинством современных браузеров.Однако это является частью рекомендации W3C CSS3.Реализация варьируется от одного клиента к другому, поэтому вам придется использовать более одного синтаксиса для кросс-браузерной совместимости.

http://www.handycss.com/effects/transparent-image-in-css/

0 голосов
/ 13 июля 2011

Это возможно, используя множественный фоновый синтаксис:

.example3 {
    background-image: url(../images/plus.png), -moz-linear-gradient(top,  #cbe3ba,  #a6cc8b);
    background-image: url(../images/plus.png), -webkit-gradient(linear, left top, left bottom, from(#cbe3ba), to(#a6cc8b));
}

Я читал об этом на Вот одно из решений .

...