Como definir uma imagem de fundo com os estilos React Inline


286

Estou tentando acessar uma imagem estática para usar em uma backgroundImagepropriedade embutida no React. Infelizmente, fiquei sem saber como fazer isso.

Geralmente, achei que você fez o seguinte:

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

Isso funciona para <img>tags. Alguém pode explicar a diferença entre os dois?

Exemplo:

<img src={ Background } /> funciona muito bem.

Obrigado!

Respostas:


472

As chaves dentro da propriedade backgroundImage estão incorretas.

Provavelmente você está usando o webpack junto com o carregador de arquivos de imagem, portanto, o Background já deve ser uma String: backgroundImage: "url(" + Background + ")"

Você também pode usar os modelos de string ES6 como abaixo para obter o mesmo efeito:

backgroundImage: `url(${Background})`

Eu deveria ter acrescentado isso à minha pergunta. Eu tenho um conjunto de largura e altura (100% / 400px, respectivamente). A questão que surge é devido à forma como reagir lida com imagens estáticas, acredito.
Kris

Se um escapar da '(", ')' e espaço em branco caracteres na variável de fundo antes de concatenação como por w3.org/TR/CSS2/syndata.html#value-def-uri ?
qbolec

49
Sintaxe completa deve ficar assim:style={{backgroundImage: "url(" + Background + ")"}}
mike

2
apenas para expandir o comentário de @ mike, você precisa de chaves duplas, porque uma é para o React entrar no modo JS e outra é para denotar o novo objeto.
Ciprian Tomoiagă

Estou recebendo o erro 'Seção' é definido, mas nunca usado 'depois de fornecer este plano de importação a partir de' ./background.jpg '; var sectionStyle = {width: "100%", height: "400px", backgroundImage: url(${Background})}; classe Section estende o Componente {render () {return (<section style = {sectionStyle}> </section>); }}
Pavanan MS

40

Se você estiver usando o ES5 -

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

Se você estiver usando o ES6 -

backgroundImage: `url(${Background})`

Basicamente, remover chaves desnecessárias ao adicionar valor aos trabalhos da propriedade backgroundImage funcionará.


2
Para mim no ES6, foi backgroundImage: `url("${Background}")`porque o seu exemplo do ES6 não funcionou para mim.
S ..

37

Estilo embutido para definir qualquer imagem em tela cheia:

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

Você também pode trazer a imagem para o componente usando a require()função

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

Observe os dois conjuntos de colchetes . O primeiro conjunto é para entrar no modo de reação e o segundo é para indicar o objeto


E se o caminho da imagem for um URL da Web em vez de um caminho local? Algo comohttps://images.com/myimage.png
Aminu Kano

3
Ok, eu entendo, ao usar URL baseado na web. Eu deveria apenas escreverurl(https://images.com/myimage.png)
Aminu Kano

4

Você pode usar literais de modelo (incluídos com back-tick: `...`) em vez de backgroundImagepropriedades como esta:

backgroundImage: `url(${Background})`

3

tente isto:

style={{ backgroundImage: `url(require("path/image.ext"))` }}

2

Para mim, o que funcionou é tê-lo assim

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

-1

Você pode tentar usimg

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

Isso não é recomendado, pois evitará que o webpack conheça o ativo. Isso terminará com uma falta de cache se o aplicativo de reação for aberto offline.
Thomas Kekeisen 13/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.