javascript - 禁用 `sticky` 和 `fixed` CSS(用于完整网页截图)
问题描述
背景:我正在使用一种工具对网页进行自动“整页”屏幕截图。它通过滚动网页、截取屏幕截图并将它们拼接在一起来做到这一点。(猜猜哪个工具没有奖品)。
问题: html元素破坏了图像的拼接sticky
。fixed
(基本上每个屏幕截图“片段”都包含一个横幅/页脚)。见下文...
fixed
问题:有没有一种方法可以指示网页将sticky
css 视为已修复?(或者通过在子元素中设置滚动来否定它们的效果?)
临时解决方案...
解决方案 1:我可以随时裁剪图像(例如裁剪 200px 顶部和底部)。但是这需要事先知道(/假设)元素的高度。
解决方案2:加载网站iframe
,并将iframe高度设置为内页高度。CSP
这非常有效,除了我在访问其他网站时遇到问题。
假设:
- 我们可以在浏览器中执行Javascript(例如修改dom、css等)
- 仅适用于 Firefox 和 Chrome
- 使用本机 Javascript(无库)
- 自动化(不涉及人工)
fixed
例如,我尝试将sticky
css 元素设置为relative
(/ absolute
),它适用于 90%(但不是 100% 正确)。
var elems = document.body.getElementsByTagName("*");
for (var i=0;i<elems.length;i++) {
const pos = window.getComputedStyle(elems[i],null).getPropertyValue('position')
if (pos == 'sticky' || pos == 'fixed') {
elems[i].style = "position:relative !important;"
}
}
我正在使用以下页面进行测试:https ://digitalocean.com/pricing/
更新:我很乐意让粘性/固定对象透明。(自我注意:调查)
类似(但不同)的问题:
- 在 selenium 中捕获具有粘性标题的完整网页截图- 建议使用其他库和上述(折扣)建议的解决方案
- 获取完整的 localhost 网页截图(Firefox、Windows)?- 手动解决方案
- 使用 javascript 的完整网页截图- 建议的解决方案是使用 html2canvas 库
解决方案
对于fixed
元素,您可以依赖transform
或filter
更改包含块并禁用固定行为(此处解释:CSS-Filter on parent breaks child position)
这是一个基本的例子。一般我们需要把它应用到body
.
.fixed {
position:fixed;
bottom:0;
left:0;
right:0;
background:red;
height:56px;
}
body {
margin:0;
height:220vh;
filter:blur(0); /* OR transform:translate(0) */
}
<div class="fixed"></div>
当然,诀窍是应用空过滤器或变换以避免任何视觉变化。
对于sticky
元素,您需要考虑溢出属性来禁用效果。这里有点棘手,因为它取决于 HTML,但在大多数情况下,您需要应用父元素overflow
以外的值(此处的完整详细信息:什么是“滚动框”?)visible
这是一个基本示例:
.fixed {
position:sticky;
top:0;
background:red;
height:56px;
}
body {
margin:0;
height:220vh;
overflow:auto;
}
html {
overflow-y:scroll;
}
<div class="fixed"></div>
上面的例子有点小技巧,因为我们也面临从到的overflow
传播,这就是为什么我也需要为 HTML 显式设置,否则它将不起作用。body
html
overflow
这是另一个使用主体以外的容器的示例:
.sticky {
position: sticky;
top: 0;
background: red;
height: 56px;
}
.container {
height: 220vh;
overflow: auto;
}
<div class="container">
<div class="sticky"></div>
</div>
推荐阅读
- angularjs -
使用 ng-repeat添加每 5 个项目 - python - Scrapy 合约 101
- c# - LazyLoading 在 EFCore 中的行为不符合预期
- ios - 使用 AirPods 将 AVAudioEngine 音频录制与背景音轨同步
- c# - 为自定义前缀创建自定义 Web 请求创建者
- python - 如何在 scipy.optimize 中动态生成约束?
- apache-flink - 无法为不存在的操作员时间戳/水印设置 uid
- python - 在 Python 中使用相同的字段名称保存 XML 数据
- javascript - 为什么我的 post 请求没有创建新的 JSON 文件 JS?
- python-3.x - 使用 celery 和 redis 键的 kombu 中的不一致错误 '_kombu.binding.reply.celery.pidbox'