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

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


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

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

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

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

1.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代码:

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代码:

导入文件:

<!-- 导入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"), // 获取 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样式进行理解!

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

代码:

<!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>

效果图:


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/888198.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot基础(三):Logback日志

SpringBoot基础系列文章 SpringBoot基础(一)&#xff1a;快速入门 SpringBoot基础(二)&#xff1a;配置文件详解 SpringBoot基础(三)&#xff1a;Logback日志 目录 一、日志依赖二、日志格式1、记录日志2、默认输出格式3、springboot默认日志配置 三、日志级别1、基础设置2、…

Linux中的网络指令:ping、netstat、watch、pidof、xargs

目录 Ping指令 netstat指令 watch指令 pidof指令 xargs指令 Ping指令 功能&#xff1a;检测两台主机间的网络连通性 语法&#xff1a;ping [选项] 目标主机的IP地址 &#xff08;192.168.1.1&#xff09;或域名&#xff08;google.com&#xff09; 常见选项&#xff1a…

P1010 [NOIP1998 普及组] 幂次方 Python题解

[NOIP1998 普及组] 幂次方 题目描述 任何一个正整数都可以用 2 2 2 的幂次方表示。例如 137 2 7 2 3 2 0 1372^7 2^3 2^0 137272320。 同时约定次方用括号来表示&#xff0c;即 a b a^b ab 可表示为 a ( b ) a(b) a(b)。 由此可知&#xff0c; 137 137 137 可表示…

华为 HCIP-Datacom H12-821 题库 (33)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.VLAN Pool 只要通过一个 SSID 就能够同时支持多个业务 VLAN&#xff0c;从而缩小广播域&#…

draw.io 设置默认字体及添加常用字体

需求描述 draw.io 是一个比较好的开源免费画图软件。但是其添加容器或者文本框时默认的字体是 Helvetica&#xff0c;一般的期刊、会议论文或者学位论文要求的英文字体是 Times New Roman&#xff0c;中文字体是 宋体&#xff0c;所以一般需要在文本字体选项里的下拉列表选择 …

Spring开发最佳实践之跨域处理

1. 跨域处理 1.1 异常现象 1.2 异常原因分析 跨源资源共享的官方定义如下&#xff1a; 跨源资源共享&#xff08;CORS&#xff0c;Cross Origin Resource Sharing。或通俗地译为跨域资源共享&#xff09;是一种基于 HTTP 头的机制&#xff0c;该机制通过允许服务器标示除了它自…

线性代数入门

线性代数入门 线性代数&#xff08;Linear Algebra&#xff09;是数学的重要分支之一&#xff0c;广泛应用于工程、计算机科学、物理学、经济学等领域。它主要研究向量、矩阵及其在空间中的变换。对于程序员来说&#xff0c;掌握线性代数的基础知识能够帮助更好地理解数据处理…

[C++]使用纯opencv部署yolov8-cls图像分类onnx模型

【算法介绍】 使用纯OpenCV部署YOLOv8-cls图像分类ONNX模型涉及几个关键步骤。 首先&#xff0c;你需要将YOLOv8-cls模型从PyTorch格式转换为ONNX格式&#xff0c;这是为了确保模型在不同深度学习框架之间的互操作性。这个转换过程通常是通过ultralytics框架中的model.export…

Linux TFTP服务器搭建

话得多说 先水一波字 TFTP&#xff08;Trivial File Transfer Protocol&#xff09;是一种简单的文件传输协议。它用于在计算机网络中传输文件&#xff0c;特别适用于在网络设备&#xff08;如开发板和Linux系统下&#xff09;代码调试等操作。TFTP使用UDP&#xff08;User Da…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz

SpringBoot教程&#xff08;二十四&#xff09; | SpringBoot实现分布式定时任务之Quartz 简介适用场景Quartz核心概念Quartz 存储方式Quartz 版本类型引入相关依赖开始集成方式一&#xff1a;内存方式(MEMORY)存储实现定时任务1. 定义任务类2. 定义任务描述及创建任务触发器3.…

C语言的柔性数组

目录 柔性数组1.柔性数组的特点&#xff1a;2.柔性数组的使用3.柔性数组的优势 柔性数组 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。 C99 中&#xff0c;结构体中的最后⼀个元素允许是未知⼤⼩的数组&…

程序员日志之DNF手游女鬼剑异界套选择思路

目录 传送门正文日志1、概要2、剑宗3、剑豪4、剑魔5、暗帝 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff09; SpringBoot3框架&#xff08;精品&#xff09; MyBatis框架&#xff08;精品&#xff09; MyBatis-Plus Sp…

STM32 OLED

文章目录 前言一、OLED是什么&#xff1f;二、使用步骤1.复制 OLED.C .H文件1.1 遇到问题 2.统一风格3.主函数引用头文件3.1 oled.h 提供了什么函数 4.介绍显示一个字符的函数5. 显示十进制函数的讲解 三、使用注意事项3.1 配置符合自己的引脚3.2 花屏总结 前言 提示&#xff…

Elasticsearch要点简记

Elasticsearch要点简记 1、ES概述2、基础概念&#xff08;1&#xff09;索引、文档、字段&#xff08;2&#xff09;映射&#xff08;3&#xff09;DSL 3、架构原理4、索引字段的数据类型5、ES的三种分页方式&#xff08;1&#xff09;深度分页&#xff08;fromsize&#xff09…

ndb9300public-ndb2excel简介

1 引言 ndb9300是一个自己定义的机载导航数据库劳作&#xff08;不敢称为项目&#xff09;代号&#xff0c;其中3表示是第3种数据库。 多年前&#xff0c;对在役民航客机中的某型机载导航数据库的二进制文件进行分析&#xff0c;弄明白它的数据结构后做了几个工具&#xff0c…

【Flutter】- 核心语法

文章目录 知识回顾前言源码分析1. 有状态组件2. 无状态组件3. 组件生命周期4. 常用组件Container组件Text组件Image组件布局组件row colum stack expandedElevntButton按钮拓展知识总结知识回顾 【Flutter】- 基础语法 前言 Flutter是以组件化的思想构建客户端页面的,类似于…

算法与程序课程设计——观光铁路

观光铁路 一、任务 跳蚤国正在大力发展旅游业&#xff0c;每个城市都被打造成了旅游景点。 许多跳蚤想去其他城市旅游&#xff0c;但是由于跳得比较慢&#xff0c;它们的愿望难以实现。这时&#xff0c;小C听说有一种叫做火车的交通工具&#xff0c;在铁路上跑得很快&#x…

Kubernetes proxy 命令与集群资源交互中起的作用

关于 Kubernetes 中的 kubectl proxy 命令&#xff0c;理解它的作用有助于更深入地掌握 Kubernetes 如何管理集群内的资源&#xff0c;以及开发和调试时如何通过代理来简化交互。kubectl proxy 提供了一种安全且方便的方式来访问 Kubernetes API 服务器&#xff0c;尤其是在调试…

今日指数day8实战补充(上)

1.用户管理 1.多条件综合查询 1.1 多条件综合查询接口说明 1&#xff09;原型效果 2&#xff09;接口说明 功能描述&#xff1a;多条件综合查询用户分页信息&#xff0c;条件包含&#xff1a;分页信息 用户创建日期范围 服务路径&#xff1a;/api/users 服务方法&#xff1…

用Manim简单解释奇异值分解(SVD)和图像处理方面的应

一&#xff0c;介绍 奇异值分解&#xff08;SVD&#xff09;是一种重要的矩阵分解技术&#xff0c;在统计学、信号处理和机器学习等领域有广泛应用。对于任意给定的矩阵 A&#xff08;可以是任意形状的矩阵&#xff09;&#xff0c;SVD将其分解为三个特定的矩阵的乘积&#x…