Movatterモバイル変換


[0]ホーム

URL:


Skip to content
DEV Community
Log in Create account

DEV Community

Daniel Orner
Daniel Orner

Posted on

     

Building an Unsplash Slide Show on NeoCities

Unsplash is a great website that offers free images in a variety of formats and subjects. When we first went into lockdown in 2020, my home setup was two screens - my laptop, for actual work, and an external screen which is where my video calls took place, so I could still reference my work screen at the same time.

However, while a call wasn't taking place, my top screen just kind of sat there, blank. I wanted something to look at during thinking breaks. Basically I wanted a screen saver, but you can't get those going on just one screen.

Way back in the day, I had a number of personal pages onGeoCities. This revolutionary site allowed you to write your own HTML and have it hosted for free! Turns out, there's a modern version of this, calledNeoCities. It allows you to create simple sites with static files that are hosted for free.

I usedthis post to make use of thesource.unsplash.com endpoint to show a random, full-page image on my browser which I made full-screen on the external monitor. (I use Firefox for my browsing, so I just stuck Chrome up there for the slide show). I also made use offinicky so that all Google Meet links went to Chrome, while all other links stayed with Firefox.

Problem! A couple of weeks ago, Unsplash removed thesource.unsplash.com endpoint. Instead, you need to use their API directly. Thankfully, the API is still free for low levels of usage, so I was able to modify the site to work with it.

The Design

Once you sign up, you'll get an API key. For these purposes, I didn't care too much about exposing it in a static site since I don't have any payment info on Unsplash and I'm not using it for anything else.

The overall design is as follows:

  • We want a "target" image div which will hold the image.
  • We will fetch 30 images (the max we can) from the API in the collection we're interested in.
  • We will loop through those images and show a new one once per minute.
  • Once we've exhausted the ones we have, we'll fetch more. This means we should in general only be making 2 API requests per hour.
  • If I don't like the image showing, I want an easy way to skip to the next one. I want to add a "refresh" button that will do that for me.

I'm going to keep this super simple. The only dependency I have is jQuery which I'm using for animations. You could easily do this with CSS animations, but I'm not as used to those.

The Implementation

First, here's the HTML:

<head><style>*{box-sizing:border-box;}body{margin:0;background-color:black;}.trigger{position:fixed;top:2rem;right:2rem;}a{font-size:2rem;color:white;transition:color200msease;}a:hover{color:rgba(white,0.7)}#target{background-size:cover;background-position:center;background-repeat:no-repeat;height:100%;width:100%;}</style><linkrel="stylesheet"href="https://cdnjs.cloudflare.com/ajax/libs/material-design-iconic-font/2.2.0/css/material-design-iconic-font.min.css"></link><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script></head><body><divclass="trigger"><astyle="cursor: pointer;"id="refresh"><iclass="zmdi zmdi-refresh-alt"></i></a></div><divid="target"></div></body>
Enter fullscreen modeExit fullscreen mode

Now for the JavaScript.

// control the auto refresh rate -> 1000 = 1 secondwindow.refreshRate=60000;// you can change the collections ID to switch these out. Or you can use any other query from the API if you want truly random imageswindow.url="https://api.unsplash.com/photos/random?w=1600&h=900&collections=879001&count=30&client_id=YOUR_API_KEY&orientation=landscape"// use this to cache our datawindow.jsonData=null;// fetch the data, put it into the JSON blob, and pre-load the images from the dataasyncfunctionfetchData(){constresponse=awaitfetch(window.url);window.jsonData=awaitresponse.json();window.jsonData.forEach((image)=>{constimg=newImage();img.url=image.urls.full;});}// display the next imageasyncfunctionnextImage(){constimage=window.jsonData?.pop()if(image){// we have more in the arrayconstimageURL=image.urls.full$('#target').fadeOut(function(){$('#target').css({'background-image':`url(${imageURL})`}).fadeIn(1500)});}else{// we've exhausted the array, go get moreawaitfetchData();awaitnextImage();}}window.intervalTimer=setInterval(nextImage,refreshRate);setTimeout(nextImage,0);$('#refresh').click(asyncfunction(){clearInterval(window.intervalTimer);awaitnextImage();window.intervalTimer=setInterval(nextImage,refreshRate);});// Hide the images on load$('#target').hide();
Enter fullscreen modeExit fullscreen mode

Et voila! Hope someone out there finds this helpful!

Top comments(0)

Subscribe
pic
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

Big fan of Ruby and Rails! I have four kids so my hobbies are understandably limited. :)
  • Work
    Staff Software Engineer at Flipp
  • Joined

Trending onDEV CommunityHot

DEV Community

We're a place where coders share, stay up-to-date and grow their careers.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp