Skip to content

js视差学习(鼠标视差)

只用css产生的视差太过简陋,这里加入css使得视差效果更佳。

html
<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>js视差学习</title>
    <style>
        html{
            height: 100%;
            overflow: hidden;
        }
        body{
            height: 100%;
            overflow: hidden;
        }
        .container{
            /* 基本布局 */
            display: flex;
            align-items: center;
            justify-content: center;
            height: 100vh;

            /* 结合数据属性完成3d化 */
            --orgin-width: 50%;
            --orgin-height: 50%;
            overflow-y: auto;
            overflow-x: auto;
            perspective: 1px;
            perspective-origin: var(--orgin-width) var(--orgin-height);
            transform-style: preserve-3d;

            /* 添加动画 */
            transition: perspective-origin .2s ease;
        }
        .item{
            /* 根据数据属性生成每个元素的位置 */
            height: var(--r);
            width: var(--r);
            background: var(--background);
            border-radius: 50%;
            position: relative;
            top: var(--r);
            left: var(--r);
            transform: translate3d(var(--r),var(--r),calc(var(--speed)*-1px)) scale(var(--speed));
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="item item1" data-speed="1" data-r="40" data-bgc="blue"></div>
        <div class="item item2" data-speed="2" data-r="20" data-bgc="black"></div>
        <div class="item item3" data-speed="3" data-r="60" data-bgc="yellow"></div>
        <div class="item item4" data-speed="4" data-r="30" data-bgc="pink"></div>
        <div class="item item5" data-speed="5" data-r="20" data-bgc="red"></div>
    </div>
    <script>
        // 使用js使得数据属性可以在css中使用
        document.querySelectorAll('.item').forEach(e => {
            let bgc = e.getAttribute('data-bgc');
            let r = e.getAttribute('data-r');
            let speed = e.getAttribute('data-speed');
            e.style = `--background: ${bgc}; --r: ${r}px; --speed: ${speed}`;
        });

        // 使用鼠标移动监听,动态改变容器视点
        document.addEventListener('mousemove',function (e) {
            console.log(e.pageY/10);
            console.log(e.pageX/10);
            document.getElementsByClassName('container')[0].style = 
            `
            --orgin-width: ${e.pageX/10}%;
            --orgin-height: ${e.pageY/7}%;
            `;
        });

        // 监听鼠标离开,离开时复原
        document.addEventListener('mouseleave',function (e) {
            document.getElementsByClassName('container')[0].style = 
            `
            --orgin-width: 50%;
            --orgin-height: 50%;
            `;
        });
    </script>
</body>
</html>

这是一段关于鼠标的视差特效,用到了html5新特性数据属性,但是目前css3中attr()对数据属性的解析新特性并未被大多数浏览器采纳,故使用js代码完成css变量的生成。

鄂ICP备19018246号-1