为打印输出创建一个CSS样式

本文介绍如何利用XHTML和CSS实现网页打印优化,避免创建单独的打印页面。通过设置颜色、字体、链接样式,隐藏导航栏等元素,并调整内容布局,使网页更适合打印输出。
可以不必在Web站点上创建一个独立的与打印相关的页面。

  大多数的Web页面都显示在电脑屏幕上,人们通过屏幕观看,但是,有时候用户想要将一些网上的内容打印出来,这就需要与打印媒体连接起来。由于原来采用的是能让Web页面在屏幕上显示的效果很好的那种格式,但在打印时效果并不那么好,Web创建者们通常都会创建一些独立的页面,这些页面与打印机联系紧密,而用户也需要经常打印这些页面。但如果你使用了XHTML标记和CSS,你就没必要再创建一个独立的与打印机相连接的页面了,你仅仅只需要几种CSS样式来将需打印的页面的内容进行格式化,以便于打印输出就行了。

  以良好的标记开头

  XHTML和CSS有一种特殊的功能,即内容与表述是各自独立的;你可以随意将其格式改成另一种媒体形式,而不必改变它的内容,也不必改变它的基本标记。不过为了使这一想法能在实践中成为可能,你应该让你的结构标记好一点,干净整洁一点。因此,在你准备用CSS创建一个与打印机相连的页面之前,要仔细看看它的XHTML标记。

  清除该标记中所有的内嵌样式以及其它固有的表述格式。为了让该打印媒体的CSS文件能发挥应有的作用,所有的样式和格式都必须由它自带的样式表来决定,而不是由它的标记中的格式来决定。同样,将页眉中所有的CSS样式移走,将它们存入一个外部样式表中,这个表是附在(连接在或被输入)该XHTML文档中的。

  检查标记的时候,你要确定它的内容都是按逻辑分组的,分成了一个个的div,而且每一个div都是通过其ID或类别来鉴别。

  第一步:添加一个打印样式表

  用CSS创建一个与打印机密切联系的页面的第一步,是将打印媒体的CSS文件附加到你的XHTML文档中。与下面两个独立的CSS文件相比,我更倾向于使用XHTML页眉中的链接,这两个文件,一个是有关所有媒体的(或者屏幕媒体),另一个是有关打印媒体的。该链接看起来与下面这些有点相似:

  <link rel="stylesheet" type="text/css" media="all" href="mysite-all.css" />
<link rel="stylesheet" type="text/css" media="print" href="mysite-print.css" />

  第二步:设置颜色和字体

  在屏幕上,那些有色文本,多彩的颜色,以及纹理清晰的背景看起来比较宜人,但是如果是在一张由一台黑白打印机打印出来的纸张上,可能就不那么好了。在这种情况下,通常是简单的黑底白字更好看一些。

  通常设计师们会在主体标签选择器中设定默认背景和文本颜色。这个选择器还设置默认字体外形和大小,如下所示:

  body {
font-family: Arial, Helvetica, sans-serif;
font-size: 10px;
background-color: maroon;
color: silver;
}

  为了使这种样式与打印机之间配合更好一些,你要将颜色改为白色背景黑色字体,还要设置基本的字体大小。主要的样式像下面这样:

  body {
font-family: Arial, Helvetica, sans-serif;
font-size: 12pt;
background-color: white;
color: black;
}

  注意一下,在打印样式表中,字体大小是以点(pt)来计的。如果要指定屏幕显示度量单位的话,象素比点和英尺更合适,而在打印中,情况却恰好相反,人们采用的往往是前者。

  另一方面,许多人建议使用一种有衬线的字体来取代人们在屏幕上广泛使用的无衬线字体,我个人觉得这是一种逐项设计,因此,我不会自动转换每个打印样式表中的字体。

  第三步:链接的样式

  对于打印输出中的链接的处理,存在着两种不同的看法,两者各成一派。一种看法是,链接在纸张上并不发挥作用,因此,应该对它们进行一番设计,就像设计文本中其它部份一样。另一种看法则认为,链接对于一个Web的结构来说至关重要,正由于它的重要性,在打印文本中,它应该清楚可见。

  如果不考虑你的设计意图,不管你是想突出链接还是让它掺入到文本中,有一件事是无可置疑的,那就是你要改变普通的Web页面和打印版之间的链接的样式。由于普通链接与已访问链接之间并没有什么区别,这样你就可以将那两个选择器合并起来,就像这样:

  a:link,a:visited {
color: #3333CC;
text-decoration: underline;
font-weight: bold;
}

  这个盒子将链接设为深蓝色(在黑白打印机上则显示为深灰色),粗体,有下划线,这也是链接的一种最普通的无格式样式,即白色背景上的黑色文本。

  第四步:隐藏导航栏和工具条

  设计师们设计一种与打印机联系紧密的页面的目的之一在于,要通过消除主要页面内容之外的那些东西,包括导航栏,广告,工具条等。

  在输出中,导航按纽并不起什么作用;而那些广告也并没有点击进入功能,至于工具条,它为用户提供一些相关信息之间的链接,以此让页面内容更丰富,不过在打印输出时,往往会适得其反,造成不必要的混乱。

  要想将这些因素从该页面中排除掉,关键在于在标记中将它们分隔开来,将它们分成一个个独立的,但可分辨的div。例如,可以将导航栏分在一个名为navbar的div中,样式如下:

  div#navBar{
margin: 0 79% 0 0;
padding: 0px;
background-color: #eeeeee;
border-right: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}

  你可以用以下的CSS,在该页面中隐藏那个div的内容:

  div#navBar {
display: none;
}

  在与打印机相连接的页面中,你可以用同样的方法来移动广告,工具条,页眉,页脚,动画,多余的图片,以及其它一些不重要的部份。

  第五步:设置宽度和页边空白

  隐藏了那些不重要的部份之后,就该设计一下余下的内容了,这样才能让它更便于打印。通常,主要内容都在一个div里面,可能已被设计好了,这样它就能与其它一些诸如导航栏和工具条的元件和平共处,共同分享一个屏幕了。

  div#content{
width: 75%;
margin: 10px;
padding: 10px 15px;
}

  由于该页面中其它那些元件都已经被排除了,现在我们所要做的,就是设置打印页面中的div,就像这样:

  div#content{
width: 100%;
margin: 0pt;
padding: 0pt;
}

  设置宽度:100%,这种设置会填充页面上可以打印的部分。当然,你还可以有其它选择,你可以设一个特定的宽度(以英寸),然后采用页边空白和填料,这样,你就可以更好地控制打印输出,不过,如此一来,你就需要仔细考虑,小心测试,以确保你的设置对大多数打印机都有效。

  第六步:让内容不可浮动

  有些浏览器打印浮动的div的过程中,会有一个麻烦,需要特别加以注意。例如,基于Gecko的浏览器(例如Netscape 6+),当用户用它来浏览一个打印输出页面时,它会截去浮动元素中的内容。这些内容就不会被传送到打印机,下一个页面也不会有它的踪影――它消失了。

  值得庆幸的是,对于这个问题,有一个很方便的工作区。在你的打印页面中的还保留着一些div,你仅仅只需移走这些div中的浮动物就行了。通常,在移走了工具条和导航栏之后,页面布局看起来较简洁,你也就不需要那些浮动物了。你可以使用与下面相类似的方法来移走浮动物:

  div#content2{
float: none;
}

  第七步:检查一下其它那些需要调整的样式

  当你完成了前面那些步骤以后,你要特别当心其中的主要变化,要使一个页面与打印机紧密联系起来的话,这些变化是必须的。尽管如此,可能还是有一些会将用户引入歧途的样式,这些应该引起我们的注意。现在,你该启用你的文档和样式表,好好整理一下那些零碎材料了。启动浏览器的Print Preview功能,预览一下你的打印媒体样式表的效果。


--------------------------------------------------------------------------------

  本文作者: Michael Meadhra,自Web问世之初便涉足IT行业,目前已出版了30多本书,其中包括How to Do Everything with Dreamweaver MX(Osborne/McGraw-Hill出版)。
 
<think>我们正在使用Vue3的h函数(也称为createElement函数)来创建虚拟DOM节点。在Vue3中,h函数是用于创建VNode(虚拟节点)的核心函数。 需求:创建一个div元素,并内联添加CSS样式(即使用style属性)。 在h函数中,第二个参数是一个对象,用于表示该元素的属性(props),包括样式、类、事件等。我们可以在这个对象中设置style属性,其值可以是一个对象(推荐)或字符串(不推荐,因为对象形式更易管理)。 具体步骤: 1. 导入h函数(如果是在setup函数中,可以直接使用,或者从vue包中导入)。 2. 使用h函数,第一个参数是标签名,如'div'。 3. 第二个参数是配置对象,其中我们可以设置style属性,值为一个对象,对象的键是CSS属性名(可以使用驼峰式或短横线分隔,但注意在JavaScript中更常用驼峰式),值是对应的样式值(字符串或数字)。 4. 第三个参数(可选)是子节点,可以是字符串(文本内容)或其他h函数创建的VNode。 示例代码: 假设我们要创建一个div,背景色为蓝色,文字颜色为白色,内边距为10px,并显示文字“Hello World”。 在Vue3中,我们可以这样写: */ import { h } from 'vue'; // 在setup函数中返回,或者直接在render函数中使用 const myDiv = h('div', { style: { backgroundColor: 'blue', color: 'white', padding: '10px', // 注意:CSS属性名可以使用驼峰式(camelCase)或者用引号包裹的短横线分隔形式(但短横线分隔在JavaScript中需要写成字符串形式,所以驼峰更常用) // 例如:'background-color' 也可以,但需要加引号,写成字符串。 } }, 'Hello World'); // 如果需要在组件中使用,可以在setup函数中返回这个VNode,或者使用render函数。 /* 但是,如果是在组件的setup函数中返回一个渲染函数,可以这样写: */ export default { setup() { return () => h('div', { style: { backgroundColor: 'blue', color: 'white', padding: '10px' } }, 'Hello World'); } }; /* 注意:在Vue3中,样式对象中的属性名可以使用驼峰式(如backgroundColor)或短横线分隔(但需要用引号括起来,如'background-color')。推荐使用驼峰式,因为它是JavaScript中更常见的写法。 另外,样式值可以是字符串,也可以是数字(对于需要单位的属性,数字会默认被转换成像素,如padding:10相当于10px)。但是,如果属性值单位不是像素,则必须写成字符串(如padding: '10%')。 示例:使用数字和字符串混合 */ const myDiv2 = h('div', { style: { padding: 10, // 相当于'10px' margin: '20px', // 字符串 fontSize: 18, // 相当于'18px' lineHeight: 1.5, // 无单位,直接输出1.5(注意:这会被转换成字符串'1.5',但通常line-height可以接受无单位数字,表示倍数) width: '50%' } }, 'Hello World'); /* 注意事项: 1. 如果样式属性需要浏览器前缀,Vue不会自动添加,需要自己写全(如WebkitAppearance)。或者,可以使用内联样式字符串(不推荐,因为对象形式更易操作): style: "background-color: blue; color: white; padding: 10px;" 2. 当样式值需要多个单位时,必须使用字符串,例如:margin: '10px 5px'。 根据引用[2]中提到的,在Vue中可以通过对象形式绑定内联样式,并且可以绑定多个样式对象(数组形式)。在h函数中,我们也可以使用数组形式来合并多个样式对象。 例如: */ const styleObj1 = { color: 'red', fontSize: 20 }; const styleObj2 = { backgroundColor: 'black', padding: '10px' }; const myDiv3 = h('div', { style: [styleObj1, styleObj2] // 数组形式,多个样式对象会合并,后面的对象如果有相同属性会覆盖前面的 }, '合并样式对象'); /* 这样,这个div就会同时应用两个样式对象。 总结: 在Vue3中使用h函数创建div并添加内联样式,主要是在第二个参数的style属性中设置,值可以是一个对象或对象数组(用于合并多个样式对象)。 参考引用[2]中关于样式绑定的描述,我们可以知道在模板中我们可以使用:style绑定一个对象或数组,而使用h函数时,我们直接以编程方式在配置对象中设置style属性,其规则与模板中的:style绑定一致。 */</think>在 Vue 3 中使用 `h()` 函数创建带有内联样式div 元素,可以通过在第二个参数中设置 `style` 属性实现。以下是具体方法和示例: ### 基础实现方法 ```javascript import { h } from 'vue'; // 创建样式div const styledDiv = h('div', { style: { color: 'red', backgroundColor: '#f0f0f0', padding: '20px', border: '1px solid #ccc', borderRadius: '4px' } }, '带样式div 内容'); // 在组件中使用 export default { setup() { return () => styledDiv; } } ``` ### 动态样式绑定 可以结合响应式数据实现动态样式: ```javascript import { ref, h } from 'vue'; export default { setup() { const isActive = ref(true); const textColor = ref('blue'); // 动态样式对象 const dynamicStyle = { color: textColor.value, backgroundColor: isActive.value ? '#e3f2fd' : '#ffebee', transition: 'all 0.3s ease' }; return () => h('div', { style: dynamicStyle, onClick: () => { isActive.value = !isActive.value; textColor.value = isActive.value ? 'blue' : 'red'; } }, '点击切换样式'); } } ``` ### 样式数组语法 可以合并多个样式对象(类似引用[2]中的数组语法): ```javascript const baseStyles = { padding: '15px', margin: '10px', border: '1px solid #ddd' }; const dynamicStyles = { backgroundColor: '#e8f5e9', color: '#2e7d32' }; const styledDiv = h('div', { style: [baseStyles, dynamicStyles] // 合并样式 }, '合并样式示例'); ``` ### 注意事项 1. **样式属性命名**:使用驼峰式命名(如 `backgroundColor`)而非短横线命名(如 `background-color`) 2. **单位处理**:数值默认转换为像素,非像素单位需显式指定: ```javascript style: { width: 100, // 转换为 '100px' height: '50%', // 需显式指定单位 margin: '1rem' // 需显式指定单位 } ``` 3. **自动前缀**:Vue 会自动为需要浏览器前缀的样式添加前缀(如 `WebkitTransition`) 4. **样式优先级**:内联样式具有最高优先级(类似引用[4]中 Sass 变量的覆盖特性) ### 完整组件示例 ```javascript import { ref, h } from 'vue'; export default { setup() { const rotation = ref(0); const rotateDiv = () => { rotation.value = (rotation.value + 30) % 360; }; return () => h('div', { style: { width: '200px', height: '200px', background: 'linear-gradient(45deg, #ff9a9e, #fad0c4)', display: 'flex', justifyContent: 'center', alignItems: 'center', borderRadius: '8px', cursor: 'pointer', transform: `rotate(${rotation.value}deg)`, transition: 'transform 0.5s ease' }, onClick: rotateDiv }, '点击旋转'); } } ``` ### 关键点说明 1. **响应式更新**:当响应式数据变化时,Vue 会自动更新 DOM(类似引用[1]中的响应式原理) 2. **性能优化**:Vue 会对样式变化进行智能比对,仅更新实际变化的样式属性[^1] 3. **样式冲突**:内联样式优先级高于 CSS 类(类似引用[3]中 v-show 的样式处理) 4. **动态计算**:可在样式中使用 JavaScript 表达式: ```javascript style: { opacity: isActive.value ? 1 : 0.5, transform: `scale(${zoomLevel.value})` } ``` [^1]: Vue 3 的响应式系统会高效追踪样式依赖,仅更新实际变化的样式属性,避免不必要的 DOM 操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值