2012-10-02 10 views
8

Ich versuche, einen Rahmen zu einem PNG-Bild hinzuzufügen, das ich habe (Beispiel enthalten). Die Sache ist, dass, wenn ich den Rahmen derzeit hinzufügen es in einer Box-Form um das gesamte Bild und nicht auf dem genauen Vektor (Bedeutung enthält es die transparenten Teile im Bild) hinzugefügt.CSS Border auf PNG-Bild mit transparenten Teilen

Gibt es eine Möglichkeit, die Konfiguration des Rahmens so einzurichten, dass der transparente Bereich nicht berücksichtigt wird. (? Auch wenn nicht in CSS ... Vielleicht HTML5/JS)

Example image

enter image description here

+0

Obwohl das Bild ein transparentes PNG ist, wird die Umrandung auf das Element angewendet, das immer noch im Wesentlichen ein Quadrat um das Bild ist. Es gibt leider keine Lösung, warum kannst du nicht die Grenze auf dem Aktbild setzen? – Andy

+0

Können Sie veranschaulichen, wie das Bild + Rahmen aussehen soll? –

+0

Hallo Jon, ich habe das Bild eines Beispiels hinzugefügt, wie ich es gerne zeigen würde. – nimi

Antwort

0

Stieß auf, um dies selbst zu tun - kam mit diesem Hack auf. Eine Reihe von überlagerten Bildern hinter meinem Original, die etwas unpassend waren. Kontext ctx3 ist eine Kopie des Originalbildes und würde eine weiße Silhouette hinter dem Original mehrmals replizieren.

 ctx3.shadowColor = "rgba(255,255,255,1)"; 
     ctx3.globalCompositeOperation = 'source-over'; 
     ctx3.shadowOffsetX = 2; 
     ctx3.shadowOffsetY = 2; 
     ctx3.shadowBlur = 0; 
     ctx3.drawImage(YourImageSource,0,0); 
     ctx3.shadowOffsetX = -2; 
     ctx3.shadowOffsetY = -2; 
     ctx3.shadowBlur = 0; 
     ctx3.drawImage(YourImageSource,0,0); 
     ctx3.shadowOffsetX = -2; 
     ctx3.shadowOffsetY = 2; 
     ctx3.shadowBlur = 0; 
     ctx3.drawImage(YourImageSource,0,0); 
     ctx3.shadowOffsetX = 2; 
     ctx3.shadowOffsetY = -2; 
     ctx3.shadowBlur = 0; 
     ctx3.drawImage(YourImageSource,0,0); 
     ctx3.shadowOffsetX = 0; 
     ctx3.shadowOffsetY = 2; 
     ctx3.shadowBlur = 0; 
     ctx3.drawImage(YourImageSource,0,0); 
     ctx3.shadowOffsetX = 0; 
     ctx3.shadowOffsetY = -2; 
     ctx3.shadowBlur = 0; 
     ctx3.drawImage(YourImageSource,0,0); 
     ctx3.shadowOffsetX = 2; 
     ctx3.shadowOffsetY = 0; 
     ctx3.shadowBlur = 0; 
     ctx3.drawImage(YourImageSource,0,0); 
     ctx3.shadowOffsetX = -2; 
     ctx3.shadowOffsetY = 0; 
     ctx3.shadowBlur = 0; 
     ctx3.drawImage(YourImageSource,0,0); 
25

Ab sofort (31. Januar 2015) gibt es eine Möglichkeit, das zu tun, ohne Leinwand zu verwenden, mit reinem CSS und mit nur zwei Zeilen Code.

Der Trick filter und -webkit-filter Eigenschaften des CSS verwendet ohne Unschärfe zwei Schlagschatten zu ziehen, eine für die positive Achse und einem für die negativen, die um das Bild herum werden, die die (hoffentlich) liefert gewünschter Effekt.

Hinweis: CSS-Filter sind überhaupt nicht in IE unterstützt (lassen Sie uns hoffen, Spartan ist besser), hier ist ein compatibility table.

Dieses erste Snippet (fiddle) gilt die einfachste Grenze möglich.

img { 
 
    -webkit-filter: drop-shadow(1px 1px 0 black) 
 
        drop-shadow(-1px -1px 0 black); 
 
    filter: drop-shadow(1px 1px 0 black) 
 
      drop-shadow(-1px -1px 0 black); 
 
} 
 

 
body { 
 
    background-color: lightcoral; 
 
}
<img src="http://i.imgur.com/GZoXRjS.png" width="250">

Wie Sie ein wenig mehr Zwicken sehen können, müssen einige Bilder (wie this awesome baymax render), können Sie die rechte Grenze ist ein wenig kleiner als der linken Seite.

In diesem Sinne, hier ist die perfektioniert Border Snippet (fiddle) mit nur einem wirklich winzigen Wert zwicken.

img { 
 
    -webkit-filter: drop-shadow(2px 1px 0 black) 
 
        drop-shadow(-1px -1px 0 black); 
 
    filter: drop-shadow(2px 1px 0 black) 
 
      drop-shadow(-1px -1px 0 black); 
 
} 
 

 
body { 
 
    background-color: khaki; 
 
}
<img src="http://i.imgur.com/GZoXRjS.png" width="250">

Das ziemlich gut Grenzen abdecken sollte, aber wir können noch mehr Spaß mit diesem, an diesem fantastischen Leichtigkeit Effekt sehen Snippet (fiddle).

img{ 
 
    -webkit-filter: drop-shadow(1px 1px 0 black) 
 
        drop-shadow(-1px -1px 0 white); 
 
    filter:drop-shadow(1px 1px 0 black) 
 
      drop-shadow(-1px -1px 0 white); 
 
} 
 

 
body{ 
 
    background-color:lightblue; 
 
}
<img src="http://i.imgur.com/GZoXRjS.png" width="250">

Hope this jemand Gedanken über die Möglichkeit einer Rundum-Grenze für halbtransparente Bilder hilft!

+1

Hoffen wir, dass diese Lösung es zu den Spezifikationen macht und dass IE es zu unterstützen beginnt! +1 –

+2

gute Idee, nur ein Tipp, der Effekt funktioniert ein bisschen besser mit 4 Schlagschatten, wenn Sie für einen größeren Strich: Filter: Schlagschatten (2px 0px 0 schwarz) Schlagschatten (0px 2px 0 schwarz) Drop - Schatten (-2px - 0px 0 schwarz) - Schlagschatten (- 0px - 2px 0 schwarz); –

+0

@AdamCoulombe 'Filter: Schlagschatten (2px 0px 0 Schwarz) Schlagschatten (0px 2px 0 Schwarz) Schlagschatten (-2px -0px 0 Schwarz) Schlagschatten (-0px -2px 0 Schwarz);'. Bitte Code beim nächsten Mal verwenden :) – haykam

3

Ich erweiterte die Top-Antwort ein bisschen, das ist besser für meine Verwendung.

-webkit-filter: drop-shadow(2px 2px 0 white) 
 
\t \t drop-shadow(-2px 2px 0 white) 
 
\t \t drop-shadow(2px -2px 0 white) 
 
     \t \t drop-shadow(-2px -2px 0 white); 
 

 
\t filter: drop-shadow(2px 2px 0 white) 
 
\t \t drop-shadow(-2px 2px 0 white) 
 
\t \t drop-shadow(2px -2px 0 white) 
 
     \t \t drop-shadow(-2px -2px 0 white);

Wenn jemand es noch braucht.

+0

Ja, genau das brauche ich. Ich danke Ihnen für das Teilen. – ITWitch

+0

Denken Sie daran, das ist größer als 2 Pixel pro Richtung, da Sie diagonal gehen. Doing (1, 0), (-1, 0), (0, 1), (0, -1) ergibt einen 1-Pixel-Strich. –