Apply image or gradient as border

by 23to33to43

HTML

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" type="text/css" href="css/style.css">
    <title>Document</title>
</head>

<body>
    <div class="content">
        <div class="base_img_box">
            <img class="base_img" src='https://i.gyazo.com/2ef3dad2a118dce6bb99a44b62a9318a.jpg' />
            <!-- :: htmlタグに直接関数を書く場合は↑上記一行のタグ内容を ↓下記一行に代える-->
            <!-- img class="base_img" src='img/SamplePic.jpg' onmousemove="zoomIn(event)" onmouseout="zoomOut(event)" /-->
        </div>
        <div class="lens_img_box">
            <img class="lens_img" src='https://i.gyazo.com/918b20f3a1ec45ee4228882eae5b77a3.jpg' />
        </div>
    </div>
    <script type="text/javascript" src="script/sample.js"></script>
</body>

</html>

CSS

.content {
    cursor: pointer;
    position: relative;
    margin: 30px;
}
.base_img_box {
    z-index: 0;
}

.lens_img_box {
    position: absolute;
    opacity:0;
    width: 200px;
    height: 200px;
    overflow: hidden;
    pointer-events: none;
    border-radius: 100%;
    border: solid 5px #ffffff;
    z-index: 1;
}

.lens_img{
    position: absolute;
    transform-origin: top left;
}

JavaScript

// Dom  元画像
        let baseImg = document.querySelector(".base_img");
        
        // Dom  拡大画像Box (虫眼鏡)
        let lensImgBox = document.querySelector(".lens_img_box");
        
        // Dom  拡大画像
        let lensImg = document.querySelector(".lens_img");

        // 拡大比率 今回は2倍
        let ratio = 2;

        // 元画像の上をマウスポインタが通った場合、虫眼鏡を表示
        baseImg.addEventListener("mousemove", function (event) {
            // :: htmlタグに直接関数を書く場合は↑上記一行を ↓下記一行に代える
            // function zoomIn(event) {

            // 拡大画像Box(虫眼鏡...元画像の座標から100引いた値を設定)
            lensImgBox.style.opacity = 1;
            lensImgBox.style.top = (event.offsetY - 100) + "px";
            lensImgBox.style.left = (event.offsetX - 100) + "px";

            // 拡大画像 (元画像の座標から反転して100足した値を設定)
            let newLensOffsetY = event.offsetY * ratio * -1 + 100;
            let newLensOffsetX = event.offsetX * ratio * -1 + 100;

            lensImg.style.top = (newLensOffsetY) + "px";
            lensImg.style.left = (newLensOffsetX) + "px";
            // :: ↑上記二行は ↓下記一行でも実装可能
            // lensImg.style.transform = " translate(" + newLensOffsetX + "px, " + newLensOffsetY + "px)";
        
        }, false);
        // :: htmlタグに直接関数を書く場合は↑上記一行を ↓下記一行に代える
        // }
        
        // 元画像の上にマウスポインタがない場合、虫眼鏡を非表示
        baseImg.addEventListener("mouseout", function () {
            // :: htmlタグに直接関数を書く場合は↑上記一行を ↓下記一行に代える
            // function zoomOut(event) {
            lensImgBox.style.opacity = 0;

        }, false);
        // :: htmlタグに直接関数を書く場合は↑上記一行を ↓下記一行に代える
        // }