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

前言:相信读者在学习完了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>

效果图:


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

相关推荐
胡西风_foxww4 分钟前
【es6复习笔记】rest参数(7)
前端·笔记·es6·参数·rest
m0_748254885 分钟前
vue+elementui实现下拉表格多选+搜索+分页+回显+全选2.0
前端·vue.js·elementui
星就前端叭1 小时前
【开源】一款基于Vue3 + WebRTC + Node + SRS + FFmpeg搭建的直播间项目
前端·后端·开源·webrtc
m0_748234521 小时前
前端Vue3字体优化三部曲(webFont、font-spider、spa-font-spider-webpack-plugin)
前端·webpack·node.js
Web阿成1 小时前
3.学习webpack配置 尝试打包ts文件
前端·学习·webpack·typescript
雷神乐乐1 小时前
Spring学习(一)——Sping-XML
java·学习·spring
噢,我明白了1 小时前
同源策略:为什么XMLHttpRequest不能跨域请求资源?
javascript·跨域
李雨非-19期-河北工职大1 小时前
思考: 与人交际
学习
哦哦~9212 小时前
深度学习驱动的油气开发技术与应用
大数据·人工智能·深度学习·学习