Image de fond transparente avec un Gradient

Aujourd'hui, je concevais un fond PNG transparent qui ne s'asseyait que dans le coin supérieur gauche d'une div, et le reste de la div conserverait un fond gradient pour toutes les zones transparentes de la PNG, et le reste de la div elle-même.

Il peut être préférable de les expliquer par le code je pensais peut-être:

#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 );
}

ce que j'ai trouvé est que la plupart des navigateurs choisissent l'un ou l'autre - la plupart choisissant le gradient depuis son plus loin dans la CSS fichier.

je sais que certains des gars ici vont dire "il suffit d'appliquer la pente à la PNG que vous faites" - mais ce n'est pas idéal parce que le div va maintenir une hauteur dynamique - parfois très court, parfois très grand. Je sais que ce gradient n'est pas indispensable mais j'ai pensé que ça vaudrait la peine de vous demander ce que vous en pensez.

Est-il possible d'avoir une image de fond, tout en gardant le reste de l'arrière-plan comme un dégradé?

23
demandé sur BoltClock 2011-04-16 00:06:42

5 réponses

gardez à l'esprit qu'un gradient CSS est en fait un valeur de l'image, pas une couleur de la valeur que l'on pourrait attendre. Par conséquent, il correspond à background-image spécifiquement, et pas background-color, ou de l'ensemble de l' background raccourci.

essentiellement, ce que vous essayez vraiment de faire, c'est de se superposer deux images de fond: une image bitmap sur un gradient. Pour ce faire, vous spécifiez à la fois dans la même déclaration, en les séparant par une virgule. Précisez l'image en premier, suivi par le gradient. Si vous spécifiez une couleur de fond, cette couleur sera toujours peinte sous l'image la plus basse, ce qui signifie qu'un gradient la couvrira très bien, et cela fonctionnera même dans le cas d'un repli.

parce que vous incluez les préfixes vendeur, vous devrez le faire une fois pour chaque préfixe, une fois pour préfixe sans, et une fois pour repli (sans gradient). Pour éviter d'avoir à répéter les autres valeurs, utilisez la main propriétés 1 au lieu de background abréviation:

#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);
}

malheureusement cela ne fonctionne pas correctement dans IE comme il utilise filter pour la pente, qu'il peint toujours arrière-plan.

pour travailler autour de la question D'IE vous pouvez placer le filter et l'image de fond en éléments séparés. Cela permettrait d'éviter la puissance de CSS3 arrière-plans multiples, bien que, puisque vous pouvez juste faire la dispersion pour tous les navigateurs, mais c'est un tu devras faire un compromis. Si vous n'avez pas besoin de supporter des versions D'IE qui n'implémentent pas de gradients CSS standardisés, vous n'avez pas à vous inquiéter.


1Techniquement, le background-position et background-repeat les déclarations s'appliquent aux deux couches ici parce que les lacunes sont comblées en répétant les valeurs au lieu de les coller, mais puisque background-position est sa valeur initiale et background-repeat n'a pas d'importance pour un gradient couvrant l'ensemble de l'élément, il ne trop d'importance. Les détails de la façon dont les déclarations de fond en couches sont traitées peuvent être trouvés ici.

37
répondu BoltClock 2015-03-27 18:05:35

L'ordre de l'image et le dégradé est très important ici, je veux que ce soit clair. Le combo gradient/image fonctionne mieux comme ceci...

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

background-image fonctionnera également...

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

le gradient doit passer en premier... pour aller au sommet. La clé absolue ici cependant est que le gradient utilise au moins 1 couleur RGBA... la couleur(s) doivent être transparents pour laisser l'image. (rgba(20,20,20,***0.5***)). mettre le gradient en premier dans votre css place le gradient sur le dessus de l'image, de sorte que le plus bas le paramètre alpha sur vous RGBAs plus vous voyez l'image.

D'un autre côté, si vous utilisez l'ordre inverse, le PNG doit avoir des propriétés transparentes, tout comme le gradient, pour laisser le gradient briller. L'image va sur le dessus de sorte que votre PNG doit être enregistré en 24 bits dans photoshop avec les zones alpha... ou un 32 bit dans des feux d'artifice avec des zones alpha (ou un gif je suppose... barf), de sorte que vous pouvez voir le gradient en dessous. Dans ce cas, le gradient peut utiliser HEX RGB ou RGBA.

la différence clé ici est le regard. L'image sera beaucoup plus dynamique lorsque sur le dessus. Quand en dessous vous avez la possibilité d'accorder les valeurs RGBA dans le navigateur pour obtenir l'effet désiré... au lieu d'éditer et de sauvegarder des allers-retours à partir de votre logiciel d'édition d'image.

J'espère que cela vous aidera, excusez ma simplification excessive.

5
répondu Brendan Wolfe 2013-02-14 18:33:55

Vous pouvez utiliser Transparence et dégradés. Les Gradients favorisent la transparence. Vous pouvez l'utiliser, par exemple, lorsque vous empilez plusieurs arrière-plans, pour créer des effets de décoloration sur les images d'arrière-plan.

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

4
répondu gras 2017-06-06 18:08:53

Ceci est possible en utilisant la syntaxe de fond multiple:

.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));
}

j'ai lu à ce sujet à l' Voici une Solution.

0
répondu Chris Peckham 2011-07-13 12:22:45

les images transparentes ne sont pas encore une norme CSS, mais elles sont prises en charge par la plupart des navigateurs modernes. Toutefois, cela fait partie de la recommandation CSS3 du W3C. La mise en œuvre varie d'un client à l'autre, vous devrez donc utiliser plus d'une syntaxe pour assurer la compatibilité entre les navigateurs.

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

-1
répondu Sohail Bashir 2012-06-04 12:40:39