Установка backgroundImage с помощью встроенных стилей React


290

Я пытаюсь получить доступ к статическому изображению для использования внутри встроенного backgroundImageсвойства в React. К сожалению, я иссяк от того, как это сделать.

Вообще, я думал, ты просто сделал следующее:

import Background from '../images/background_image.png';

var sectionStyle = {
  width: "100%",
  height: "400px",
  backgroundImage: "url(" + { Background } + ")"
};

class Section extends Component {
  render() {
    return (
      <section style={ sectionStyle }>
      </section>
    );
  }
}

Это работает для <img>тегов. Может кто-нибудь объяснить разницу между ними?

Пример:

<img src={ Background } /> работает просто отлично.

Спасибо!

Ответы:


476

Фигурные скобки внутри свойства backgroundImage неверны.

Возможно, вы используете webpack вместе с загрузчиком файлов изображений, поэтому Background должен быть уже String: backgroundImage: "url(" + Background + ")"

Вы также можете использовать шаблоны строк ES6, как показано ниже, для достижения того же эффекта:

backgroundImage: `url(${Background})`

Я должен был добавить это к моему вопросу. У меня есть ширина и высота (100% / 400 пикселей соответственно). Возникающая проблема связана с тем, как реагирует на статические изображения, я верю.
Крис

Нужно ли экранировать символы '(",') 'и пробелы в переменной Background перед объединением в соответствии с w3.org/TR/CSS2/syndata.html#value-def-uri ?
qbolec

50
Полный синтаксис должен выглядеть следующим образом:style={{backgroundImage: "url(" + Background + ")"}}
Майк

2
просто чтобы развернуть комментарий @ mike, вам нужны двойные фигурные скобки, потому что для React нужно ввести режим JS, а для другого - обозначить новый объект.
Ciprian Tomoiagă

Я получаю сообщение об ошибке «Раздел» определен, но никогда не используется «после передачи этого фона для импорта из« ./background.jpg »; var sectionStyle = {width: "100%", height: "400px", backgroundImage: url(${Background})}; Класс Section extends Component {render () {return (<section style = {sectionStyle}> </ section>); }}
Паванан М.С.

41

Если вы используете ES5 -

backgroundImage: "url(" + Background + ")"

Если вы используете ES6 -

backgroundImage: `url(${Background})`

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


2
Для меня в ES6 это было backgroundImage: `url("${Background}")`, так как ваш пример ES6 не работал для меня.
S ..

Здравствуйте, Бхарад, как бы вы поступили, если хотите добавить более одного фонового изображения. Скажите для двух изображений, как бы вы это сделали? Спасибо
На пути к успеху

37

Встроенный стиль для установки любого изображения на весь экран:

style={{  
  backgroundImage: "url(" + "https://images.pexels.com/photos/34153/pexels-photo.jpg?auto=compress&cs=tinysrgb&h=350" + ")",
  backgroundPosition: 'center',
  backgroundSize: 'cover',
  backgroundRepeat: 'no-repeat'
}}

17

Вы также можете перенести изображение в компонент с помощью require()функции.

<div style={{ backgroundImage: `url(require("images/img.svg"))` }}>

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


Что если путь к изображению - это веб-URL, а не локальный путь? Нечто подобноеhttps://images.com/myimage.png
Амину Кано

3
Хорошо, я понимаю, при использовании веб-URL. Я должен просто написатьurl(https://images.com/myimage.png)
Амину Кано

4

Вместо этого вы можете использовать литералы шаблона (заключенные в обратный тик: `...`) для backgroundImageтакого свойства:

backgroundImage: `url(${Background})`


2

Для меня то, что сработало, это так

style={{ backgroundImage: `url(${require("./resources/img/banners/3.jpg")})` }}

-1

Вы можете попробовать usimg

backgroundImage: url(process.env.PUBLIC_URL + "/      assets/image_location")

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