Add actions
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
import Arrow from '../Arrow/Arrow.svelte'
|
import Arrow from '../Arrow/Arrow.svelte'
|
||||||
import { NEXT, PREV } from '../../direction'
|
import { NEXT, PREV } from '../../direction'
|
||||||
import { swipeable } from '../../utils/swipeable'
|
import { swipeable } from '../../utils/swipeable'
|
||||||
|
import { hoverable } from '../../utils/hoverable'
|
||||||
import {
|
import {
|
||||||
addResizeEventListener,
|
addResizeEventListener,
|
||||||
removeResizeEventListener
|
removeResizeEventListener
|
||||||
@@ -76,6 +77,16 @@
|
|||||||
let offset = 0
|
let offset = 0
|
||||||
let pageWindowElement
|
let pageWindowElement
|
||||||
let pagesElement
|
let pagesElement
|
||||||
|
let hovered = false
|
||||||
|
|
||||||
|
let autoplayIntervals = []
|
||||||
|
$: {
|
||||||
|
if (hovered) {
|
||||||
|
clearAutoplay()
|
||||||
|
} else {
|
||||||
|
applyAutoplay()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// used for lazy loading images, preloaded only current, adjacent and cloanable images
|
// used for lazy loading images, preloaded only current, adjacent and cloanable images
|
||||||
$: loaded = getAdjacentIndexes(originalCurrentPageIndex, originalPagesCount, infinite)
|
$: loaded = getAdjacentIndexes(originalCurrentPageIndex, originalPagesCount, infinite)
|
||||||
@@ -96,15 +107,17 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function applyAutoplay() {
|
function applyAutoplay() {
|
||||||
let interval
|
|
||||||
if (autoplay) {
|
if (autoplay) {
|
||||||
interval = setInterval(() => {
|
let autoplayInterval = setInterval(() => {
|
||||||
directionFnDescription[autoplayDirection]()
|
directionFnDescription[autoplayDirection]()
|
||||||
}, autoplayDuration)
|
}, autoplayDuration)
|
||||||
|
autoplayIntervals.push(autoplayInterval)
|
||||||
}
|
}
|
||||||
return () => {
|
}
|
||||||
interval && clearInterval(interval)
|
function clearAutoplay() {
|
||||||
}
|
while(autoplayIntervals.length) {
|
||||||
|
clearInterval(autoplayIntervals.pop())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function addClones() {
|
function addClones() {
|
||||||
@@ -128,12 +141,13 @@
|
|||||||
infinite && addClones()
|
infinite && addClones()
|
||||||
applyPageSizes()
|
applyPageSizes()
|
||||||
}
|
}
|
||||||
cleanupFns.push(applyAutoplay())
|
applyAutoplay()
|
||||||
addResizeEventListener(applyPageSizes)
|
addResizeEventListener(applyPageSizes)
|
||||||
})()
|
})()
|
||||||
})
|
})
|
||||||
|
|
||||||
onDestroy(() => {
|
onDestroy(() => {
|
||||||
|
clearAutoplay()
|
||||||
removeResizeEventListener(applyPageSizes)
|
removeResizeEventListener(applyPageSizes)
|
||||||
cleanupFns.filter(fn => fn && typeof fn === 'function').forEach(fn => fn())
|
cleanupFns.filter(fn => fn && typeof fn === 'function').forEach(fn => fn())
|
||||||
})
|
})
|
||||||
@@ -198,8 +212,16 @@
|
|||||||
function handleSwipeEnd() {
|
function handleSwipeEnd() {
|
||||||
showPage(currentPageIndex, { offsetDelay: 0, animated: true })
|
showPage(currentPageIndex, { offsetDelay: 0, animated: true })
|
||||||
}
|
}
|
||||||
|
function handleHovered(event) {
|
||||||
|
console.log('hovered', event.detail.value)
|
||||||
|
hovered = event.detail.value
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
hovered={hovered}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="sc-carousel__carousel-container">
|
<div class="sc-carousel__carousel-container">
|
||||||
<div class="sc-carousel__content-container">
|
<div class="sc-carousel__content-container">
|
||||||
{#if arrows}
|
{#if arrows}
|
||||||
@@ -216,6 +238,8 @@
|
|||||||
<div
|
<div
|
||||||
class="sc-carousel__pages-window"
|
class="sc-carousel__pages-window"
|
||||||
bind:this={pageWindowElement}
|
bind:this={pageWindowElement}
|
||||||
|
use:hoverable
|
||||||
|
on:hovered={handleHovered}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="sc-carousel__pages-container"
|
class="sc-carousel__pages-container"
|
||||||
|
|||||||
39
src/utils/hoverable.js
Normal file
39
src/utils/hoverable.js
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import { createDispatcher } from './event'
|
||||||
|
|
||||||
|
export function hoverable(node) {
|
||||||
|
const dispatch = createDispatcher(node)
|
||||||
|
|
||||||
|
function handleMouseenter() {
|
||||||
|
dispatch('hovered', { value: true })
|
||||||
|
|
||||||
|
// node.addEventListener('mouseleave', handleMouseleave)
|
||||||
|
// node.addEventListener('touchend', handleMouseleave)
|
||||||
|
// node.addEventListener('touchcancel', handleMouseleave)
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleMouseleave() {
|
||||||
|
dispatch('hovered', { value: false })
|
||||||
|
|
||||||
|
// node.removeEventListener('mouseleave', handleMouseleave)
|
||||||
|
// node.removeEventListener('touchend', handleMouseleave)
|
||||||
|
// node.removeEventListener('touchcancel', handleMouseleave)
|
||||||
|
}
|
||||||
|
|
||||||
|
node.addEventListener('mouseenter', handleMouseenter)
|
||||||
|
node.addEventListener('touchstart', handleMouseenter)
|
||||||
|
|
||||||
|
node.addEventListener('mouseleave', handleMouseleave)
|
||||||
|
node.addEventListener('touchend', handleMouseleave)
|
||||||
|
node.addEventListener('touchcancel', handleMouseleave)
|
||||||
|
|
||||||
|
return {
|
||||||
|
destroy() {
|
||||||
|
node.removeEventListener('mouseenter', handleMouseenter)
|
||||||
|
node.removeEventListener('touchstart', handleMouseenter)
|
||||||
|
|
||||||
|
node.removeEventListener('mouseleave', handleMouseleave)
|
||||||
|
node.removeEventListener('touchend', handleMouseleave)
|
||||||
|
node.removeEventListener('touchcancel', handleMouseleave)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user