- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我一直在努力围绕这种名为“视差”的整洁效果。基本上,背景滚动比前景元素慢。
我发现这个新的“技巧”正在起作用。随着滚动的进行,更改top
属性以创建视差效果。
问题...
因此,为了提高性能并减轻元素不在用户视口内时CPU的负担,我创建了if
语句,该语句检查top
位置是否大于300px。如果是,它将覆盖所有内容并将top
属性设置回0,因此它将无缘无故地不断增加。
现在,只需滚动一下。看到红色的div
越过白色的时,白色的结巴怎么办?在DOM检查器中查看,我发现if
语句很奇怪,将top
属性设置为0px,即使它不超过300px。快点
在此期间,我很乐意看到有关视差效果的更多建议。我已经看到了有关此效果的一些答案,但它们似乎……对我来说过于复杂。我知道有更好的方法可以做到这一点,我知道有。
而且,如果没有jQuery答案,将不胜感激。谢谢。
var txtfirst = document.getElementById("txtfirst");
window.onscroll = function(){
var ypos = window.pageYOffset;
txtfirst.style.top = ypos * 0.4 + "px";
if(txtfirst.style.top > '300px'){
txtfirst.style.top = '0px';
}
}
html, body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
.text-first {
display: flex;
text-align: center;
justify-content: center;
align-items: center;
font-size: 32px;
font-family: Arial;
color: gray;
width: 100%;
height: 500px;
position: relative;
}
.foreground-red {
width: 100%;
height: 600px;
background-color: red;
display: flex;
justify-content: center;
align-items: center;
font-family: Arial;
color: gray;
font-size: 32px;
}
.spacer { /*for scrolling purposes*/
width: 100%;
height: 1000px;
}
<div class="text-first" id="txtfirst">THIS IS SOME TEXT</div>
<div class="foreground-red">THIS SHOULD GO ABOVE</div>
<div class="spacer"></div>
最佳答案
您的应用程序很有可能(我假设您仅提供了选定的代码片段)无法正常工作,至少是因为您要比较数字时正在比较文本,以进行优化:
txtfirst.style.top > '300px'
Element::style
属性的每个属性(例如您的情况下为
txtfirst.style
)都是
text string,而不是
number。像
"50px" < "300px"
这样的测试不会比较50是否小于300,而是比较文本值
lexicographically。
parseInt
函数将
50px
之类的值转换为数字50。然后您的测试将如下所示:
parseInt(txtfirst.style.top) < 300
Window::getComputedStyle(element)
函数检索元素的计算样式。
getComputedStyle
读取属性并将它们直接写入首选的样式表(如果需要,可以为空)(
document.styleSheets
,反映所有
link rel=stylesheet
和
style
元素):
function rule(selector) {
var sheet = document.styleSheets[0];
return Array.prototype.find.call(sheet.cssRules, rule => rule.selectorText == selector);
}
var txtfirst = document.getElementById("txtfirst");
window.onscroll = function() {
var ypos = window.pageYOffset;
var style = rule(".text-first").style;
style.top = ypos * 0.4 + "px";
if(parseInt(getComputedStyle(txtfirst).top) > 300) {
style.top = "0px";
}
}
rule
函数从找到的第一个样式表(您只有一个)中返回带有匹配选择器(例如
.text-first
或
html, body
)的CSS规则(其中包含一组CSS属性)。规则的
style
属性是指包含规则中设置的所有CSS属性的对象。它的行为与内联样式对象相同。请注意,您在上面的任何地方都没有使用内联样式,而是写入了样式表对象(由文档的
<style>...</style>
片段初始化)并回读了计算所得的值。
scroll
事件用于动画的问题
scroll
事件?这将使您的视差效果停滞不前,因为在用户停止滚动后会触发单个
scroll
事件。这与浏览器进行页面滚动的方式有关–使用受限制的移动CPU资源来实现平滑的页面滚动动画,仅每秒一次执行
scroll
事件处理程序的JavaScript代码60次,这被认为过于慷慨,而Apple取而代之的是颇有争议的解决方案,因为它们原本就是好的UX。
scroll
事件该怎么办?您可以使用旧的
setInterval
:
function rule(selector) {
var sheet = document.styleSheets[0];
return Array.prototype.find.call(sheet.cssRules, rule => rule.selectorText == selector);
}
var txtfirst = document.getElementById("txtfirst");
var old_window_pageYOffset = window.pageYOffset;
setTimeout(function() {
var ypos = window.pageYOffset;
if(ypos != old_window_pageYOffset) return;
old_window_pageYOffset = ypos;
var style = rule(".text-first").style;
style.top = ypos * 0.4 + "px";
if(parseInt(getComputedStyle(txtfirst).top) > 300) {
style.top = "0px";
}
}, 1000 / 60);
scroll
事件。综上所述,较新的iOS版本已恢复了行为,并且滚动位置的每次更改都会触发
scroll
事件。意味着您可能只是想将其用作基准并取决于事件而不是
setInterval
。后者的一个免费好处是您可以控制视差效果的运行速度。
requestAnimationFrame
,它比
setInterval
更“智能”,因为如果用户代理认为不需要动画,例如,如果整个页面选项卡不可见或与之交互,则用户代理将不会调用您的代码。目前的用户。请放心,动画将在“需要时”运行:
function rule(selector) {
var sheet = document.styleSheets[0];
return Array.prototype.find.call(sheet.cssRules, rule => rule.selectorText == selector);
}
var txtfirst = document.getElementById("txtfirst");
var old_window_pageYOffset = window.pageYOffset;
requestAnimationFrame(function() {
var ypos = window.pageYOffset;
if(ypos != old_window_pageYOffset) return;
old_window_pageYOffset = ypos;
var style = rule(".text-first").style;
style.top = ypos * 0.4 + "px";
if(parseInt(getComputedStyle(txtfirst).top) > 300) {
style.top = "0px";
}
});
on*name*
时,我不使用
addEventListener
系列功能。前者是每个处理程序的一个属性,并且不能保证您的脚本是这些属性的唯一使用者-它们可能已经由浏览器扩展设置。我们可以争辩说网页作者是否拥有专有权并可以访问他们可以使用的所有属性,但是至少我已经解释了我的理由。使用
addEventListener("scroll", function() { ... })
并没有明显的缺点。
document.querySelector(".text-field")
将返回其类名称列表中第一个具有“文本字段”的可用元素。
perspective
属性以及其他一些方法来实现(尽管对于浏览器而言,没有一些小漏洞,但没有任何JavaScript)所需的效果。它还提到了我上面警告过的一些相同的事情,这些都是我试图规避和解释的事情。
关于javascript - 视差-元素毛刺,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50890728/
在开发中的网页上,我在 IE 上遇到此错误 element = $(element); 此代码位于prototype.js 预期对象 如何消除此错误。 更新: 现场也使用了 jQuery。 最佳答
我有两个大小相同的嵌套数组: Array1 =[[1, 2], [], [2, 3]] Array2= [[1, 4], [8, 11], [3, 6]] 我需要将它们合并到一个数组中,如下所示: A
我有一些 jQuery 代码,当单击具有特定 ID 的项目时运行。当 ID 是 的一部分时,它就可以工作。元素,但当它位于 中时则不然元素。为什么会这样呢?我想使用 an,因为如果用户关闭了 Ja
Flex-box 规范 3声明 flex 元素不是 block 容器: A flex item establishes a new formatting context for its content
我遇到了一个意想不到的问题。 HTML JS $(function() { var $divs = $('.myDiv'); // create new div not in
我使用 Bootstrap 和 Ember.js 得到了一个无序列表。每个列表项都是一个显示新帖子的链接,每当您单击该链接时,Ember 都会添加类 active默认情况下。我正在使用 Bootstr
我正在尝试让一个函数正常工作,但运气不佳,所以我想向 Stackoverflow 智囊团提出一个新手问题! 基本上,我有一个表单,并且循环遍历所有元素以查看是否存在自定义数据属性。如果存在,则保持该元
我想映射一个可选数组,删除那些 nil 值,并使用另一个函数映射非 nil 值。 我知道我可以通过使用 compactMap 然后使用常规 map 来实现这一点,但我只想遍历数组一次。 我为此实现了一
我如何定位 li 元素,除非它们出现在 之后元素?换句话说,我想针对步骤而不是注释。 我尝试向 OL 添加一个我想从选择中排除的类,但我想出的代码不起作用。 (顺便说一句,重构 html 不是一种选
Warning 1 The element 'system.webServer' has invalid child element 'rewrite'. List of possible eleme
我正在尝试编写一个脚本,该脚本将遍历 HTML 源并创建 DOM 的 JSON 文件,然后使用 d3.js 在 TreeView 中显示该文件。我遇到的问题是不仅希望显示元素(TITLE、P、LI 等
我有以下 HTML 表单:- Option 1 Option 2
我试图在选定的 HTML 元素之后选择下一个具有类名 slider-value 的 span 元素。我尝试了多种解决方案,但没有一个有效。 我可以通过 id 选择它,但我不希望那样做使代码冗余。 $(
如果电子邮件地址无效,我想在屏幕上显示一条消息“请输入有效的电子邮件地址”。 body 元素的innerHTML 语句工作正常,但我用于p 元素的innerHTML 语句不起作用。 有一次,当我测试它
以下 jQuery 代码调用 ul 元素,查找元素内的前 三个 li 列表项,并隐藏剩余的 li 项目。然后,它附加一个 li 元素,其中显示“显示更多...”,并且在单击时显示之前隐藏的列表项。 (
我问了a question早些时候关于将编辑/删除链接与 h1 元素内联的最佳方法。我能够通过给出的答案实现这一点,但我现在有额外的要求,我需要在 h1 下方显示一个段落并编辑/删除链接。 到目前为止
我使用 MVC 4 和 knockout.js 库版本 2.1.0 显示从服务器检索到的大量文件的表中的以下摘录。 0)"> 正在正确检索数据,
我创建了一个脚本,该脚本在鼠标悬停在父容器上时激活,并且应该将其子元素移离鼠标。我目前已经让它工作了,但是代码的某些部分似乎与 REACT 代码应该是什么样子相矛盾。特别是两个部分。 我在渲染函数中使
我是 JS 新手,正在尝试理解项目 https://github.com/tastejs/todomvc 的代码 请参阅屏幕截图,我尝试对 button X 以及其父元素 div 设置断点,但在这两种
例如,假设有一个带有奇特颜色的标记: Something written here 使用 Visual Studio 2017 和 MVC 5 元素,有没有办法检查和定位当前应用了哪些样式,以及负责它
我是一名优秀的程序员,十分优秀!