Haben Sie jemals ein Element auf einer Seite mit transparenten Rändern gesehen? Ich glaube, Facebook hat es ursprünglich populär gemacht und damit Lightbox-Plugins wie Facebox hervorgebracht. Ich glaube nicht, dass Facebook diesen Look mehr aufweist, aber er ist immer noch ziemlich raffiniert.

Man könnte denken, es wäre so einfach wie das
#lightbox {
background: white;
border: 20px solid rgba(0, 0, 0, 0.3);
}
Das Setzen eines transparenten Rands auf einem Element zeigt jedoch den eigenen Hintergrund des Elements unter dem Rand an.
Im obigen Screenshot verwenden die Ränder RGBa, um transparent zu sein, erscheinen aber solide grau, da sie nur den darunter liegenden soliden weißen Hintergrund von sich selbst offenbaren.
Glücklicherweise gibt es eine CSS3-Eigenschaft, die uns rettet! Sie heißt background-clip und wird speziell verwendet, um anzugeben, welcher Teil des Box-Modells zum Anzeigen des Hintergrunds verwendet werden soll. Sie tut, was sie zu tun scheint, sie schneidet den Hintergrund an dem angegebenen Teil der Box ab. Es gibt drei Werte, die sie haben kann, und Vendor-Präfixe sind involviert. Hier sind die drei Einstellungen, die sie haben könnte. Sie würden sie nicht alle gleichzeitig verwenden, dies dient der Bequemlichkeit, nur anzuzeigen
#lightbox {
-moz-background-clip: border; /* Firefox 3.6 */
-webkit-background-clip: border; /* Safari 4? Chrome 6? */
background-clip: border-box; /* Firefox 4, Safari 5, Opera 10, IE 9 */
-moz-background-clip: padding; /* Firefox 3.6 */
-webkit-background-clip: padding; /* Safari 4? Chrome 6? */
background-clip: padding-box; /* Firefox 4, Safari 5, Opera 10, IE 9 */
-moz-background-clip: content; /* Firefox 3.6 */
-webkit-background-clip: content; /* Safari 4? Chrome 6? */
background-clip: content-box; /* Firefox 4, Safari 5, Opera 10, IE 9 */
}
Hier sind die Schemata

Ich bin mir sicher, Sie sehen, worauf ich hinauswill... wenn wir background-clip auf padding-box setzen, endet der weiße Hintergrund vor dem Rand, und die Transparenz legt sich über andere Inhalte und erzielt den gewünschten Look!

Verwandt: background-origin
In unserem Lightbox-Beispiel ist der Hintergrund höchstwahrscheinlich eine solide Farbe. In diesem Fall ist background-origin eher irrelevant, da niemand jemals feststellen kann, wo die Farbe "begonnen" hat. Wenn der Hintergrund des Elements jedoch ein Bild ist, kann es ziemlich wichtig sein, wo der Ursprungspunkt des Hintergrunds beginnt.
Dies steht in Beziehung zu background-clip, denn wenn background-clip padding-box ist, aber background-origin auf dem Standardwert border-box belassen wird, wird ein Teil des background-image abgeschnitten, was wünschenswert sein kann oder auch nicht.
Hier ist die schematische Darstellung

Und ein visuelles Beispiel
Browserkompatibilität
Funktioniert in: Safari 5, Chrome 7, Firefox 3.6+, Opera 10, IE 9
Ich habe nur diese modernen Browser getestet und die Unterstützung ist gut. Es kann (und wird wahrscheinlich auch) etwas weiter zurück in den Nicht-IE-Browsern gehen.
Wenn Sie eine vollständigere Browserkompatibilität wünschen, können Sie immer die Double-Div-Methode verwenden.
<div id="lightbox">
/* Set transparent background with PNG
add padding to push inside box inward */
<div id="lightbox-inside">
/* Set white background in here */
</div>
</div>
Ein weiterer Vorteil der Double-Div-Methode ist, dass Sie wirklich abgerundete Ränder erzielen könnten. Leider bleiben bei der Background-Clip-Methode der äußere Rand rund, aber die Kante des Hintergrunds bleibt gerade.
Schade, dass wir nichts wie background-radius haben, um das zu beheben
#lightbox
border-radius: 16px;
padding: 8px;
/* NOT REAL */
background-radius: 8px;
}
Kuriositäten
20px Rand war in Ordnung, aber als ich 30px versuchte, tauchten in Safari 5 diese Mini-Kästchen des Todes auf.
In Chrome waren kleine diagonale Linien bei jeder Randbreite bis zu 20px vorhanden.
Über 20px Rand hinaus verdunkeln sich die Ecken vollständig.
Ohne border-radius sind die verdunkelten Eckkästen immer sichtbar.
Danksagung
Danke an Alex Hall für die ursprüngliche Idee und Hilfe.
Hier ist eine einfache Demo, die auch die verschiedenen Werte von background-clip zeigt
Check out this Pen!
und background-origin
Check out this Pen!
Chris,
Toller Artikel, und der Tipp wird sicherlich nützlich sein!
Vielen Dank,
David
Chris –
Die letzten beiden Screenshots beziehen sich wahrscheinlich auf den darüber stehenden. Das bedeutet, die letzten beiden sind in Chrome. Ich wollte nur etwas Klarheit.
Danke
Schön. Verrückt, dass ich gestern gerade rgba ausprobiert habe und mich gefragt habe, warum zur Hölle die Transparenz nicht funktioniert hat.
Haben Sie einen Screenshot davon, wie das in IE 7/8 aussah?
In IE8 ist der Rand solide.
„Funktioniert in: Safari 5, Chrome 7, Firefox 3.6+, Opera 10, IE 9“
Das ist raffiniert. Aber die Nachteile sind wirklich seltsam. Diese schwarzen Linien und Kästen sind ein seltsames Problem. Ich schätze, es ist vielleicht ein Problem auf der Browserseite bei der Darstellung von CSS
Das ist eine wirklich coole Idee. Ich könnte mir vorstellen, Daten anzuzeigen, die über Text verknüpft sind, z. B. eine Wörterbuchdefinition, Fotodetails usw. Leider bleibt IE bei diesen coolen visuellen Stilen auf der Strecke. Ich bin jedoch auf PIE CSS3 für IE gestoßen! Dies ermöglicht die Unterstützung von RGBA-Werten und anderen CSS3-Eigenschaften. Ich hatte noch keine Gelegenheit, es selbst auszuprobieren, aber ich arbeite daran und freue mich darauf!
Chris, um die nicht abgerundete innere Ecke zu lösen, setzen Sie border-radius auf das Doppelte der Randgröße.
Goldstern ++
Die gleiche CSS kam mir in den Sinn. Warum nicht border, RGBa-Farbe und border-radius verwenden?
Ein weiterer Stolperstein dabei: Sie müssen sicherstellen, dass Sie das Attribut background-color setzen und nicht nur das Attribut background, sonst fließt der Hintergrund weiterhin durch den Rand. (zumindest in Firefox 3.6.10)
so
background: #fff;wird nicht funktionieren, während
background-color: #fff;wird funktionieren!
Toller Artikel, Chris, danke dafür. :-)
Ja, tatsächlich. Das Demo-Beispiel hat das in der CSS, aber danke, dass Sie es speziell darauf hinweisen. Sie können es auch in WebKit zum Laufen bringen, indem Sie
Aber im Moment bricht das Gecko, also am besten separat verwenden.
Ahhh, das ist gut zu wissen. Ich war mir nicht bewusst, dass die box-sizing-Werte im background-Attribut verwendet werden konnten.
Schön. :-)
In meinem Beispiel verwende ich *nur* background: #fff und es funktioniert trotzdem?
http://www.devseo.co.uk/examples/facebook-style-overlay-css/
Sie haben auch padding-box im background-Attribut angegeben, was ich bis zu Christ's Erwähnung oben nicht wusste.
Gute Idee, Sie beide, ich werde mich das auf jeden Fall merken!
Chris, nicht Christ. Entschuldigen Sie, Chris.
Mini-Kästchen des Todes!
Ich bin so glücklich, dass IE9 das alles unterstützt. Das wird unsere Arbeit erleichtern.
„transparenter Rand eines Elements zeigt den eigenen Hintergrund des Elements an“
Würde die Verwendung von outline anstelle von border dieses Problem nicht überwinden?
Ich erkenne jedoch, dass outline die Abrundung durch die Hinzufügung eines Radius nicht erlauben würde.
Sie können outline radius (zumindest mit Mozilla) auf die outline-Eigenschaft anwenden
https://developer.mozilla.org/en/CSS/-moz-outline-radius
und
http://blogs.sitepoint.com/2010/04/13/towards-a-cooler-focus-caret/
Ich habe jedoch festgestellt, dass die Verwendung von border tatsächlich einfacher war, da die outline-Eigenschaft seltsame Dinge tat, z. B. weit außerhalb des Elementbereichs zu liegen!
supercool, das habe ich mit darunter liegendem transparentem div gemacht, aus Kompatibilitätsgründen, aber das wird raffiniert sein, sobald wir diese IE<9 Bastarde losgeworden sind (Wünsche, niemand kann sie mir nehmen! :D )
FYI Facebook hat Facebox nicht entwickelt.
Er sagte, er glaube, FB habe ursprünglich die Sache mit dem "transparenten Rand" angefangen (ich bin mir auch nicht sicher), was *zu* Dingen wie Facebox führte.
Sehr schön, Chris.
Nebenbei bemerkt. Aus der Zusammenarbeit mit Chris weiß ich, dass er große Anstrengungen unternimmt, jeden Aspekt von etwas zu untersuchen, bevor er darüber schreibt, daher ist fast alles, was er lehrt, auch der beste Weg, etwas zu tun.
Diese Seite ist eine großartige Ressource für Webdesigner und Entwickler. Ich habe sie einfach geliebt! Danke, Chris.
Gute Tipps; obwohl ich denke, dass die Verwendung eines doppelten Divs mit einem transparenten PNG-Rand anmutiger auf IE wäre; die RGBA-Werte sind die problematische Eigenschaft. Mit einem PNG-Double-Div behalten Sie zumindest den transparenten Effekt, aber wenn Sie eine anmutige Herabstufung berücksichtigen, könnten Sie damit sehr schick aussehende Modals oder :focus- und :hover-Effekte erzielen.
Ich stimme dieser Idee zu. Chris' Idee mit dem transparenten Rand ist verdammt genial, aber zu bleeding edge für Seiten mit vielen Legacy-Benutzern.
Entschuldigung,
aber ich verstehe einfach nicht, was das große Problem ist und wozu transparente Ränder überhaupt gebraucht würden?.
Transparenzen sind die neuen Schatten. Das ist alles.
Es geht eher darum, dass rgba nicht einfach zu Rändern hinzugefügt werden kann und sie einfach funktionieren, da die Hintergrundfarbe unter dem Rand liegt (wodurch er effektiv nicht transparent, sondern nur in der Schattierung verändert wird). Mit den oben genannten Methoden kann dieses kleine Problem umgangen werden.
genial, toll, super Artikel………………………..hilf mehr interessierten Leuten mit Artikeln wie diesen……Hut ab, wirklich toll
Hallo Chris,
Haben Sie die Fehler an die Chrome- und Safari-Teams gemeldet (falls sie nicht bereits gemeldet wurden)? :)
Schön illustrierter Artikel übrigens, ich könnte Dinge nie so gut erklären wie Sie. :)
Exzellenter Effekt, die transparenten Ränder, besonders auch mit der inneren Rundung! Danke für CSS3. LT
Wirklich cleverer Trick, ich habe versucht, transparente Ränder auf einer Lightbox zu bekommen, die ich entwickle... Eine weitere mögliche Route, die ich versucht habe, ist ein transparentes Div als Elternteil... es hatte auch den Vorteil, dass es abgerundete Ecken innerhalb von abgerundeten Ecken hatte.
Nachdem ich das ein paar Mal durchgegangen bin, muss ich sagen, es gibt einfach viel zu viele browserübergreifende Merkwürdigkeiten.
Hier ist meine Version. Funktioniert in IE6+, FF, Safari, Chrome.
http://blog.pressedweb.com/demos/facebook_border/
Beeindruckt. Sehr beeindruckt.
Aber Sie verwenden drei Elemente, um diese eine Box zu erstellen, die Methode von Chris hat nur ein Element.
Ich erkenne jedoch an, dass diese Methode nur in den neuesten Browsern funktioniert und Ihre Version die sauberste Methode ist, die mir eingefallen ist und die auf allen Plattformen funktioniert, also wirklich gute Arbeit!
Schön erklärt background-clip und background-origin anhand von Bildern.
Sehr schön und sehr hilfreich
Ich entschuldige mich, falls meine Frage nicht zum ursprünglichen Thema Ihres Artikels passt, aber wenn ich fragen darf, was war die ursprüngliche Lösung, die Facebook verwendet hat, und hat sie sich anmutig verschlechtert?
OK, das ergibt VIEL Sinn, Mann. Wow.
Lou
http://www.online-privacy.eu.tc
Danke für das Teilen Ihrer Expertise. Ich wünschte, es gäbe eine bessere Implementierung dieses großartigen CSS-Features, ohne dass der Entwickler durch Reifen springen muss. Ich kann schon sehen, dass die meisten Designer die Double-Div-Methode verwenden werden.
Danke für die Kompatibilitäts-Screenshots
ist es kompatibler oder so kompatibel wie die Verwendung von background:url(whitealpha.png);
Danke...
Alles, was ich brauche, ist ein Kunde, der transparente Ränder genug will, um mich dafür zu bezahlen? Eines Tages!
Bei allem Respekt kann ich das nicht zum Laufen bringen. Ich habe sogar Ihre CSS aus der Demo kopiert, ich bekomme immer dieses Ergebnis – http://drp.ly/1TXs
Setzen Sie diesen inneren weißen Block (blockquote p, glaube ich) auf die bg-Farbe dieses Strichs.
Gerade jetzt nimmt es seinen Standard-BG oder so etwas auf.
CSS wird von Tag zu Tag besser. Was wäre, wenn es keinen Browserkrieg gäbe? Immer noch müssen wir alte Stile berücksichtigen, um sicherzustellen, dass unsere Webanwendungen ein konsistentes Aussehen über Browser hinweg haben. Einige Kunden sind so verrückt (oder wir?) wie die Verwendung von IE6. Danke für den Post.
Liebe deinen Artikel.
Vielen Dank!
Es ist erstaunlich!
Danke für das Teilen.
So schludrig es auch ist, aus Kompatibilitätsgründen, könnten Sie zwei Divisionen erstellen?
#border (setzen Sie das Hintergrundbild auf einen transparenten schwarzen PNG und geben Sie ihm den gleichen Abstand wie die Randbreite.)
#popup (weißer Hintergrund, innerhalb der Border-Division.)
Nicht alle IE-Versionen werden dies unterstützen, aber ich schätze, es könnte in einigen Fällen eine einfache Lösung sein.
Nette Sache zur Implementierung :) aber ich konnte das auf IE7 nicht reproduzieren
Sehr schön, danke fürs Teilen.
sehr schön in der Tat! etwas Neues zum Spielen.
Die Verwendung von rgba-Definitionen ist besser. Schließlich wird dies auch nur von modernen Browsern unterstützt.
Ich konnte das nirgends finden, also dachte ich, ich teile es... Dies ergibt einen halbtransparenten Randumriss um eine Box, während die 100%ige Transparenz der inneren Box erhalten bleibt... im Wesentlichen ein "Fenster", durch das man die 50%ige Transparenzbox sehen kann.
Die Verwendung von SASS ermöglicht es Ihnen, die Breite des "Randes" zu ändern, indem Sie nur eine Codezeile ändern. Muss SASS lieben
Richten Sie das "Fenster" ein
Das SASS / CSS (ich habe die Langversion des Randes zur Verdeutlichung eingefügt). Dies verwendet ein weißes PNG-Bild mit 50% Transparenz.
Ziemlich viele Codezeilen, aber das Ergebnis ist schön.
Viel Spaß :)
Hallo Chris, danke fürs Teilen :)
Ich habe festgestellt, dass es einen kleinen Fehler im background-origin-Bild gibt, der Standardwert von background-origin sollte "padding-box" anstelle von "border-box" sein.
Ein weiterer Ansatz wäre die Verwendung einer Box Shadow ohne Weichzeichnung
border-radius: 10px;
background: #FFFFFF;
box-shadow: 0px 0px 0px 10px rgba(0,0,0,0.30);
Gibt es Nachteile, die ich übersehe?