-
-
Notifications
You must be signed in to change notification settings - Fork 196
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Feat]: Add a fade plugin #39
Comments
Hi Damon (@dmorda), About:
Would you mind explaining what you mean a bit more in detail or provide an example? Because I need more information to answer this question, but I'm going to take a guess and ask if you've checked out the The answer to your question about the fade option is no, it has not been requested yet. I'm not sure what you mean by fade option because it can be done in many different ways so would you mind explaining a bit further? Thank you in advance! Best, |
Thanks for the quick response and a Merry Christmas to you as well. What I'm trying to achieve is a Fade effect , as an example view this page and search for the word "Fade". That will provide an example of what I'm trying to accomplish. Let me know if that helps! |
Hi again Damon (@dmorda), The vision for Embla is carousels that move in a fluid and natural manner. The assumption here is that the carousel should be scrollable, and that doesn't play well with fade sliders that don't feel natural when dragging/swiping. This is why a fade option is not a part of the Embla vision and won't be incorporated into the Embla core. But with that said, I've setup a CodeSandbox example for you, where I've created the fade effect just by tweaking some CSS. I hope that you'll find it useful! Best, |
That small tweak now lets me re-use Embla for both the fade version of a carousel and the normal sliding version. Thanks so much, happy holidays! |
Hi Damon (@dmorda), I’m glad to hear that 🙂. Thank you and happy holidays to you too! Kindly, |
Hey @davidjerleke, sorry for digging up an old issue but I found your sandbox for a fade slider (thanks!). While playing around with it, I noticed that every slide is seen as "in view" by the slider and subsequently gets the I added a Happy to hear your thoughts on this 🙂 Thanks! |
Hi @vntw, Thank you for noticing this.
Your suggestion does the trick, nice work 👍. I've updated the original CodeSandbox. I also added the
Thank you for your efforts! Best, |
Thank you @davidjerleke! |
Reopening this:As of v.6 it’s possible to provide plugins to Embla. A Fade plugin will be added in the future:
|
Great solution with the fade effect! I have an improvement suggestion for the CSS used in the SandBox. I was applying the example CSS code to my project and noticed that since In my case, I wanted the container to automatically use the height as defined by the slide markup itself. By changing the CSS to use
|
I think best practice would be to do something like this:
This requires the classes module but works perfect for me. Height of the container is automatically adapted to your selected slide. |
The sandbox linked multiple times here doesn't load anymore. Does anyone have a copy of the code? |
|
@davidjerleke thank you for your feedback. I think it's not really necessary because when using fade, we will adjust the width in the parent element and fade only works well when there is only 1 slide in each viewport. Don't care too much about these things, these are just some of my thoughts, because I don't understand Embla as deeply as you do, so if anything is incorrect, please forgive me. P/S: Thanks for your hard work, the fade plugin is awesome. |
Out of curiosity, will the fade duration be adjustable? For both autoplay and next / previous trigger, I feel as though a duration adjustment is almost a necessity. Great work thus far! |
@ItsFrankieD yes, the default duration option for the carousel constructor changes the fade duration. |
@meirroth yes. The plugin will expose the slide opacity states with a method called function loadImages(emblaApi) {
const opacities = emblaApi.plugins().fade.opacities();
opacities.forEach((opacity, snapIndex) => {
if (opacity === 0) return // Not visible so bail here
const slidesInSnap = emblaApi.internalEngine().slideRegistry[snapIndex];
slidesInSnap.forEach((slideIndex) => { /* Load image for slideIndex */ })
})
}
emblaApi.on('scroll', loadImages); |
@davidjerleke Thank you! I look forward to using this plugin on our homepage 😃 |
@meirroth, @sarussss, @ItsFrankieD, @sitoexpress, @walton-alex, @AndreiMotinga, @mil920, @HIT2022 and anyone else interested, feel free to test the fade plugin here. Let me know how it goes. |
@davidjerleke Thanks i tested it and i adapted it to ts and put it on my shadcn carousel and it work well. |
@mil920 thanks for letting me know! The package is written in TypeScript so that won't be a problem once officially released. |
@davidjerleke I tested again the Fade plugin you shared, and even tried it with the Vue wrapper and works perfectly. |
@meirroth thanks for your ideas! I've updated the work in progress plugin here with the following: Cleanup functionIt's now in place so calling Slides in viewI was able to shift slides with // Logging slides in view will work
emblaApi.on('slidesInView', (emblaApi) => {
console.log(emblaApi.slidesInView())
}) However, I'm not sure it makes sense to try recreating the inViewThreshold option. Because when shifting slides with |
@davidjerleke Not sure I follow 😬 But my lazy load implementation above works with your update, and 100% matches non fade carousels which is neat! |
Hi @davidjerleke |
Hi @davidjerleke.
It's not a bug, I want to do it with embla, but I don't know how to do it. |
@sarussss use the breakpoints option: const emblaNode = document.querySelector('.embla')
const emblaApi = EmblaCarousel(emblaNode, { loop: true }, [Fade({
breakpoints: {
'(min-width: 768px)': { active: false }
}
})]) |
@davidjerleke thank of ton. |
Only code cleanup and creating the documentation page for the fade plugin left to do before release. All features done ✅. |
Awesome, thank you! |
Released in |
In my tests the fade effect seemed a little stuck, perhaps due to the greater number of children in the item, change duration with 20 and in CSS this rule made it smoother;
|
@ribeiroeder I suggest you also try lazy loading slides, that might help performance. Here's the implementation from earlier in this thread: https://stackblitz.com/edit/embla-carousel-nuxt-fade-lazy?file=app.vue |
Love the carousel and was able to get it working right away. The one thing that I need that it doesn't provide is a way to have a scroll option for single/multiple slides and a fade option to handle next/previous transition when it's just showing a single slide at a time.
Is that something that has been requested before?
The text was updated successfully, but these errors were encountered: