공지사항

북마크 입니당 >

구글 블로그스팟 링크 이미지 썸네일 첨부2

 



기존에는 링크 위에 마우스를 올리면, 링크 대표 썸네일 이미지가 뜨도록 만들었다.

구글 브로거 링크 이미지 썸네일 가능해요? (xehostel.blogspot.com)

그랬더니, 모바일버전에서는 보기가 힘들고,(마우스가 없으니)

또 다른 아이디어가 떠 올라 버전 2를 만들었다.


이번 버전은 링크가 화면에서 30%쯤 지날 때 해당 링크의 대표이미지를 변습 하게끔 만들었다.

처음에는 링크 바로 위에 썸네일이 뜨게끔 만들었지만,

추잡한 것 같아,

무난하게 변경하였다.


동적인 것이 티스토리 링크 이미지 썸네일보다 훨 낫다.

조금 더 까리하게 변경하고자 한다면,

신문기사처럼, 해당링크를 지날 때 페이지 전체가 위 아래로 열리면서 이미지를 보여주면 좋으나, 그것은 나중에 적용하고자 한다.


아이디어는 많이 떠 오르나, 모두 다 한 곳에 적용하다 보면,

도리어 아니한 것보다 못 해진다.


그래서 이 사이트에 적용해 놓았다.

Ha! anisekai & manga (hanissss.blogspot.com)


본 사이트보다 질적으로 떨어진다고 판단 되는 아무글을 써 놓는 곳인데,,,

오히려 이 곳이 본 사이트보다 인기가 더 좋다.(역전현상)

역시 사람들의 본성에는 다들 괴수 하나는 다 있는 듯 하다.



기름 시추하기 전에 지진이 나서 다행이다라고 생각하는 나처럼.


코드는 다음과 같다.

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Scroll Thumbnail Preview</title>

    <style>

        .thumbnail {

            position: fixed;

            top: 30%;

            right: 0;

            width: 150px;

            height: 150px;

            border: 1px solid #ddd;

            padding: 5px;

            background: #fff;

            z-index: 1000;

            display: none;

        }


        .thumbnail img {

            max-width: 100%;

            max-height: 100%;

        }


        .widget.Blog a {

            display: block;

            margin: 20px 0;

        }

    </style>

</head>

<body>

    <div class="widget Blog">

        <a href="https://aldkzm.tistory.com/">Link 1</a>

        <a href="https://xehostel.blogspot.com/">Link 2</a>

    </div>

    <div class='thumbnail' id='thumbnail'>

        <a id="thumbnail-link" href="" target="_blank">

            <img alt='Thumbnail' id='thumbnail-img' src=''/>

        </a>

    </div>

    <script>

        document.addEventListener('DOMContentLoaded', function() {

            const widget = document.querySelector('.widget.Blog');

            const links = widget.querySelectorAll('a');

            const thumbnailDiv = document.getElementById('thumbnail');

            const thumbnailImg = document.getElementById('thumbnail-img');

            const thumbnailLink = document.getElementById('thumbnail-link');

            const cache = {};


            // 미리 썸네일 로드

            links.forEach(link => {

                const url = link.getAttribute('href');

                fetchThumbnail(url, function(thumbnailUrl) {

                    if (thumbnailUrl) {

                        cache[url] = thumbnailUrl;

                    }

                });

            });


            function fetchThumbnail(url, callback) {

                const proxyUrl = 'https://api.allorigins.win/raw?url=' + encodeURIComponent(url);

                fetch(proxyUrl)

                    .then(response => response.text())

                    .then(data => {

                        const parser = new DOMParser();

                        const doc = parser.parseFromString(data, 'text/html');

                        const ogImage = doc.querySelector('meta[property="og:image"]')?.content;

                        callback(ogImage);

                    })

                    .catch(error => {

                        console.error('Error fetching thumbnail:', error);

                        callback(null);

                    });

            }


            const observerOptions = {

                root: null,

                rootMargin: '-30% 0px -70% 0px', // 30% ~ 70% 지점에서 트리거

                threshold: 0

            };


            const observer = new IntersectionObserver((entries) => {

                entries.forEach(entry => {

                    const link = entry.target;

                    const url = link.getAttribute('href');

                    if (entry.isIntersecting) {

                        if (cache[url]) {

                            thumbnailImg.src = cache[url];

                            thumbnailLink.href = url;

                            thumbnailDiv.style.display = 'block';

                        }

                    }

                });

            }, observerOptions);


            links.forEach(link => observer.observe(link));

        });

    </script>

</body>

</html>





intersectionobserver를 이용한 것이 특징인데,
잘 응용하길 바란다.

애초에 이 블로그를 내가 만들었으면, 링크 자체를 손 봤겠지만,
그게 아니라서 이런 방법을 사용 할 수 밖에 없었다.


댓글

7일동안 많은 클릭!!!

탁류~옛부터 중간 관리자와 그에 빌붙어 농락하는 넘들이 문제다.

태양광 일조권은 '기대권'이 아니라, '현실권'이다. feat 건축법 일조권 개정

UPS(무정전전원공급장치) 화재? 국가정보자원관리원

테더링(핫스팟) 제한 무력화 또는 우회(DUN)하는 방법, how it's done

재생에너지(태양광) 입찰제에 대한 회의(출력제어 제로화? 글쎄...)

유행하는 프로그레스바(그로우링, 오라, 물채움) etc