Sleva na dani na dítě

Sdílíte domácnost se svými nezaopatřenými dětmi? V tom případě máte nárok na finanční podporu od státu v podobě daňového zvýhodnění na děti. To je možné uplatnit prostřednictvím slevy na dani, daňového bonusu nebo jejich kombinací, přičemž vždy záleží na tom, jak vysoké jsou vaše příjmy. Pamatujte ovšem na to, že slevu na dítě může uplatnit pouze jeden z poplatníků, kteří žijí s dětmi ve společné domácnosti.

Kdo je vyživovaným dítětem?

Slevu na dítě je možné uplatnit na každého vyživovaného potomka, který s vámi sdílí společnou domácnost. Podle zákona o daních z příjmů se za vyživované dítě považuje nezletilá osoba (dítě ve věku do 18 let), ale také zletilé dítě až do dovršení věku 26 let, pokud mu není přiznán invalidní důchod pro invaliditu 3. stupně. Taková osoba však musí spadat do jedné z následujících kategorií:

  • jedná se o dítě do 26 let, které se soustavně připravuje na výkon budoucího povolání (dítě, které má status studenta),
  • jedná se o dítě do 26 let, které se nemůže soustavně připravovat na budoucí povolání ani vykonávat výdělečnou činnost kvůli nemoci či úrazu, nebo
  • jde o dítě do 26 let, které z důvodu dlouhodobě nepříznivého zdravotního stavu není schopné vykonávat soustavnou výdělečnou činnost.

Jestliže nestudující dítě dovrší 18 let nebo student dosáhne věku 26 let v průběhu měsíce, je možné započítat do daňového zvýhodnění ještě i daný měsíc, kdy k tomu došlo. Pro děti narozené prvního dne v měsíci je však situace jiná. Pokud dovrší 18 nebo 26 let první den v měsíci, podmínka pro nárok na slevu na dítě již splněna není a tento měsíc tak již žádné daňové zvýhodnění nezískáte.

Podle § 35c odst. 6 zákona č. 586/1992 Sb., o daních z příjmů se pak za vyživované dítě považuje:

  • dítě vlastní,
  • dítě osvojené,
  • dítě v péči, která nahrazuje péči rodičů,
  • dítě druhého z manželů.

Kdo může uplatnit slevu na dítě?

Rodiče, kteří chtějí daňové zvýhodnění na své potomky uplatnit, se nejčastěji ptají, kdo má nárok na uplatnění slevy na dítě a kdy lze slevu na dítě vlastně uplatnit. Toto daňové zvýhodnění, někdy označované také jako odpočet na děti či úleva na děti, se pojí s příjmovou hranicí, kterou je nutné překročit. Zároveň je dobré vědět, že zvýhodnění na dítě může uplatnit pouze jeden z rodičů (poplatníků), kteří žijí ve společně hospodařící domácnosti.

Abyste mohli slevu na děti uplatnit, vaše příjmy ze zaměstnání či podnikání za předchozí kalendářní rok musí přesáhnout alespoň 6násobek minimální měsíční mzdy. Pro rok 2024 se tedy jedná o částku příjmu min. 113 400 Kč.

Pokud se řadíte mezi zaměstnance, do zmíněné částky se počítá vaše hrubá mzda, v podnikání jsou to pak veškeré příjmy (nikoliv zisk). Nezáleží přitom, zda osoba samostatně výdělečně činná uplatňuje paušální, či reálné výdaje. Co se týče měsíčního daňového zvýhodnění, aby měl zaměstnanec nárok na tuto slevu, je nutné dosáhnout vyměřovacího základu, který se rovná alespoň polovině aktuální minimální mzdy.

Někteří zaměstnanci pracují současně pro více zaměstnavatelů a je tedy dobré zdůraznit, že daňové zvýhodnění se dá uplatnit také při práci na DPP nebo DPČ. Slevu na dítě však můžete získat pouze u jednoho zaměstnavatele, a to konkrétně tam, kde jste podepsali prohlášení k dani.

Jak je to se společnou domácností?

Jak již bylo zmíněno výše, v České republice platí pro uplatnění slevy na dítě podmínka, že vyživované osoby musí s poplatníkem sdílet společnou domácnost. Pro účely zákona o daních z příjmů se společně hospodařící domácností rozumí společenství fyzických osob, které spolu trvale žijí a uhrazují dohromady náklady na své potřeby.

V souvislosti s uplatňováním slevy na dítě spoustu lidí zajímá také to, zda se situace nějak mění v případě, že se jejich ratolest dočasně zdržuje mimo společnou domácnost. Pokud se váš potomek například rozhodne cestovat, dočasný pobyt mimo společně hospodařící domácnost nemá na uplatnění daňového zvýhodnění žádný vliv. O slevu tedy nepřijdete.

Pokud jsou rodiče dítěte rozvedení, zákon samozřejmě počítá s tím, že slevu na vyživované dítě uplatní ten z nich, který pobývá s potomkem ve společné domácnosti. Existuje ale možnost uzavřít písemnou dohodu o tom, že zvýhodnění využije rodič, který dítě v péči nemá. (Viz Pokyn GFŘ – 22, pasáž k § 38l odst. 3).

Podobná pravidla pak platí i v případě střídavé péče o dítě, kdy je dítě součástí dvou domácností. Daňové zvýhodnění na dítě svěřené do střídavé výchovy obou rodičů může uplatňovat každý z nich ve zdaňovacím období pouze po dobu, ve které je dítě příslušníkem jeho společně hospodařící domácnosti (několik kalendářních měsíců). Nelze však vyloučit ani dohodu rodičů, že potomek bude nadále žít pouze v jedné domácnosti, kdy bude po celé zdaňovací období uplatňovat slevu pouze jeden rodič.

Přehled slev na dani na děti

Daňové zvýhodnění na dítě 2024
Druh slevy Roční Měsíční
Sleva na první dítě 15 204 Kč 1267 Kč
Sleva na druhé dítě 22 320 Kč 1860 Kč
Sleva na třetí a každé další dítě 27 840 Kč 2320 Kč

U dítěte, které má status zdravotně postižené osoby ZTP/P, je daňové zvýhodnění vyšší, jedná se konkrétně o dvojnásobek původní částky. Zákon přitom neříká, že při uplatňování slevy na dítě musí být potomci seřazeni podle jejich věkového pořadí. Pokud doma žádné dítě s průkazem ZTP/P nemáte, v podstatě nezáleží na tom, jak své ratolesti seřadíte. Jestliže však dítě se ZTP/P máte, můžete do formuláře uvést potomky tak, abyste dosáhli na co nejvyšší daňové zvýhodnění (dítě se ZTP/P se vyplatí uvádět poslední v pořadí).

Daňové zvýhodnění na dítě ZTP/P pro rok 2024
Druh slevy Roční Měsíční
Sleva na 1. dítě (ZTP/P) 30 408 Kč 2534 Kč
Sleva na 2. dítě (ZTP/P) 44 640 Kč 3720 Kč
Sleva na 3. a každé další dítě (ZTP/P) 55 680 Kč 4640 Kč

Jak uplatnit slevu na dítě?

Daňové zvýhodnění je možné uplatnit několika různými způsoby. Prvním z nich je standardní sleva na dítě, druhým daňový bonus a třetím kombinace slevy a daňového bonusu. Vždy přitom záleží na tom, jak vysoké jsou příjmy daného poplatníka.

Zaměstnanci mohou slevu na dítě uplatnit ve své měsíční mzdě, a to na základě podepsaného Prohlášení poplatníka. Kromě toho bude nutné doložit také:

  • rodný list dítěte,
  • potvrzení o studiu (pokud je dítě studentem),
  • potvrzení, že druhý rodič slevu na dítě neuplatňuje.

Daň z příjmů, kterou zaměstnavatel počítá, bude po započítání slevy na dítě nižší, což povede k navýšení částky, kterou zaměstnanec každý měsíc dostane na účet. Jestliže bude výsledná daň záporná, zaměstnanec dokonce obdrží daňový bonus. Jak je ovšem patrné z tabulky, která se nachází výše, slevu na dítě nemusíte řešit každý měsíc, ale uplatnit ji můžete také jednou za rok při ročním zúčtování příjmů.

V případě OSVČ je mechanismus uplatnění slevy na dítě velice podobný, pouze s tím rozdílem, že za takové jedince nevyřizuje daňové zvýhodnění mzdové oddělení, ale musí to provést sami. Tato skutečnost se pak kromě podnikatelů týká i zaměstnanců, kteří souběžně vykonávají více povolání najednou nebo mají další příjmy.

Daňový bonus

Jako daňový bonus na dítě se označují peníze, které člověk dostane od státu, pokud je daňové zvýhodnění vyšší než vypočtená daň z příjmů. Nárok na tuto sumu mají jak zaměstnanci, tak i podnikatelé. Zatímco zaměstnanci mohou dostávat daňový bonus každý měsíc společně s čistou mzdou, ale i jednorázově po ročním zúčtování příjmů v únorové či březnové výplatě, u OSVČ probíhá vyplácení daňového bonusu jednou ročně, konkrétně po podání daňového přiznání.

Daňový bonus mohou využít pouze ti poplatníci, kteří měli ve zdaňovacím období příjem ze zaměstnání či podnikání, jehož výše dosáhla alespoň šestinásobku minimální mzdy (pro rok 2024 tedy alespoň 113 400 Kč). Sem se ovšem nepočítají příjmy z nájmu ani příjmy z kapitálového majetku. 

Jak je to se slevou na dítě během prázdnin?

Pokud uplatňujete slevu na dítě, které je studentem, a jeho vzdělávání pokračuje bez přerušení, daňové zvýhodnění se uplatňuje i v průběhu letních prázdnin. Aby toho nebylo málo, rodič pak může slevu uplatnit i v případě, že jeho potomek odmaturoval, během července a srpna se rozhodl udělat si volno a nemá tedy ještě příjmy zakládající účast na nemocenském pojištění.

Zajímavá je také skutečnost, že při splnění zákonných podmínek pro nárok na daňové zvýhodnění může mít studující dítě vlastní příjem, přičemž jeden z rodičů může na tohoto potomka stále uplatňovat slevu.

Co dělat, pokud slevu na dítě neuplatňujete?

Daňová sleva na dítě náleží vždy pouze jednomu z rodičů. Abyste tak mohli jako zaměstnanec zvýhodnění uplatnit, musíte mzdové účetní doložit kromě jiného také potvrzení od zaměstnavatele druhého z rodičů, kde bude jasně uvedeno, že zde slevu neuplatňuje. Jestliže druhý z rodičů není zaměstnancem, je třeba, aby sepsal čestné prohlášení o neuplatnění slevy na dítě, které se zároveň přikládá i při podání daňového přiznání.

Co je sleva na dítě?
Jako sleva na dítě se označuje daňové zvýhodnění, které je možné uplatnit na každého vyživovaného potomka, který s vámi sdílí společnou domácnost. Podle zákona o daních z příjmů se může jednat o nezletilé ratolesti, ale také o zletilé děti až do dovršení věku 26 let, pokud jim není přiznán invalidní důchod (3. stupeň). Mohou to přitom být děti vlastní, děti osvojené, děti v péči nahrazující péči rodičů nebo děti druhého z manželů.
Jaké podmínky je nutné splnit?
Abyste mohli slevu na děti uplatnit, vaše příjmy ze zaměstnání či podnikání za předchozí kalendářní rok musí přesáhnout šestinásobek minimální měsíční mzdy. Pro rok 2024 byla minimální mzda stanovena na 18 900 Kč, takže částka, kterou je nutné překročit, činí 113 400 Kč. Zároveň je dobré vědět, že slevu na dítě může uplatnit pouze jeden z rodičů.
Kolik činí sleva na dítě?
Roční daňové zvýhodnění na první dítě činí 15 204 Kč, sleva na druhé dítě je 22 320 Kč a sleva na třetí a každé další dítě dosahuje výše 27 840 Kč. Měsíční zvýhodnění pak činí 1267 Kč, 1860 Kč a 2320 Kč. Pokud se staráte o dítě s průkazem ZTP/P, daňové zvýhodnění je dvakrát vyšší. Roční sleva na první dítě tedy činí 30 408 Kč, na druhé dítě 44 640 Kč a na třetí a každé další dítě 55 680 Kč.
Jak uplatnit slevu na dítě?
Daňové zvýhodnění můžete uplatnit několika způsoby, a to buď standardní slevou, daňovým bonusem, nebo kombinací těchto dvou možností. Zaměstnanci mohou slevu uplatnit ve své měsíční mzdě, ale také jednou za rok při ročním zúčtování příjmů. Pro OSVČ je mechanismus uplatnění slevy na dítě podobný, daňové zvýhodnění za ně však nevyřizuje mzdové oddělení, ale musí to provést sami.
'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).
'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); outstreamDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); if (direct) { adsRequest.adTagUrl = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; } // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * Handles the ad manager loading and sets ad event listeners. * @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent */ function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } /** * Handles actions taken in response to ad events. * @param { !google.ima.AdEvent } adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }
OSZAR »