javascript - 禁用 `sticky` 和 `fixed` CSS(完整网页截图)

标签 javascript html css

背景:我正在使用一种工具自动截取网页的“整页”屏幕截图。它通过滚动浏览网页、截取屏幕截图并将它们拼接在一起来实现这一点。 (猜哪个工具没有奖品)。

问题 stickyfixed html 元素破坏了图像的拼接。 (基本上每个屏幕截图“片段”都包含一个横幅/页脚)。见下文...

enter image description here


问题:有没有一种方法可以指示网页将 fixedsticky css 视为固定的? (或者通过在子元素内设置滚动来抵消它们的影响?)

临时解决方案...

解决方案 1:我可以在图像移动时裁剪图像(例如裁剪 200 像素的顶部和底部)。但这需要事先知道(/假设)元素的高度。

解决方案二:iframe中加载网站,并将iframe的高度设置为内页的高度。这非常有效,除了我遇到 CSP访问其他网站的问题。

假设:

  • 我们可以在浏览器中执行Javascript(例如修改dom、css等)
  • 仅适用于 Firefox 和 Chrome
  • 使用原生 Javascript(无库)
  • 自动化(无人参与)

例如,我尝试将 fixedsticky 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/

更新:我很乐意让粘性/固定对象透明。 ( self 注意:调查)

类似(但不同)的问题:

  1. Capture full webpage screenshot in selenium that has sticky header - 建议使用其他库和上述(折扣)建议的解决方案
  2. Take full localhost webpage screenshot (Firefox, Windows)? - 手动解决方案
  3. Full WebPage screenshot using javascript - 建议的解决方案是使用 html2canvas 库

最佳答案

对于 fixed 元素,您可以依靠 transformfilter 来更改包含 block 并禁用固定行为(此处解释:CSS-Filter on parent breaks child positioning)

这是一个基本的例子。通常我们需要将其应用于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>

当然,诀窍是应用null 过滤器或转换以避免任何视觉变化。


对于 sticky 元素,您需要考虑 overflow 属性来禁用效果。这里有点棘手,因为它取决于 HTML,但在大多数情况下,您需要将 overflow 应用于父元素上的 visible 以外的值(完整详情在这里:What are `scrolling boxes`?)

这是一个基本的例子:

.fixed {
  position:sticky;
  top:0;
  background:red;
  height:56px;
}

body {
  margin:0;
  height:220vh;
  overflow:auto;
}
html {
  overflow-y:scroll;
}
<div class="fixed"></div>

上面的例子有点小技巧,因为我们还面临从 bodyhtmloverflow 传播,这就是为什么我需要明确地设置 overflow 也适用于 HTML,否则将无法正常工作。

这是另一个容器而不是主体的例子:

.sticky {
  position: sticky;
  top: 0;
  background: red;
  height: 56px;
}

.container {
  height: 220vh;
  overflow: auto;
}
<div class="container">
  <div class="sticky"></div>
</div>

关于javascript - 禁用 `sticky` 和 `fixed` CSS(完整网页截图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56927679/

相关文章:

JavaScript 下拉菜单不再起作用

javascript - Greensock 不透明度动画从 0 到 1 然后再返回

javascript - 如果方法不存在则创建一个

css - 使一个 div 在悬停在另一个 div 上时出现

html - 在 Joomla 中添加 CSS 容器

html - 如何在另一个上添加一个等待的 div?

javascript - JQuery 与 getElementbyId - 返回内容的差异

javascript - 过滤/搜索表 HTML

javascript - 存储在aws polly上提取的音频,将其存储在S3上并将其上传到Javascript中的html元素上

css - 将复选框左对齐