Versetzen Sie ein Hintergrundbild von rechts mit CSS

443

Gibt es eine Möglichkeit, ein Hintergrundbild eine bestimmte Anzahl von Pixeln rechts von seinem Element zu positionieren?

Um beispielsweise eine bestimmte Anzahl von Pixeln (z. B. 10) von links zu positionieren, würde ich dies folgendermaßen tun:

#myElement {
    background-position: 10px 0;
}
nickf
quelle
Du meinst doch nicht background-position: -10px 0;?
Ich
1
Ich weiß, dass dies eine Reihe von Duplikaten enthält, aber ich kann keine finden.
Pekka
1
@thirtydot, der es 10 Pixel vom linken Rand nach links verschiebt.
Nickf
Es ist dumm, dass es nicht verfügbar ist ...
Juan
@nickf Sie wissen, dass es bis Ende 2013 auf den meisten Geräten nicht verfügbar war, oder?
Juan

Antworten:

786

Ich fand diese CSS3-Funktion hilfreich:

/* to position the element 10px from the right */
background-position: right 10px top;

Soweit ich weiß, wird dies in IE8 nicht unterstützt. In den neuesten Chrome / Firefox funktioniert es gut.

Weitere Informationen zu den unterstützten Browsern finden Sie unter Kann ich verwenden ?

Verwendete Quelle: http://tanalin.com/de/blog/2011/09/css3-background-position/

Update :

Diese Funktion wird jetzt in allen gängigen Browsern unterstützt, einschließlich mobiler Browser.

Steven
quelle
23
Das ist großartig, aber leider funktioniert es nicht auf Safari 5.1.7 (was extrem wichtig ist, wenn es von Mobiltelefonen angezeigt wird)
MosheElisha
5
Es funktioniert jetzt auf Mobilgeräten (aktiviert auf Android, iOS und WindowsPhone). Trotzdem unterstützt Safari 5.1.7 die hier angegebene Hintergrundposition nicht.
Szorstki
8
Ich benutze dies aber mit einem prozentualen Fallback für ältere Brower, z. Hintergrundposition: 95% Mitte; Hintergrundposition: rechts 13px Mitte;
Gregdev
1
Ich bin mir nicht sicher, wie viele Benutzer noch Browser verwenden, die alt genug sind, um dies nicht zu unterstützen. Safari-Benutzer sollten jetzt eine neuere Version verwenden, obwohl viele ältere Android-Geräte noch verfügbar sind. caniuse.com/#feat=css-background-offsets Einfach genug, um einen prozentualen Fallback für diese zu verwenden (obwohl es nicht genau dasselbe ist).
Markieren Sie
29
Bitte beachten Sie, dass dies nur funktioniert, wenn Sie eine Kardinalposition sowohl für die vertikale als auch für die horizontale Position angeben, z right left top bottom. Zum Beispiel wird das Folgende nicht background-position: right 10px 10pxbackground-position: right 10px top 10px
gerendert
110

!! Veraltete Antwort, da CSS3 diese Funktion brachte

Gibt es eine Möglichkeit, ein Hintergrundbild eine bestimmte Anzahl von Pixeln rechts von seinem Element zu positionieren?

Nee.

Beliebte Problemumgehungen sind:

  • Setzen Sie margin-rightstattdessen ein auf das Element
  • Hinzufügen transparenter Pixel zum Bild selbst und Positionieren top right
  • oder Berechnen der Position mit jQuery, nachdem die Breite des Elements bekannt ist.
Pekka 웃
quelle
6
Eine umfassendere Unterstützung für die erweiterte CSS3-Hintergrundposition steht vor der Tür
Vlad Magdalin
92

Die einfachste Lösung ist die Verwendung von Prozentsätzen. Dies ist nicht genau die Antwort, nach der Sie gesucht haben, da Sie nach Pixelgenauigkeit gefragt haben. Wenn Sie jedoch nur eine kleine Auffüllung zwischen dem rechten Rand und dem Bild benötigen, funktioniert eine Position von 99% normalerweise gut genug.

Code:

/* aligns image to the vertical center and horizontal right of its container with a small amount of padding between the right edge */
div.middleleft {
  background: url("/images/source.jpg") 99% center no-repeat;
}
Matt Brock
quelle
30
+1 "Wir werden nächste Woche die Pixelausrichtung durchlaufen" - funktioniert immer.
Moonwave99
2
Diese Lösung scheint in allen Browsern am konsistentesten zu funktionieren.
Evan Haas
49

Veraltete Antwort: Sie ist jetzt in den wichtigsten Browsern implementiert. Weitere Antworten auf diese Frage finden Sie unter.

CSS3 hat die Spezifikation von background-positionso geändert , dass es mit verschiedenen Ursprungspunkten funktioniert. Leider kann ich noch keine Beweise dafür finden, dass es in allen gängigen Browsern implementiert ist.

http://www.w3.org/TR/css3-background/#the-background-position Siehe Beispiel 12.

background-position: right 3em bottom 10px;
Tami
quelle
Danke Tami! Leider funktionierte dies weder in Firefox 4 noch in Chrome 11 für mich.
Nickf
Dies ist in Opera implementiert. Ich dachte, es wäre zu schön, um wahr zu sein, und dann habe ich in anderen Browsern getestet und hatte Recht.
Vian Esterhuizen
1
Dies funktioniert in der aktuellen Version von Chrome immer noch nicht. Version 21.0.1180.89
andlrc
3
Chrome Canary (v26) unterstützt dies jetzt. Sobald dies auf den Release-Kanal herunterrutscht und Safari die Engine aktualisiert, wird nur IE6-8 nicht mehr unterstützt (IE9 / 10 unterstützt bereits das neue Format).
Vlad Magdalin
1
Ich habe dies gerade getestet und es funktioniert jetzt in Firefox (v.18.0.2), IE (v.9.0.8) und Chrome (v.25.0.1364.97), aber es funktioniert noch nicht in Safari (v.5.1.2). . Würde gerne wissen, ob jemand weiß, wann das eingeführt werden kann ;-)
Chaya Cooper
40

Wie hier vorgeschlagen , ist dies eine ziemlich browserübergreifende Lösung, die perfekt funktioniert:

background: url('/img.png') no-repeat right center;
border-right: 10px solid transparent;

Ich habe es verwendet, da die CSS3-Funktion zum Festlegen von Offsets, die in der als Lösung der Frage gekennzeichneten Antwort vorgeschlagen wurden, in Browsern noch nicht so gut unterstützt wird. Z.B

luksak
quelle
1
Was ist, wenn dieser Rand eine bestimmte Farbe haben muss?
Machineaddict
1
Dies ist eine großartige Antwort, da Sie Pixelgenauigkeit erzielen und gleichzeitig browserübergreifend kompatibel bleiben können. Vielen Dank! (Und wenn Sie einen Rand haben möchten, der eine bestimmte Farbe hat, verwenden Sie einen Wrapper eines Typs, um die Eingabe zu umbrechen und den Rand zu diesem Element hinzuzufügen.)
Gavin
23

Die am besten geeignete Antwort ist die neue vierwertige Syntax für die Hintergrundposition. Bis alle Browser dies unterstützen, ist Ihr bester Ansatz eine Kombination früherer Antworten in der folgenden Reihenfolge:

background: url(image.png) no-repeat 97% center; /* default, Android, Sf < 6 */
background-position: -webkit-calc(100% - 10px) center; /* Sf 6 */
background-position: right 10px center; /* Cr 25+, FF 13+, IE 9+, Op 10.5+ */
Stedman
quelle
15

Ein einfacher, aber schmutziger Trick besteht darin, dem Bild, das Sie als Hintergrund verwenden, einfach den gewünschten Versatz hinzuzufügen. Es ist nicht wartbar, aber es erledigt die Arbeit.

Merosi
quelle
8

Dies funktioniert auf den meisten modernen Browsern ... abgesehen vom IE (Browser-Unterstützung) . Obwohl auf dieser Seite> = IE9 als unterstützt aufgeführt ist, stimmten meine Tests dem nicht zu.

Sie können die Eigenschaft calc () css3 wie folgt verwenden.

.class_name {
    background-position: calc(100% - 10px) 50%;
}

Für mich ist dies der sauberste und logischste Weg, um einen rechten Spielraum zu erreichen. Ich benutze auch einen Fallback der Verwendung border-right: 10px solid transparent;für IE.

Novocain
quelle
1
Das ist großartig, aber leider funktioniert es nicht auf Safari 5.1.7 (was extrem wichtig ist, wenn es von Mobiltelefonen angezeigt wird)
MosheElisha
Dann sollten Sie eine Hintergrundposition verwenden, die in Safari funktioniert, und eine, die von Browsern überschrieben werden kann, die sie verwenden können. Zum Beispiel: background-position: 92% 8px; background-position: calc(100% - 12px) 8px;
Laki Politis
Funktioniert nicht bei allen Browsern. Die right 10px centerSyntax unterstützt Browser besser.
Farzad YZ
Bitte lesen Sie die erste Zeile, in der ich feststelle, dass dies bei "modernsten Browsern" funktioniert. Ich habe nie gesagt, dass es bei allen funktioniert.
Novocaine
Laut caniuse würde die Verwendung eines Calc IE9 zum Absturz bringen ... sobald Sie das _durch ein-
Ruskin
4

Ok, wenn ich verstehe, was Sie fragen, würden Sie dies tun;

Sie haben Ihren DIV-Container aufgerufen #main-containerund .my-elementdas ist darin. Verwenden Sie diese Option, um loszulegen.

#main-container { 
  position:relative;
}
/*To make the element absolute - floats above all else within the parent container do this.*/
.my-element {
  position:absolute;
  top:0;
  right:10px;
}

/*To make the element apart of elements, something tangible that affects the position of other elements on the same level within the parent then do this;*/
.my-element {
  float:right;
  margin-right:10px;
}

Übrigens ist es besser, Klassen zu verwenden, wenn Sie auf ein untergeordnetes Element innerhalb einer Seite verweisen (ich gehe davon aus, dass Sie daher meine Namensänderung oben sind.

Desi
quelle
3

Die CSS3-Spezifikation, die unterschiedliche Ursprünge für die Hintergrundposition zulässt, wird jetzt in Firefox 14 unterstützt, aber immer noch nicht in Chrome 21 (anscheinend unterstützt IE9 sie teilweise, aber ich habe sie selbst nicht getestet).

Zusätzlich zu dem Chrome-Problem, auf das @MattyF verwiesen hat, gibt es hier eine prägnantere Zusammenfassung: http://code.google.com/p/chromium/issues/detail?id=95085

Tom Gaulton
quelle
Ich habe dies gerade getestet und es funktioniert jetzt in Firefox (v.18.0.2), IE (v.9.0.8) und Chrome (v.25.0.1364.97), aber nicht in Safari (v.5.1.2)
Chaya Cooper
3

Wenn Sie proportionierte Elemente haben, können Sie Folgendes verwenden:

.valid {
    background-position: 98% center;
}

.half .valid {
    background-position: 96% center;
}

In diesem Beispiel .validwäre dies die Klasse mit dem Bild und .halfeine Zeile mit der halben Größe der Standardgröße.

Schmutzig, wirkt aber wie ein Zauber und ist einigermaßen handhabbar.

Nighto
quelle
1
In meinem Fall (mit einem Layout mit fester Breite) macht dies genau das, was ich brauche. Vielen Dank.
Gavin
3

Wenn Sie dies zum Beispiel zum Hinzufügen von Pfeilen / anderen Symbolen zu einer Schaltfläche verwenden möchten, können Sie CSS-Pseudoelemente verwenden?

Wenn es sich wirklich um ein Hintergrundbild für die gesamte Schaltfläche handelt, neige ich dazu, den Abstand in das Bild einzubeziehen und nur zu verwenden

background-position: right 0;

Aber wenn ich zum Beispiel einen entworfenen Pfeil zu einer Schaltfläche hinzufügen muss, neige ich dazu, dieses HTML zu haben:

<a href="[url]" class="read-more">Read more</a>

Und neigen dazu, mit CSS Folgendes zu tun:

.read-more{
    position: relative;
    padding: 6px 15px 6px 35px;//to create space on the right
    font-size: 13px;
    font-family: Arial;
}

.read-more:after{
    content: '';
    display: block;
    width: 10px;
    height: 15px;
    background-image: url('../images/btn-white-arrow-right.png');
    position: absolute;
    right: 12px;
    top: 10px;
}

Mit dem Selektor: after füge ich ein Element mit CSS hinzu, um dieses kleine Symbol zu enthalten. Sie können dasselbe tun, indem Sie einfach einen Bereich oder ein <i>Element in das a-Element einfügen. Ich denke jedoch, dass dies eine sauberere Methode zum Hinzufügen von Symbolen zu Schaltflächen ist und dass es browserübergreifend unterstützt wird.

Sie können die Geige hier überprüfen: http://codepen.io/anon/pen/PNzYzZ

Stijn_d
quelle
das sollte content: ''; eher sein als, content:0;aber das war eine nützliche Lösung für mich
Nat
3
background-position: calc(100% - 8px);
Eifer Murapa
quelle
2

Verwenden Sie Mitte rechts als Position und fügen Sie dann einen transparenten Rand hinzu, um ihn zu versetzen.

André Figueira
quelle
1
Das ist nicht schlecht, aber dann würde der Inhalt auch von rechts verschoben. Dies kann ein Dealbreaker sein oder auch nicht. Hier ist ein Beispiel, wie es aussieht: jsbin.com/ijewoq/1
nickf
Ich denke, es ist nur ein Fall des Balancierens mit ein wenig Versuch und Irrtum :) Ich hoffe, es klappt!
André Figueira
2

Wenn Sie ein Element mit fester Breite haben und die Breite Ihres Hintergrundbilds kennen, können Sie die Hintergrundposition einfach auf Folgendes einstellen: die Breite des Elements - die Breite des Bildes - die gewünschte Lücke auf der rechten Seite.

Beispiel: Mit einem 100 Pixel breiten Element und einem 300 Pixel breiten Bild setzen Sie 100-300-10 = -210 Pixel, um rechts eine Lücke von 10 Pixel zu erhalten:

#myElement {
  background:url(my_image.jpg) no-repeat -210px top;
  width:100px;
}

Und Sie erhalten die 80 Pixel Ihres Bildes ganz rechts links von Ihrem Element und eine Lücke von 20 Pixel rechts.

Ich weiß, dass es dumm klingen kann, aber manchmal spart es Zeit ... Ich verwende so viel vertikal (Lücke unten) für Navigationslinks mit Text unter dem Bild.

Ich bin mir jedoch nicht sicher, ob dies für Ihren Fall gilt.

Julix
quelle
2

Mein Problem war, dass ich das Hintergrundbild brauchte, um den gleichen Abstand vom rechten Rand zu halten, wenn die Fenstergröße geändert wird, z. B. für Tablet / Handy usw. Mein Fix besteht darin, ein Percenatge wie folgt zu verwenden:

background-position: 98% 6px;

und es bleibt an Ort und Stelle.

JC_Dev
quelle
Das mag in Situationen funktionieren, in denen Sie die Abmessungen des Fensters genau kennen, aber im Web sind Sie sich die meiste Zeit nicht sicher. Sehen Sie sich die akzeptierte Antwort an, die in allen Situationen funktioniert (in unterstützten Browsern).
Nickf
2

Ja! gut, um ein Hintergrundbild so zu positionieren, als ob 0px von der rechten Seite des Browsers statt von links - ich benutze:

background-position: 100% 0px;
David Jazzy Dawson
quelle