You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Edge浏览器打印React页面时table的thead被footer重叠求助

Edge浏览器打印React页面时thead与Footer重叠问题(Chrome无此问题)

在使用Edge浏览器打印React.js前端页面时,出现表格thead被页面Footer(after-data-footer元素)重叠的问题,Chrome浏览器下无此现象。

重叠效果


相关代码与样式

打印样式(print.scss)

@media screen {
  .printOnly {
    display: none;
  }
}

@media print {
  .noPrint,
  .hiddenNotSticky {
    display: none !important;
  }

  .printOnly {
    display: block;
  }

  .sticky,
  .stuck {
    position: relative !important;
  }

  @page {
    size: auto;
    margin: 20mm 10mm 20mm 20mm;
  }

  body,
  #main,
  #app {
    margin: 0;
    padding: 0;
    width: 100%;
    height: 100%;
    min-height: initial;
    max-height: 100%;
    font-size: 12pt;
  }

  wb-notification {
    display: none;
  }

  wb-grid {
    padding: 0 !important;
  }

  header,
  footer {
    background-color: white !important;
    position: relative !important;
  }

  .MuiAccordion-root {
    & > div {
      height: auto !important;
      visibility: visible !important;
      overflow: visible;
    }

    .MuiCollapse-root {
      .subsection {
        padding: 12pt 0;
      }
    }

    .MuiAccordionSummary-root {
      background-color: white !important;

      .MuiBox-root {
        background-color: white !important;
      }

      .MuiButtonBase-root {
        display: none;
      }
    }
  }
}

问题表格代码

<table
  className={`xyz-table xyz-table--border-horizontal ${styles.furtherContractsTable}`}
>
  <thead>
    <tr>
      <th scope="col" className={styles.tableHead}>
        {t("companyData")}
      </th>
      <th scope="col" className={styles.tableHead}>
        {t("companyData")}
      </th>
      <th scope="col" className={styles.tableHead}>
        {t("companyData")}
      </th>
      <th scope="col" className={styles.tableHead}>
        {t("companyData")}
      </th>
      <th scope="col" className={styles.tableHead}>
        {t("companyData")}
      </th>
      <th scope="col" className={styles.tableHead}>
        {t("companyData")}
      </th>
    </tr>
  </thead>
  <tbody>
    {(companyData || []).map((companyData, companyData) => (
      <tr
        className={styles.tableRow}
        key={companyData}
        onClick={() => {
          browserHistory.push(`companyData`);
        }}
      >
        <td>
          {companyData}
          {!_.isNil(companyData) && (
            <span className={styles.additionalContractSource}>
              {companyData}
            </span>
          )}
        </td>
        <td>
          {r.bool(_.isNil(companyData) ? false : companyData)}
        </td>
        <td>{companyData}</td>
        <td>{companyData}</td>
        <td>{companyData}</td>
        <td>
          {r.date(companyData)}
          {" / "}
          {r.date(companyData)}
        </td>
      </tr>
    ))}
  </tbody>
</table>

表格相关样式

@import "company/core/dist/scss/utility";

.furtherContractsTable {
  td,
  th {
    font-size: 1rem !important;
  }
}

.tableHead {
  border-top: none !important;

  &:first-child {
    padding-left: 0;
  }

  &:last-child {
    padding-right: 0;
  }
}

.tableRow {
  &:hover {
    cursor: pointer;
    background: var(--xyz-grey-90);
  }

  td:first-child {
    padding-left: 0;
  }

  td:last-child {
    padding-right: 0;
  }

  &:last-child {
    border-bottom: 1px solid var(--xyz-grey-70);
  }
}

.paginationWrapper {
  display: flex;
  justify-content: center;
  margin: var(--xyz-spacing-xs) 0;
}

.additionalContractSource {
  &::before {
    content: " (";
    white-space: pre;
  }

  &::after {
    content: ")";
  }

  color: var(--xyz-grey-45);
}

Footer组件代码

function Footer() {
  const { t } = useTranslation();
  const { user } = useStoreon<StoreState, StoreEvents>("user");
  const currentYear = new Date().getFullYear();
  const authenticated = Object.keys(user).length > 0;

  return (
    <footer className={styles.footer}>
      <GridContainer>
        <XYZGridRow>
          <XYZGridCol mq1={12} allowOverflowX>
            <div className={styles.footerContainer}>
              <div className={styles.logoWrapper}>
                <div className={styles.logo}>
                  <img
                    src={logo}
                    height={18}
                    alt="companyData"
                    className="noPrint"
                  />
                  <img
                    src={logoBlack}
                    height={18}
                    alt="companyData"
                    className="printOnly"
                  />
                </div>
                <p className={styles.copyright}>
                  {t<string>("companydata", {
                    currentYear: currentYear,
                  })}
                </p>
              </div>
            </div>
          </XYZGridCol>
        </XYZGridRow>
      </GridContainer>
    </footer>
  );
}

export default memo(Footer);

Footer相关样式

.footer {
  color: var(--xyz-white);
  background-color: var(--xyz-black);
  z-index: 1202;
  @include xyz-type-button-secondary;
}

.footerContainer {
  display: flex;
  flex-direction: column-reverse;
  align-items: center;

  @include breakpoint-from(mq5) {
    flex-direction: row;
    justify-content: space-between;
  }
}

.logoWrapper {
  display: flex;
  align-items: center;
  flex-direction: column;
  padding-bottom: var(--xyz-spacing-xxs);

  @include breakpoint-from(mq5) {
    padding: 0;
    flex-direction: row;
  }
}

.logo {
  display: flex;
  align-items: center;
}

解决方案

1. 调整打印样式中的表格与Footer定位

Edge的打印渲染逻辑和Chrome存在差异,需针对性调整样式:
在print.scss的@media print区块中添加:

/* 避免表格被分页截断,强制thead作为表头组渲染 */
table {
  page-break-inside: avoid;
}
thead {
  display: table-header-group;
}

/* 给表格底部添加margin,防止被Footer覆盖 */
.furtherContractsTable {
  margin-bottom: 60px; /* 根据实际Footer高度调整 */
}

/* 修正Footer打印定位,固定在页面底部 */
footer {
  position: fixed;
  bottom: 0;
  width: calc(100% - 30mm); /* 匹配@page的左右边距(10mm+20mm) */
  height: auto;
}

2. 清除thead的sticky残留样式

即使全局设置了.sticky为relative,仍需单独给thead添加打印样式:

@media print {
  thead {
    position: relative !important;
    z-index: 1;
  }
}

3. 调整页面边距

当前@page底部边距可能不足,增大给Footer预留空间:

@page {
  size: auto;
  margin: 20mm 10mm 35mm 20mm;
}

4. 手动添加分页标记

如果表格跨页严重,可在表格后添加分页元素:

{/* 表格代码后添加 */}
<div className="print-page-break"></div>

然后在print.scss中添加:

@media print {
  .print-page-break {
    page-break-after: always;
  }
}

优先尝试前两个方案,大部分Edge打印重叠问题都能通过调整定位和边距解决。


内容的提问来源于stack exchange,提问作者tdog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:20:29