Сместить фоновое изображение справа с помощью CSS


443

Есть ли способ расположить фоновое изображение на определенное количество пикселей справа от его элемента?

Например, чтобы расположить что-то определенное количество пикселей (скажем, 10) слева , я бы так и сделал:

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

Вы, конечно, не имеете в виду background-position: -10px 0;? Просто проверяю :)
тридцать пятого

1
Я знаю, что у этого есть несколько дубликатов, но я не могу найти ни одного из них.
Пекка

1
@thirtydot, который перемещает его на 10 пикселей влево от левого края.
nickf

это глупо, что это не доступно ...
Хуан

@ nickf вы понимаете, что к концу 2013 года его не было в большинстве устройств, верно?
Хуан

Ответы:


786

Я нашел эту функцию CSS3 полезной:

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

Насколько я знаю, это не поддерживается в IE8. В последнем Chrome / Firefox все работает отлично.

См. Могу ли я использовать для получения подробной информации о поддерживаемых браузерах.

Использованный источник: http://tanalin.com/en/blog/2011/09/css3-background-position/

Обновление :

Эта функция теперь поддерживается во всех основных браузерах, включая мобильные браузеры.


23
Это здорово, но, к сожалению, оно не работает в Safari 5.1.7 (что крайне важно, если смотреть на мобильные телефоны)
MosheElisha

5
Теперь он работает на мобильных устройствах (проверено на Android, iOS и WindowsPhone). Тем не менее Safari 5.1.7 не поддерживает фоновое положение, как здесь.
Szorstki

8
Я использую это, но с процентным запасом для старых браузеров, например. background-position: 95% центра; background-position: справа 13px по центру;
Грегдев

1
Не уверен, сколько людей все еще используют браузеры, достаточно старые, чтобы не поддерживать это. Пользователи Safari должны быть на более новой версии, хотя многие старые устройства Android все еще существуют. caniuse.com/#feat=css-background-offsets Достаточно легко использовать процентный запасной вариант для них (хотя это не совсем то же самое).
Марк

29
Обратите внимание, что это работает только в том случае, если вы указываете кардинальное положение для вертикального и горизонтального положения, например right left top bottom. Например, следующее не будет отображаться: background-position: right 10px 10pxно должно быть записано какbackground-position: right 10px top 10px
chadiusvt

110

!! Устаревший ответ, так как CSS3 принес эту функцию

Есть ли способ расположить фоновое изображение на определенное количество пикселей справа от его элемента?

Нет.

Популярные обходные пути включают

  • установив margin-rightвместо этого элемент
  • добавление прозрачных пикселей к самому изображению и позиционирование его top right
  • или вычисление позиции с использованием jQuery после того, как ширина элемента станет известна.

6
Более полная поддержка расширенной CSS3 'background-position' уже не за горами: stackoverflow.com/questions/501375/…
Влад Магдалин

92

Самое простое решение - использовать проценты. Это не совсем тот ответ, который вы искали, поскольку вы просили о точности пикселей, но если вам просто нужно что-то сделать, чтобы между правым краем и изображением было небольшое отступление, то положение в 99% обычно работает достаточно хорошо.

Код:

/* 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 «Мы пройдем выравнивание пикселей на следующей неделе» - всегда работает.
moonwave99

2
Это решение, кажется, работает наиболее согласованно в разных браузерах.
Эван Хаас

49

Устаревший ответ: теперь он реализован в основных браузерах, см. Другие ответы на этот вопрос.

CSS3 изменил спецификацию, background-positionтак что он будет работать с другой точкой происхождения. К сожалению, я не могу найти никаких доказательств того, что это реализовано еще ни в одном из основных браузеров.

http://www.w3.org/TR/css3-background/#the-background-position См. пример 12.

background-position: right 3em bottom 10px;

Спасибо Тами! К сожалению, это не сработало для меня ни в Firefox 4, ни в Chrome 11.
nickf

Это реализовано в Opera. Думал, что это слишком хорошо, чтобы быть правдой, а потом я проверил в других браузерах, и я был прав.
Виан Эстерхуизен

1
Это все еще не работает в текущей версии Chrome. Version 21.0.1180.89
andlrc

3
Chrome Canary (v26) теперь поддерживает это. Как только это перейдет к каналу релиза, и Safari обновит свой движок, только IE6-8 не будет поддерживать (IE9 / 10 уже поддерживает новый формат).
Влад Магдалин

1
Только что проверил это, и теперь он работает в Firefox (v.18.0.2), IE (v.9.0.8) и Chrome (v.25.0.1364.97), но он еще не работает в Safari (v.5.1.2) , Хотелось бы знать, если кто-нибудь знает, когда это может быть развернуто ;-)
Chaya Cooper

40

Как предлагается здесь , это довольно кросс-браузерное решение, которое отлично работает:

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

Я использовал его, так как функция CSS3 задания смещений, предложенная в ответе, помеченная как решение вопроса, пока не поддерживается в браузерах. Например


1
Как насчет того, когда мне нужна эта граница определенного цвета?
Machineaddict

1
Это отличный ответ, потому что вы можете иметь пиксельную точность, сохраняя кросс-браузерную совместимость. Спасибо! (И если вы хотите, чтобы граница была определенного цвета, используйте обертку какого-либо типа, чтобы обернуть ввод и добавить границу к этому элементу.)
Gavin

23

Наиболее подходящий ответ является новым синтаксисом четыре-значения фона позиции, но пока все браузеры не поддерживают его ваш лучший подход представляет собой сочетание предыдущих ответов в следующем порядке:

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

Простой, но грязный трюк - просто добавить необходимое смещение к изображению, которое вы используете в качестве фона. это не ремонтопригодно, но оно выполняет свою работу.


8

Это будет работать в большинстве современных браузеров ... кроме IE (поддержка браузеров) . Несмотря на то, что на этой странице перечислены> = IE9 как поддерживаемые, мои тесты не согласились с этим.

Вы можете использовать свойство calc () css3 следующим образом;

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

Для меня это самый чистый и самый логичный способ добиться разницы справа. Я также использую запасной вариант использования border-right: 10px solid transparent;для IE.


1
Это здорово, но, к сожалению, оно не работает в Safari 5.1.7 (что крайне важно, если смотреть на мобильные телефоны)
MosheElisha

Затем вы должны использовать background-position, которая работает в Safari, и ту, которая может быть переопределена браузерами, которые могут ее использовать. Например: background-position: 92% 8px; background-position: calc(100% - 12px) 8px;
Лаки Политис

Не работает на всех браузерах чувак. right 10px centerСинтаксис имеет более расширенную поддержку в браузерах.
Farzad YZ

Пожалуйста, прочитайте первую строку, где я утверждаю, что это работает на "большинстве современных браузеров". Я никогда не говорил, что это работает на всех из них.
Новокаин

Согласно Каниусу, использование calc приведет к краху IE9 ... как только вы замените его _на-
Ruskin

4

Хорошо, если я понимаю, о чем ты спрашиваешь, ты это сделаешь;

Вы называете свой контейнер DIV, #main-containerи .my-elementэто внутри него. Используйте это, чтобы начать;

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

Между прочим, лучше использовать классы, если вы ссылаетесь на элемент более низкого уровня на странице (я полагаю, что вы меняете свое имя выше).


3

Спецификация CSS3, допускающая различное происхождение для background-position, теперь поддерживается в Firefox 14, но все еще не в Chrome 21 (очевидно, IE9 частично поддерживает их, но я не проверял это сам)

В дополнение к проблеме Chrome, на которую ссылается @MattyF, здесь есть более краткое резюме: http://code.google.com/p/chromium/issues/detail?id=95085.


Я только что проверил это, и теперь он работает в Firefox (v.18.0.2), IE (v.9.0.8) и Chrome (v.25.0.1364.97), но не в Safari (v.5.1.2)
Chaya Купер

3

Если у вас есть пропорциональные элементы, вы можете использовать:

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

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

В этом примере, .validбудет класс с изображением и .halfбудет строка с половиной размера стандартного.

Грязный, но работает как шарм, и это разумно управляемым.


1
В моем случае (с использованием макета с фиксированной шириной) это именно то, что мне нужно. Спасибо.
Гэвин

3

Если вы хотите использовать это, например, для добавления стрелок / других значков к кнопке, тогда вы можете использовать псевдо-элементы css?

Если это действительно фоновое изображение для всей кнопки, я стараюсь включить интервал в изображение, и просто использую

background-position: right 0;

Но если мне нужно добавить, например, разработанную стрелку к кнопке, я получаю следующий HTML:

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

И, как правило, делать следующее с помощью 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;
}

Используя селектор: after, я добавляю элемент, используя CSS, чтобы содержать этот маленький значок. Вы можете сделать то же самое, просто добавив span или <i>element внутри a-element. Но я думаю, что это более чистый способ добавления значков к кнопкам, и он поддерживается в разных браузерах.

Вы можете проверить скрипку здесь: http://codepen.io/anon/pen/PNzYzZ


это должно быть, content: ''; а не, content:0;но это было полезным решением для меня
Nat


2

использовать центр вправо в качестве позиции, а затем добавить прозрачную границу, чтобы сместить его?


1
Это неплохо, но тогда контент также будет сдвинут вправо. Это может или не может быть нарушителем. Вот пример того, как это выглядит: jsbin.com/ijewoq/1
nickf

Думаю, это всего лишь случай балансировки с небольшой пробой и ошибкой :) надеюсь, что это сработает!
Андре Фигейра,

2

Если у вас есть элемент фиксированной ширины и вы знаете ширину фонового изображения, вы можете просто установить background-position: ширина элемента - ширина изображения - требуемый промежуток справа.

Например: для элемента шириной 100px и изображения шириной 300px, чтобы получить разрыв в 10px справа, вы устанавливаете его в 100-300-10 = -210px:

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

И вы получите самые правые 80 пикселей вашего изображения слева от вашего элемента, и промежуток 20 пикселей справа.

Я знаю, что это может звучать глупо, но иногда это экономит время ... Я использую это по вертикали (зазор внизу) для навигационных ссылок с текстом под изображением.

Не уверен, что это относится к вашему делу, хотя.


2

моя проблема заключалась в том, что мне нужно, чтобы фоновое изображение оставалось на том же расстоянии от правой границы при изменении размера окна, т.е. для планшета / мобильного телефона и т. д. Мое исправление заключается в использовании процента в следующем формате:

background-position: 98% 6px;

и он застревает на месте.


Это может работать в ситуациях, когда вы точно знаете размеры окна, но большую часть времени в Интернете вы не можете быть в этом уверены. Посмотрите на принятый ответ, который будет работать во всех ситуациях (в поддерживаемых браузерах).
Nickf

2

да! хорошо, чтобы расположить фоновое изображение, как будто 0px с правой стороны браузера, а не слева - я использую:

background-position: 100% 0px;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.