- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想生成并下载网页的屏幕截图而不丢失样式。我有一个网页。在该网页中我有一个下载按钮。当用户单击下载按钮时,整个页面的屏幕截图需要作为图像下载到用户计算机中。我该怎么做?
请检查我的代码
Index.html
<html>
<body>
<link href="style.css" rel="stylesheet">
<h1>Scrrenshot</h1>
<form class="cf">
<div class="half left cf">
<input type="text" id="input-name" placeholder="Name">
<input type="email" id="input-email" placeholder="Email address">
<input type="text" id="input-subject" placeholder="Subject">
</div>
<div class="half right cf">
<textarea name="message" type="text" id="input-message" placeholder="Message"></textarea>
</div>
<input type="submit" value="Submit" id="input-submit">
</form>
<a class="btn btn-success" href="javascript:void(0);" onclick="generate();">Generate Screenshot »</a>
</body>
<script>
(function (exports) {
function urlsToAbsolute(nodeList) {
if (!nodeList.length) {
return [];
}
var attrName = 'href';
if (nodeList[0].__proto__ === HTMLImageElement.prototype
|| nodeList[0].__proto__ === HTMLScriptElement.prototype) {
attrName = 'src';
}
nodeList = [].map.call(nodeList, function (el, i) {
var attr = el.getAttribute(attrName);
if (!attr) {
return;
}
var absURL = /^(https?|data):/i.test(attr);
if (absURL) {
return el;
} else {
return el;
}
});
return nodeList;
}
function screenshotPage() {
urlsToAbsolute(document.images);
urlsToAbsolute(document.querySelectorAll("link[rel='stylesheet']"));
var screenshot = document.documentElement.cloneNode(true);
var b = document.createElement('base');
b.href = document.location.protocol + '//' + location.host;
var head = screenshot.querySelector('head');
head.insertBefore(b, head.firstChild);
screenshot.style.pointerEvents = 'none';
screenshot.style.overflow = 'hidden';
screenshot.style.webkitUserSelect = 'none';
screenshot.style.mozUserSelect = 'none';
screenshot.style.msUserSelect = 'none';
screenshot.style.oUserSelect = 'none';
screenshot.style.userSelect = 'none';
screenshot.dataset.scrollX = window.scrollX;
screenshot.dataset.scrollY = window.scrollY;
var script = document.createElement('script');
script.textContent = '(' + addOnPageLoad_.toString() + ')();';
screenshot.querySelector('body').appendChild(script);
var blob = new Blob([screenshot.outerHTML], {
type: 'text/html'
});
return blob;
}
function addOnPageLoad_() {
window.addEventListener('DOMContentLoaded', function (e) {
var scrollX = document.documentElement.dataset.scrollX || 0;
var scrollY = document.documentElement.dataset.scrollY || 0;
window.scrollTo(scrollX, scrollY);
});
}
function generate() {
window.URL = window.URL || window.webkitURL;
window.open(window.URL.createObjectURL(screenshotPage()));
}
exports.screenshotPage = screenshotPage;
exports.generate = generate;
})(window);
</script>
</html>
样式.css
@import "compass/css3";
@import url(https://fonts.googleapis.com/css?family=Merriweather);
$red: #e74c3c;
*,
*:before,
*:after {
@include box-sizing(border-box);
}
html, body {
background: #f1f1f1;
font-family: 'Merriweather', sans-serif;
padding: 1em;
}
h1 {
text-align: center;
color: #a8a8a8;
@include text-shadow(1px 1px 0 rgba(white, 1));
}
form {
border: 2px solid blue;
margin: 20px auto;
max-width: 600px;
padding: 5px;
text-align: center;
}
input, textarea {
border:0; outline:0;
padding: 1em;
@include border-radius(8px);
display: block;
width: 100%;
margin-top: 1em;
font-family: 'Merriweather', sans-serif;
@include box-shadow(0 1px 1px rgba(black, 0.1));
resize: none;
&:focus {
@include box-shadow(0 0px 2px rgba($red, 1)!important);
}
}
#input-submit {
color: white;
background: $red;
cursor: pointer;
&:hover {
@include box-shadow(0 1px 1px 1px rgba(#aaa, 0.6));
}
}
textarea {
height: 126px;
}
}
.half {
float: left;
width: 48%;
margin-bottom: 1em;
}
.right { width: 50%; }
.left {
margin-right: 2%;
}
@media (max-width: 480px) {
.half {
width: 100%;
float: none;
margin-bottom: 0;
}
}
/* Clearfix */
.cf:before,
.cf:after {
content: " "; /* 1 */
display: table; /* 2 */
}
.cf:after {
clear: both;
}
.half.left.cf > input {
margin: 5px;
}
为此,我使用了方法 [ http://www.xpertdeveloper.com/2012/10/webpage-screenshot-with-html5-js/] ,这里生成了屏幕截图,但没有样式,也无法下载。请帮忙,有可用的 jQuery 库吗?
最佳答案
您可以使用以下 JavaScript 库来实现此目的...
ᴅᴇᴍᴏ
(function(exports) {
function urlsToAbsolute(nodeList) {
if (!nodeList.length) {
return [];
}
var attrName = 'href';
if (nodeList[0].__proto__ === HTMLImageElement.prototype || nodeList[0].__proto__ === HTMLScriptElement.prototype) {
attrName = 'src';
}
nodeList = [].map.call(nodeList, function(el, i) {
var attr = el.getAttribute(attrName);
if (!attr) {
return;
}
var absURL = /^(https?|data):/i.test(attr);
if (absURL) {
return el;
} else {
return el;
}
});
return nodeList;
}
function screenshotPage() {
var wrapper = document.getElementById('wrapper');
html2canvas(wrapper, {
onrendered: function(canvas) {
canvas.toBlob(function(blob) {
saveAs(blob, 'myScreenshot.png');
});
}
});
}
function addOnPageLoad_() {
window.addEventListener('DOMContentLoaded', function(e) {
var scrollX = document.documentElement.dataset.scrollX || 0;
var scrollY = document.documentElement.dataset.scrollY || 0;
window.scrollTo(scrollX, scrollY);
});
}
function generate() {
screenshotPage();
}
exports.screenshotPage = screenshotPage;
exports.generate = generate;
})(window);
@import url(https://fonts.googleapis.com/css?family=Merriweather);
$red: #e74c3c;
*,
*:before,
*:after {
@include box-sizing(border-box);
}
html,
body {
background: #f1f1f1;
font-family: 'Merriweather', sans-serif;
padding: 1em;
}
h1 {
text-align: center;
color: #a8a8a8;
@include text-shadow(1px 1px 0 rgba(white, 1));
}
form {
border: 2px solid blue;
margin: 20px auto;
max-width: 600px;
padding: 5px;
text-align: center;
}
input,
textarea {
border: 0;
outline: 0;
padding: 1em;
@include border-radius(8px);
display: block;
width: 100%;
margin-top: 1em;
font-family: 'Merriweather', sans-serif;
@include box-shadow(0 1px 1px rgba(black, 0.1));
resize: none;
&:focus {
@include box-shadow(0 0px 2px rgba($red, 1)!important);
}
}
#input-submit {
color: white;
background: $red;
cursor: pointer;
&:hover {
@include box-shadow(0 1px 1px 1px rgba(#aaa, 0.6));
}
}
textarea {
height: 126px;
}
}
.half {
float: left;
width: 48%;
margin-bottom: 1em;
}
.right {
width: 50%;
}
.left {
margin-right: 2%;
}
@media (max-width: 480px) {
.half {
width: 100%;
float: none;
margin-bottom: 0;
}
}
/* Clearfix */
.cf:before,
.cf:after {
content: " ";
/* 1 */
display: table;
/* 2 */
}
.cf:after {
clear: both;
}
.half.left.cf > input {
margin: 5px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script>
<div id="wrapper">
<h1>Scrrenshot</h1>
<form class="cf">
<div class="half left cf">
<input type="text" id="input-name" placeholder="Name">
<input type="email" id="input-email" placeholder="Email address">
<input type="text" id="input-subject" placeholder="Subject">
</div>
<div class="half right cf">
<textarea name="message" type="text" id="input-message" placeholder="Message"></textarea>
</div>
<input type="submit" value="Submit" id="input-submit">
</form>
</div>
<a class="btn btn-success" href="javascript:void(0);" onclick="generate();">Generate Screenshot »</a>
关于javascript - 生成并下载网页截图而不丢失样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44494447/
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
如何创建 iPhone 屏幕截图?当我打开 Xcode 时,我转到“窗口”>“管理器”,但没有可见的“设备”选项卡。我有一部操作系统为 3.1.2 的越狱手机。 最佳答案 在手机上,按住主页按钮并按
我一直在使用 UIGetScreenImage() 来获取 UIImagePickerController 的屏幕截图。基本上我使用相机覆盖层,然后当我拍摄屏幕截图时,我会看到相机预览显示的图像以及我
我想对我创建的面板进行屏幕截图,代码如下。任何人都可以告诉我为什么我没有得到。谢谢 public static final void makeScreenshot(JFrame argFram
我正在开发一个应用程序,它使用前置摄像头为使用该应用程序的人模拟一面镜子。我已经实现了一个“平视显示器”,它位于相机 View 的前面并显示一些东西。目前这很好用。现在我想实现一种每 5 秒截取一次屏
如何使用安卓模拟器截屏? 最佳答案 在 Eclipse 中打开 Devices View (Window -> Show View -> Other, Android -> Devices),右侧有一
我正在开发一个用于在设备中截取屏幕截图的应用程序。在这个应用程序中,我们可以在屏幕上绘制任何东西。为此,我使用 Canvas、Paint 和 Path 来执行此操作。 我正在使用此代码截取屏幕截图:
如何捕获屏幕并将其保存为 C 中的图像? 操作系统:Windows(XP 和 7) 谢谢 最佳答案 你试过了吗google ?这forum entry有一个示例,包含使用 Win32 API 的 C
我正在尝试使用这段代码: bool SaveBMPFile(char *filename, HBITMAP bitmap, HDC bitmapDC, int width, int height);
我想使用 php 创建网站缩略图(屏幕截图)。我有一个运行 centos 5.5 的专用服务器,所以我可以在上面安装软件。 我需要一个免费的解决方案来在生产服务器上创建网站的缩略图,而无需运行 X 服
我正在尝试截取在 lcdtv 上播放的 roku 应用程序的屏幕截图。 将您的 Roku 置于开发者模式。确认您的 Roku 的 IP 地址。 Side load your app to the Ro
UIImage* image = nil; UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, YES, 0); {
我有一个 View Controller ,它通过按钮进入 TableView Controller 。 在 View Controller 中,导航栏是完全半透明的(如下面的屏幕截图所示)。在 Ta
我使用- (BOOL)presentPreviewAnimated:(BOOL)animated; 来加载文档,然后我想从文档中截取屏幕截图。所以我尝试 UIGraphicsBeginImageCon
我不知道如何使用 css (-fx-... :...) 将这种效果应用于 javaFX 2 中的文本字段; 我需要像屏幕截图中那样的东西。我有一个带有该背景的面板,我需要文本字段将其变暗一点(它看起来
我在我的 Windows 应用程序中使用 C++/Direct2D,我在 pRenderTarget->BeginDraw() 和 pRenderTarget->EndDraw() 之间绘制一些线条和
我正在尝试使用后台服务截取屏幕截图。此服务就像 Facebook chathead,但我希望它在我点击时截取屏幕截图。 我已经开发了一些代码,但它不起作用。我最后尝试的是: private void
我搜索了很多有关在 Android 上截取我的 OpenGL 对象的屏幕截图的信息,并提出了 this解决方案。它工作得很好,但在我的例子中,我在相机 View 之上有相机 View 和 opengl
我开始在 xcode 中编程,当我启动它时,xcode 会问我“你是谁”。有人知道需要做什么吗?谢谢! 截图: 最佳答案 Xcode 包含对 Git 的集成支持。你的屏幕截图是 Git 要求你设置你的
我需要对ARSCNView进行截图,类定义如下: public class SceneLocationView: ARSCNView, ARSCNViewDelegate { } 我正在按照以下方法完
我是一名优秀的程序员,十分优秀!