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


321

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

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



может быть полезно: 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;

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 пикселей справа. Это может быть хорошо для вашего случая.



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/


Мне нравится, куда ты идешь, но это: после действительно больше элемента псевдо, чем класс. Просто для уточнения
— 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+ */

-webkit-calc вылетает в моем Safari без угрызений совести. OSX 10.8.5 / Safari 6.0.5
— SquareCat

4

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


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


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

4

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

background-position-x: right 100px;

Это не работает в 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/


1

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

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

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

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


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%;

Этот сработал для меня довольно хорошо, пока вам не нужны точные пиксели справа, но более плавный макет.
— Джефф С.

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;

1
это недопустимо, Chrome просто был мил с тобой.
— RozzA


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