CSS 打印

2017-01-31

CSS 打印

簡(jiǎn)介

Chrome 瀏覽器打印預(yù)覽

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

基本概念

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

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

頁(yè)面打印區(qū)域和不可打印區(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ò)用戶(hù)代理指定。不管是否雙面打印,CSS 打印總是包含左頁(yè)和右頁(yè) (分別通過(guò) :left, :right 指定) 。(或者說(shuō) CSS 打印假定所有文檔是雙面打诱崮怠)

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

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

頁(yè)面模型

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

  • 內(nèi)容區(qū)域也叫頁(yè)面區(qū)域 (Page Area)敦间,第一頁(yè)的頁(yè)面區(qū)域邊界構(gòu)成了文檔的初始的包含塊 (Containing Block)
  • 頁(yè)面外邊距區(qū)域是透明的,環(huán)繞在頁(yè)面區(qū)域周?chē)T?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) 的 directionwriting-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è))

引入打印樣式的三種方式

在 CSS 中使用 @media print

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

在 CSS 中使用 @import

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

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

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

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

使用 @page

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

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

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

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

page-margin-boxes

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

@page {
    /* 頁(yè)面內(nèi)容區(qū)域底部添加一條 1px 的灰線(xiàn) */
    @bottom-left, @bottom-center, @bottom-right {
        border-top: 1px solid gray;
    }

    /* 頁(yè)腳中間顯示格式如 "第 3 頁(yè)" 的頁(yè)碼 */
    @bottom-center {
        content: "第" counter(page) "頁(yè)";
    }
}

屬性

margin (CSS2.1)

margin 系列屬性(margin-top腾啥、margin-rightmargin-bottom冯吓、margin-leftmargin)用于指定頁(yè)面外邊距大小倘待。

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

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

size (CSS3)

size 屬性支持 auto失尖、landscape啊奄、portrait<length>{1,2}<page-size>掀潮。

  • 默認(rèn)值為 auto菇夸,表示頁(yè)面大小和方向由用戶(hù)代理決定
  • landscape 指定頁(yè)面為橫向,如果 <page-size> 沒(méi)有指定仪吧,大小則由用戶(hù)代理決定
  • portrait 指定頁(yè)面為縱向峻仇,如果 <page-size> 沒(méi)有指定,大小則由用戶(hù)代理決定
  • <length>{1,2} 表示指定頁(yè)面大小邑商,填寫(xiě)兩個(gè)值則分別指定頁(yè)面盒子的寬度和高度摄咆,填寫(xiě)一個(gè)值則同時(shí)指定寬度和高度凡蚜。在 CSS3 中,值的單位支持 emex吭从,大小相對(duì)于頁(yè)面上下文中字體的大小
  • <page-size> 也用于指定頁(yè)面大小朝蜘,等價(jià)于使用 <length>{1,2}。常用的值有:A3涩金、A4谱醇、A5B4B5 等步做,詳細(xì)尺寸請(qǐng)參考 ISO 216副渴。<page-size> 可以與 landscapeportrait 組合同時(shí)指定頁(yè)面方向。

偽類(lèi)

頁(yè)面上下文也支持使用偽類(lèi)全度,其中支持的偽類(lèi)有::left煮剧、:right:first:blank将鸵。

偽類(lèi) :left:right

需要雙面打印時(shí)勉盅,通常需要將左頁(yè)和右頁(yè)設(shè)置不同的樣式(如頁(yè)邊距、頁(yè)碼位置)顶掉。這時(shí)左頁(yè)和右頁(yè)可以分別用 :left:right 表示草娜。再次強(qiáng)調(diào),通過(guò) :left:right 設(shè)置左右頁(yè)面不同樣式痒筒,并不代表用戶(hù)代理會(huì)將頁(yè)面雙面打印

/* 通過(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;
}

偽類(lèi) :first

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

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

偽類(lèi) :blank

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

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

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

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

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è)則不顯示 */
    }
}

分頁(yè)

page-break-before戳粒,page-break-afterpage-break-inside (CSS 2.1)

用于控制元素之前虫啥、之后或之中是否分頁(yè)蔚约,沒(méi)有生成盒子的塊元素不會(huì)生效

page-break-before涂籽、page-break-after 屬性支持 auto苹祟、alwaysavoidleft树枫、right直焙、rectoverso

h2 {
    page-break-before: always;
}

  • auto 默認(rèn)值砂轻,表示既不強(qiáng)制分頁(yè)也不禁止分頁(yè)
  • always奔誓、avoid 表示在該元素之前(或之后)強(qiáng)制或禁止分頁(yè)
  • leftright 表示在該元素之前(或之后)強(qiáng)制分頁(yè)搔涝,使得下一頁(yè)出現(xiàn)在左頁(yè)或右頁(yè)
  • recto厨喂、verso 頁(yè)面進(jìn)度從左至右時(shí),分別與 rightleft 一致庄呈;反之與 leftright 一致

page-break-inside 屬性?xún)H支持 autoavoid蜕煌,表示在元素內(nèi)允許或禁止分頁(yè)。

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

orphans诬留,windows (CSS 2.1)

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

最佳實(shí)踐

  • “白紙黑字”--避免不必要的背景顏色、加深文字顏色等
  • 避免打印次要的內(nèi)容颁独,比如導(dǎo)航欄彩届、側(cè)邊欄等
  • 鏈接后顯示鏈接地址
  • 做好分頁(yè),避免標(biāo)題誓酒、表格單元格等換行

示例:

@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;
    }
}


https://lon.im/post/css-print.html

參考鏈接:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末樟蠕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子靠柑,更是在濱河造成了極大的恐慌寨辩,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歼冰,死亡現(xiàn)場(chǎng)離奇詭異靡狞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)隔嫡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)甸怕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人腮恩,你說(shuō)我怎么就攤上這事梢杭。” “怎么了秸滴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵武契,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)咒唆,這世上最難降的妖魔是什么届垫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮钧排,結(jié)果婚禮上敦腔,老公的妹妹穿的比我還像新娘。我一直安慰自己恨溜,他們只是感情好符衔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著糟袁,像睡著了一般判族。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上项戴,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天形帮,我揣著相機(jī)與錄音,去河邊找鬼周叮。 笑死辩撑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仿耽。 我是一名探鬼主播合冀,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼项贺!你這毒婦竟也來(lái)了君躺?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤开缎,失蹤者是張志新(化名)和其女友劉穎棕叫,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奕删,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俺泣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了完残。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砌滞。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坏怪,靈堂內(nèi)的尸體忽然破棺而出贝润,到底是詐尸還是另有隱情,我是刑警寧澤铝宵,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布打掘,位于F島的核電站华畏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尊蚁。R本人自食惡果不足惜亡笑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望横朋。 院中可真熱鬧仑乌,春花似錦、人聲如沸琴锭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)决帖。三九已至厕九,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間地回,已是汗流浹背扁远。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刻像,地道東北人畅买。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像细睡,于是被迫代替她去往敵國(guó)和親谷羞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 原文鏈接:https://lon.im/post/css-print.html 簡(jiǎn)介 本文主要講解如何使用 CSS...
    龍好閱讀 3,265評(píng)論 0 11
  • 引入樣式: @media print{} 單位(cm,in英寸)1 inch = 2.54 cm1cm = 96/...
    神刀閱讀 7,575評(píng)論 1 2
  • css打印的基本設(shè)置 打印頁(yè)面的一些屬性,包括紙張尺寸纹冤,方向洒宝,頁(yè)邊距购公,分頁(yè)萌京,頁(yè)眉,頁(yè)腳宏浩,水印等等特性知残,大多數(shù)可以通...
    恬雅過(guò)客閱讀 7,413評(píng)論 0 4
  • 基本常識(shí)與實(shí)踐 css的每一個(gè)語(yǔ)句包括一個(gè)場(chǎng)所,以及這個(gè)場(chǎng)所的一個(gè)屬性比庄,還要應(yīng)用到這個(gè)屬性一個(gè)樣式,一個(gè)典型的cs...
    丁俊杰_閱讀 1,037評(píng)論 0 0
  • 學(xué)習(xí)CSS的最佳網(wǎng)站沒(méi)有之一 http://www.w3school.com.cn/tags/index.asp ...
    Amyyy_閱讀 1,056評(píng)論 0 1