javascript - 通过滚动事件更改字体大小后文本闪烁

标签 javascript html css scroll flicker

我有这段 JavaScript 代码可以根据 window.scrollY 更改 font-size

var title = document.querySelector('.title')
var titleFontSizePX = getComputedStyle(title).fontSize
var titleFontSizePXInt = parseFloat(titleFontSizePX)

var titleFontSizeVWInt = titleFontSizePXInt * (100 / window.innerWidth)
var titleFontSizeVW = titleFontSizeVWInt + 'vw'
title.style.fontSize = titleFontSizeVW

function updateFontSize(event) {
  console.log('fire!', event.type, window.scrollY)
  var titleSizeMax = titleFontSizeVWInt - 0.02 * window.scrollY
  var titleSizeMin = titleFontSizeVWInt * 2 / 5
  title.style.fontSize = Math.max(titleSizeMin, titleSizeMax) + 'vw'
}

var events = ['scroll', 'touchmove']
events.forEach(event => document.addEventListener(event, updateFontSize))
body {
  background: #111;
  padding: 40vh 10vw 10vw;
  font-family: 'Rubik';
  color: white;
}

h1 {
  font-size: 12vw;
  line-height: 1em;
  font-weight: 700;
}

p {
  font-size: 1.4rem;
  line-height: 1.6em;
  font-weight: 400;
  margin-top: 2em;
  max-width: 50%;
}
<h1 class="title">
  This is a big<br> hero copy to<br> say a couple<br> words about<br> this website.
</h1>

<p>One morning, when Gregor Samsa woke from troubled dreams, he found himself transformed in his bed into a horrible vermin. He lay on his armour-like back, and if he lifted his head a little he could see his brown belly, slightly domed and divided by arches
  into stiff sections. One morning, when Gregor Samsa woke from troubled dreams, he found himself transformed in his bed into a horrible vermin.</p>
<p>The bedding was hardly able to cover it and seemed ready to slide off any moment. His many legs, pitifully thin compared with the size of the rest of him, waved about helplessly as he looked. "What's happened to me?" he thought. It wasn't a dream. His
  room, a proper human room although a little too small, lay peacefully between its four familiar walls.</p>
<p>A collection of textile samples lay spread out on the table - Samsa was a travelling salesman - and above it there hung a picture that he had recently cut out of an illustrated magazine and housed in a nice, gilded frame. It showed a lady fitted out with
  a fur hat and fur boa who sat upright, raising a heavy fur muff that covered the whole of her lower arm towards the viewer.</p>

一切似乎都正常,除了有时滚动事件会多次触发,导致文本在循环中轻弹。我已经测试了不同的调试方法,例如去抖动、节流、手动设置 line-height 等,但都没有用。

此外,您可以在控制台中键入 window.scrollTop(0, number) 来产生闪烁效果。尝试不同的数字。在某个时候它会发生。

不确定是什么原因造成的,因此不胜感激。

这是一个视频:https://youtu.be/Kiwwcabmqcc

还有一个代码笔:https://codepen.io/podrivo/pen/zebWmW

谢谢!

最佳答案

解决方法是将上次滚动位置设置为与实际滚动位置不同。所以 JavaScript 是:

var title               = document.querySelector('.title')
var titleFontSizePX     = getComputedStyle(title).fontSize
var titleFontSizePXInt  = parseInt(titleFontSizePX, 10)

var titleFontSizeVWInt  = titleFontSizePXInt * (100 / window.innerWidth)
var titleFontSizeVW     = titleFontSizeVWInt + 'vw'
title.style.fontSize    = titleFontSizeVW

var lastScroll          = 0

function updateFontSize(event) {
  if (lastScroll != window.scrollY) {
    var titleSizeMax      = titleFontSizeVWInt - 0.02 * window.scrollY
    var titleSizeMin      = titleFontSizeVWInt * 2 / 5
    title.style.fontSize  = Math.max(titleSizeMin, titleSizeMax) + 'vw'
  }
  lastScroll = window.scrollY
}

var events = ['scroll', 'touchmove']
events.forEach(event => document.addEventListener(event, updateFontSize))

关于javascript - 通过滚动事件更改字体大小后文本闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54896743/

相关文章:

html - 不同分辨率屏幕中间的中心菜单(CSS/HTML)

python - 在 Django+Bootstrap 中使表单字段更宽

html - anchor 不环绕 li。为什么?

javascript - JS 在 Firefox 中工作,但在 Chrome 和 IE 中无法加载

javascript - Firefox 上 Web Worker 中的 IndexedDB

javascript - 使用 jQuery Ajax 发送 'pure' JSON 而不是多种形式

javascript - Canvas requestAnimationFrame暂停

javascript - 以时间格式显示 NVD3 y 轴标签

javascript - 是否可以在 css 中按下并按住按钮触发事件?

html - GEDCOM 到 HTML 和 RDF