3D相框案例讲解(详细)

前言

通过现阶段的学习,我们已经掌握了HTML,CSS和JS部分的相关知识点,现在让我们通过一篇案例,来巩固我们近期所学的知识点。

详细视频讲解戳这里

任务一 了解目标案例样式

1.1了解案例

3D相框

1.2 分析案例

首先我们看到一个完整的图片被分成16份,每张小图片都有黄色阴影衬托除3D效果,当我们点击按钮时,所有小图片按Z轴旋转360°并合称为一张照片,此时大照片也有黄色阴影衬托3D效果,再次点击按钮,大图片一同样的方式变回小照片。

源图片

1.3 整理思路

在HTML中创建按钮部分以及一个盒子。在CSS中修饰按钮,设置图片,定义图片移动方向及方式,定义阴影。在JS中实现按钮与盒子的交互,以及将一张图片分成16等份。

任务二 创建3D相框文件包

创建一个本地文件


将源代码,以及所需图片放在一起。

任务三 HTML框架部分

3.1 按钮部分

按钮部分简单,仅需id和类名即可

<button id="a" class="c">Magic </button>

3.2 盒子部分

盒子部分同理,不同点是有两个类名,因为以后照片要向外扩,所以有两个类名,分别适应不同情况。

<div id="b" class="c1 c2"></div>

任务四 CSS初始样式部分

4.1 body样式

*{

  box-sizing: border-box;

}

body {

  background-color: rgb(255, 255, 255);

  display: flex;

  flex-direction: column;

  align-items: center;

  justify-content: center;

  height: 100vh;

}

*{ } 这是一个通用选择器

flex-direction: column; - 这个属性设置flex容器的主轴方向为垂直

align-items: center; - 这个属性设置flex容器内项目在交叉轴上的对齐方式。

justify-content: center; - 这个属性设置flex容器内项目在主轴上的对齐方式。

4.2 按钮样式

.c{

  background-color: #f9ca25;

  color: #ffffff;

  border: 0;

  border-radius: 5px;

  font-size: 18px;

  padding: 12px 20px;

  cursor: pointer;

  position: fixed;

  top: 30px;

  z-index: 1;

}

border-radius: 5px; - 设置元素的边框圆角为5像素。

cursor: pointer; - 当鼠标悬停在元素上时,鼠标光标会变成指针形状。

position: fixed; - 设置元素的位置为固定定位。

z-index: 1; - 设置元素的堆叠顺序为1。

运行如下:

4.3 盒子样式

.c1{

  display: flex;

  flex-wrap: wrap;

  justify-content: space-around;

  width: 500px;

  height: 500px;

  position: relative;

}

.c2{

  width: 600px;

  height: 600px;

}

c1为图片完整前盒子,c2为图片拆分后盒子大小。

flex-wrap: wrap; - 设置flex容器的换行行为。

justify-content: space-around; - 设置flex容器内项目在主轴上的对齐方式。

position: relative; - 设置元素的位置为相对定位。

任务五 JS交互部分

5.1 按钮与盒子交互

const r1 = document.getElementById('b')

const r2 = document.getElementById('a')

r2.addEventListener('click', () => r1.classList.toggle('c2'))

意为实现id为a和id为b相互交互

任务六 JS图片分裂

6.1 功能实现

function fun(){

  for(let i = 0; i <= 3; i++){

    for(let j= 0; j <= 3; j++){

      const x = document.createElement('div')

      x.classList.add('x')

      x.style.backgroundPosition = `${-j * 125}px ${-i * 125}px`

      r1.appendChild(x)

    }

  }

}

fun()

这里我们定义了一个名为fun的函数,并在函数内部创建了一个4x4的div元素网格。每个div元素都被添加到一个名为r1的容器中,并且每个div都有一个x类。

详情解析:

  1. 定义了一个名为fun的函数
  2. 开始一个外层循环,循环变量i从0开始,直到小于或等于3(即循环4次)。
  3. 在外层循环内部,开始一个内层循环,循环变量j从0开始,直到小于或等于3(即循环4次)。
  4. 在内层循环内部,创建一个新的div元素,并将其赋值给常量x。
  5. 给新创建的div元素添加一个名为x的类。这使得该元素可以通过CSS样式进行样式化。
  6. 设置新创建的div元素的backgroundPosition样式属性。这里使用了模板字符串来计算背景图片的位置。-j * 125和-i * 125的计算结果用于确定背景图像的显示位置。
  7. 将新创建的div元素x添加到名为r1的容器中。
  8. 调用fun函数,执行上述代码,创建并添加16个div元素到r1容器中。

任务七 CSS修饰图片

7.1 图片部分

.x{

  background-image: url('../源代码/EZqwsBSPlvSda.webp');

  background-repeat: no-repeat;

  background-size: 500px 500px;

  position: relative;

  width: 125px;

  height: 125px;

  transition: 0.7s ease;

}

background-repeat: no-repeat; - 设置背景图像不重复。

position: relative; - 设置元素的位置为相对定位。

transition: 0.7s ease; - 定义一个过渡效果,当元素的某些属性值发生变化时,这个过渡效果会被应用。

.c1.c2 .x{

    trandform: rotateZ(360deg);

}

这里我们使用了后代选择器和类选择器的组合来应用样式。

transform: rotateZ(360deg); - 这个属性应用了一个CSS变换,使得匹配的元素围绕Z轴旋转360度。

7.2 3D背景阴影部分

.x::after{

  content: '';

  background-color: #f6e58d;

  position: absolute;

  top: 8px;

  right: -15px;

  height: 100%;

  width: 15px;

  transform: skewY(45deg);

}

.x::before{

  content: '';

  background-color: #f9ca25;

  position: absolute;

  bottom: -15px;

  left: 8px;

  height: 15px;

  width: 100%;

  transform: skewX(45deg);

}

这段CSS代码使用了伪元素::after和::before来给具有类x的元素添加装饰性的效果。

position: absolute; - 将伪元素的定位设置为绝对定位。

transform: skewY(45deg); - 应用一个Y轴倾斜的变换效果,倾斜角度为45度,使得伪元素沿Y轴倾斜。

整合代码


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            box-sizing: border-box;
        }
        body {
            background-color: rgb(255, 255, 255);
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            height: 100vh;
        }
        .c{
            background-color: #f9ca25;
            color: #ffffff;
            border: 0;
            border-radius: 5px;
            font-size: 18px;
            padding: 12px 20px;
            cursor: pointer;
            position: fixed;
            top: 30px;
            z-index: 1;
        }
        .c1{
            display: flex;
            flex-wrap: wrap;
            justify-content: space-around;
            width: 500px;
            height: 500px;
            position: relative;
        }
        .c2{
            width: 600px;
            height: 600px;
        }
        .c1.c2 .x{
            transform: rotateZ(360deg);
        }
        .x{
            background-image: url(.//3d.webp);
            background-repeat: no-repeat;
            background-size: 500px 500px;
            position: relative;
            width: 125px;
            height: 125px;
            transition: 0.7s ease;  
        }
        .x::after{
            content: '';
            background-color: #f6e58d;
            position: absolute;
            top: 8px;
            right: -15px;
            height: 100%;
            width: 15px;
            transform: skewY(45deg);
        }
        .x::before{
            content: '';
            background-color: #f9ca25;
            position: absolute;
            bottom: -15px;
            left: 8px;
            height: 15px;
            width: 100%;
            transform: skewX(45deg);
        }
    </style>
</head>
<body>
    <button id="a" class="c">Magic </button>
    <div id="b" class="c1 c2"></div>
    <script>
        const r1 = document.getElementById('b')
        const r2 = document.getElementById('a')
        r2.addEventListener('click', () => r1.classList.toggle('c2'))
        function fun(){
            for(let i = 0; i <= 3; i++){
                for(let j= 0; j <= 3; j++){
                    const x = document.createElement('div')
                    x.classList.add('x')
                    x.style.backgroundPosition = `${-j * 125}px ${-i * 125}px`
                    r1.appendChild(x)
                }
            }
        }
        fun()
    </script>
</body>
</html>

效果图

将全体代码写完后运行

3D相框

 

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

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

相关文章

网络安全漏洞挖掘之漏洞SSRF

SSRF简介 SSRF(Server-Side Request Forgery:服务器端请求伪造是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能够请求到与它相连而与外…

简单的Java小项目

学生选课系统 在控制台输入输出信息&#xff1a; 在eclipse上面的超级简单文件结构&#xff1a; Main.java package experiment_4;import java.util.*; import java.io.*;public class Main {public static List<Course> courseList new ArrayList<>();publi…

VPN模式

拓扑结构 实验图&#xff1a; 路由器router 配置 DHCP配置 需要右键激活 路由器项配置网关 dns项配置ip DNS服务配置 正向区域 选择不允许动态更新 反向区域 创建主机 正向 验证是否创建成功 反向查找区域 输入网段 使用默认名称---不允许动态更新 KALI机的验证 web服务…

IS-IS协议

IS-IS协议介绍 IS-IS&#xff08;Intermediate System to Intermediate System&#xff09;协议是一种链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在同一个自治系统&#xff08;Autonomous System, AS&#xff09;内部的路由器之间交换路由信息。IS-I…

Git-基础操作命令

目录 Git基础操作命令 case *查看提交日志 log 版本回退 get add . Git基础操作命令 我们创建并且初始化这个仓库以后&#xff0c;我们就要在里面进行操作。 Git 对于文件的增删改查存在几个状态&#xff0c;这些修改状态会随着我们执行Git的命令而发生变化。 untracked、…

Java 枚举

目录 枚举是什么 常用方法 构造方法 枚举的优缺点 枚举和反射 实现单例模式 枚举是什么 枚举&#xff08;enum&#xff09;&#xff1a;是一种特殊的类&#xff0c;用于定义一组常量&#xff0c;将其组织起来。枚举使得代码更具有可读性和可维护性&#xff0c;特别是在处…

服务器限制某个端口只允许特定IP访问(处理第三方依赖漏洞)

最近项目部署之后&#xff0c;有些客户开始进行系统系统漏洞扫描&#xff0c;其中出现问题多的一个就是我们项目所依赖的Elasticsearch&#xff08;es检索服务&#xff09;&#xff0c;很容易就被扫出来各种高危漏洞&#xff0c;而且这些漏洞我们在处理起来是很棘手的&#xff…

安卓 文件管理相关功能记录

文件管理细分为图片、视频、音乐、文件四类 目录 权限 静态声明权限 动态检查和声明权限方法 如何开始上述动态申请的流程 提示 图片 获取图片文件的对象列表 展示 删除 视频 获取视频文件的对象列表 获取视频file列表 按日期装载视频文件列表 展示 播放 删除…

Springmvc初学

什么是springmvc springmvc框架它是spring框架的一个分支。它是按照mvc架构思想设计的一款框架。springmvc的主要作用: 接收浏览器的请求数据&#xff0c;对数据进行处理&#xff0c;然后返回页面进行显示。 为什么要学习springmvc 如何使用springmvc&#xff1f; 1.创建maven…

知从科技总经理受邀参加上海临港新片区商会“湖畔TECS”技术分享沙龙(第五期)

11月26日&#xff0c;上海知从科技有限公司创始人陈荣波先生受邀出席临港新片区商会 “湖畔TECS”技术分享沙龙&#xff08;第五期&#xff09;活动&#xff0c;并在活动上为参会嘉宾们做了主题分享。本次活动由临港新片区商会主办&#xff0c;智能网联汽车创新联盟协办&#x…

Vue中纯前端实现导出简单Excel表格的功能

Vue 前端Excel导出 Vue中纯前端导出简单Excel表格的方法(使用vue-json-excel插件) 前言 在许多的后台系统中少不了导出Excel表格的功能&#xff0c;在项目中纯前端使用vue-json-excel插件来实现简单Excel表格的导出功能。 使用方法 1、安装依赖 npm install vue-json-exc…

QT6 Socket通讯封装(TCP/UDP)

为大家分享一下最近封装的以太网socket通讯接口 效果演示 如图&#xff0c;界面还没优化&#xff0c;后续更新 废话不多说直接上教程 添加库 如果为qmake项目中&#xff0c;在.pro文件添加 QT network QT core gui QT networkgreaterThan(QT_MAJOR_VERS…

ip_done

文章目录 路由结论 IP分片 数据链路层重谈Mac地址MAC帧报头局域网的通信原理MSS&#xff0c;以及MAC帧对上层的影响ARP协议 1.公司是不是这样呢? 类似的要给运营商交钱&#xff0c;构建公司的子网&#xff0c;具有公司级别的入口路由器 2&#xff0e;为什么要这样呢?? IP地…

LearnOpenGL学习(高级OpenGL -> 高级GLSL,几何着色器)

完整代码见&#xff1a;zaizai77/Cherno-OpenGL: OpenGL 小白学习之路 高级GLSL 内建变量 顶点着色器 gl_PointSoze : float 输出变量&#xff0c;用于控制渲染 GL_POINTS 型图元时&#xff0c;点的大小。可用于粒子系统。将其设置为 gl_Position.z 时&#xff0c;可以使点…

vscode设置终端代理

转载请标明出处&#xff1a;小帆的帆的博客 设置终端代理 修改项目的.vscode/settings.json {"terminal.integrated.env.windows": {"http_proxy": "http://127.0.0.1:7890","https_proxy": "http://127.0.0.1:7890"}, }…

计算机视觉中的边缘检测算法

摘要&#xff1a; 本文全面深入地探讨了计算机视觉中的边缘检测算法。首先阐述了边缘检测的重要性及其在计算机视觉领域的基础地位&#xff0c;随后详细介绍了经典的边缘检测算法&#xff0c;包括基于梯度的 Sobel 算子算法、Canny 边缘检测算法等&#xff0c;深入剖析了它们的…

ComfyUI 与 Stable Diffusion WebUI 的优缺点比较

ComfyUI与Stable Diffusion WebUI都是AI绘画领域比较知名两款产品&#xff0c;两者存在诸多差异&#xff0c;本篇就带你熟悉二者的优劣&#xff0c;方便自己做出决策。 界面与操作 ComfyUI&#xff1a;界面简洁直观&#xff0c;通过节点和连线的方式构建工作流&#xff0c;用…

2024年12月16日Github流行趋势

项目名称&#xff1a;PDFMathTranslate 项目维护者&#xff1a;Byaidu reycn hellofinch Wybxc YadominJinta项目介绍&#xff1a;基于 AI 完整保留排版的 PDF 文档全文双语翻译&#xff0c;支持 Google/DeepL/Ollama/OpenAI 等服务&#xff0c;提供 CLI/GUI/Docker。项目star数…

CDGA|“数据池塘资源”理论的出现对数据治理有怎样的影响?

“数据池塘资源”这一理论实践&#xff0c;可以理解为将数据集视为一个池塘&#xff0c;其中蕴含着丰富的信息和资源&#xff0c;有待于人们去挖掘和利用。这一理论实践对数据管理、分析和应用等领域可能会产生一系列深远的影响。以下是对其可能影响的详细分析&#xff1a; 一、…

linux学习笔记02 linux中的基础设置(修改主机名、ip、防火墙、网络配置管理)

目录 修改主机名 ​编辑 修改ip地址 防火墙 关闭networkmanage 修改主机名 查看主机名 hostnamectl status 修改主机名 vim /etc/hostname 修改ip地址 vim /etc/sysconfig/network-scripts/ifcfg-ens33 输入这个命令后对照以下文件修改 TYPE"Ethernet" PROXY_M…