Slik laver du Lazy Load innebygde YouTube-videoer

I denne opplæringen vil jeg forklare hvordan du "lat last" flere innebygde YouTube-videoer. Å gjøre det, vil forbedre ytelsen til vår første sidebelastning, og gi litt strøm til brukeren. 

Lazy Loading

Embedding av en Youtube-video har blitt en helt normal prosess for alle som er involvert i nettet; kopiere, lime inn, ferdig. Hvis du trekker inn en ekstern ressurs som en Youtube-video, kan det imidlertid redusere en nettsideens ytelse, spesielt hvis det er to eller flere videoer som er innebygd på samme side..

Ved å legge inn videoer, ber vi mer enn bare en videofil. En rekke ressurser hentes, inkludert JavaScript-filer, et stilark, bilder og annonser. Og som du kan fra skjermbildet nedenfor, er to Youtube-videoer tilsvarer 22 HTTP-forespørsler med totalt 624 kb nedlastet. Disse tallene vil klatre når vi legger inn flere videoer på siden.

Totalt antall HTTP-forespørsler som er gjort når du legger inn to videoer

Så, i stedet for å laste inn Youtube-videoen så snart siden laster, skal vi trekke og spille av videoen når brukeren ber om å gjøre det. Denne metoden er populært kjent som lat lasting-det vil minimere HTTP-forespørsler på første sidebelastning, og til slutt forbedre sidens ytelse.

Uten videre, la oss komme i gang.

1. HTML-struktur

Vi begynner med å bygge HTML-koden. Dette er rett fram; vi bruker bare to div elementer. Den første div vil vikle rundt den innebygde Youtube-videoen, den andre div er nestet i den første div, og vi vil bruke den til å forme Spille knappen for å illustrere at dette er en spillbar video.

 

Som du kan se fra kodestykket ovenfor, har vi lagt til en klasse til disse div elementer og a data- attributt til den første div å spesifisere IDen til Youtube-videoen vi vil legge inn.

2. CSS

Deretter legger vi til stilene:

.youtube bakgrunnsfarge: # 000; margin-bunn: 30px; stilling: relativ; polstringstopp: 56,25%; overløp: skjult; markør: pointer;  .youtube img bredde: 100%; topp: -16,84%; venstre: 0; opasitet: 0,7;  .youtube .play-button width: 90px; høyde: 60px; bakgrunnsfarge: # 333; boks-skygge: 0 0 30px rgba (0,0,0,0,6); z-indeks: 1; opasitet: 0,8; border-radius: 6px;  .youtube .play-button: før innhold: ""; border-style: solid; kantbredde: 15px 0 15px 26.0px; border-farge: gjennomsiktig gjennomsiktig transparent #fff;  .youtube img, .youtube .play-button cursor: pointer;  .youtube img, .youtube iframe, .youtube .play-button, .youtube .play-button: før posisjon: absolutt;  .youtube .play-button, .youtube .play-button: før topp: 50%; venstre: 50%; transformere: translate3d (-50%, -50%, 0);  .youtube iframe høyde: 100%; bredde: 100%; topp: 0; venstre: 0;  

Disse stilene handler hovedsakelig om:

  • Beholder (fleksibelt) videoformatforhold på 16: 9, som er det anbefalte aspektforholdet for en Youtube-video. Når vi gjør det, setter vi inn padding-top av den første div til 56.25%. Dette tallet er avledet fra å dele 9 ved 16 og multiplisere den resulterende til 100%.
  • Danner den andre div til en spilleknapp og plassere den til midten av den første div.
  • Plasserer Youtube-miniatyrbildet som vi henter og legger til senere via JavaScript.

På dette tidspunktet bør vi se disse div elementene begynner å ligne en typisk online videospiller, som følger:

Hvis du klikker på avspillingsknappen, spilles ikke en video. Det er et bilde. 

3. Java

La oss skrive skript for å hente bildeminiatyret basert på Youtube-IDen som ble lagt til i data-innbygging Egenskap. Til slutt vil det også legge inn og spille videoen på brukerens klikk. 

Miniatyrbilde

For å starte det, velger vi div elementer som vil pakke inn den innebygde videoen; de medyoutube klasse.

var youtube = document.querySelectorAll (".youtube"); 

Siden vi kan ha to eller flere Youtube-videoer, må vi deretter iterere gjennom hvert av de valgte elementene:

... for (var i = 0; jeg < youtube.length; i++)  // add the code here 

Deretter henter vi Youtube-miniatyrbildet og viser det. Youtube genererer flere bildestørrelser, hver som er tilgjengelig gjennom følgende nettadresser:

  • Medium kvalitet: http://img.youtube.com/vi/video-id/mqdefault.jpg (320 × 180 piksler)
  • Høy kvalitet: http://img.youtube.com/vi/G0wGs3useV8/hqdefault.jpg (480 × 360 piksler)
  • Standarddefinisjon (SD): http://img.youtube.com/vi/G0wGs3useV8/sddefault.jpg (640 × 480 piksler)
  • Maksimal oppløsning: http://img.youtube.com/vi/G0wGs3useV8/maxresdefault.jpg (1920 × 1080 piksler)

Legg merke til at vi trenger den tilsvarende Youtube-video-IDen for å legge til URL-adressen. Vi har angitt IDen i data, og vi kan hente den ved hjelp av JavaScript .datasett eiendom.

// loop for (var i = 0; i < youtube.length; i++)  // thumbnail image source. var source = "https://img.youtube.com/vi/"+ youtube[i].dataset.embed +"/sddefault.jpg"; 

Som du kan se fra koden ovenfor, vil vi vise sdstandard.jpg bilde, siden de fleste videoer i dag kommer i Standard Definition (SD). Kommer inn på 640 × 480 piksler, er dette bildet miniatyrbildet akkurat i riktig størrelse; ikke for liten eller for stor. Du kan velge for miniatyrbilde av høy kvalitet, maxresdefault.jpg, i stedet, men husk at Youtube-video ikke alltid kommer i HD-definisjon (HD), så denne størrelsen kan ikke alltid være tilgjengelig.

Laster bilde Miniatyrbilde Asynkront

Lasting av miniatyrbildet somynkront vil tillate at siden lastes raskere. Hvis vi har to eller flere innebygde Youtube-videoer, vil hvert miniatyrbilde av disse videoene lastes samtidig slik at de ikke forhindrer sidedriverflyten:

// loop for (var i = 0; i < youtube.length; i++) … // Load the image asynchronously var image = new Image(); image.src = source; image.addEventListener( "load", function()  youtube[ i ].appendChild( image ); ( i ) ); 

Denne koden vil laste bilde miniatyrbildet fra kilde variabel. Når den er lastet, legger vi den til omslaget div:

Pause Fest 2016 Kickoff på Envato. Fortsatt et bilde.

Til slutt legger vi til det siste stykket av skriptet.

// loop for (var i = 0; i < youtube.length; i++) … youtube[i].addEventListener( "click", function()  var iframe = document.createElement( "iframe" ); iframe.setAttribute( "frameborder", "0" ); iframe.setAttribute( "allowfullscreen", "" ); iframe.setAttribute( "src", "https://www.youtube.com/embed/"+ this.dataset.embed +"?rel=0&showinfo=0&autoplay=1" ); this.innerHTML = ""; this.appendChild( iframe );  ); 

Dette skriptet gjør spesielt følgende:

  • Først legger den til klikk hendelse til omslaget div samt utføre den anonyme funksjonen som er vedlagt.
  • Innenfor funksjonen oppretter vi en iframe element; vi lager en lignende iframe at Youtube genererer å legge inn en video, bortsett fra at vi nå setter inn automatisk avspilling = 1 i nettadressen for å umiddelbart spille av videoen når iframe er satt.
  • Til slutt, det erstatter omslaget div innhold med iframe.

Vi er alle satt. Du kan prøve følgende demonstrasjon!

Wrapping Up

I denne opplæringen lærte vi hvordan du laster inn en Youtube-video på brukerens klikk. Dette er raskere og mer båndbreddeeffektiv enn å måtte trekke videoer direkte ved siden av siden, spesielt hvis du har flere videoer som er innebygd på en enkelt side.

Og som du ser fra følgende skjermdump, har vi gjort en betydelig forbedring i løpet av antall HTTP-forespørsler som ble gjort under den første sidelasten. I dette tilfellet har vi trimmet det ned fra 22 til 5 HTTP-forespørsler.

neste

I den neste opplæringen forbedrer vi koden vår ved å pakke den inn som en "Webkomponent". Dette gjør at vi kan legge inn Youtube-videoen mer elegant gjennom et egendefinert navnelement. Istedenfor å legge til to div elementer som vi gjorde i denne opplæringen, kan vi bare legge til, for eksempel,