电竞比分网-中国电竞赛事及体育赛事平台

分享

通過(guò)CSS控制window.print打印樣式淺析

 hncdman 2023-07-20 發(fā)布于湖南

  本文主要講解如何使用 CSS 控制打印樣式。

一、基本概念

  使用 CSS 可以控制文檔如何正確的顯示在不同的媒介 (Media) 上。其中分頁(yè)媒介 (Paged Media) ,不同于連續(xù)媒介 (Continuous Media),它可以控制文檔內(nèi)容,將其分隔至一個(gè)或多個(gè)不相關(guān)聯(lián)的頁(yè)面 (如:書、幻燈片)。

  頁(yè)面 (Page Sheet) 是物理介質(zhì) (如:紙張) 的表面,它包含可打印區(qū)域 (Printable Areas) 和不可打印區(qū)域 (Non-printable Areas)。用戶代理可以調(diào)整文檔內(nèi)容的格式,使其顯示在可打印區(qū)域。

  頁(yè)面盒子 (Page Box) 是一個(gè)由長(zhǎng)邊 (Long Edge) 和短邊 (Short Edge) 組成的矩形。長(zhǎng)邊的方向決定了頁(yè)面朝向 (Page Orientation),長(zhǎng)邊是垂直方向,則頁(yè)面朝向?yàn)榭v向 (Portrait Orientation),反之為橫向 (Landscape Orientation)。

  CSS 打印無(wú)法指定文檔是否為雙面打印 (Duplex Printing),是否雙面打印應(yīng)該通過(guò)用戶代理指定。不管是否雙面打印,CSS 打印總是包含左頁(yè)和右頁(yè) (分別通過(guò) :left:right 指定) 。(或者說(shuō) CSS 打印假定所有文檔是雙面打?。?/span>

二、頁(yè)面模型 (Page Model)

  和 CSS 盒子模型一樣,頁(yè)面盒子模型由外邊距 (margin)、邊框 (border)、內(nèi)邊距 (padding) 和 內(nèi)容區(qū)域 (content area) 構(gòu)成。

  其中內(nèi)容區(qū)域和外邊距有著特殊的功能:

  • 內(nèi)容區(qū)域也叫頁(yè)面區(qū)域 (Page Area),第一頁(yè)的頁(yè)面區(qū)域邊界構(gòu)成了文檔的初始的包含塊 (Containing Block)

  • 頁(yè)面外邊距區(qū)域是透明的,環(huán)繞在頁(yè)面區(qū)域周圍。在 CSS3 中,可以用于創(chuàng)建頁(yè)眉和頁(yè)腳,詳見(jiàn)下文頁(yè)面外邊距盒子

  頁(yè)面進(jìn)度 (Page Progression)方向 是文檔被分隔后的頁(yè)面的排列方向。比如:現(xiàn)代中文頁(yè)面進(jìn)度多是從左至右;而古代中文的頁(yè)面進(jìn)度則相反??梢酝ㄟ^(guò)設(shè)置根元素 (root element) 的 direction 和 writing-mode 屬性來(lái)改變頁(yè)面進(jìn)度。

  頁(yè)面的“第一頁(yè)”是左頁(yè)還是右頁(yè),可以由頁(yè)面進(jìn)度的方向決定,當(dāng)頁(yè)面進(jìn)度方向?yàn)閺淖笾劣視r(shí),第一頁(yè)是右頁(yè);反之為左頁(yè)。(事實(shí)上也可以通過(guò)設(shè)置根元素的 break-before 屬性來(lái)強(qiáng)制改變第一頁(yè)是左頁(yè)還是右頁(yè))

三、引入打印樣式的三種方式

1、在 CSS 中使用 @media print

復(fù)制代碼

@media print {
    body {
        background-color: white;
    }
    img {
        visibility: hidden;
    }
    a::after {
        content: "(" attr(href) ")"; /* 所有鏈接后顯示鏈接地址 */
    }
}

復(fù)制代碼

2、在 CSS 中使用 @import

@import url("my-print-style.css") print;

3、在 HTML 中使用 <link> 標(biāo)簽

<link rel="stylesheet" media="print" href="my-print-style.css">

  在 @media print 或 my-print-style.css 中,可以自由的修改大部分樣式。

四、使用 @page

  使用打印媒介查詢可以自定義很多樣式,當(dāng)希望改變頁(yè)面大小、邊距等,就需要用到 @page 了。頁(yè)面上下文 (Page Context) 中僅支持部分 CSS 屬性,支持的屬性有:margin、sizemarks、bleed 以及頁(yè)面外邊距盒子等,不支持的屬性將會(huì)被忽略。

1、頁(yè)面外邊距盒子 (CSS3)

  頁(yè)面的外邊距被分成了 16 個(gè)頁(yè)面外邊距盒子。每個(gè)外邊距盒子都有自己的外邊距、邊框、內(nèi)邊距和內(nèi)容區(qū)域。頁(yè)面外邊距盒子用于創(chuàng)建頁(yè)眉和頁(yè)腳,頁(yè)眉和頁(yè)腳是頁(yè)面的一部分,用于補(bǔ)充信息,如頁(yè)碼或標(biāo)題。

   頁(yè)面外邊距盒子需要在 @page 下使用,使用起來(lái)和偽類類似,也包含 content 屬性。

復(fù)制代碼

@page {    /* 頁(yè)面內(nèi)容區(qū)域底部添加一條 1px 的灰線 */
    @bottom-left, @bottom-center, @bottom-right {
        border-top: 1px solid gray;
    }    /* 頁(yè)腳中間顯示格式如 "第 3 頁(yè)" 的頁(yè)碼 */
    @bottom-center {
        content: "第" counter(page) "頁(yè)";
    }
}

復(fù)制代碼

  注:常見(jiàn)瀏覽器都不支持該屬性,推薦使用 Prince

2、屬性

(1)margin (CSS2.1)

  margin 系列屬性(margin-top、margin-right、margin-bottommargin-left 和 margin)用于指定頁(yè)面外邊距大小。

  在 CSS2.1 中,頁(yè)面上下文中只支持 margin 系列屬性。而且因?yàn)?CSS2.1 的頁(yè)面上下文中沒(méi)有字體的概念,margin 系列屬性的值的單位不支持 em 和 ex。

@page {
    size: A4 portrait;
    margin: 3.7cm 2.6cm 3.5cm; /* 國(guó)家標(biāo)準(zhǔn)公文頁(yè)邊距 GB/T 9704-2012 */}

(2)size (CSS3)

  size 屬性支持 auto、landscape、portrait、<length>{1,2} 和 <page-size>。

  • 默認(rèn)值為 auto,表示頁(yè)面大小和方向由用戶代理決定

  • landscape 指定頁(yè)面為橫向,如果 <page-size> 沒(méi)有指定,大小則由用戶代理決定

  • portrait 指定頁(yè)面為縱向,如果 <page-size> 沒(méi)有指定,大小則由用戶代理決定

  • <length>{1,2} 表示指定頁(yè)面大小,填寫兩個(gè)值則分別指定頁(yè)面盒子的寬度和高度,填寫一個(gè)值則同時(shí)指定寬度和高度。在 CSS3 中,值的單位支持 em 和 ex,大小相對(duì)于頁(yè)面上下文中字體的大小

  • <page-size> 也用于指定頁(yè)面大小,等價(jià)于使用 <length>{1,2}。常用的值有:A3、A4、A5、B4 和 B5 等,詳細(xì)尺寸請(qǐng)參考 [ISO 216]。<page-size> 可以與 landscape 或 portrait 組合同時(shí)指定頁(yè)面方向。

3、偽類

  頁(yè)面上下文也支持使用偽類,其中支持的偽類有::left、:right、:first 和 :blank。

(1)偽類 :left 和 :right

  需要雙面打印時(shí),通常需要將左頁(yè)和右頁(yè)設(shè)置不同的樣式(如頁(yè)邊距、頁(yè)碼位置)。這時(shí)左頁(yè)和右頁(yè)可以分別用 :left 和 :right 表示。

  再次強(qiáng)調(diào),通過(guò) :left 和 :right 設(shè)置左右頁(yè)面不同樣式,并不代表用戶代理會(huì)將頁(yè)面雙面打印

復(fù)制代碼

/* 通過(guò)分別設(shè)置左頁(yè)和右頁(yè)不同的左右頁(yè)面距,為裝訂邊留出更多的空間 */@page :left {
    margin-left: 2.5cm;
    margin-right: 2.7cm;
}

@page :right {
    margin-left: 2.7cm;
    margin-right: 2.5cm;
}

復(fù)制代碼

(2)偽類 :first

  偽類 :first 用于匹配到文檔的第一頁(yè)。

@page :first {
    margin-top: 10cm; /* 首頁(yè)上頁(yè)邊距設(shè)置為 10cm */}

(3)偽類 :blank

  偽類 :blank 用于匹配文檔的空白頁(yè)。

復(fù)制代碼

h1 {
    page-break-before: left; /* 一級(jí)標(biāo)題強(qiáng)制分配到右頁(yè) */}

@page :blank {
    @top-center {
        content: "這是空白頁(yè)";
    }
}

復(fù)制代碼

  注意,空白頁(yè)既可能是左頁(yè),又可能是右頁(yè),設(shè)置左頁(yè)或右頁(yè)的樣式也會(huì)顯示在空白頁(yè)上,如果不希望顯示在空白頁(yè)上,可以清除這些樣式。

復(fù)制代碼

h1 {    break-before: left;
}

@page :left {
    @left-center {
        content: "這是左頁(yè)";
    }
}

@page :right {
    @right-center {
        content: "這是右頁(yè)";
    }
}

@page :blank {
    @left-center, @right-center {
        content: none; /* 如果是空白頁(yè)則不顯示 */
    }
}

復(fù)制代碼

五、分頁(yè)

1、page-break-before,page-break-after,page-break-inside (CSS 2.1):用于控制元素之前、之后或之中是否分頁(yè),沒(méi)有生成盒子的塊元素不會(huì)生效。

  page-break-before、page-break-after 屬性支持 auto、alwaysavoid、left、rightrecto 和 verso。

  • auto 默認(rèn)值,表示既不強(qiáng)制分頁(yè)也不禁止分頁(yè)

  • alwaysavoid 表示在該元素之前(或之后)強(qiáng)制或禁止分頁(yè)

  • left、right 表示在該元素之前(或之后)強(qiáng)制分頁(yè),使得下一頁(yè)出現(xiàn)在左頁(yè)或右頁(yè)

  • recto、verso 頁(yè)面進(jìn)度從左至右時(shí),分別與 right 和 left 一致;反之與 left 和 right 一致

  page-break-inside 屬性僅支持 auto 和 avoid,表示在元素內(nèi)允許或禁止分頁(yè)。

復(fù)制代碼

thead, tfoot {
    display: table-row-group;
}
thead, tfoot, tr, th, td {
    page-break-inside: avoid;
}

復(fù)制代碼

2、orphanswindows (CSS 2.1)

  orphans 和 windows 用于指定在頁(yè)面的底部或頂部,元素中允許剩余的最少行數(shù),默認(rèn)為 2 行。

六、實(shí)踐

  • “白紙黑字”--避免不必要的背景顏色、加深文字顏色等

  • 避免打印次要的內(nèi)容,比如導(dǎo)航欄、側(cè)邊欄等

  • 鏈接后顯示鏈接地址

  • 做好分頁(yè),避免標(biāo)題、表格單元格等換行

  示例樣式

復(fù)制代碼

@media print {
    @page {
        size: A4 portrait;
        margin: 3.7cm 2.6cm 3.5cm;
    }

    h1 {
        page-break-before: always;
    }

    h1, h2, h3, h4, h5, h6,
    thead, tfoot, tr, th, td,
    li {
        page-break-inside: avoid;
    }

    body {
        background-color: white;
        color: black;
    }

    nav, aside {
        display: none;
    }

    a::after {
        content: "(" attr(href) ")";
    }

    thead, tfoot {
        display: table-row-group;
    }
}

復(fù)制代碼

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多