Сместить фоновое изображение справа с помощью 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.