Create a layout with a fixed image on the left, a button on the right, and center or center text
P粉681400307
2023-09-04 21:02:34
<p>I'm making a food order layout that contains an image on the left, text in the middle, and a button on the right. </p>
<p>The image is fixed to the left, but the button moves based on the length of the text in the middle. So I want to fix this layout: </p>
The <p> button will also be fixed to the right, same as the left image, and not dependent on the middle test length. </p>
<p>If the text is longer, the text will be moved to the next line. </p>
<p><strong>Foodlist.js</strong></p>
<pre class="brush:php;toolbar:false;">import React from "react";
import "./Foodlist.css";
import { useStateValue } from "../../StateProvider";
function Foodlist({ id, title, rating, image, price, info, stock, nostock }) {
const [{ basket }, dispatch] = useStateValue();
// console.log("This is the basket >>>", basket);
const addToBasket = () => {
// dispatch the item into the data layer
dispatch({
type: "ADD_TO_BASKET",
item: {
id: id,
title: title,
info: info,
image: image,
price: price,
stock: stock,
nostock: nostock,
rating: rating,
},
});
};
return (
<div className="food">
<div className="food__details">
<img src={image} alt="" />
{/* <button onClick={addToBasket} style={{fontWeight: "bold"}}>
<strong style={{fontSize: 20}}> </strong>
Add
</button> */}
</div>
<div className="food__title">
<div className="food__info__layout">
<p style={{fontWeight: "bold"}}>{title}</p>
<p className="food__info">
<small>¥ </small>
<strong style={{fontSize: 14 ,fontWeight: 100}}>{price}</strong>
</p>
</div>
<button onClick={addToBasket} style={{fontWeight: "bold"}}>
<strong style={{fontSize: 20}}> </strong>
Add
</button>
</div>
</div>
);
}
export default Foodlist</pre>
<p><strong>Foodlist.css</strong></p>
<pre class="brush:php;toolbar:false;">.food {
display: flex;
flex-direction: row;
background-color: transparent;
align-items: center;
margin: 5px;
}
.food__details{
display: flex;
flex-direction: row;
}
.food__details > img {
max-height: 100px;
width: 120px;
object-fit: contain;
margin-right: 10px;
border: 1px solid gold;
border-radius: 10px;
overflow: hidden;
}
/*
.food__details > button {
background: gold;
border: none;
cursor: pointer;
border-radius: 5px;
height: fit-content;
width: fit-content;
} */
.food__info__layout {
display: flex;
flex-direction: column;
}
.food__info {
display: flex;
flex-direction: row;
height: auto;
/* margin-bottom: 5px; */
}
.food__title {
display: flex;
flex-direction: row;
}
.food__title > button {
background: gold;
border: none;
cursor: pointer;
border-radius: 5px;
height: fit-content;
width: fit-content;
margin-left: 15px;
}</pre></p>
To have the image on the left and the button on the right, regardless of the length of the intervening text, you can set
grid-template-columns: auto 1fr auto
on the grid to include them as direct children wrapper.Find the simplified version you want below. Note that I simplified the HTML structure. If you copy over, don’t forget to change React’s
class
toclassName
.