通过 CSS 的 命名页面(Named Pages) 技术实现作用域隔离,实现 @page 样式仅影响当前组件

devtools/2025/3/19 3:05:02/

以下是实现 @page 样式仅影响当前组件的完整解决方案,通过 CSS 的 命名页面(Named Pages) 技术实现作用域隔离:

vue

<template><div><button v-print="printOptions">打印当前报表</button><!-- 打印容器(添加特定类名) --><div id="printReport" class="print-scope"><!-- 页眉内容 --><div class="report-header">...</div><!-- 表格内容 --><table class="report-table">...</table><!-- 页脚内容 --><div class="report-footer">...</div></div></div>
</template><script setup>
// 脚本部分保持不变
</script><style scoped>
/* 普通样式 */
.print-scope {display: none;
}
</style><style>
/* 打印专用样式(无scoped) */
@media print {/* 关键步骤1:定义命名页面 */.print-scope {page: report-page; /* 绑定页面名称 */}/* 关键步骤2:指定命名页面的样式 */@page report-page {size: A4;margin: 100px 20px 60px;/* 页码位置 */@top-right {content: "第 " counter(page) " 页/共 " counter(pages) " 页";font-size: 12px;}}/* 其他样式规则... */
}
</style>

实现原理说明:

  1. 命名页面绑定

    css

    .print-scope {page: report-page; /* 将元素绑定到特定页面 */
    }
    • 通过 page 属性将打印容器与特定页面名称关联

  2. 限定作用域的页面规则

    css

    @page report-page { /* 仅影响绑定了report-page的元素 */ }
    • 只有应用了 page: report-page 的元素才会使用这个页面样式

  3. 样式隔离保障

    • 使用唯一命名(如 report-page

    • 其他组件使用不同的页面名称(如 sales-page

多组件共存示例:

css

/* 组件A的样式 */
@media print {.component-a {page: component-a-page;}@page component-a-page {margin: 2cm;}
}/* 组件B的样式 */
@media print {.component-b {page: component-b-page;}@page component-b-page {margin: 1cm;}
}

浏览器兼容性处理:

css

/* 添加浏览器前缀 */
@page report-page {-webkit-margin-before: 100px; /* Chrome/Safari */-moz-margin-top: 100px;       /* Firefox */margin-top: 100px;            /* 标准属性 */
}

最佳实践建议:

  1. 命名规范

    css

    /* 推荐使用 [组件名]-page 格式 */
    page: user-list-page;
  2. 动态样式注入(可选):

    javascript

    // 在组件挂载时动态添加样式
    onMounted(() => {const style = document.createElement('style')style.textContent = `@page unique-${Math.random().toString(36).substr(2, 9)} {/* 样式规则 */}`document.head.appendChild(style)
    })
  3. 样式优先级控制

    css

    @page report-page {margin: 1cm !important; /* 确保覆盖浏览器默认 */
    }

通过这种方案,不同组件的打印样式可以完全隔离,且无需担心全局污染问题。每个组件的 @page 规则都通过唯一的命名空间实现独立作用域。


http://www.ppmy.cn/devtools/168220.html

相关文章

MySQL复习笔记

文章目录 1.MySQL1.1什么是数据库1.2 数据库分类1.3 MySQL简介1.4连接数据库 2. 操作数据库2.1 操作数据库2.2 数据库的列类型2.3 数据库的字段属性&#xff08;重点&#xff09;2.4 创建数据库表&#xff08;重点&#xff09;2.5 数据表的类型2.6 修改数据表 3. MySQL 数据管理…

WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)深度解析与实战复现

0x00 漏洞概述 CVE-2017-10271 是Oracle WebLogic Server WLS Security组件中的远程代码执行漏洞。攻击者通过构造恶意XML请求&#xff0c;利用XMLDecoder反序列化机制绕过安全验证&#xff0c;最终实现服务器权限接管。 影响版本 WebLogic 10.3.6.0WebLogic 12.1.3.0WebLog…

第十五届蓝桥杯C/C++B组拔河问题详解

解题思路 这道题目的难点在于枚举所有区间&#xff0c;并且区间不能重合&#xff0c;那么这样感觉就很难了。但是用下面这种方法就会好很多。 我们只需要将左边的所有区间的各种和放在一个set中&#xff0c;然后我们在枚举右边的所有区间的和去和它进行比较&#xff0c;然后…

基于图神经网络(GNN)的节点分类实战:从GCN到GraphSAGE

图神经网络(GNN)是一种专门用于处理图结构数据的深度学习模型,广泛应用于社交网络分析、推荐系统和生物信息学等领域。图卷积网络(GCN)是GNN的经典方法,而GraphSAGE则通过引入采样机制进一步提升了其性能。本文将通过一个完整的实战案例,展示如何使用GCN和GraphSAGE对图…

基于CNN的多种类蝴蝶图像分类

基于CNN的多种类蝴蝶图像分类&#x1f98b; 基于卷积神经网络对64992786张图像&#xff0c;75种不同类别的蝴蝶进行可视化分析、模型训练及分类展示 导入库 import pandas as pd import os import matplotlib.pyplot as plt import seaborn as sns import numpy as np from …

Android第三次面试(Java基础)

面试题一&#xff1a;在 Android 里&#xff0c;Array 和 ArrayList 区别&#xff1f; 定义与大小&#xff1a;数组声明时要指定大小&#xff0c;之后固定&#xff1b;ArrayList 动态&#xff0c;无需提前定大小。性能&#xff1a;二者访问元素快&#xff0c;时间复杂度 O(1)&…

vue/react/vite前端项目打包的时候加上时间最简单版本,防止后端扯皮

如果你是vite项目&#xff0c;直接写一个vite的插件&#xff0c;通过这个插件可以动态注入环境变量&#xff0c;然后当打包的时候&#xff0c;自动注入这个时间到环境变量中&#xff0c;然后在项目中App.vue中或者Main.tsx中打印出来&#xff0c;这就知道是什么时候编译的项目了…

C51 Proteus仿真实验17:数码管显示4×4键盘矩阵按键

说明 按下任意键时&#xff0c;数码管都会显示其键的序号&#xff0c;扫描程序首先判断按键发生在哪一列&#xff0c;然后根据所发生的行附加不同的值&#xff0c;从而得到按键的序号 Proteus仿真 注意&#xff1a; K0、K4、K8、KC右边引脚连接的是P1.0 K1、K5、K9、KD右边引…