Home > Software design >  How to render SVG images inside a div
How to render SVG images inside a div

Time:05-09

I'm new to react and i hope someone can help me with this. I've searched everywhere for a solution to my problem with no luck.

Basically i want to render an array of SVG images inside a div as a backgroundImage: url(). I've managed to render my array with math.random but i want the SVG images to render in same order as in the array.

This is my code so far:

import './ListView.css';
import Green from '../Assets/ListCard/Green.svg';
import Brown from '../Assets/ListCard/Brown.svg';
import Orange from '../Assets/ListCard/Orange.svg';
import Mail from '../Assets/Icons/Mail.svg'
import Phone from '../Assets/Icons/Phone.svg'


function ListView({ userData}) { 


  const cardImages = [Green, Brown, Orange]; /// Array


  const renderList = cardImages.map(function(image) { /// Tried to map through the array with - 
    return image;                                     /// no luck
  }) 
 
  /// This Math.radom method works, but not the solution i want
  const randomItem = cardImages[Math.floor(Math.random()*cardImages.length)];

  

  return (         /// Below inside the div is where i want to render the images. 
        <div className="list-card" style={{backgroundImage: `url(${renderList})`}}> 
          <div className="list-card-wrapper">
            <div className="list-user-image"><img  src={userData.picture.medium} alt=""/></div>

            <div className="list-user-info">
              <div className="list-user-name">{userData.name.first} {userData.name.last}</div>          
              <div className="list-user-location">{userData.location.city}</div>
            </div>

            <div className="list-user-contact">    
              <img height={19} src={Mail} alt="svg"/>
              <img height={19} src={Phone} alt="svg"/>
            </div>
        </div>
      
    </div>
    

  )

}

export default ListView```
 

CodePudding user response:

you will need import image and bind it like below:

import logo from './logo.svg';

function App() {
  return (
    <div className="App">
      <img src={logo} className="App-logo" alt="logo" />
    </div>
  );
}
export default App;

CodePudding user response:

1. You can either add appropriate loader in webpack.config.js to handle svg file and then can use img tag to display image.

//import image
import ImageVar from '<image_path>';

//set ImageVar to src attribute of image tag
<img src={ImageVar} alt="React Logo" />

2. Embed svg tag into jsx.

function ImageComponent(){
    return (
        <div>
            <svg version="1.1"
                width="300" height="200"
                xmlns="http://www.w3.org/2000/svg">
                <rect width="100%" height="100%" fill="red" />
                <circle cx="150" cy="100" r="80" fill="green" />
                <text x="150" y="125" font-size="60" text-anchor="middle" fill="white">SVG</text>
            </svg>
        </div>
    )
}

3. Import svg as component

import {ReactComponent as ImageVar} from '<image_path>';

const ImageComponent = () => {
  return (
    <div className="App">
      <ImageVar />
    </div>
  );
}

CodePudding user response:

This is what you might be looking for:

import "./styles.css";

export default function App() {
  const items = [
    { name: "first" },
    { name: "second" },
    { name: "third" },
    { name: "fourth" },
    { name: "fifth" },
    { name: "sixth" }
  ];

  const colorArray = ["green", "brown", "orange"];

  return (
    <div className="App">
      {items.map((item, index) => {
        const classColorIndex = index % 3;
        return (
          <div
            className={`list-card ${colorArray[classColorIndex]}`}
            key={index}
          >
            <p>{item.name}</p>
          </div>
        );
      })}
    </div>
  );
}

The main concept behind this is, that you have to focus on the index of the item and check if it the first, second, or third item (I am considering it 3 because you have 3 colors in the array). Now, according to index number, you need to add a class to that div, and using CSS, you could provide background to each div according to that array.

In this sample, I have used plain background color, but I have commented how you could use svg as well. on APP.css, and here is the css

.App {
  font-family: sans-serif;
  text-align: center;
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
}
.list-card {
  width: 50px;
  height: 50px;
  display: flex;
  justify-content: center;
  flex-basis: 50%;
}
.list-card.green {
  background: green;
  /* background:url('../../Green.svg'); */
}
.list-card.brown {
  background: brown;
}
.list-card.orange {
  background: orange;
}

and here is the sandbox link:

https://codesandbox.io/s/stack-overflos-sample-z0yxyk?file=/src/App.js

On this example, you can see background is assigned, exactly to the array.

  • Related