0

Mobile Powerstation

EES go

Mobile Powerstation

EES 1/1

Mobile Powerstation

EES 2/1

Mobile Powerstation

EES 2/2

Lade fast alles auf.
Jederzeit und überall.

ca.3

Stunden

TV

ca.4

Stunden

Haus Beleuchtung

ca.6

Stunden

Kühlschrank

ca.7

Stunden (Ohne Heizung)

Aquarium

ca.1

Aufladung

E-bike

ca.4

Aufladungen

Drohne

ca.6

Aufladungen

Laptop

ca.8

Stunden

Kühlbox

ca.28

Aufladungen

Smartphone

ca.34

Aufladungen

Kamera

ca.3

Stunden

medizinisches Beatmungsgerät

ca.4

Stunden

Wohnung Beleuchtungssystem

ca.1

Stunde

Mikrowelle

ca.7

Stunden

TV

ca.10

Stunden

Haus Beleuchtung

ca.13

Stunden

Kühlschrank

ca.16

Stunden (Ohne Heizung)

Aquarium

ca.3

Aufladungen

E-bike

ca.10

Aufladungen

Drohne

ca.14

Aufladungen

Laptop

ca.18

Stunden

Kühlbox

ca.66

Aufladungen

Smartphone

ca.79

Aufladungen

Kamera

ca.8

Stunden

medizinisches Beatmungsgerät

ca.10

Stunden

Wohnung Beleuchtungssystem

ca.1,4

Stunde

Mikrowelle

ca.9

Stunden

TV

ca.14

Stunden

Haus Beleuchtung

ca.18

Stunden

Kühlschrank

ca.22

Stunden (Ohne Heizung)

Aquarium

ca.4

Aufladungen

E-bike

ca.14

Aufladungen

Drohne

ca.18

Aufladungen

Laptop

ca.24

Stunden

Kühlbox

ca.90

Aufladungen

Smartphone

ca.108

Aufladungen

Kamera

 

Feuerwehr

BOS

ca.11

Stunden

medizinisches Beatmungsgerät

ca.14

Stunden

Wohnung Beleuchtungssystem

ca.2

Stunde

Mikrowelle

ca.14

Stunden

TV

ca.20

Stunden

Haus Beleuchtung

ca.28

Stunden

Kühlschrank

ca.33

Stunden (Ohne Heizung)

Aquarium

ca.6

Aufladungen

E-bike

ca.20

Aufladungen

Drohne

ca.28

Aufladungen

Laptop

ca.36

Stunden

Kühlbox

ca.138

Aufladungen

Smartphone

ca.165

Aufladungen

Kamera

 

Feuerwehr

BOS

ca.16

Stunden

medizinisches Beatmungsgerät

ca.20

Stunden

Wohnung Beleuchtungssystem

Leistungsstark

Mit einer Dauerleistung von 500 bis 2200 W bist Du für fast alle Eventualitäten gerüstet. Das intelligente Energiemanagement erlaubt es Dir, kurzfristig mehr Leistung abzurufen um somit Anlaufströme zu überbrücken.

Alles auf einen Blick

Auf dem neu gestalteten Display siehst Du auf einen Blick alle wichtigen Informationen deines EES.

 

Sicherheit ohne Kompromisse

ENDRESS Stromerzeuger ist ein führender Hersteller seiner Branche und in den Produktlinien kanalisieren sich technische Leistung, ambitionierte Weiterentwicklung und leidenschaftlich gelebte Qualität zu hochausgereiften Lösungen, deren Anwendungsfreundlichkeit sich täglich aufs Neue beweist. Der ENDRESS EES erfüllt alle technischen Voraussetzungen und besitzt alle Zertifikate, welche den ENDRESS EES zu einem der sichersten Energiespeicher in seiner Klasse machen.

 

Superschnell aufladen

Dein EES lässt sich superschnell aufladen. Darüber hinaus bieten wir Dir zahlreiche Lademöglichkeiten.

Jetzt Kaufen

(1) EES go verwendet einen AC-Adapter.
(2) Es kann ein separat erhältliches 100W Solarpanel angeschlossen werden.

 

Superschnell aufladen

Dein EES lässt sich superschnell aufladen. Darüber hinaus bieten wir Dir zahlreiche Lademöglichkeiten.

Jetzt Kaufen

(1) EES 1/1 verwendet einen AC-Adapter.
(2) Es kann ein separat erhältliches 100W Solarpanel angeschlossen werden.

 

Superschnell aufladen

Dein EES lässt sich superschnell aufladen. Darüber hinaus bieten wir Dir zahlreiche Lademöglichkeiten.

Jetzt Kaufen

(1) EES 2/1 wird direkt an das Stromnetz angeschlossen.
(2) Es kann ein separat erhältliches 800W Solarpanel angeschlossen werden.

 

Superschnell aufladen

Dein EES lässt sich superschnell aufladen. Darüber hinaus bieten wir Dir zahlreiche Lademöglichkeiten.

Jetzt Kaufen

(1) EES 2/2 wird direkt an das Stromnetz angeschlossen.
(2) Es kann ein separat erhältliches 800W Solarpanel angeschlossen werden.

Nutze die Kraft der Sonne für grenzenlose Unabhängigkeit

Die ENDRESS EES Energiespeicher können netzunabhängig per Solarpanel aufgeladen werden.

Einfach das separat erhältliche ENDRESS PV-Kit anschließen und unabhängig und ohne Emissionen laden.

Demnächst Verfügbar

4000W

Parallelfähig

Obwohl der EES 2/1 und EES 2/2 kraftvoll ausgelegt sind, kann es vorkommen, dass Du kurzfristig einen höheren Leistungsbedarf als im Alltag hast. Hierbei hilft Dir die ENDRESS Parallel Lösung! Über ein Verbindungskabel können zwei EES 2/1 oder zwei EES 2/2 parallel betrieben werden und somit nahezu die doppelte Leistung abgerufen werden. Somit kannst Du auch Endverbraucher betreiben, welche mehr Leistung benötigen.

Batterie-Technologie

In unseren ENDRESS EES Energiespeichern sind Lithium-Ionen Batterien verbaut welche einen Betrieb bei hohen als auch bei niedrigen Umgebungstemperaturen von -10°C bis +40°C ermöglichen. Somit lassen Dich unsere EES Energiespeicher niemals im Stich.

18650 NCM

Lithium-Ionen Batterie

21700 NCM

Lithium-Ionen Batterie

Kabelloses Laden

Bist Du immer auf der Suche nach dem passenden Ladekabel für dein Smartphone? Die ENDRESS EES Energiespeicher verfügen über eine kabellose Ladezone.

Die ENDRESS EES Energiespeicher liefern sauberen Strom ohne CO2 Emissionen und bei flüsterleisem Betrieb.

Null Emissionen.
100 Prozent Power.

Somit hast Du die Möglichkeit deine Geräte in Innenräumen oder im Auto mit Strom zu versorgen und kannst Dich auf andere Aufgaben konzentrieren.

Einsparrechner

Leicht und Kompakt

Wir haben bei der Entwicklung darauf geachtet, dass die ENDRESS EES Energiespeicher besonders handlich werden. Mit einem Gewicht von 4,3 bis 15,2 kg und den kompakten Abmessungen, hast Du einen treuen Begleiter im Alltag.

 
 

EES go

EES 1/1

EES 2/1

EES 2/2

Nennleistung
Dauerleistung
500W 1000W 1800W 2200W
Nennleistung
Spitzenleistung
1000W 2000W 3600W 4400W
Batteriekapazität 400Wh (22,2V 18Ah) 933Wh (22,2V 42Ah) 1270Wh (44,4V 28.6Ah) 1944Wh (43,2 V 45 Ah)
Maße (L x B x H) 230 x 168 x 178 mm 290 x 201 x 200 mm 350 x 265 x 240 mm 350 x 265 x 240 mm
Gewicht 4,3 kg 8,6 kg 14 kg 15,2 kg
Ladetemperatur 0 / +40°C 0 / +40°C 0 / +45°C 0 / +45°C
Entladetemperatur -10 / +40°C -10 / +40°C -10 / +45°C -10 / +45°C
Ladezyklen 500 ≥ 80% 500 ≥ 80% 700 ≥ 80% 1000 ≥ 80%
Ladezeit 4,0 h 6,2 h 1,6 h 1,9 h
         
Wireless Charger
10 W
Zigarettenanzünder
12 V / 10 A
60 W
60 W
80 W
80 W
AC Input
800 W
1000 W
Solar Input
100 W
120 W
800 W
800 W
DC Input
100 W
150 W
AC Output
Dauerleistung
1 x 500 W(1)
2 x 1000 W (1)
3 x 1800 W (1)
3 x 2200 W (1)
AC Output
Spitzenleistung
1000 W (1)
2000 W (1)
3600 W (1)
4400 W (1)
DC5525 Output
x 2
x 2
DC Output
(Zigaretten­anzünder 12V / 10A)
 
 
 
 
 
 
 
 
USB-C
PD 3.0 60 W
x 2 (120 W max.)
x 2 (120 W max.)
USB-A
QC 3.0 18 W
x 3 (54 W max.)
x 3 (54 W max.)
x 2 (36 W max.)
x 2 (36 W max.)
LCD Display
LED Licht 1W
(2)
(2)
Taschenlampe 1W
(2)
(2)
ECO Knopf

(1) Saubere Sinuskurve.
(2) mit SOS-Modus.

Lieferumfang

EES go

Im Lieferumfang enthalten:

  • AC-Ladekabel und Adapter
  • Autoladekabel (Zigarettenanzünder an DC7909)
  • Betriebsanleitung

379 €  549 €

inkl. MwSt.

EES 1/1

Im Lieferumfang enthalten:

  • AC-Ladekabel und Adapter
  • Autoladekabel (Zigarettenanzünder an DC7909)
  • Betriebsanleitung

749 €  1.099 €

inkl. MwSt.

EES 2/1

Im Lieferumfang enthalten:

  • AC-Ladekabel und Adapter
  • Autoladekabel (Zigarettenanzünder an DC7909)
  • Betriebsanleitung

1.229 €  1.799 €

inkl. MwSt.

EES 2/2

Im Lieferumfang enthalten:

  • AC-Ladekabel und Adapter
  • Autoladekabel (Zigarettenanzünder an DC7909)
  • Betriebsanleitung

1.699 €  2.459 €

inkl. MwSt.

AC-Ladekabel

 

Autoladekabel

Zigarettenanzünder an EC5

Verfügbares Zubehör

PV-Kit

Faltbares Solarpanel zum direkten Anschluss

Solarladekabel

MC4 zu EC5

Parallel-Kabel

Um zwei EES 2/1 oder EES 2/2 über parallele Anschlüsse zu verbinden.

Bevor's losgeht:

Wir respektieren Ihre Privatsphäre. Für Ihre optimale Online-Erfahrung verwenden wir Usercentrics. Dieser Dienst bietet Transparenz für alle Cookie-Nutzungen und Tracking-Technologien auf der Website und ermöglicht es uns, Ihre Einwilligung zu einzelnen Diensten datenschutzkonform einzuholen. Wir bitten Sie hiermit um Ihre Einwilligung, Usercentrics anzuwenden. Sie können diese und alle weiteren Dienste und Einwilligungen nach der Aktivierung von Usercentrics jederzeit ändern/widerrufen, indem Sie auf die Schaltfläche ‘Einstellungen’ in der linken unteren Ecke der Seite klicken.

Hier erfahren Sie mehr

import UAParser from 'ua-parser-js'; import videoDecoder from './videoDecoder'; /** * ____ _ _ __ ___ _ * / ___| ___ _ __ ___ | | |_ \ \ / (_) __| | ___ ___ * \___ \ / __| '__/ _ \| | | | | \ \ / /| |/ _` |/ _ \/ _ \ * ___) | (__| | | (_) | | | |_| |\ V / | | (_| | __/ (_) | * |____/ \___|_| \___/|_|_|\__, | \_/ |_|\__,_|\___|\___/ * |___/ * * Responsive scrollable videos without obscure video encoding requirements. * Compatible with React, Svelte, Vue, and plain HTML. */ class ScrollyVideo { constructor({ src, // The src of the video, required scrollyVideoContainer, // The dom element or id that this object will be created in, required cover = true, // Whether the video should "cover" inside the container sticky = true, // Whether the video should "stick" to the top of the container full = true, // Whether the container should expand to 100vh and 100vw trackScroll = true, // Whether this object should automatically respond to scroll transitionSpeed = 8, // How fast the video transitions between points frameThreshold = 0.1, // When to stop the video animation, in seconds useWebCodecs = true, // Whether to try using the webcodecs approach debug = false, // Whether to print debug stats to the console }) { // Make sure that we have a DOM if (typeof document !== 'object') { console.error('ScrollyVideo must be initiated in a DOM context'); return; } // Make sure the basic arguments are set for scrollyvideo if (!scrollyVideoContainer) { console.error('scrollyVideoContainer must be a valid DOM object'); return; } if (!src) { console.error('Must provide valid video src to ScrollyVideo'); return; } // Save the container. If the container is a string we get the element // eslint-disable-next-line no-undef if (scrollyVideoContainer instanceof Element) this.container = scrollyVideoContainer; // otherwise it should better be an element else if (typeof scrollyVideoContainer === 'string') { // eslint-disable-next-line no-undef this.container = document.getElementById(scrollyVideoContainer); if (!this.container) throw new Error('scrollyVideoContainer must be a valid DOM object'); } else { throw new Error('scrollyVideoContainer must be a valid DOM object'); } // Save the constructor options this.src = src; this.transitionSpeed = transitionSpeed; this.frameThreshold = frameThreshold; this.useWebCodecs = useWebCodecs; this.cover = cover; this.sticky = sticky; this.full = full; this.trackScroll = trackScroll; this.debug = debug; // Create the initial video object. Even if we are going to use webcodecs, // we start with a paused video object // eslint-disable-next-line no-undef this.video = document.createElement('video'); this.video.src = src; this.video.preload = 'auto'; this.video.tabIndex = 0; this.video.autobuffer = true; this.video.playsInline = true; this.video.muted = true; this.video.pause(); this.video.load(); // Adds the video to the container this.container.appendChild(this.video); // Setting CSS properties for sticky if (sticky) { this.container.style.display = 'block'; this.container.style.position = 'sticky'; this.container.style.top = '0'; } // Setting CSS properties for full if (full) { this.container.style.width = '100%'; this.container.style.height = '100vh'; this.container.style.overflow = 'hidden'; } // Setting CSS properties for cover if (cover) this.setCoverStyle(this.video); // Detect webkit (safari), because webkit requires special attention const browserEngine = new UAParser().getEngine(); // eslint-disable-next-line no-undef this.isSafari = browserEngine.name === 'WebKit'; if (debug && this.isSafari) console.info('Safari browser detected'); // Initialize state variables this.currentTime = 0; // Saves the currentTime of the video, synced with this.video.currentTime this.targetTime = 0; // The target time before a transition happens this.canvas = null; // The canvas for drawing the frames decoded by webCodecs this.context = null; // The canvas context this.frames = []; // The frames decoded by webCodecs this.frameRate = 0; // Calculation of frameRate so we know which frame to paint // Add scroll listener for responding to scroll position this.updateScrollPercentage = (jump) => { // Used for internally setting the scroll percentage based on built-in listeners const containerBoundingClientRect = this.container.parentNode.getBoundingClientRect(); // Calculate the current scroll percent of the video const scrollPercent = -containerBoundingClientRect.top / // eslint-disable-next-line no-undef (containerBoundingClientRect.height - window.innerHeight); if (this.debug) console.info('ScrollyVideo scrolled to', scrollPercent); // Set the target time percent this.setTargetTimePercent(scrollPercent, { jump }); }; // Add our event listeners for handling changes to the window or scroll if (this.trackScroll) { // eslint-disable-next-line no-undef window.addEventListener('scroll', this.updateScrollPercentage); // Set the initial scroll percentage this.video.addEventListener( 'loadedmetadata', () => this.updateScrollPercentage(true), { once: true }, ); } else { this.video.addEventListener( 'loadedmetadata', () => this.setTargetTimePercent(0, { jump: true }), { once: true }, ); } // Add resize function this.resize = () => { if (this.debug) console.info('ScrollyVideo resizing...'); // On resize, we need to reset the cover style if (this.cover) this.setCoverStyle(this.canvas || this.video); // Then repaint the canvas, if we are in useWebcodecs this.paintCanvasFrame(Math.floor(this.currentTime * this.frameRate)); }; // eslint-disable-next-line no-undef window.addEventListener('resize', this.resize); this.video.addEventListener('progress', this.resize); // Calls decode video to attempt webcodecs method this.decodeVideo(); } /** * Sets the style of the video or canvas to "cover" it's container * * @param el */ setCoverStyle(el) { if (this.cover) { /* eslint-disable no-param-reassign */ el.style.position = 'absolute'; el.style.top = '50%'; el.style.left = '50%'; el.style.transform = 'translate(-50%, -50%)'; el.style.minWidth = '101%'; el.style.minHeight = '101%'; // Gets the width and height of the container const { width: containerWidth, height: containerHeight } = this.container.getBoundingClientRect(); // Gets the width and height of the video frames const width = el.videoWidth || el.width; const height = el.videoHeight || el.height; if (this.debug) console.info('Container dimensions:', [ containerWidth, containerHeight, ]); if (this.debug) console.info('Element dimensions:', [width, height]); // Determines which axis needs to be 100% and which needs to be scaled if (containerWidth / containerHeight > width / height) { el.style.width = '100%'; el.style.height = 'auto'; } else { el.style.height = '100%'; el.style.width = 'auto'; } /* eslint-enable no-param-reassign */ } } /** * Uses webCodecs to decode the video into frames */ decodeVideo() { if (this.useWebCodecs && this.src) { videoDecoder( this.src, (frame) => { this.frames.push(frame); }, this.debug, ) .catch(() => { if (this.debug) console.error('Error encountered while decoding video'); // Remove all decoded frames if a failure happens during decoding this.frames = []; // Force a video reload when videoDecoder fails this.video.load(); }) .then(() => { // If no frames, something went wrong if (this.frames.length === 0) { if (this.debug) console.error('No frames were received from webCodecs'); return; } // Calculate the frameRate based on number of frames and the duration this.frameRate = this.frames.length / this.video.duration; if (this.debug) console.info('Received', this.frames.length, 'frames'); // Remove the video and add the canvas // eslint-disable-next-line no-undef this.canvas = document.createElement('canvas'); this.context = this.canvas.getContext('2d'); // Hide the video and add the canvas to the container this.video.style.display = 'none'; this.container.appendChild(this.canvas); if (this.cover) this.setCoverStyle(this.canvas); // Paint our first frame this.paintCanvasFrame(Math.floor(this.currentTime * this.frameRate)); }); } } /** * Paints the frame of to the canvas * * @param frameNum */ paintCanvasFrame(frameNum) { if (this.canvas) { // Get the frame and paint it to the canvas const currFrame = this.frames[frameNum]; if (currFrame) { if (this.debug) console.info('Painting frame', frameNum); // Make sure the canvas is scaled properly, similar to setCoverStyle this.canvas.width = currFrame.width; this.canvas.height = currFrame.height; const { width, height } = this.container.getBoundingClientRect(); if (width / height > currFrame.width / currFrame.height) { this.canvas.style.width = '100%'; this.canvas.style.height = 'auto'; } else { this.canvas.style.height = '100%'; this.canvas.style.width = 'auto'; } // Draw the frame to the canvas context this.context.drawImage( currFrame, 0, 0, currFrame.width, currFrame.height, ); } } } /** * Transitions the video or the canvas to the proper frame. * * @param options - Configuration options for adjusting the video playback. * - jump: boolean - If true, the video currentTime will jump directly to the specified percentage. If false, the change will be animated over time. * - transitionSpeed: number - Defines the speed of the transition when `jump` is false. Represents the duration of the transition in milliseconds. Default is 8. * - easing: (progress: number) => number - A function that defines the easing curve for the transition. It takes the progress ratio (a number between 0 and 1) as an argument and returns the eased value, affecting the playback speed during the transition. */ transitionToTargetTime({ jump, transitionSpeed = this.transitionSpeed, easing = null, }) { if (this.debug) { console.info( 'Transitioning targetTime:', this.targetTime, 'currentTime:', this.currentTime, ); } const diff = this.targetTime - this.currentTime; const distance = Math.abs(diff); const duration = distance * 1000; const isForwardTransition = diff > 0; const tick = ({ startCurrentTime, startTimestamp, timestamp }) => { const progress = (timestamp - startTimestamp) / duration; // if frameThreshold is too low to catch condition Math.abs(this.targetTime - this.currentTime) < this.frameThreshold const hasPassedThreshold = isForwardTransition ? this.currentTime >= this.targetTime : this.currentTime <= this.targetTime; // If we are already close enough to our target, pause the video and return. // This is the base case of the recursive function if ( // eslint-disable-next-line no-restricted-globals isNaN(this.targetTime) || // If the currentTime is already close enough to the targetTime Math.abs(this.targetTime - this.currentTime) < this.frameThreshold || hasPassedThreshold ) { this.video.pause(); if (this.transitioningRaf) { // eslint-disable-next-line no-undef cancelAnimationFrame(this.transitioningRaf); this.transitioningRaf = null; } return; } // Make sure we don't go out of time bounds if (this.targetTime > this.video.duration) this.targetTime = this.video.duration; if (this.targetTime < 0) this.targetTime = 0; // How far forward we need to transition const transitionForward = this.targetTime - this.currentTime; const easedProgress = easing && Number.isFinite(progress) ? easing(progress) : null; const easedCurrentTime = isForwardTransition ? startCurrentTime + easedProgress * Math.abs(distance) * transitionSpeed : startCurrentTime - easedProgress * Math.abs(distance) * transitionSpeed; if (this.canvas) { if (jump) { // If jump, we go directly to the frame this.currentTime = this.targetTime; } else if (easedProgress) { this.currentTime = easedCurrentTime; } else { this.currentTime += transitionForward / (256 / transitionSpeed); } this.paintCanvasFrame(Math.floor(this.currentTime * this.frameRate)); } else if (jump || this.isSafari || !isForwardTransition) { // We can't use a negative playbackRate, so if the video needs to go backwards, // We have to use the inefficient method of modifying currentTime rapidly to // get an effect. this.video.pause(); if (easedProgress) { this.currentTime = easedCurrentTime; } else { this.currentTime += transitionForward / (64 / transitionSpeed); } // If jump, we go directly to the frame if (jump) { this.currentTime = this.targetTime; } this.video.currentTime = this.currentTime; } else { // Otherwise, we play the video and adjust the playbackRate to get a smoother // animation effect. const playbackRate = Math.max( Math.min(transitionForward * 4, transitionSpeed, 16), 1, ); if (this.debug) console.info('ScrollyVideo playbackRate:', playbackRate); // eslint-disable-next-line no-restricted-globals if (!isNaN(playbackRate)) { this.video.playbackRate = playbackRate; this.video.play(); } // Set the currentTime to the video's currentTime this.currentTime = this.video.currentTime; } // Recursively calls ourselves until the animation is done. if (typeof requestAnimationFrame === 'function') { // eslint-disable-next-line no-undef this.transitioningRaf = requestAnimationFrame((currentTimestamp) => tick({ startCurrentTime, startTimestamp, timestamp: currentTimestamp, }), ); } }; if (typeof requestAnimationFrame === 'function') { // eslint-disable-next-line no-undef this.transitioningRaf = requestAnimationFrame((startTimestamp) => { tick({ startCurrentTime: this.currentTime, startTimestamp, timestamp: startTimestamp, }); }); } } /** * Sets the currentTime of the video as a specified percentage of its total duration. * * @param setPercentage - The percentage of the video duration to set as the current time. * @param options - Configuration options for adjusting the video playback. * - jump: boolean - If true, the video currentTime will jump directly to the specified percentage. If false, the change will be animated over time. * - transitionSpeed: number - Defines the speed of the transition when `jump` is false. Represents the duration of the transition in milliseconds. Default is 8. * - easing: (progress: number) => number - A function that defines the easing curve for the transition. It takes the progress ratio (a number between 0 and 1) as an argument and returns the eased value, affecting the playback speed during the transition. */ setTargetTimePercent(setPercentage, options = {}) { // eslint-disable-next-line // The time we want to transition to this.targetTime = Math.max(Math.min(setPercentage, 1), 0) * (this.frames.length && this.frameRate ? this.frames.length / this.frameRate : this.video.duration); // If we are close enough, return early if ( !options.jump && Math.abs(this.currentTime - this.targetTime) < this.frameThreshold ) return; // Play the video if we are in video mode if (!this.canvas && !this.video.paused) this.video.play(); this.transitionToTargetTime(options); } /** * Simulate trackScroll programmatically (scrolls on page by percentage of video) * * @param percentage */ setScrollPercent(percentage) { if (!this.trackScroll) { console.warn('`setScrollPercent` requires enabled `trackScroll`'); return; } const parent = this.container.parentNode; const { top, height } = parent.getBoundingClientRect(); // eslint-disable-next-line no-undef const startPoint = top + window.pageYOffset; // eslint-disable-next-line no-undef const containerHeightInViewport = height - window.innerHeight; const targetPoint = startPoint + containerHeightInViewport * percentage; // eslint-disable-next-line no-undef window.scrollTo({ top: targetPoint, behavior: 'smooth' }); } /** * Call to destroy this ScrollyVideo object */ destroy() { if (this.debug) console.info('Destroying ScrollyVideo'); if (this.trackScroll) // eslint-disable-next-line no-undef window.removeEventListener('scroll', this.updateScrollPercentage); // eslint-disable-next-line no-undef window.removeEventListener('resize', this.resize); // Clear component if (this.container) this.container.innerHTML = ''; } } export default ScrollyVideo;