Comments (13)
I've implemented something like this before, and have been working on updating it this week by coincidence.
One thing that is super useful is to be able to specify a threshold for visibility e.g. element must be > 50% in viewport to be counted as visible. Essentially, you calculate a ratio of visible area of element to total area of element. A value of 1
will then behave exactly as this currently does.
You can think of this problem in math terms as calculating the area of intersection between two rectangles in a coordinate system, where one rectangle is the viewport, and the other is the element.
from in-view.
@camwiegert You could start by reading the code of in-viewport and see what could be missing/what you do not get so that we discuss it then.
from in-view.
There's also this one https://github.com/russellgoldenberg/enter-view by @russellgoldenberg. It lets you specify the distance after entering in % of viewport, which is quite useful.
from in-view.
@vvo I'm definitely open to that! How would you propose that happen?
from in-view.
I was gonna make a new issue, but this seems to be a nice, healthy discussion.
Have you thought about using Intersection Observer? It's currently only implemented in Chrome, but it's built exactly for what your use case is for. Other browsers require a polyfill
from in-view.
@vvo Agreed. I'll be familiarizing myself with it very soon.
Also, as long as we're discussing the future of this library, I think we should consider where (as @dogoku mentions) the IntersectionObserver
API fits in. Do we try to ape the API and extend it, or just use it under the hood when it's available?
I'm going to change the title of this issue so it can serve as a more general discussion of the roadmap.
from in-view.
Apparently you can't use markdown in issue titles 😼
from in-view.
Hi!
I think I read about using requestAnimationFrame(func)
instead of event listeners somewhere in the issues. Did you consider it? I think func
runs before the next render and after all scroll, resize, etc is applied. Also, I think the spec mentions that the animationFrame
queue must be copied before it is processed, so
function process () {
checkInView()
requestAnimationFrame(process)
}
would make a nice asynchronous infinite checking loop. You could also throttle it by
let lastCheck
function process (timestamp) {
if (lastCheck < (timeStamp - threshold)) {
lastCheck = timeStamp
checkInView()
}
requestAnimationFrame(process)
}
It might be better performance wise, but I am not sure it if it would work. I can test it if you think it's worth a chance.
Edit: Of course I suggest this as a fallback for IntersectionObserver
, not as a replacement to it.
from in-view.
@WickyNilliams Agreed. That would be a useful feature and was actually originally implemented but later removed. Mind sharing your implementation? Thanks!
from in-view.
@vvo I'm working on adding support for MutationObserver. Mind taking a look at #17?
from in-view.
@vvo
How do you detect style changes on descendant/nested nodes?
from in-view.
How do you detect style changes on descendant/nested nodes?
I think that's the subtree
parameter, it's already inside the PR
from in-view.
Here's where I'm at with next steps, in order of priority:
Set offset per direction(#6)- Set custom visibility threshold (#21)
- Allow custom container (#20)
- Cache scroll container dimensions (#19)
Thoughts and PRs appreciated. This issue is starting to sprawl a bit, so I'm going to close it now in favor of more focused discussions. Thanks everyone!
from in-view.
Related Issues (20)
- Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'. HOT 2
- inView.is Uncaught TypeError: Cannot read property 'getBoundingClientRect' of null HOT 2
- Is there a way to set multiple offsets for different DOM nodes
- How to tell if a 200vh element is at top of view? HOT 1
- Simplify `enter` / `exit` events processing with callback: possible to pass the event type into the callback?
- IntersectionObserver support HOT 9
- Accept single, or array of DOM elements
- Dynamic offset ? HOT 2
- Uncaught TypeError: this.handlers[t][n] is not a function in-view.min.js:6 HOT 1
- still maintained? HOT 11
- Replace lodash with lodash-es
- Feature request: loop on elements revealed at same position (stagger elements sequentially)
- Custom parent
- inView.is(YOUR_SELECTOR) throws an error HOT 2
- Can we get a non-minified distribution file please? HOT 1
- How to use this with React HOT 7
- Maybe this is a bad question, but trying to link script on a page yields this: HOT 5
- Tapping "Home" key does not fire enter / exit functions
- Get the data-attribute and classnames of the element on 'enter'?
- Not working in android WebView
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from in-view.