Odsuń obraz tła od prawej za pomocą CSS


443

Czy istnieje sposób na ustawienie obrazu tła o pewną liczbę pikseli z prawej strony jego elementu?

Na przykład, aby ustawić coś o określonej liczbie pikseli (powiedzmy 10) od lewej , tak to zrobiłbym:

#myElement {
    background-position: 10px 0;
}

Na pewno nie masz na myśli background-position: -10px 0;? Tylko sprawdzam :)
trzydziesty

1
Wiem, że ma wiele duplikatów, ale nie mogę znaleźć żadnego z nich.
Pekka

1
@ thirtydot, który przesuwa go o 10 pikseli w lewo od lewej krawędzi.
nickf

to głupie, że nie jest dostępne ...
Juan

@nickf zdajesz sobie sprawę, że do końca 2013 roku nie był dostępny na większości urządzeń, prawda?
Juan

Odpowiedzi:


786

Uważam, że ta funkcja CSS3 jest pomocna:

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

O ile wiem, nie jest to obsługiwane w IE8. W najnowszym Chrome / Firefox działa dobrze.

Zobacz: Mogę użyć aby uzyskać szczegółowe informacje na temat obsługiwanych przeglądarek.

Wykorzystane źródło: http://tanalin.com/en/blog/2011/09/css3-background-position/

Aktualizacja :

Ta funkcja jest teraz obsługiwana we wszystkich głównych przeglądarkach, w tym także w przeglądarkach mobilnych.


23
To jest świetne, ale niestety nie działa w Safari 5.1.7 (co jest niezwykle ważne, jeśli oglądane przez telefony komórkowe)
MosheElisha

5
Działa teraz na urządzeniach mobilnych (sprawdzone na Android, iOS i Windows Phone). Nadal Safari 5.1.7 nie obsługuje pozycji tła podanej jak tutaj.
Szorstki

8
Używam tego, ale z procentową rezerwą dla starszych przeglądarek, np. pozycja tła: 95% środkowa; pozycja tła: prawy środek 13px;
gregdev,

1
Nie jestem pewien, ile osób nadal używa przeglądarek na tyle starych, by tego nie obsługiwać. Użytkownicy przeglądarki Safari powinni już korzystać z nowszej wersji, chociaż wciąż istnieje wiele starszych urządzeń z Androidem. caniuse.com/#feat=css-background-offsets Na tyle łatwe, że można zastosować procentową rezerwę zastępczą (chociaż nie jest dokładnie taka sama).
Mark

29
Pamiętaj, że działa to tylko wtedy, gdy określisz pozycję kardynalną dla pozycji pionowej i poziomej, np right left top bottom. Na przykład następujące elementy nie będą renderowane: background-position: right 10px 10pxnależy je zapisać jakobackground-position: right 10px top 10px
chadiusvt

110

!! Nieaktualna odpowiedź, ponieważ CSS3 wprowadził tę funkcję

Czy istnieje sposób na ustawienie obrazu tła o pewną liczbę pikseli z prawej strony jego elementu?

Nie.

Popularne obejścia obejmują

  • ustawienie margin-right zamiast tego elementu
  • dodając przezroczyste piksele do samego obrazu i ustawiając go top right
  • lub obliczanie pozycji za pomocą jQuery po znaniu szerokości elementu.

6
Bardziej kompleksowe wsparcie dla rozszerzonej „pozycji tła” CSS3 jest tuż za rogiem: stackoverflow.com/questions/501375/…
Vlad Magdalin

92

Najłatwiejszym rozwiązaniem jest użycie wartości procentowych. Nie jest to dokładnie odpowiedź, której szukałeś, ponieważ poprosiłeś o precyzję pikseli, ale jeśli potrzebujesz czegoś, co ma trochę wypełnienia między prawą krawędzią a obrazem, ustawienie 99% zwykle działa wystarczająco dobrze.

Kod:

/* 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;
}

30
+1 „Przejdziemy przez wyrównanie pikseli w przyszłym tygodniu” - zawsze działa.
moonwave99

2
To rozwiązanie wydaje się działać najbardziej konsekwentnie w różnych przeglądarkach.
Evan Haas,

49

Nieaktualna odpowiedź: jest teraz zaimplementowany w głównych przeglądarkach, zobacz inne odpowiedzi na to pytanie.

CSS3 zmodyfikował specyfikację, background-positionaby działał z innym punktem początkowym. Niestety nie mogę znaleźć żadnego dowodu na to, że jest on zaimplementowany w głównych przeglądarkach.

http://www.w3.org/TR/css3-background/#the-background-position Patrz przykład 12.

background-position: right 3em bottom 10px;

Dzięki Tami! Niestety, nie działało to dla mnie ani w Firefoksie 4, ani w Chrome 11.
nickf

Jest to zaimplementowane w Operze. Pomyślałem, że to zbyt piękne, aby mogło być prawdziwe, a potem przetestowałem w innych przeglądarkach i miałem rację.
Vian Esterhuizen,

1
To nadal nie działa w bieżącej wersji Chrome. Version 21.0.1180.89
andlrc

3
Chrome Canary (v26) obsługuje teraz to. Gdy tylko spłynie to do kanału dystrybucji, a Safari zaktualizuje silnik, tylko IE6-8 nie będzie obsługiwać (IE9 / 10 już obsługuje nowy format).
Vlad Magdalin

1
Właśnie to przetestowałem i działa teraz w Firefox (v.18.0.2), IE (v.9.0.8) i Chrome (v.25.0.1364.97), ale nie działa jeszcze w Safari (v.5.1.2) . Chciałbym wiedzieć, czy ktoś wie, kiedy to może zostać wprowadzone ;-)
Chaya Cooper

40

Jak zaproponowano tutaj , jest to całkiem rozwiązanie dla wielu przeglądarek, które działa idealnie:

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

Użyłem go, ponieważ funkcja CSS3 polegająca na określaniu przesunięć zaproponowanych w odpowiedzi oznaczonej jako rozwiązanie pytania nie jest jeszcze obsługiwana w przeglądarkach. Na przykład


1
A kiedy potrzebuję, aby ta ramka była określonego koloru?
machineaddict

1
To świetna odpowiedź, ponieważ możesz mieć precyzję pikseli, jednocześnie zachowując zgodność z różnymi przeglądarkami. Dzięki! (A jeśli chcesz mieć obramowanie określonego koloru, użyj opakowania jakiegoś typu, aby owinąć wejście i dodać obramowanie do tego elementu.)
Gavin

23

Najwłaściwszą odpowiedzią jest nowa składnia cztery wartości dla background-position, ale aż wszystkie przeglądarki obsługują go najlepszym rozwiązaniem jest połączenie wcześniejszych odpowiedzi w następującej kolejności:

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+ */

15

Prostą, ale brudną sztuczką jest po prostu dodanie przesunięcia, którego chcesz do obrazu, którego używasz jako tła. nie da się go utrzymać, ale wykonuje zadanie.


8

Działa to w większości nowoczesnych przeglądarek ... oprócz IE (obsługa przeglądarki) . Mimo że strona zawiera listę> = IE9 jako obsługiwane, moje testy się z tym nie zgadzały.

Możesz użyć właściwości calc () css3 w ten sposób;

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

Dla mnie jest to najczystszy i najbardziej logiczny sposób uzyskania marginesu po prawej stronie. Korzystam również z rezerwowego korzystania border-right: 10px solid transparent;z IE.


1
To jest świetne, ale niestety nie działa w Safari 5.1.7 (co jest niezwykle ważne, jeśli oglądane przez telefony komórkowe)
MosheElisha

Następnie powinieneś użyć tła działającego w Safari i takiego, które może zostać zastąpione przez przeglądarki, które mogą z niego korzystać. Na przykład: background-position: 92% 8px; background-position: calc(100% - 12px) 8px;
Laki Politis

Nie działa na wszystkich przeglądarkach, koleś. right 10px centerSkładnia ma bardziej rozszerzoną obsługę w przeglądarkach.
Farzad YZ

Przeczytaj pierwszą linię, w której stwierdzam, że działa to w „najnowocześniejszych przeglądarkach”. Nigdy nie powiedziałem, że działa na wszystkich z nich.
Novocaine

Według caniuse użycie kalendarza spowodowałoby awarię IE9 ... po zastąpieniu go _przez-
Ruskin

4

Ok, jeśli rozumiem, o co prosisz, zrobiłbyś to;

Wywołano twój kontener DIV #main-containeri .my-elementto jest w nim. Użyj tego, aby zacząć;

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

Nawiasem mówiąc, lepiej ćwiczyć korzystanie z klas, jeśli odwołujesz się do elementu niższego poziomu na stronie (zakładam, że stąd moja nazwa się zmienia powyżej.


3

Specyfikacja CSS3 zezwalająca na różne pochodzenie pozycji tła jest teraz obsługiwana w Firefox 14, ale wciąż nie w Chrome 21 (podobno IE9 częściowo je obsługuje, ale nie przetestowałem go osobiście)

Oprócz problemu z Chrome, do którego nawiązał @MattyF, znajduje się bardziej zwięzłe streszczenie tutaj: http://code.google.com/p/chromium/issues/detail?id=95085


Właśnie to przetestowałem i działa teraz w Firefox (v.18.0.2), IE (v.9.0.8) i Chrome (v.25.0.1364.97), ale nie w Safari (v.5.1.2)
Chaya Cooper

3

Jeśli masz proporcjonalne elementy, możesz użyć:

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

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

W tym przykładzie .validbyłaby klasa ze zdjęciem i .halfbyłaby rzędem o połowie wielkości standardowego.

Brudny, ale działa jak urok i można go łatwo opanować.


1
W moim przypadku (przy użyciu układu o stałej szerokości) robi to dokładnie to, czego potrzebuję. Dzięki.
Gavin,

3

Jeśli chcesz na przykład użyć tego do dodawania strzałek / innych ikon do przycisku, możesz użyć pseudoelementów css?

Jeśli naprawdę jest to tło dla całego przycisku, zwykle włączam odstępy do obrazu i po prostu go używam

background-position: right 0;

Ale jeśli muszę dodać na przykład zaprojektowaną strzałkę do przycisku, zwykle mam ten HTML:

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

I zwykle wykonuj następujące czynności z CSS:

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

Korzystając z selektora: po, dodaję element za pomocą CSS, aby zawierał tę małą ikonę. Możesz zrobić to samo, dodając rozpiętość lub <i>element wewnątrz elementu a. Ale myślę, że jest to czystszy sposób dodawania ikon do przycisków i jest obsługiwany w różnych przeglądarkach.

możesz sprawdzić skrzypce tutaj: http://codepen.io/anon/pen/PNzYzZ


tak powinno być content: ''; , content:0;ale było to dla mnie przydatne rozwiązanie
Nat


2

użyć środkowej prawej jako pozycji, a następnie dodać przezroczystą ramkę, aby ją przesunąć?


1
To nie jest złe, ale wtedy zawartość zostanie również przesunięta z prawej strony. To może, ale nie musi, być przełomem. Oto przykład tego, jak to wygląda: jsbin.com/ijewoq/1
nickf

Pomyśl, że to tylko kwestia wyważenia przy odrobinie prób i błędów :) mam nadzieję, że się uda!
André Figueira

2

Jeśli masz element o stałej szerokości i znasz szerokość obrazu tła, możesz po prostu ustawić pozycję tła na: szerokość elementu - szerokość obrazu - odstęp, który chcesz po prawej stronie.

Na przykład: w przypadku elementu o szerokości 100 pikseli i obrazu o szerokości 300 pikseli, aby uzyskać odstęp 10 pikseli po prawej stronie, ustaw go na 100-300-10 = -210px:

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

Otrzymujesz skrajnie prawe 80 pikseli obrazu po lewej stronie elementu i odstęp 20 pikseli po prawej stronie.

Wiem, że to może zabrzmieć głupio, ale czasem oszczędza czas ... Używam tego tak dużo w pionie (przerwa u dołu) do linków nawigacyjnych z tekstem pod obrazem.

Nie jestem jednak pewien, czy dotyczy to twojej sprawy.


2

mój problem polegał na tym, że potrzebowałem obrazu tła, aby pozostawał w tej samej odległości od prawej ramki, gdy okno jest przeskalowane, tj. na tablecie / telefonie komórkowym itp. Moim rozwiązaniem jest użycie percenatge takiego:

background-position: 98% 6px;

i przykleja się


Może to działać w sytuacjach, w których znasz dokładnie wymiary okna, ale przez większość czasu w Internecie nie możesz być tego pewien. Spójrz na zaakceptowaną odpowiedź, która zadziała we wszystkich sytuacjach (w obsługiwanych przeglądarkach).
nickf

2

tak! dobrze ustawić obraz tła tak, jakby 0px z prawej strony przeglądarki zamiast z lewej - używam:

background-position: 100% 0px;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.