用HTML、CSS和JavaScript实现鼠标可交互的3D太阳和月亮切换效果

news2024/11/29 7:50:49

部分数据来源:ChatGPT 

引言

        太阳和月亮对于我们来说是一种常见的对比,这篇文章将介绍一个使用HTML、CSS和JavaScript创建的网页场景,能够把太阳和月亮切换展示给用户。这个场景能够让用户使用鼠标和滚轮与场景互动,带来更多的趣味和体验。

HTML代码实现部分

这里展示了HTML部分的代码来创建页面结构,包括头部文件声明,以及结构元素body和其中的两个div标签。

<!DOCTYPE html>
<html lang="zh-CN">

<head>
 <meta charset="UTF-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 <title>太阳和月亮切换</title>
 <style>
   /* CSS代码在这里*/
 </style>
 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" />
</head>

<body>
  <!-- 页面容器 -->
  <div id="page-container">
    <!-- 立方体面板 -->
    <div class="face front"></div>
    <div class="face back"></div>
    <div class="face top"></div>
    <div class="face bottom"></div>
    <div class="face left"></div>
    <div class="face right"></div>
  </div>
  <!-- 太阳和月亮切换按钮 -->
  <div id="sun-moon-toggle" onclick="toggleSunMoon()">
    <i class="fas fa-moon"></i>
    <i class="fas fa-sun"></i>
  </div>

 <script>
   // JavaScript代码在这里
 </

在代码中, #page-container 这个元素用来定义一个3D立方体场景,而 #sun-moon-toggle 用来表示切换按钮。页面中也链接了一个Font Awesome图标库实现按钮图标的展示。

CSS代码实现部分

下面是CSS代码的具体实现细节,其中包括页面元素的外观(如颜色、大小、位置等)以及3D场景的效果等。

   /* 设置 HTML 元素高度为 100% */
    html {
      height: 100%;
    }

    /* 设置 body 元素样式 */
    body {
      margin: 0;
      height: 100%;
      display: flex;
      justify-content: center;
      align-items: center;
      background-color: #2d3436;
      font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    }

    /* 设置页面容器样式 */
    #page-container {
      width: 500px;
      height: 500px;
      position: relative;
      transform-style: preserve-3d;
      transition: transform 0.3s ease-in-out;
    }

    /* 设置太阳和月亮切换按钮样式 */
    #sun-moon-toggle {
      position: absolute;
      top: 20px;
      right: 0px;
      z-index: 1;
      cursor: pointer;
      width: 60px;
      height: 60px;
      display: flex;
      justify-content: center;
      align-items: center;
      border-radius: 50%;
      background-color: #fff;
      box-shadow: 0px 0px 30px rgba(0, 0, 0, 0.3);
      transition: right 0.3s ease-in-out;
    }

    /* 设置太阳和月亮图标样式 */
    #sun-moon-toggle i {
      font-size: 28px;
      color: #f39c12;
      transition: color 0.3s ease-in-out;
    }

    /* 设置太阳和月亮切换按钮为夜间模式样式 */
    #sun-moon-toggle.sun-shown i.fa-moon {
      color: #f1c40f;
    }

    /* 设置太阳和月亮切换按钮为白天模式样式 */
    #sun-moon-toggle.sun-shown i.fa-sun {
      color: #fdcb6e;
    }

    /* 设置立方体面板样式 */
    .face {
      width: 500px;
      height: 500px;
      position: absolute;
      background-repeat: no-repeat;
      background-size: 100% 100%;
      border: 5px solid #fff;
      box-sizing: border-box;
      transform: translate3d(0, 0, 250px);
    }

    /* 设置前面板样式 */
    .front {
      background-image: url("https://picsum.photos/500");
      transform: rotateY(0deg) translateZ(250px);
    }

    /* 设置后面板样式 */
    .back {
      background-image: url("https://picsum.photos/501");
      transform: rotateY(180deg) translateZ(250px);
    }

    /* 设置上面板样式 */
    .top {
      background-image: url("https://picsum.photos/502");
      transform: rotateX(-90deg) translateZ(250px);
    }

    /* 设置底面板样式 */
    .bottom {
      background-image: url("https://picsum.photos/503");
      transform: rotateX(90deg) translateZ(250px);
    }

    /* 设置左面板样式 */
    .left {
      background-image: url("https://picsum.photos/504");
      transform: rotateY(-90deg) translateZ(250px);
    }

    /* 设置右面板样式 */
    .right {
      background-image: url("https://picsum.photos/505");
      transform: rotateY(90deg) translateZ(250px);
    }

JavaScript代码实现部分

下面是JavaScript代码的实现,其中包括:

  • 获取页面DOM元素
  • 初始化变量
  • 切换太阳和月亮的按钮点击事件
  • 鼠标按下、松开和移动事件
  • 鼠标滚轮事件

完整JavaScript代码如下:

 // 获取DOM元素
    const pageContainer = document.getElementById("page-container");
    const sunMoonToggle = document.getElementById("sun-moon-toggle");
    const moonIcon = document.querySelector("#sun-moon-toggle .fa-moon");
    const sunIcon = document.querySelector("#sun-moon-toggle .fa-sun");

    // 初始化变量
    let isSunShown = false; // 初始状态下显示月亮

    // 为按钮绑定点击事件
    function toggleSunMoon() {
      if (isSunShown) {
        // 从太阳到月亮
        sunMoonToggle.classList.remove("sun-shown");
        moonIcon.style.display = "inline-block";
        sunIcon.style.display = "none";
        document.body.style.backgroundColor = "#2d3436";
      } else {
        // 从月亮到太阳
        sunMoonToggle.classList.add("sun-shown");
        sunIcon.style.display = "inline-block";
        moonIcon.style.display = "none";
        document.body.style.backgroundColor = "#ffeaa7";
      }
      isSunShown = !isSunShown;
    }

    // 鼠标按下事件
    let isMouseDown = false;
    let pageX, pageY;
    document.addEventListener("mousedown", (event) => {
      isMouseDown = true;
      pageX = event.pageX;
      pageY = event.pageY;
    });

    // 鼠标松开事件
    document.addEventListener("mouseup", () => {
      isMouseDown = false;
    });

    // 鼠标移动事件
    document.addEventListener("mousemove", (event) => {
      if (!isMouseDown) return;
      const deltaX = event.pageX - pageX;
      const deltaY = event.pageY - pageY;
      pageContainer.style.transform += `rotateX(${deltaY * 0.5}deg) rotateY(${deltaX * -0.5
        }deg)`;
      pageX = event.pageX;
      pageY = event.pageY;
    });

    // 鼠标滚轮事件
    let scale = 1;
    document.addEventListener("wheel", (event) => {
      event.preventDefault();
      scale += event.deltaY * -0.01;
      scale = Math.min(Math.max(0.5, scale), 3); // 缩放边界
      pageContainer.style.transform = `rotateX(0deg) rotateY(0deg) scale(${scale})`;
    });

        在这个代码片段中, scale 变量存储当前页面的缩放比例,当鼠标滚轮事件发生时, event.deltaY 用于获取鼠标滚轮的方向(正值表示向上滚动,负值则表示向下滚动),并根据其值更新 scale 变量。同时更新页面样式中的transform属性,以实现页面缩放。

完整的HTML、CSS和JavaScript代码如下:

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>太阳和月亮切换</title>
  <style>
    /* 设置 HTML 元素高度为 100% */
    html {
      height: 100%;
    }

    /* 设置 body 元素样式 */
    body {
      margin: 0;
      height: 100%;
      display: flex;
      justify-content: center;
      align-items: center;
      background-color: #2d3436;
      font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    }

    /* 设置页面容器样式 */
    #page-container {
      width: 500px;
      height: 500px;
      position: relative;
      transform-style: preserve-3d;
      transition: transform 0.3s ease-in-out;
    }

    /* 设置太阳和月亮切换按钮样式 */
    #sun-moon-toggle {
      position: absolute;
      top: 20px;
      right: 0px;
      z-index: 1;
      cursor: pointer;
      width: 60px;
      height: 60px;
      display: flex;
      justify-content: center;
      align-items: center;
      border-radius: 50%;
      background-color: #fff;
      box-shadow: 0px 0px 30px rgba(0, 0, 0, 0.3);
      transition: right 0.3s ease-in-out;
    }

    /* 设置太阳和月亮图标样式 */
    #sun-moon-toggle i {
      font-size: 28px;
      color: #f39c12;
      transition: color 0.3s ease-in-out;
    }

    /* 设置太阳和月亮切换按钮为夜间模式样式 */
    #sun-moon-toggle.sun-shown i.fa-moon {
      color: #f1c40f;
    }

    /* 设置太阳和月亮切换按钮为白天模式样式 */
    #sun-moon-toggle.sun-shown i.fa-sun {
      color: #fdcb6e;
    }

    /* 设置立方体面板样式 */
    .face {
      width: 500px;
      height: 500px;
      position: absolute;
      background-repeat: no-repeat;
      background-size: 100% 100%;
      border: 5px solid #fff;
      box-sizing: border-box;
      transform: translate3d(0, 0, 250px);
    }

    /* 设置前面板样式 */
    .front {
      background-image: url("https://picsum.photos/500");
      transform: rotateY(0deg) translateZ(250px);
    }

    /* 设置后面板样式 */
    .back {
      background-image: url("https://picsum.photos/501");
      transform: rotateY(180deg) translateZ(250px);
    }

    /* 设置上面板样式 */
    .top {
      background-image: url("https://picsum.photos/502");
      transform: rotateX(-90deg) translateZ(250px);
    }

    /* 设置底面板样式 */
    .bottom {
      background-image: url("https://picsum.photos/503");
      transform: rotateX(90deg) translateZ(250px);
    }

    /* 设置左面板样式 */
    .left {
      background-image: url("https://picsum.photos/504");
      transform: rotateY(-90deg) translateZ(250px);
    }

    /* 设置右面板样式 */
    .right {
      background-image: url("https://picsum.photos/505");
      transform: rotateY(90deg) translateZ(250px);
    }
  </style>
  <!-- 引入 font-awesome 图标库的 CSS 文件 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" />
</head>

<body>
  <!-- 页面容器 -->
  <div id="page-container">
    <!-- 立方体面板 -->
    <div class="face front"></div>
    <div class="face back"></div>
    <div class="face top"></div>
    <div class="face bottom"></div>
    <div class="face left"></div>
    <div class="face right"></div>
  </div>
  <!-- 太阳和月亮切换按钮 -->
  <div id="sun-moon-toggle" onclick="toggleSunMoon()">
    <i class="fas fa-moon"></i>
    <i class="fas fa-sun"></i>
  </div>

  <script>
    // 获取DOM元素
    const pageContainer = document.getElementById("page-container");
    const sunMoonToggle = document.getElementById("sun-moon-toggle");
    const moonIcon = document.querySelector("#sun-moon-toggle .fa-moon");
    const sunIcon = document.querySelector("#sun-moon-toggle .fa-sun");

    // 初始化变量
    let isSunShown = false; // 初始状态下显示月亮

    // 为按钮绑定点击事件
    function toggleSunMoon() {
      if (isSunShown) {
        // 从太阳到月亮
        sunMoonToggle.classList.remove("sun-shown");
        moonIcon.style.display = "inline-block";
        sunIcon.style.display = "none";
        document.body.style.backgroundColor = "#2d3436";
      } else {
        // 从月亮到太阳
        sunMoonToggle.classList.add("sun-shown");
        sunIcon.style.display = "inline-block";
        moonIcon.style.display = "none";
        document.body.style.backgroundColor = "#ffeaa7";
      }
      isSunShown = !isSunShown;
    }

    // 鼠标按下事件
    let isMouseDown = false;
    let pageX, pageY;
    document.addEventListener("mousedown", (event) => {
      isMouseDown = true;
      pageX = event.pageX;
      pageY = event.pageY;
    });

    // 鼠标松开事件
    document.addEventListener("mouseup", () => {
      isMouseDown = false;
    });

    // 鼠标移动事件
    document.addEventListener("mousemove", (event) => {
      if (!isMouseDown) return;
      const deltaX = event.pageX - pageX;
      const deltaY = event.pageY - pageY;
      pageContainer.style.transform += `rotateX(${deltaY * 0.5}deg) rotateY(${deltaX * -0.5
        }deg)`;
      pageX = event.pageX;
      pageY = event.pageY;
    });

    // 鼠标滚轮事件
    let scale = 1;
    document.addEventListener("wheel", (event) => {
      event.preventDefault();
      scale += event.deltaY * -0.01;
      scale = Math.min(Math.max(0.5, scale), 3); // 缩放边界
      pageContainer.style.transform = `rotateX(0deg) rotateY(0deg) scale(${scale})`;
    });
  </script>
</body>

</html>

这段代码段通过HTML、CSS、JavaScript实现了一个太阳和月亮切换的3D动画效果,实现了用户可鼠标观看的效果,兼具技术性和美观性。

效果图

鼠标长按可以旋转 

按钮切换背景 

鼠标滑轮滚动可以缩放

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解锁Qt QListWidget的全部潜力——用最佳实践和技巧赢得用户的喜爱和赞誉!

文章目录 前言一、属性和方法添加列表项获取当前选中的列表项删除列表项列表显示模式交替背景色 二、信号与槽选中的行数变化item被点击 三、解决icon图标模式下图标不对称的问题1、设置属性2、面向结果的手动换行 总结 前言 在现代的GUI应用程序中&#xff0c;列表框是必不可…

什么是千兆光模块和万兆光模块?它们有什么区别?

众所周知千兆光模块和万兆光模块的主区别在于它们的传输速率不一样&#xff0c;那你还知道千兆光模块和万兆光模块的其他区别吗&#xff1f;接下来海翎光电的小编将对千兆光模块和万兆光模块的区别进行详细解析。 什么是千兆光模块&#xff1f; 千兆光模块即传输速率为1000Mbps…

Java之路:构建坚实基础,系统学习Java技术的终极指南

无论是初学者还是有经验的专业人士&#xff0c;在学习一门新的IT技术时&#xff0c;都需要采取一种系统性的学习方法。作为一名Java技术er&#xff0c;下面我将介绍我是如何系统的学习Java技术的。 一、Java技术介绍 Java是一种广泛应用于软件开发的高级编程语言&#xff0c;…

数据链路层:点对点协议PPP

数据链路层&#xff1a;点对点协议PPP 笔记来源&#xff1a; 湖科大教书匠&#xff1a;点对点协议PPP 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 数据链路层只负责直接相连的两个结点之间的通信 PPP是点对点数据链路层协议 用户通过ISP接入因特…

sklearn实现余弦相似度计算

from sklearn.metrics.pairwise import cosine_similarity cosine_similarity() 这个函数的输入是 n 个长度相同的 list 或 array 函数的处理是计算这 n 个 list 两两之间的余弦相似性 最后生成的是一个 n*n 的相似性矩阵s&#xff0c;s[i][j] 表示输入中第 i 个和第 j 个元…

如何在 Ubuntu Linux 上使用 SNAP 安装 Docker?

Docker 是一种开源的容器化平台&#xff0c;它允许开发人员将应用程序和其依赖项打包到一个可移植的容器中&#xff0c;以便在不同的环境中运行。在 Ubuntu Linux 上&#xff0c;我们可以使用 SNAP&#xff08;一种软件包管理系统&#xff09;来安装和管理 Docker。本文将详细介…

ProtoBuf 语法(一)

系列文章 ProtoBuf 语法&#xff08;二&#xff09; ProtoBuf 语法&#xff08;三&#xff09; 文章目录 前言一、字段规则二、消息类型的定义与使用2.1 定义2.2 使用 三、enum 类型3.1 定义规则3.2 注意事项 四、any 类型4.1 类型说明4.2 类型使用 五、oneof 类型六、map 类型…

HACKER KID: 1.0.1实战演练

文章目录 HACKER KID: 1.0.1实战演练一、前期准备1、相关信息 二、信息收集1、端口扫描2、访问网站3、扫描目录4、查看源码5、请求参数6、burpsuite批量请求7、编辑hosts文件8、DNS区域传输9、编辑hosts10、访问网站11、注册账号12、burpsuite抓包13、XML注入14、解密15、登录网…

供应链对于小程序、app等平台能带来什么好处?

供应链对于小程序、 app等平台的重要性不言而喻&#xff0c;这是一个企业生存的根本&#xff0c;只有保证了供应链&#xff0c;才能获得足够的产品和服务&#xff0c;保证企业能够长期稳定发展。因此很多企业都开始重视供应链&#xff0c;同时也在为之努力。 那么&#xff0c;…

gradle环境的spring boot搭建

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

tensorrt yolov7 推理

参考 源码修改如下&#xff1a;如果将源代码cpp/norm/yolo.hpp修改为自己训练的数据时修改如下&#xff1a; class YOLO{ const char* INPUT_BLOB_NAME "images"; const char* OUTPUT_BLOB_NAME "output"; }根据自己转换onnx模型采用netron打开查看 输入…

(2022,MoCA)Few-shot 图像生成的原型记忆(Prototype Memory)和注意力机制

Prototype Memory and Attention Mechanisms for Few Shot Image Generation 公众号&#xff1a;EDPJ 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 3.1 原型记忆学习 3.2 记忆概念注意力&#xff08;MEMORY CONCEPT ATTENTION&#xff0c;MoCA&#xff09; 3.3 空间上…

自平衡二叉树(AVL)及四种旋转方式详解

推荐可视化插入、删除节点的二叉树网站&#xff1a;AVL Tree Visualzation (usfca.edu) 1. 概述 AVL树是一种自平衡二叉搜索树&#xff0c;他是搜索二叉树(BST)的优化&#xff0c;它在每次插入或删除操作后&#xff0c;通过旋转节点来保持树的平衡性。AVL树的平衡条件是任意节…

代码随想录算法训练营第三十八天 | 力扣 509. 斐波那契数, 70. 爬楼梯, 746. 使用最小花费爬楼梯

509. 斐波那契数 题目 509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(…

几种经典算法

1.分治法 分治法也叫做分而治之法。核心思想是将一个难以直接解决的大问题依照相同的概念分割成两个或者多个相同的小问题&#xff0c;以便各个击破。 如图所示&#xff1a; 2.递归法 递归法和分而治之法像一对孪生兄弟&#xff0c;都是将一个复杂的算法问题进行分解&#x…

【JAVAWEB】CSS

目录 1.CSS是什么 2.基本语法规范 3.引入方式 3.1内部样式表 3.2行内样式表 3.3外部样式 4.代码风格 4.1样式风格 4.2样式大小写 4.3空格规范 5.选择器 5.1选择器的功能 5.2选择器的种类 1.基础选择器 2.复合选择器 6.常用元素属性 6.1字体属性 设置字体font-…

配置静态ip

1.切换到root用户&#xff08;当前永久&#xff0c;不是5分钟权限失效那种&#xff09; su root #普通用户切换到root用户 2.cd到网络配置文件夹network-scripts目录下 cd /etc/sysconfig/network-scripts ls #ls查看文件目录 #找到ifcfg-exx这个格式的文件&#xff0c;我这…

IIC总线协议的死锁问题

目录 1. IIC的特性 2. IIC死锁问题分析 3. 常见的IIC死锁问题解决方法 1. IIC的特性 IIC协议是一个允许一主多从通信的协议&#xff0c;只能用于短距离通信&#xff0c;并且只需要两根信号线来交换信息。 IIC的两根信号是SCL和SDA&#xff0c;SCL是时钟信号线&#xff0c;S…

【Linux】多线程01 --- 理解线程 线程控制及封装

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统编程 目录 一、线程概念 -- 理解线程与进程的区别和联系1. 再次理解用户级页表和进程地址空间2.理解Linux的轻量级进程3. 线程的属性4.线程的优点和缺点二、线程的控制 --- 学学接口使用 一、线程…

企业级帮助中心编写方案

随着互联网的飞速发展&#xff0c;越来越多的企业开始将客户服务转向线上服务。在这个过程中&#xff0c;企业级帮助中心因其高效的自助服务和低成本的维护方式受到越来越多企业的青睐。下文将从如何编写一个高质量的企业级帮助中心入手&#xff0c;为您介绍具体步骤。 一、明…