其实Css的内心还住着一位Print

一、真实案例

听说网页按右键就可以列印了?

图片介绍

但简直就像卸了妆一样 , 惨不忍睹啊!!!

图片介绍

二、那位来至边缘地带的Print

小明:欸 , P....? , 那个新来的 , 来帮我看一下这个问题.

Print:其实我已经来这十几年了 , 还时常中午帮你买便当....

小明:为什么列印的时候 , 样式都不见了?((无视

Print:因为没另外写列印的样式啊.

小明:蛤?

Print:先来看看这个範例 , 你觉得按列印会印出什么呢?

图片介绍

小明:就那个画面啊 , 三岁小孩都知道.

Print:不不不 , 人家是有封面的.

图片介绍

小明:为啥?愚人节喔?

Print:那是昨天啦 , 你知道display:none;是什么吗?

小明:让元素不出现在画面啊 .

Print:对 , 所以列印时 , 我们也可以把网页的一些元素设定none.

小明:可是那个封面 , 网页也没显示啊.

Print:一样意思啊 , 没列印时 , 就设定none啊.

小明: 听谋啦 , 给个範例是否?

Print:噢 , 你看看这个网页的结构 , 上面是web页面结构 , 而下面是一个列印时才会用到的模板 .

图片介绍

Print:再来看看这两个scss档案 , 左边是专门写给列印时用的 , 而右边则是写给浏览网页时用的.

图片介绍

Print: 所以只要加上.no-print的元素 , 在列印时就会display:none; , 而模板的显示和隐藏也是一样方式 .

小明:那上面那个 @page { ... } 是什么呀?

Print:就跟word设定边界一样意思 , 来看看这图.

图片介绍

Print:你也可以指定大小和印直式/横式的设定, 像是 @page { size: A4 portrait; } (直式的A4大小).

小明:等等 , 你 scss 的 margin 是设定0啊?

Print:因为还有要另外做页码 , 而因为定位不能定到margin , 所以改换成各页面自己设定padding.

小明:不是有什么页码再搭配 @bottom-left, @bottom-center ... 那些吗?

Print:那些在常用的浏览器中已经不能使用了 , 另外页码在@page{...}里面 , 也已经失效很久了.

=> https://stackoverflow.com/a/20317775/5570967

Print:那你知道『列印样式要写在 @media print {...} 』和 『设定 大小/方向/边界 是写在@page{...} 』了吗?

小明:嗯...略懂略懂.

Print:现在你再弄懂两件事 , 大该可以开始写列印样式了.

小明:那我可以不要懂吗... , 没事 没事 你继续.

Print:问个问题 , 你觉得我是像做网页那样 , 一页一页做的吗 ?

小明:别以为我会回答不是 , 怎么看都是一页一页的 .

Print:错了 , 其实只有一页 .

Print:先看看这张对照图 , 其实在列印时 , 我们把其他元素都none了 , 所以 里面只剩下了那个列印模板结构.

图片介绍

Print:然后看到第二层主要是有三种区块 , 页尾 / 封面 / 表格页 (多页).

Print:页尾 .print-footer 其实就是用到像 web 一样的 fixed 的效果.

Print:然后封面和表格页的『大小』和『换页』都是套用到 .print-page .

小明:欸~其实我听不懂啦 , 你还是讲中文吧.

Print:假如我们页面的高度都只设定80%时 , 就会看到第二页的画面就会出现在第一页.

图片介绍

小明:那要怎么办呢? 放弃治疗吗?

Print:这里有两种解决的方式.

Print:第一种是我们可能避免不了有时页面的height是不足100%的, 但至少可以设定表格不要被切开.

Print:所以可以使用 page-break-inside:avoid; , 就会向下图一样效果 ,

图片介绍

小明:那第二种呢?

Print:第二种就像这个範例一样 , 我们做了一个模板 , 而且知道每一页是怎么换页的.

Print:就可以下图一样 , 就算是高度不到100% , 也可以自订换页.

图片介绍

Print:而这个是在元素后进行换页 , 相对的也有在元素前换页 page-break-before:always.

Print:那你知道 『区块与列印高度』、『避免表格被切开』、『自订换页』 这三件事了吗?

小明:阿你不是说两件事 , 怎么变三件了?

Print:麦茶啦 , 那不是重点...

小明:其实我有点好奇 , 你那页码是怎么做的?

Print:就定位啊 , 跟网页一样.

小明:我说的是数字...

Print:其实css也有类似计数的功能.

图片介绍

Print:看到我们在body里面初始了一个 PageNumber (默认0) .

Print:另外在伪元素里面设定counter-increment 做加1 , 然后可以使用counter(xx)来获取.

Print:这样就做出计数器了呀

小明:喔~懂了!!

Print:你还有问题吗?

小明:有!! 为什么你的scss里面有 pt cm 啊? 怎么从来都没看过.

Print:那是原本就有的单位呀 , 比较符合列印用的单位 , 你可以看看下面这篇文章.

=> https://www.w3.org/Style/Examples/007/units.en.html

小明:那你其它css的部分不介绍吗?

Print:其实那些就跟做网页时一样的css , 只是刚刚讲的那些是比较特别的.

Print:那来整理一下刚刚说到的重点吧!!!

有专门列印时才会生效的css => @media print {...}可以设定页面大小/方向/边界 => @page { size: A4 portrait; margin: 0; }元素高度与列印页面高度的关係避免表格/图片被断开 => page-break-inside: avoid;控制换页设定 => page-break-after: always;使用适合列印的单位 => cm mm pt ...

小明:那个...你没事吧?((拍肩

Print:蛤 , 没事啊 , 要不拉个椅子继续聊 , 我最近还学了&^&$#%....

小明:可4我想下班惹....

Demo
GitHub


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章