前端练习小项目 —— 让图片变得更 “色”

前言:相信读者在学习完了HTML、CSS和JavaScript之后已经想要迫不及待的想找一个小型的项目来练练手,那么这篇文章就正好能满足你的 "需求"。


✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

在开始学习之前,先让我们看一下最终的效果:

------看完了上述效果之后,现在让我们开始制作吧!

1.HTML代码

再开始进行效果制作之前,先让我们将HTML代码的骨架搭建好,以下为其HTML代码:

html 复制代码
<body>
    <div class="shell"> <!-- 外部容器,用于包裹内部的盒子 -->
        <div class="box" id="box-a"> <!-- 第一个盒子,ID 为 box-a -->
            <img src="./1.jpg" alt=""> <!-- 图片,src 指向本地的 1.jpg -->
        </div>
        <div class="box" id="box-b"> <!-- 第二个盒子,ID 为 box-b -->
            <img src="./1.jpg" alt=""> <!-- 图片,src 指向本地的 1.jpg -->
        </div>
        <div class="box" id="box-c"> <!-- 第三个盒子,ID 为 box-c -->
            <img src="./1.jpg" alt=""> <!-- 图片,src 指向本地的 1.jpg -->
        </div>
    </div>
</body>

在上述的代码中,我们可以看到:

  1. 外部容器<div class="shell">,用于包裹内部的盒子。

  2. 盒子1<div class="box" id="box-a">,包含一张图片。

  3. 盒子2<div class="box" id="box-b">,同样包含一张图片。

  4. 盒子3<div class="box" id="box-c">,也包含一张图片。

  5. 图片来源 :每个盒子中的图片均指向本地文件1.jpg

这样,通过上述的解释之后,我们对其的HTML代码也就进一步加深了。

2.css代码

当我们编写完了HTML代码之后,我们就可以对其进行一些效果上的修饰了!以下为CSS代码:

css 复制代码
body {
    background: radial-gradient(circle farthest-side at center bottom,
            crimson, #003087 130%); /* 背景为径向渐变,从鲜红色到深蓝色 */
    overflow: hidden; /* 隐藏超出边界的内容 */
    display: flex; /* 使用弹性布局 */
    justify-content: center; /* 水平居中对齐内容 */
    align-items: center; /* 垂直居中对齐内容 */
    height: 100vh; /* 高度为视口高度的 100% */
}

.shell {
    height: 260px; /* 容器高度 */
    width: 500px; /* 容器宽度 */
}

.box {
    filter: grayscale(40%); /* 应用 40% 的灰度滤镜 */
}

.box img {
    position: absolute; /* 绝对定位 */
    opacity: 0.4; /* 图片透明度为 40% */
    margin: auto; /* 自动外边距 */
    width: 100%; /* 图片宽度为 100% */
}

解释:

  1. 全屏背景:使用径向渐变,从鲜红色到深蓝色,营造视觉层次感。

  2. 居中布局body 使用弹性布局,使内容在水平和垂直方向上居中。

  3. 固定容器.shell 设置固定的高度(260px)和宽度(500px)。

  4. 灰度效果.box 应用 40% 的灰度滤镜,使内容呈现灰色调。

  5. 透明图片.box img 的透明度设置为 40%,增加柔和视觉效果

通过上述的总理之后,这样我们就对CSS代码有了一定的理解了!

3.JavaScript代码

再编写完了HTML和CSS代码之后,再让我们对其交互的效果进行完善,以下为JavaScript代码:

导入文件:

javascript 复制代码
<!-- 导入jquery -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<!-- 导入动画库 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.5/TweenMax.min.js"></script>

交互的编写:

javascript 复制代码
<script>
    /* 获取元素 */
    let $body = $("body"), // 获取 body 元素
        $heroA = $("#box-a img"), // 获取盒子 A 中的图片
        $heroB = $("#box-b img"), // 获取盒子 B 中的图片
        $heroC = $("#box-c img"); // 获取盒子 C 中的图片

    // 设置 transformStyle 属性为 'preserve-3d',使3D效果得以保留
    TweenMax.set($heroA, { transformStyle: 'preserve-3d' });
    TweenMax.set($heroB, { transformStyle: 'preserve-3d' });
    TweenMax.set($heroC, { transformStyle: 'preserve-3d' });

    /* 鼠标移动事件 */
    $body.mousemove(function (e) {
        /* 计算鼠标在页面中的位置 */
        let sxPos = e.pageX / $body.width() * 300 - 50; // 计算鼠标的 X 轴位置
        let syPos = e.pageY / $body.height() * 300 - 50; // 计算鼠标的 Y 轴位置
        console.log("x:" + sxPos + ", y:" + syPos); // 输出鼠标位置

        /* 使用 TweenMax 库设置元素的动画效果 */
        TweenMax.to($heroA, 1, { // 动画到盒子 A
            rotationY: 0.05 * sxPos, rotationX: 0.20 * syPos,
            rotationZ: '-0.1', transformPerspective: 500,
        });
        TweenMax.to($heroB, 1, { // 动画到盒子 B
            rotationY: 0.10 * sxPos,
            rotationX: 0.15 * syPos, rotationZ: 0, transformPerspective: 500,
        });
        TweenMax.to($heroC, 1, { // 动画到盒子 C
            rotationY: 0.15 * sxPos,
            rotationX: 0.10 * syPos, rotationZ: 0.10, transformPerspective: 500,
        });
    });
</script>

这里我们再对上述代码进行解释一下,便于读者的理解:

  1. 获取 DOM 元素

    • 使用 jQuery 获取 body 和每个盒子内的图片元素。
  2. 设置 3D 效果

    • 使用 TweenMax 设置每个图片的 transformStyle 属性为 'preserve-3d',以保留 3D 效果。
  3. 鼠标移动事件

    • body 添加鼠标移动事件,捕捉鼠标位置。
  4. 计算鼠标位置

    • 根据鼠标在页面中的 X 和 Y 坐标计算出相应的偏移量。
  5. 动画效果

    • 使用 TweenMax.to 方法对每个盒子的图片应用旋转动画,旋转量根据鼠标位置动态变化。
  6. 动画持续时间

    • 每个动画持续 1 秒,添加了透视效果。

希望读者可以根据上述的代码注释和下面的解释对JavaScript样式进行理解!

------至此,我们就完成了这个案例的编写了,最后我们附上全部代码以及最终的效果图:

代码:

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>秋刀鱼不做梦</title>
    <link rel="stylesheet" href="./index.css">
    <style>
        body {
            background: radial-gradient(circle farthest-side at center bottom,
                    crimson, #003087 130%);
            overflow: hidden;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        .shell {
            height: 260px;
            width: 500px;
        }

        .box {
            filter: grayscale(40%);
        }

        .box img {
            position: absolute;
            opacity: 0.4;
            margin: auto;
            width: 100%;
        }
    </style>
</head>

<body>
    <div class="shell">
        <div class="box" id="box-a">
            <img src="./1.jpg" alt="">
        </div>
        <div class="box" id="box-b">
            <img src="./1.jpg" alt="">
        </div>
        <div class="box" id="box-c">
            <img src="./1.jpg" alt="">
        </div>
    </div>
</body>


<!-- 导入jquery -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<!-- 导入动画库 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.5/TweenMax.min.js"></script>

<script>
    /* 获取元素*/
    let $body = $("body"),
        $heroA = $("#box-a img"),
        $heroB = $("#box-b img"),
        $heroC = $("#box-c img");
    // 设置 transformStyle 属性为 'preserve-3d'
    TweenMax.set($heroA, { transformStyle: 'preserve-3d' });
    TweenMax.set($heroB, { transformStyle: 'preserve-3d' });
    TweenMax.set($heroC, { transformStyle: 'preserve-3d' });
    /* 鼠标移动事件 */
    $body.mousemove(function (e) {
        /* 计算鼠标在页面中的位置 */
        let sxPos = e.pageX / $body.width() * 300 - 50;
        let syPos = e.pageY / $body.height() * 300 - 50;
        console.log("x:" + sxPos + ", y:" + syPos);
        /* 使用TweenMax库设置元素的动画效果 */
        TweenMax.to($heroA, 1, {
            rotationY: 0.05 * sxPos, rotationX: 0.20 * syPos,
            rotationZ: '-0.1', transformPerspective: 500,
        });
        TweenMax.to($heroB, 1, {
            rotationY: 0.10 * sxPos,
            rotationX: 0.15 * syPos, rotationZ: 0, transformPerspective: 500,
        });
        TweenMax.to($heroC, 1, {
            rotationY: 0.15 * sxPos,
            rotationX: 0.10 * syPos, rotationZ: 0.10, transformPerspective: 500,
        });
    });
</script>

</html>

效果图:


以上就是本篇文章的全部内容了!!!

相关推荐
xiaoyaolangwj22 分钟前
高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十三)图优化SLAM的本质
学习·机器人·自动驾驶
Martin -Tang23 分钟前
vite和webpack的区别
前端·webpack·node.js·vite
迷途小码农零零发24 分钟前
解锁微前端的优秀库
前端
王解1 小时前
webpack loader全解析,从入门到精通(10)
前端·webpack·node.js
老码沉思录1 小时前
写给初学者的React Native 全栈开发实战班
javascript·react native·react.js
静止了所有花开1 小时前
SpringMVC学习笔记(二)
笔记·学习
我不当帕鲁谁当帕鲁1 小时前
arcgis for js实现FeatureLayer图层弹窗展示所有field字段
前端·javascript·arcgis
那一抹阳光多灿烂1 小时前
工程化实战内功修炼测试题
前端·javascript
爱吃生蚝的于勒1 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
放逐者-保持本心,方可放逐2 小时前
微信小程序=》基础=》常见问题=》性能总结
前端·微信小程序·小程序·前端框架