【问题标题】:how to use styled components to style the printing of a component?如何使用样式化的组件来设置组件的打印样式?
【发布时间】:2019-08-14 20:11:09
【问题描述】:

我试图在使用样式组件打印组件时控制大小/方向。我的问题是:如何使用 @page CSS at-rule 或其他方法来设置打印组件的样式,以及样式化的组件?

CSS @page 文档:

https://developer.mozilla.org/en-US/docs/Web/CSS/@page

我试过了:

const PrintSchedulesContainer = styled.div`
  display: none;
  @media print and (min-width: 480px) {
    padding: none;
    margin: none;
  }
`;

还有:

const PrintSchedulesContainer = styled.div`
  display: none;
  @page {
    size: landscape;
  }
`;

【问题讨论】:

  • 将标题更改为描述您的问题的属性

标签: javascript css reactjs styled-components


【解决方案1】:

您不能针对单个组件进行打印。
您需要隐藏其他元素才能使您的组件成为唯一打印的组件。

@page 仅适用于更改打印规则。
@media print 允许您定义其他类样式,就像@media screen 一样。

您可以在包装样式组件中使用 @media print,使其全屏显示,并固定为白色背景。

例子:

const PrintableBodyWrapper = styled.div`
  @media print {
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background-color: white;
    display: flex;
    justify-content: center;
    align-items: center;
  }
`;

function App() {
  return (
    <div className="App">
        <PrintableBodyWrapper>
          <div style={{ width: 100, height: 100, background: "grey" }}>
            I will be printed
          </div>
        </PrintableBodyWrapper>
    </div>
  );
}

要更改打印规则,您需要将@page 添加到global style 并呈现全局样式组件。

import styled, { createGlobalStyle } from "styled-components";

const GlobalStyle = createGlobalStyle`
  @page {
    size: landscape;
    margin: 5cm;
`;

const PrintableBodyWrapper = styled.div`
  @media print {
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background-color: black;
    display: flex;
    justify-content: center;
    align-items: center;
  }
`;

function App() {
  return (
    <div className="App">
        <GlobalStyle />
        <PrintableBodyWrapper>
          <div style={{ width: 100, height: 100, background: "grey" }}>
            I will be printed
          </div>
        </PrintableBodyWrapper>
    </div>
  );
}

【讨论】:

  • 有道理,但我试图针对特定组件。例如,我有一个标题和正文。我只想打印正文,没有标题
  • 好的,我再次更新了我的答案。我正在使用带有类的媒体打印,您无法打印单个组件,因此您需要以某种方式隐藏其他元素。由于这个原因,上面我使用的是固定显示。
  • 对于我来说,媒体打印在样式化的组件中不起作用,这很奇怪,所以我今天用一个干净的头脑试了一下,它可以工作。我更新了我的答案,使其简单明了。此外,您可以阅读有关媒体打印作为 CSS 规则的更多信息。它在样式化组件中的工作方式与在任何 css 样式中的工作方式相同。
  • 谨慎使用fixed,它可以防止打印多页。
  • 允许您针对单个组件进行打印的包(免责声明:我是该包的维护者):npmjs.com/package/react-to-print
猜你喜欢
  • 2021-04-21
  • 2021-10-21
  • 2021-07-04
  • 2020-05-02
  • 2018-10-18
  • 2022-01-22
  • 2018-06-03
  • 2021-06-02
  • 2020-09-26
相关资源
最近更新 更多