images - thumbnails

revision:


Content

create thumbnails the technique photo stack thumbnail slider with thumbnails filterable thumbnail layouts thumbnail hover full grid view

create thumbnails

top
car
code:
            <style>
                .thumb img{border: 0.1vw; border-radius: 0.1vw; padding: 0.1vw; width: 10vw;}
                .thumb img:not(#tech, .container img, .slider label, .slider img, .basket img):
                hover{box-shadow: 0 0 0.2vw 0.1vw red;}
            </style>  
            <div> 
                <a target="_blank" href="../images/car2.jpg">
                    <img class="thumb" src="../images/car2.jpg" alt="car"/>    
                </a>
            </div> 
        


the technique

top
bath
code:
            <div class="frame">
                <img id="tech" src="../images/3.jpg" alt="bath" width="200" >
            </div>
            <style>
                .frame {width: 40vw; height: auto;}
                #tech{float:left; border: 0.2vw dashed blue;}
                #tech:hover{border:0.4vw solid green; box-shadow: 0vw 0.4vw 0.5px blue;}
            </style>   
        


photo stack thumbnail

top
picture picture picture picture
code:
            <div class="container">
                <img src="../images/1.jpg">
                <img src="../images/1.jpg">
                <img src="../images/1.jpg">
                <img src="../images/1.jpg">
            </div>
            <style>
                .container {position: relative; width: 20vw; height: 12vw; margin-top: 5vw; background: rgba(0, 0, 0, 0); transform: 
                    rotate(-30deg) skew(25deg) scale(0.8); transition: 0.5s;}
                .container img {position: absolute; width: 100%; transition: 0.5s;}
                .container:hover img:nth-child(4) {transform: translate(16vw, -16vw); opacity: 1;}
                .container:hover img:nth-child(3) {transform: translate(12vw, -12vw); opacity: 0.8;}
                .container:hover img:nth-child(2) {transform: translate(8vw, -8vw); opacity: 0.6;}
                .container:hover img:nth-child(1) {transform: translate(4vw, -4vw); opacity: 0.4;}
            </style>   
        


slider with thumbnails

top
picture picture picture picture picture
code:
        <div class="boxes">
            <div class="slider">
                <input checked="checked" id="id1" name="ani" type="radio"> 
                <label for="id1"><img src="../images/1.jpg" width="60"></label> 
                <img src="../images/1.jpg">

                <input id="id2" name="ani" type="radio"> 
                <label for="id2"><img src="../images/2.jpg" width="60"></label> 
                <img src="../images/2.jpg"> 
                    
                <input id="id3" name="ani" type="radio"> 
                <label for="id3"><img src="../images//3.jpg" width="60"></label> 
                <img src="../images/3.jpg"> 
                
                <input id="id4" name="ani" type="radio"> 
                <label for="id4"><img src="../images/4.jpg" width="60"></label> 
                <img src="../images/4.jpg"> 
                
                <input id="id5" name="ani" type="radio"> 
                <label for="id5"><img src="../images/5.jpg" width="60"></label> 
                <img src="../images/5.jpg">
            </div>
        </div>
        <style>
            .boxes{display: grid;place-items: center; min-height: 40vw;}
            .slider1 {width: 30vw; height: 20vw;position: relative; padding-top: 25vw; margin: 1vw auto;}
            .slider1>img {position: absolute; left: 0; top: 0; transition: all 0.5s; width: 30vw; height: 25vw;}
            .slider1 input[name='ani'] {display: none;}
            .slider1 label { margin: 1vw 0 0 1vw; border: .3vw solid #999; float: left; cursor: pointer; transition: all 0.5s; opacity: 0.6; }
            .slider1 label img {display: block;}
            .slider1 input[name='ani']:checked+label {border-color: #666; opacity: 1;}
            .slider1 input[name='ani']~img { opacity: 0; transform: scale(1.1);}
            .slider1 input[name='ani']:checked+label+img {opacity: 1;transform: scale(1);}
        </style>   
    


filterable thumbnail layout

top
total photos: 12
  1. lake in the evening

  2. living on the beach

  3. ready for a refreshing shower

  4. ready for a sea trip

  5. relaxing on the beach

  6. evening meal at the local restaurant

  7. returning to the beach after the sea trip

  8. scenery in Shanghai - 2018

  9. Shanghai's tallest building - 2018

  10. the Huangpu river in Shanghai - 2018

  11. near the market in Changning district

  12. flooding in Shanghai in the summer of 2018

code:
        <section class="gallery">
            <div class="basket">
                <div class="toolbar">
                    <div class="search-wrapper">
                        <input type="search" placeholder="Search for photos">
                        <div class="counter">total photos: <span>12</span></div>
                    </div>
                    <ul class="view-options">
                        <li class="zoom"><input type="range" min="180" max="380" value="280"></li>
                        <li class="show-grid active"><button disabled><img src="../images/grid-view.svg" 
                        alt="grid view"></button></li>
                        <li class="show-list"><button><img src="../images/list-view.svg" alt="list view">
                        </button></li>
                    </ul>
                </div>
                <ol class="image-list grid-view">
                    <li>
                        <figure><img src="../images/1.jpg" alt=""/><figcaption><p>lake in the evening</p>
                        </figcaption></figure>
                    </li>
                    <li>
                        <figure><img src="../images/2.jpg" alt=""/><figcaption><p>living on the beach</p>
                        </figcaption></figure>
                    </li>
                    <li>
                        <figure><img src="../images/3.jpg" alt=""/><figcaption><p>ready for a refreshing shower
                        </p></figcaption></figure>
                    </li>
                    <li>
                        <figure><img src="../images/4.jpg" alt=""><figcaption><p>ready for a sea trip</p>
                        </figcaption></figure>
                    </li>
                    <li>
                        <figure><img src="../images/5.jpg" alt=""><figcaption><p>relaxing on the beach</p>
                        </figcaption></figure>
                    </li>
                    <li>
                        <figure><img src="../images/7.jpg" alt=""><figcaption><p>evening meal at the local 
                        restaurant</p></figcaption></figure>
                    </li>
                    <li>
                        <figure><img src="../images/8.jpg" alt=""><figcaption><p>returning to the beach after 
                        the sea trip</p></figcaption></figure>
                    </li>
                    <li>
                        <figure><img src="../images/2018-Sh-02.jpg" alt=""><figcaption><p>scenery in Shanghai
                            - 2018</p></figcaption></figure>
                    </li>
                    <li>
                        <figure><img src="../images/2018-Sh-03.jpg" alt=""><figcaption><p>Shanghai's tallest 
                        building - 2018</p></figcaption></figure>
                    </li>
                    <li>
                        <figure><img src="../images/2018-Sh-04.jpg" alt=""><figcaption><p>the Huangpu river in 
                        Shanghai - 2018</p></figcaption></figure>
                    </li>
                    <li>
                        <figure><img src="../images/2018-Sh-05.jpg" alt=""><figcaption><p>near the market in 
                        Changning districtlt;/p></figcaption></figure>
                    </li>
                    <li>
                        <figure><img src="../images/2018-Sh-06.jpg" alt=""><figcaption><p>flooding in Shanghai 
                        in the summer of 2018</p></figcaption></figure>
                    </li>
                </ol>
            </div>
        </section>   
        <style>
                :root {--black: #1a1a1a; --white: #fff; --gray: #ccc; --darkgreen: #18846C; 
                    --lightbrown: antiquewhite; --darkblack: rgba(0,0,0,0.8); --minRangeValue: 280px}
                button {cursor: pointer; background: skyblue;}
                ol img {display: block;  max-width: 100%; height: auto; }
                ol, ul {list-style: none;}
                a:not(.grid_B a, h2~a) {color: inherit;}
                .gallery {padding: 0 2vw;}
                .basket {max-width: 100vw; margin: 0 auto;}
                .d-none {display: none;}

                /* TOOLBAR */
                .toolbar {display: flex;justify-content: space-between;  align-items: center;}
                .toolbar .search-wrapper {position: relative;}
                .toolbar input[type="search"] {font-size: 1vw; border: none; border-bottom: .1vw solid; 
                    padding-bottom: .3vw; background: var(--lightbrown);}
                .toolbar ::placeholder {color: var(--gray);}
                .toolbar .counter {position: relative; left: 0; top: calc(100% + .5vw); font-size: 1.1vw; 
                    color: var(--black); }
                .view-options {display: flex;align-items: center;}
                .view-options li:not(:last-child) {margin-right: 1.2vw;}
                .view-options button {padding: .2vw; border: .3vw solid transparent;}
                .view-options .active button {border-color: var(--darkgreen);}

                /* IMAGE LIST */
                .image-list {margin: 1vw 0;}
                .image-list li {background: var(--lightbrown); color: var(--darkblack);}
                .image-list p:first-child {font-weight: bold; font-size: 1.5vw;}
                .image-list p:last-child {margin-top: 1.5vw;}

                /* GRID VIEW */
                .grid-view {display: grid; grid-gap: 1vw; grid-template-columns: repeat(auto-fit, 
                    minmax(var(--minRangeValue), 1fr));}
                .grid-view figcaption {padding: 1vw;}

                /* LIST VIEW */
                .list-view li + li { margin-top: 1.5vw; }
                .list-view figure {display: grid; grid-gap: 1.5vw; grid-template-columns: 15vw 1fr; 
                    align-items: center; }

                /* Media Queries */
                @media screen and (max-width: 900px) {
                .toolbar input[type="range"] {display: none;}
                }

                @media screen and (max-width: 700px) {
                    .grid-view li {text-align: center; padding: 0.5vw;}
                    .grid-view figcaption {padding: 0.5vw 0 0; }
                }
        </style>
        <script>
            // VARIABLES
            const rangeInput = document.querySelector('input[type = "range"]');
            const imageList = document.querySelector(".image-list");
            const searchInput = document.querySelector('input[type="search"]');
            const btns = document.querySelectorAll(".view-options button");
            const photosCounter = document.querySelector(".toolbar .counter span");
            const imageListItems = document.querySelectorAll(".image-list li");
            const captions = document.querySelectorAll(".image-list figcaption p:first-child");
            const myArray = [];
            let counter = 1;
            const active = "active";
            const listView = "list-view";
            const gridView = "grid-view";
            const dNone = "d-none";

            // SET VIEW
            for (const btn of btns) {
                btn.addEventListener("click", function() {
                    const parent = this.parentElement;
                    document.querySelector(".view-options .active").classList.remove(active);
                    parent.classList.add(active);
                    this.disabled = true;
                    document.querySelector('.view-options [class^="show-"]:not(.active) button').disabled = false;

                    if (parent.classList.contains("show-list")) {
                        parent.previousElementSibling.previousElementSibling.classList.add(dNone);
                        imageList.classList.remove(gridView);
                        imageList.classList.add(listView);
                    } else {
                        parent.previousElementSibling.classList.remove(dNone);
                        imageList.classList.remove(listView);
                        imageList.classList.add(gridView);
                    }
                });
            }

            // SET THUMBNAIL VIEW - CHANGE CSS VARIABLE
            rangeInput.addEventListener("input", function() {
                document.documentElement.style.setProperty("--minRangeValue",`${this.value}px`);
            });

            // SEARCH FUNCTIONALITY
            for (const caption of captions) {
                myArray.push({
                    id: counter++,
                    text: caption.textContent
                });
            }
            searchInput.addEventListener("keyup", keyupHandler);

            function keyupHandler() {
                for (const item of imageListItems) {
                    item.classList.add(dNone);
                }
                const text = this.value;
                const filteredArray = myArray.filter(el => el.text.includes(text));
                if (filteredArray.length > 0) {
                    for (const el of filteredArray) {
                        document.querySelector(`.image-list li:nth-child(${el.id})`).classList.remove(dNone);
                    }
                }
            photosCounter.textContent = filteredArray.length;
            }
        </script>
    


thumbnail hover full grid view

top
code:
        <div class="container_A">
            <div class="grid1">
                <div class="background"></div>
                <div class="background"></div>
                <div class="background"></div>
                <div class="background"></div>
                <div class="background"></div>
                <div class="background"></div>
            </div>
        </div>
        <style>
            .container_A {background-color: #222; max-width: 900px; height: auto; margin: 0 auto; padding: 10px 16px;}
            .grid1 {display: grid; grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));  gap: 24px; position: relative;}
            .background {  background-size: cover; background-position: center center; background-repeat: no-repeat; height: 250px;}
            .background:nth-child(1) {background-image: url("../images/8.jpg");}
            .background:nth-child(2) {background-image: url("../images/8a.jpg");}
            .background:nth-child(3) {background-image: url("../images/9.jpg");}
            .background:nth-child(4) {background-image: url("../images/9a.jpg");}
            .background:nth-child(5) {background-image: url("../images/10.jpg");}
            .background:nth-child(6) {background-image: url("../images/10a.jpg");}
            .background:hover {height: 100%; position: absolute; z-index: 1;  width: 100%;left: 0; top: 0;}
        </style>