Как бороться с разной маржой?

#html #css #reactjs #flexbox #styled-components

Вопрос:

В настоящее время я работаю над одним проектом, и я застрял на проблеме стиля. Я использую react.js со стилизованными компонентами. У меня есть разные карточки счетов внутри списка, и содержание каждой из них зависит от данных, которые поступают из JSON. Моя проблема заключается в интервале, так как содержимое элементов карты может отличаться, я не могу назначить им фиксированное поле; если я это сделаю, я получу что-то вроде этой ссылки на изображение проблемы вместо того, что должно быть. Как вы можете видеть в дизайне, они должны быть на одном уровне. Когда я добавляю минимальную ширину к идентификатору, имени и дате, у меня возникает еще одна проблема с расстоянием между именем и ценой. Это мой код в этом компоненте.

 import React from "react";
import styled from "styled-components";
import { ReactComponent as RightIcon } from "../../../images/icon-arrow-right.svg";
import data from "../data/invoices.json";

const InvoiceCardComponent = styled.li`
  font-size: 1.2rem;
  line-height: 1.5rem;
  padding: 1.6rem 3.2rem;
  box-shadow: 0px 10px 10px -10px rgba(72, 84, 159, 0.1);
  display: flex;
  align-items: center;
  justify-content: space-between;
  border-radius: 8px;
  background-color: ${({ theme }) => theme.colors.white};
  amp;:not(:last-child) {
    margin-bottom: 1.6rem;
  }
`;

const Id = styled.p`
  font-weight: 700;
  margin-right: 4.3rem;
`;

const HashTag = styled.span`
  color: ${({ theme }) => theme.colors.shipCove};
`;

const Date = styled.p`
  color: ${({ theme }) => theme.colors.baliHai};
  margin-right: 4.5rem;
`;

const Time = styled.time``;

const Name = styled.p`
  color: ${({ theme }) => theme.colors.baliHai};
`;

const Price = styled.p`
  font-weight: 700;
  font-size: 1.6rem;
  line-height: 2.4rem;
  margin-right: 4rem;
`;

const Status = styled.p`
  margin-right: 2rem;
  font-weight: 700;
  color: ${({ theme }) => theme.colors.success};
  text-transform: capitalize;
  display: flex;
  align-items: center;
  background-color: ${({ theme }) => theme.colors.lightSuccess};
  min-width: 10.4rem;
  padding: 1.3rem 0;
  display: inline-flex;
  justify-content: center;
  border-radius: 6px;
`;

const UserInfo = styled.div`
  display: flex;
`;

const PaymentInfo = styled.div`
  display: flex;
  align-items: center;
`;

const StatusIcon = styled.span`
  display: inline-block;
  border-radius: 100%;
  width: 8px;
  height: 8px;
  background-color: ${({ theme }) => theme.colors.success};
  margin-right: 8px;
`;

const InvoiceCard = () => {
  const renderInvoices = data.map((invoice) => {
    const date = new window.Date(invoice.paymentDue);
    const month = date.toLocaleString("en-US", { month: "short" });
    const day = date.getDate();
    const year = date.getFullYear();
    const formattedTotal = invoice.total.toLocaleString("en-US", {
      currency: "GBP",
      style: "currency",
    });

    return (
      <InvoiceCardComponent key={invoice.id}>
        <UserInfo>
          <Id>
            <HashTag>#</HashTag>
            {invoice.id}
          </Id>
          <Date>
            <Time dateTime={invoice.paymentDue}>
              Due {day} {month} {year}
            </Time>
          </Date>
          <Name>{invoice.clientName}</Name>
        </UserInfo>
        <PaymentInfo>
          <Price>{formattedTotal}</Price>
          <Status>
            <StatusIcon></StatusIcon>
            {invoice.status}
          </Status>
          <RightIcon />
        </PaymentInfo>
      </InvoiceCardComponent>
    );
  });

  return <React.Fragment>{renderInvoices}</React.Fragment>;
};

export default InvoiceCard;
 

Я буду признателен за любую помощь. Спасибо!

Ответ №1:

В этом случае вам нужно явно задать width значение для каждого столбца в каждой строке. Затем в каждом столбце вы можете выполнить любой стиль в зависимости от ваших потребностей ( text-align , flex с justify-content и т.д.), Чтобы все ячейки в одном столбце имели одинаковые стили.

 .row-wrap {
  display: flex;
}
.col-wrap {
  background: red;
  margin: 2px;
}
.col1 {
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;
  width: 200px;
  text-align: left;
}
.col2 {
  width: 300px;
  text-align: center;
}
.col3 {
  width: 150px;
  text-align: left;
}
.col4 {
  width: 400px;
  text-align: right;
} 
 <!DOCTYPE html>
<html>
  <head>
    <title>Parcel Sandbox</title>
    <meta charset="UTF-8" />
  </head>

  <body>
      <div class="row-wrap">
        <div class="col-wrap col1">text</div>
        <div class="col-wrap col2">text</div>
        <div class="col-wrap col3">text</div>
        <div class="col-wrap col4">text</div>
      </div>
      <div class="row-wrap">
        <div class="col-wrap col1">
          longgggggggggggggggggggggggggggggggggggggg text
        </div>
        <div class="col-wrap col2">text</div>
        <div class="col-wrap col3">text</div>
        <div class="col-wrap col4">text</div>
      </div>

  </body>
</html> 

Комментарии:

1. Привет, Куонг Ву, спасибо тебе за время и усилия, которые ты потратил на то, чтобы объяснить мне это . Однако явно указывать ширину не рекомендуется для адаптивных веб-сайтов, особенно там, где ваш контент отличается. Так что это не решит мою проблему, но все равно спасибо. 🙂