20231106-前端学习加载和视频球特效

加载效果

加载效果

代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>加载效果</title>
  <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"
    integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
  <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
  <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"
    integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
    crossorigin="anonymous"></script>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    body {
      background: #2980b9;
    }

    .loading {
      height: 40px;
      position: absolute;
      /* 使用绝对定位,相对于其最近的已定位祖先元素进行定位 */
      top: 50%;
      /* 将加载动画容器的顶部位置设为屏幕垂直中心 */
      left: 50%;
      /* 将加载动画容器的左侧位置设为屏幕水平中心 */
      display: flex;
      /* 使用弹性盒子布局 */
      transform: translate(-50%, -50%);
      /* 使用平移变换将加载动画容器水平和垂直居中 */
      align-items: center;
      /* 在交叉轴上居中对齐(垂直居中) */
    }

    .object {
      width: 6px;
      height: 40px;
      background: white;
      margin: 0 3px;
      border-radius: 10px;
      animation: loading 0.8s infinite;
      /* 使用名为 "loading" 的动画,持续时间为 0.8 秒,无限循环播放 */
      animation-play-state: paused;
      /* 初始状态为暂停 */
    }

    .xyBtn {
      position: absolute;
      top: 60%;
      left: 50%;
      transform: translate(-40%, -50%);
    }

    .object:nth-child(2) {
      animation-delay: 0.1s;
      /* 延迟 0.1 秒开始播放动画 */
    }

    .object:nth-child(3) {
      animation-delay: 0.2s;
    }

    .object:nth-child(4) {
      animation-delay: 0.3s;
    }

    .object:nth-child(5) {
      animation-delay: 0.4s;
    }

    .object:nth-child(6) {
      animation-delay: 0.5s;
    }

    .object:nth-child(7) {
      animation-delay: 0.6s;
    }

    .object:nth-child(8) {
      animation-delay: 0.7s;
    }


    @keyframes loading {
      0% {
        height: 0;
      }

      50% {
        height: 40px;
      }

      100% {
        height: 0;
      }
    }

    .animate {
      animation-play-state: running;
      /* 设置动画状态为运行中 */
    }

    .paused {
      animation-play-state: paused;
      /* 设置动画状态为暂停 */
    }
  </style>
</head>

<body>
  <div class="loading">
    <div class="object"></div>
    <div class="object"></div>
    <div class="object"></div>
    <div class="object"></div>
    <div class="object"></div>
    <div class="object"></div>
    <div class="object"></div>
    <div class="object"></div>
  </div>
  <button type="button" class="btn btn-info xyBtn" id="toggleButton">开始动画</button>

  <script>
    var toggleButton = document.getElementById("toggleButton");
    var objectElements = document.getElementsByClassName("object");
    var animationState = false;

    // 添加按钮点击事件处理程序
    toggleButton.addEventListener("click", function () {
      animationState = !animationState;

      if (animationState) {
        for (var i = 0; i < objectElements.length; i++) {
          objectElements[i].classList.add("animate");/* 添加 "animate" 类,开始播放动画 */
          objectElements[i].classList.remove("paused");/* 移除 "paused" 类,确保动画处于运行状态 */
        }
        toggleButton.textContent = "暂停动画";// 更新按钮文本为"暂停动画"
      } else {
        for (var i = 0; i < objectElements.length; i++) {
          objectElements[i].classList.add("paused");
          objectElements[i].classList.remove("animate");
        }
        toggleButton.textContent = "开始动画";// 更新按钮文本为"开始动画"
      }
    });
  </script>
</body>

</html>

创意视频球特效

 创意视频球特效

代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>创意视频球特效</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    body {
      overflow: hidden;
      /* 隐藏页面的滚动条 */
    }

    section {
      position: absolute;
      /* 绝对定位 */
      top: -100px;
      left: -100px;
      right: -100px;
      bottom: -100px;
      display: flex;
      /* 使用弹性布局 */
      justify-content: center;
      /* 水平居中对齐 */
      align-items: center;
      /* 垂直居中对齐 */
    }

    section video {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      object-fit: cover;
      /* 使用 cover 填充视频 */
      filter: blur(35px);
      /* 添加模糊效果 */
    }

    section .sphere {
      position: relative;
      /* 相对定位 */
      width: 600px;
      height: 600px;
      border-radius: 50%;
      z-index: 10;
    }

    section .sphere::before {
      content: "";
      /* 伪元素内容为空 */
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      z-index: 100;
      border-radius: 50%;
      box-shadow: inset 0 100px 100px rgba(255, 255, 255, 0.5),
        /* 内阴影效果 */
        inset 0 -100px 100px rgba(0, 0, 0, 1),
        inset 0 0 100px rgba(0, 0, 0, 1);
    }

    section .sphere::after {
      content: "";
      position: absolute;
      top: 550px;
      left: -50px;
      width: 700px;
      height: 100px;
      z-index: -1;
      border-radius: 50%;
      background: black;
      background: radial-gradient(black, transparent, transparent);
      /* 底部渐变效果 */
    }

    section .sphere video {
      width: 100%;
      height: 100%;
      position: absolute;
      top: 0;
      left: 0;
      object-fit: cover;
      border-radius: 50%;
      filter: blur(0);
      /* 取消模糊效果 */
    }

    section .controls {
      /* background-color: aqua; */
      position: absolute;
      bottom: 100px;
      left: 50%;
      transform: translateX(-50%);
      display: flex;
      align-items: center;
    }

    section .controls button {
      background: none;
      border: none;
      outline: none;
      cursor: pointer;
      color: white;
      font-size: 20px;
      margin-right: 10px;
      font-family: 'Times New Roman', Times, serif;
    }

    section .controls input[type="range"] {
      width: 800px;
      margin-right: 10px;
    }

    section .controls span {
      color: white;
      font-size: 18px;
      font-family: 'Times New Roman', Times, serif;
    }
  </style>
</head>

<body>
  <section>
    <video id="backgroundVideo" src="../Videos/1-“挑 战 B 站 画 质 上 限”-4K 超清-AVC.mp4"></video>
    <div class="sphere">
      <video id="sphereVideo" src="../Videos/1-“挑 战 B 站 画 质 上 限”-4K 超清-AVC.mp4"></video>
    </div>
    <div class="controls">
      <button id="playPauseButton">播放</button>
      <input type="range" id="progressBar" min="0" step="0.001">
      <span id="currentTime">00:00</span>&nbsp;
      <span>/</span>&nbsp;
      <span id="duration">00:00</span>
    </div>
  </section>

  <script>
    // 等待文档加载完成后执行
    document.addEventListener("DOMContentLoaded", function () {
      // 获取视频元素和控制按钮
      var backgroundVideo = document.getElementById("backgroundVideo"); // 背景视频元素
      var sphereVideo = document.getElementById("sphereVideo"); // 球形视频元素
      var playPauseButton = document.getElementById("playPauseButton"); // 播放/暂停按钮
      var progressBar = document.getElementById("progressBar"); // 进度条
      var currentTime = document.getElementById("currentTime"); // 当前时间
      var duration = document.getElementById("duration"); // 视频总时长

      // 初始状态下暂停视频
      backgroundVideo.pause();
      sphereVideo.pause();

      // 设置进度条初始值为0
      progressBar.value = 0;

      // // 在视频加载完成后获取最后一帧的画面并显示在视频元素上
      // backgroundVideo.addEventListener("loadeddata", function () {
      //   backgroundVideo.currentTime = backgroundVideo.duration; // 将视频播放位置设置为最后一帧
      //   backgroundVideo.pause(); // 暂停视频
      //   sphereVideo.currentTime = backgroundVideo.duration; // 将球形视频播放位置设置为最后一帧
      //   sphereVideo.pause(); // 暂停球形视频
      // });

      // 播放/暂停按钮点击事件
      playPauseButton.addEventListener("click", function () {
        if (backgroundVideo.paused) {
          // 如果背景视频暂停,则播放背景视频和球形视频
          backgroundVideo.play();
          sphereVideo.play();
          playPauseButton.textContent = "暂停"; // 更新按钮文本为"暂停"
        } else {
          // 如果背景视频正在播放,则暂停背景视频和球形视频
          backgroundVideo.pause();
          sphereVideo.pause();
          playPauseButton.textContent = "播放"; // 更新按钮文本为"播放"
        }
      });

      // 更新进度条和当前时间
      backgroundVideo.addEventListener("timeupdate", function () {
        // 计算视频播放进度(百分比)
        var progress = (backgroundVideo.currentTime / backgroundVideo.duration) * 100;
        progressBar.value = progress; // 更新进度条的值
        currentTime.textContent = formatTime(backgroundVideo.currentTime); // 更新当前时间显示
      });

      // 改变视频播放位置
      progressBar.addEventListener("input", function () {
        // 计算进度条对应的视频播放时间
        var progressTime = (progressBar.value / 100) * backgroundVideo.duration;
        // 设置背景视频和球形视频的当前播放时间
        backgroundVideo.currentTime = progressTime;
        sphereVideo.currentTime = progressTime;
        currentTime.textContent = formatTime(progressTime); // 更新当前时间显示
      });

      // 将时间格式化为 mm:ss 格式
      function formatTime(time) {
        var minutes = Math.floor(time / 60); // 计算分钟数
        var seconds = Math.floor(time % 60); // 计算秒数
        // 格式化为 mm:ss 格式,并在分钟数或秒数小于10时添加前导零
        return (minutes < 10 ? "0" : "") + minutes + ":" + (seconds < 10 ? "0" : "") + seconds;
      }

      // 更新视频总时长
      backgroundVideo.addEventListener("loadedmetadata", function () {
        duration.textContent = formatTime(backgroundVideo.duration); // 更新视频总时长显示
      });

      // 监听视频播放完毕事件
      backgroundVideo.addEventListener("ended", function () {
        // 在视频播放完毕后执行的操作
        playPauseButton.textContent = "播放"; // 更新按钮文本为"播放"
        progressBar.value = 0; // 重置进度条的值
        currentTime.textContent = "00:00"; // 重置当前时间显示
      });
    });
  </script>
</body>

</html>

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

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

相关文章

HarmonyOS应用开发-ArkTS基础知识

作者&#xff1a;杨亮Jerry 作为多年的大前端程序开发工作者&#xff0c;就目前的形式&#xff0c;个人浅见&#xff0c;在未来3-5年&#xff0c;移动端依旧是Android系统和iOS系统的天下。不过基于鸿蒙系统的应用开发还是值得我们去花点时间去了解下的&#xff0c;阅读并实践官…

公共数据这座金矿,授权运营为何是赋能的关键路径?

数据要素市场化正开启下一个关键阶段。 自2014年大数据写入政府工作报告&#xff0c;到全国各地大数据交易所涌现&#xff0c;再到《数据二十条》颁布&#xff0c;中国数据要素产业探索之路已走过近十载。如今&#xff0c;国家大数据局正式成立&#xff0c;更是标志着数据要素…

2023数学建模国赛C题赛后总结

今天国赛的成绩终于出来了&#xff0c;盼星星盼月亮的。之前面试的时候已经把我给推到国奖评委那里去了&#xff0c;可是好可惜&#xff0c;最终以很微小的劣势错失国二。只拿到了广西区的省一。我心里还是很遗憾的&#xff0c;我真的为此准备了很久&#xff0c;虽然当中也有着…

vue3+setup 解决:this.$refs引用子组件报错 is not a function

一、如果在父组件中以下四步都没问题的话&#xff0c;再看下面步骤 二、如果父组件引用的是index页面 请在 头部加上以下代码 &#xff08;如果是form页面请忽略这一步&#xff09; <template> <a-modalv-model:visible"visible"title"头部名称&…

Dockerfile

文章目录 基本概念commit构建镜像常用指令拓展指令ARGUSERONBUILDHEALTHCHECK SpringBoot项目镜像构建Nginx项目镜像构建 基本概念 Docker为我们提供一个用于自定义构建镜像的一个配置文件。利用docker的build命令&#xff0c;指定dockerfile文件&#xff0c;就能按配置内容把…

数据仓库工具箱-零售业务

文章目录 一、维度模型设计的4步过程1.1 第一步&#xff1a;选择业务过程1.2 第二步&#xff1a;声明粒度1.3 第三步&#xff1a;确定维度1.4 第四步&#xff1a;确定事实 二、零售业务案例研究2.1 第一步&#xff1a;选择业务过程2.2 第二步&#xff1a;声明粒度2.3 第三步&am…

,多数据源+Mybatisplus + Sharding JDBC同一库中分表

水平分表是在同一个数据库内&#xff0c;把同一个表的数据按一定规则拆到多个表中,多数据源采用 mybatis-plus的dynamic-datasource 分库分表采用sharding-jdbc 数据库连接池管理是alibaba的druid-spring-boot-starter 同一个数据库内分表 目录 1.数据库表 2.配置 3.引入的…

企业计算机服务器中了360勒索病毒怎么办?勒索病毒解密,数据恢复

网络技术的不断发展给企业的生产与生活提供了极大的帮助&#xff0c;但随之而来的网络安全威胁也不断增加&#xff0c;近期&#xff0c;云天数据恢复中心的工程师接到了很多企业的求助&#xff0c;企业的计算机服务器数据库遭到了360后缀勒索病毒&#xff0c;通过对该病毒的检测…

如何使用Pyarmor保护你的Python脚本

目录 一、Pyarmor简介 二、使用Pyarmor保护Python脚本 1、安装Pyarmor 2、创建Pyarmor项目 3、添加Python脚本 4、配置执行环境 5、生成保护后的脚本 三、注意事项与未来发展 四、未来发展 五、总结 本文深入探讨了如何使用Pyarmor工具保护Python脚本。Pyarmor是一个…

MySQL数据脱敏(Data masking plugin functions)

对于企业而言&#xff0c;数据脱敏可以在数据共享或测试时用于保护敏感数据&#xff08;如信用卡&#xff0c;社保卡&#xff0c;地址等&#xff09;。通过对敏感数据进行脱敏处理&#xff0c;组织可以最大限度地降低数据泄露和未经授权访问的风险&#xff0c;同时仍能够使用真…

基于springboot+vue的影城管理系统

影城管理系统 编号&#xff1a;springboot33 源码合集&#xff1a; www.yuque.com/mick-hanyi/javaweb 源码下载&#xff1a;博主私 目 录 摘 要 1 前 言 2 第1章 概述 2 1.1 研究背景 3 1.2 研究目的 3 1.3 研究内容 4 第二章 开发技术介绍 5 2.1相关技术 5 2.2 Java技术 6…

二进制代码反汇编逆向工具:IDA Pro(WinMac)v7.7 汉化版

IDA Pro是一款交互式的、可编程的、可扩展的、多处理器的、交叉Windows或Linux WinCE MacOS平台主机来分析程序。它被公认为最好的花钱可以买到的逆向工程利器&#xff0c;已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。 IDA Pro的特点主要包括…

Mac 下安装golang环境

一、下载安装包 安装包下载地址 下载完成&#xff0c;直接继续----->下一步到结束即可安装成功&#xff1b; 安装成功之后&#xff0c;验证一下&#xff1b; go version二、配置环境变量 终端输入vim ~/.zshrc进入配置文件&#xff0c;输入i进行编辑 打开的不管是空文本…

Flink(二)【Flink 部署模式】

前言 今天是Flink学习的第二天&#xff0c;我的心情异常的复杂哈哈哈&#xff08;苦笑&#xff09;&#xff0c;学习上还是比较顺利的&#xff0c;感情上我并不擅长&#xff0c;所以心情波动大在所难免。害&#xff0c;至少还有学习让我不被各种糟糕琐碎的日常生活里的人和事所…

Mac下flutter工程配置Gitlab cicd打包(暂时仅限android侧)

写的太粗糙&#xff0c;可能不太适合完全不懂的同学&#xff0c;但是实在没时间&#xff0c;而且也不太会写&#xff0c;权当做一个记录吧&#xff0c;对了还没有搞docker这些&#xff0c;还在持续学习中 1.GitLab Runner&#xff08;打包机&#xff09; 注意:需要有对应的权…

关于卷积神经网络中如何计算卷积核大小(kernels)

首先需要说明的一点是&#xff0c;虽然卷积层得名于卷积&#xff08; convolution &#xff09;运算&#xff0c;但我们通常在卷积层中使用更加直观的计算方式&#xff0c;叫做互相关&#xff08; cross-correlation &#xff09;运算。 也就是说&#xff0c;其实我们现在在这里…

84 柱状图中的最大的矩形(单调栈)

题目 柱状图中的最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 …

使用python快速搭建接口自动化测试脚本实战总结

导读 本文将介绍如何使用python快速进行http/https接口自动化测试脚本搭建&#xff0c;实现自动请求、获取结果、数据对比分析&#xff0c;导出结果到Excel等功能&#xff0c;包括python的requests、pandas、openpyxl等库的基本使用方法。 测试需求介绍 通常&#xff0c;在我…

Node.js |(七)express案例实践:记账本 | 尚硅谷2023版Node.js零基础视频教程

文章目录 &#x1f4da;基本结构搭建&#x1f4da;响应静态网页&#x1f4da;获取表单数据&#x1f4da;借助lowdb保存账单信息&#x1f4da;完善成功提醒&#x1f4da;账单列表&#x1f4da;删除账单&#x1f4da;final 学习视频&#xff1a;尚硅谷2023版Node.js零基础视频教程…

git上传项目至github(Linux)

01 git版本创建 git init 创建版本库 创建一个版本 git add test1.cpp git commit -m 说明信息 git log 查看版本记录 02 版本回退 git reset --hard HEAD^ 版本回退一个 git reset --hard HEAD^^ 版本回退二个 git reset --hard 版本号 版本回退到指定版本&#xff0…
最新文章