Разместите фоновое изображение CSS на x пикселей справа?

321

Я думаю, что ответ - нет, но можете ли вы расположить фоновое изображение с помощью CSS, чтобы оно было фиксированным количеством пикселей от правого?

Если я устанавливаю background-positionзначения x и y, кажется, что они дают фиксированные корректировки пикселей слева и сверху соответственно.

Doug
источник
может быть полезно: stackoverflow.com/questions/1736922/…
jedierikb
Вы можете сделать это с помощью CSS3 - см. Ниже
Druvision
Возможный дубликат stackoverflow.com/questions/5142405/…
Фолькер Э.
@JoostS было ли это редактирование действительно обязательным?
Томас Аюб

Ответы:

473
background-position: right 30px center;

Это работает в большинстве браузеров. Смотрите: http://caniuse.com/#feat=css-background-offsets для полного списка.

Дополнительная информация: http://www.w3.org/TR/css3-background/#the-background-position

Стивен Муре
источник
«Я не знаю, если это действительно» ... это не так. Данное свойство имеет стандартный порядок значений.
Эндрю Барбер
14
Он действителен в соответствии с CSS Backgrounds and Borders 3, который уже является Рекомендацией кандидата (стандарт готов к реализации): w3.org/TR/css3-background/#the-background-position
Илья Стрельцын,
19
Это должно быть выбрано как «Правильный ответ». Согласно MDN он поддерживается в IE9 + и во всех других браузерах, и это здорово! developer.mozilla.org/en-US/docs/Web/CSS/...
fregante
5
Не уверен, почему это не выбран в качестве ответа? Это делает именно то, что просят.
ChrisC
пробовать это в инструментах Chrome Dev, и, похоже, это не работает (на самом деле не очень тщательно исследовал ...)
1nfiniti
93

Можно использовать атрибут borderкак длину справа

background: url('/img.png') no-repeat right center;
border-right: 10px solid transparent;
Turda
источник
2
Это решение прекрасно работает в Safari, но не работает Chrome, Firefox или IE.
Энди Кук
4
Работает в FF для меня. И хром. И IE 8 и 9. Не 7, хотя. Полезный хак!
ndtreviv
3
не идеально, когда ваш блок выбора уже в качестве границы, в противном случае потребуется еще один div, окружающий поле
Мигель
фон: url ('/ img.png') без повтора справа 10px по центру; это будет работать, я проверил в Firefox
Asad Kamran
66

Есть один способ, но он не поддерживается во всех браузерах (см. Покрытие здесь )

element {
  background-position : calc(100% - 10px) 0;
}

Он работает в любом современном браузере, но вполне возможно, что IE9 дает сбой . Также нет покрытия для = <IE8.

Валентин Е
источник
5
Это действительно мощное решение многих проблем дизайна. берегись!
deweydb
3
так что на самом деле это не работает даже в последней версии Chrome. Когда я проверяю элемент, он на самом деле говорит background-position-x: calc(90%);- то есть он просто вычитает 10% из 100%
Simon_Weaver
@ValentinE, который работает и для меня :-) Я определенно видел, что это преобразовано в 90%, хотя - и я вырезал и вставил это прямо из хрома. если не было странной ошибки в сборке Chrome для разработчиков, я не уверен, почему
Simon_Weaver
3
@ValentinE дух! Я понял. Я использую LESS для CSS, и у него есть своя функция «calc», которая имеет приоритет. Для тех, у кого есть эта проблема, смотрите: stackoverflow.com/questions/17904088/…
Simon_Weaver
я вижу здесь caniuse.com/#feat=calc, что это может фактически привести к краху IE9 - поэтому, если вы полагаетесь на него, вам обязательно захочется протестировать его в IE9
Simon_Weaver
33

Насколько я знаю, спецификация CSS не обеспечивает именно то, что вы спрашиваете, конечно, за исключением выражений CSS. Исходя из предположения, что вы не хотите использовать выражения или Javascript, я вижу три хакерских решения:

  • Убедитесь, что фоновое изображение соответствует размеру контейнера (по крайней мере, по ширине) и установлено, background-repeat: repeatили repeat-xесли выравнивается только ширина. Тогда появление чего-либо в xпикселях справа так же просто, как и background-position: -5px 0px.
  • Использование процентов для background-positionдемонстрации особого поведения, которое лучше видно, чем описано здесь. Дать ему шанс. По сути, background-position: 90% 50%правый край фонового изображения выровняется на 10% от правого края контейнера.
  • Создайте div, содержащий изображение. Явно установить положение содержащего элементаposition: relative если он еще не установлен. Установите контейнер изображения на position: absolute; right: 10px; top: 10px;, очевидно, корректируя последние два, как вы считаете нужным. Поместите контейнер изображения div в содержащий элемент.
Стивен
источник
1
спасибо за советы! да, у меня сейчас есть значения w /%, но в моем случае это работает не так хорошо. места, где должно появляться это bg-изображение, находятся на элементах, которые сильно различаются по размеру, поэтому, конечно, величина смещения вправо также сильно меняется, что нарушает согласованность. во всяком случае, я пойду с каким-то хакерским обходным путем, я уверен, но мне странно, что это не часть спецификации. кажется достаточно простым, вы можете сделать это сверху или слева, почему бы не начать снизу или справа? в любом случае, может быть, в css4, который будет надлежащим образом поддерживаться во всех основных браузерах, когда я умру;)
Даг
1
Помните, что вы также можете использовать селектор css: after, чтобы добавить элемент с фоновым изображением справа от другого элемента. С этого момента вы можете дать ему отрицательные поля, чтобы разместить его там, где вы хотите. Это довольно чистое решение, если вы просто хотите добавить неповторяющееся изображение справа.
Нико
23

Попробуй это:

#myelement {
  background-position: 100% 50%;
  margin-right: 5px;
}

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

ahwebd
источник
21

Вы можете сделать это в CSS3:

background-position: right 20px bottom 20px;

Работает в Firefox, Chrome, IE9 +

Источник: MDN

Адриан Макнейл
источник
8

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

Обходной путь для этого же изображения - создать изображение в формате PNG или GIF (форматы файлов изображений, поддерживающие прозрачность), у которого прозрачная часть справа от изображения точно равна числу пикселей, для которого нужно задать правое поле ( например: 5px, 10px и т. д.)

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

Недостаток: К сожалению, вы не можете использовать JPG, если фоновая часть контейнера и цвет фона фонового изображения CSS не имеют одинаковый плоский цвет (без градиента / виньетки), в основном белый / черный и т. Д.

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

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

.container:after{
    content:"";
    position:absolute;
    right:20px;
    background:url(http://lorempixel.com/400/200) no-repeat right bottom;
}

этот css поместит фон в правый нижний угол элемента ".container" с пробелом 20 пикселей на правой стороне.

Смотрите эту скрипку, например, http://jsfiddle.net/h6K9z/226/

Mroz
источник
Мне нравится, куда ты идешь, но это: после действительно больше элемента псевдо, чем класс. Просто для уточнения
vmex151
Правильно, но не работает со старыми браузерами, такими как <IE 8
Miguel
1
@ Мигель Больше не нужно там работать ;-) Пусть дизайн будет выглядеть настолько уродливо, насколько это возможно для тех, кто все еще использует более старые версии, чем IE 8! (.. поскольку сайт все еще доступен ..)
Джеймс Каззетта
5

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

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
источник
-webkit-calc вылетает в моем Safari без угрызений совести. OSX 10.8.5 / Safari 6.0.5
SquareCat
4

Просто поместите пиксельные отступы в изображение - добавьте 10px или любой другой размер к размеру холста изображения в фотошопе и выровняйте его прямо в CSS.

RMM
источник
4

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

background: url(http://goo.gl/P93P5Q) center right 10px no-repeat;

После того, как я немного повозился с инспектором, я пришел к этому кросс-браузерному решению, которое работает в IE8 +, Chrome, Firefox и Safari, а также в адаптивных проектах.

background: url(http://goo.gl/P93P5Q) no-repeat 95% center;

Вот кодекс того, как это выглядит и работает. Codepen написан с использованием SCSS - http://cdpn.io/xqGbk

davidwickman
источник
Напоминаю, что установка% также приведет к выравниванию в зависимости от длины контейнера, что может быть грязно, если у вас большие контейнеры
Мигель
4

Если вы хотите указать только ось X, вы можете сделать следующее:

background-position-x: right 100px;
joshudev
источник
Это не работает в Chrome 81.0.4044.138. Это говорит неверное значение свойства.
Ксандор
Я смог заставить его работать: background-position: right -100px center;Обратите внимание, что если вы опустите y-positionего, он не будет работать правильно, потому что думает, что для чего нужны пиксели.
Ксандор
2

Другое решение, о котором я не упоминал, - это использование псевдоэлементов, и я уверен, что это решение будет работать с любым браузером, совместимым с CSS 2.1 (≥ IE8, ≥ Safari 2, ...), и оно также должно быть адаптивным:

element::after
{
content:' ';
position:relative;
display:block;
width:100%;
height:100%;
bottom:0;
right:-5px; /* 10 px from the right of element inner-margin (padding) see example */
background:url() right center no-repeat;
}

Пример : элемент напр. квадрат размером 100px (без учета границ) имеет отступ 10px, а внутри правого отступа должно отображаться фоновое изображение. Это означает, что псевдоэлемент представляет собой квадрат размером 80 пикселей. Мы хотим прикрепить его к правой границе элемента справа: -10px; , Если мы хотим, чтобы фоновое изображение находилось на расстоянии 5 пикселей от правой границы, нам нужно прикрепить псевдоэлемент на 5 пикселей от правой границы элемента справа: -5px; ... Проверьте это сами: http://jsfiddle.net/yHucT/

llange
источник
1

Если контейнер имеет фиксированную высоту: передвигайте проценты (background-position) до тех пор, пока он не поместится правильно.

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

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

Надеюсь это поможет!

Prusprus
источник
1

Вы можете расположить фоновое изображение в редакторе так, чтобы оно составляло x пикселей с правой стороны.

background: url(images_url) no-repeat right top;

Фоновое изображение будет расположено в верхнем правом углу, но будет выглядеть как x пикселей справа.

Энди Кук
источник
получил его назад .. его горизонтальный, а затем вертикальный
Рэй
1

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

<style>
    .wrapper {
        background-color: #333;
        border: solid 3px #222;
        padding: 20px;
    }
    .bg-img {
        background-image: url(path/to/img.png);
        background-position: right bottom;
        background-repeat: no-repeat;
    }
    .content-breakout {
        margin: -20px
    }
</style>

<div class="wrapper">
    <div class="bg-img">
        <div class="content-breakout"></div>
    </div>
</div>

.content-breakoutКласс не является обязательным и позволит вашему содержанию есть в обивку при необходимости (отрицательные значения маржи должны соответствовать соответствующим значениям в обертке кожухах). Это немного многословно, но работает надежно, не заботясь об относительном положении изображения по сравнению с его шириной и высотой.

Крис Янг
источник
1

С тех пор, как был задан этот вопрос, это было слишком долго, но я просто столкнулся с этой проблемой и получил ее, выполнив:

background-position:95% 50%;
Broncha
источник
Этот сработал для меня довольно хорошо, пока вам не нужны точные пиксели справа, но более плавный макет.
Джефф С.
0

Решение для отрицательных значений. Отрегулируйте отступ вправо, чтобы переместить изображение.

<div style='overflow:hidden;'>

    <div style='width:100% background:url(images.jpg) top right; padding-right:50px;'>

    </div>

</div>
Грег Татум
источник
0

Это работает в Chrome 27, я не знаю, является ли он действительным или нет, или что другие браузеры делают с ним. Я был удивлен этим.

background: url(../img/icon_file_upload.png) top+3px right+10px no-repeat;
Deedee
источник
1
это недопустимо, Chrome просто был мил с тобой.
RozzA
0

Работает для всех реальных браузеров (и для IE9 +):

background-position: right 10px top 10px;

Я использую его для RTL тем WordPress. Смотрите пример: временный сайт или реальный сайт скоро будет. Посмотрите на значки больших правых DIVs.

Ронни Шерер
источник
0

Лучше для всего фона: url ('../ images / bg-menu-dropdown-top.png') оставлено 20px top no-repeat! Важный;

azhar_SE_nextbridge
источник