分享一个403界面给大家

这篇具有很好参考价值的文章主要介绍了分享一个403界面给大家。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先看效果图(说明:小鬼影会飘来飘去,长时间停留会有小惊喜,具体大家跑一下就知道):
分享一个403界面给大家
代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>403页面</title>
  <style>
    @import url('https://fonts.googleapis.com/css?family=Open+Sans|Nova+Mono');
    :root {
      --font-header: 'Nova Mono', monospace;
      --font-text: 'Open Sans', sans-serif;
      --color-theme: #F1EEDB;
      --color-bg: #282B24;

      --animation-sentence: '你知道你应该离开,对吧?';
      --animation-duration: 40s;
    }
    * {
      box-sizing: border-box;
      margin: 0;
      padding: 0;
    }
    body {
      width: 100%;
      font-family: var(--font-text);
      color: var(--color-theme);
      background: var(--color-bg);
      overflow: hidden;
    }
    .container {
      text-align: center;
      margin: 1rem 0.5rem 0;
    }
    .container h1 {
      font-family: var(--font-header);
      font-size: calc(4rem + 2vw);
      text-transform: uppercase;
    }
    .container p {
      text-transform: uppercase;
      letter-spacing: 0.2rem;
      font-size: 2rem;
      margin: 1.5rem 0 3rem;
    }
    svg.keyhole {
      height: 82px;
      width: 82px;
      opacity: 0;
      visibility: hidden;
      /* 为钥匙孔定义一个动画,以引入默认情况下暂停的动画,在JavaScript中超时运行*/
      animation: showKey 0.5s 0.5s paused ease-out forwards;
    }
    svg.key {
      height: 164px;
      width: 164px;
      position: absolute;
      opacity: 0;
      visibility: hidden;
      /* 为钥匙孔定义一个动画,以引入默认情况下暂停的动画,在JavaScript中超时运行*/
      animation: showKey 0.5s 0.5s paused ease-out forwards;
    }
    .ghost {
      /* border: 1px solid tomato; */
      position: absolute;
      bottom: 5px;
      left: calc(50% - 100px);
      width: 200px;
      height: 200px;
      /* 让鬼影移动到屏幕的右侧和左侧,转到其中心位置并重复动画两次 */
      animation: hoverGhost calc(var(--animation-duration)/2) ease-in-out 2;

    }
    /* 通过连接到动画div的伪元素引入文本 */
    .ghost:before {
      content: var(--animation-sentence);
      color: var(--color-theme);
      border-radius: 50%;
      position: absolute;
      bottom: 100%;
      text-align: center;
      line-height: 2;
      padding: 1rem;
      visibility: hidden;
      opacity: 0;
      /* 当鬼影从屏幕右边缘返回时,引入每一个文本字符串,以及覆盖中心部分所需的时间长度(第四个字符串,由于动画长度是总持续时间的一半,因此变为八个字符串)
      /* 假设持续时间为40秒的情况下,第一个延迟为7.5秒,第二个延迟为27.5秒,最后一个延迟为40秒,经过运算,可以归结为316、2740和1
      // 记得在钥匙和钥匙孔的动画中加入一点延迟
      */
      animation:
              showText calc(var(--animation-duration)/8) calc(var(--animation-duration)*3/16) ease-out forwards,
              showNewText calc(var(--animation-duration)/8) calc(var(--animation-duration)*27/40) ease-out forwards,
              showFinalText calc(var(--animation-duration)/8) var(--animation-duration) ease-out forwards;

    }

    /* 定义关键帧动画-悬停鬼影使鬼影向右、向左移动,然后返回到其默认位置
    -showKey将钥匙(和钥匙孔)svg引入视图
    -showText、showNewText、showFinalText显示不同的字符串*/
    @keyframes hoverGhost {
      25% {
        transform: translateX(20vw);
      }
      75% {
        transform: translateX(-20vw);
      }
    }

    @keyframes showKey {
      to {
        opacity: 1;
        visibility: visible;
      }
    }

    /* 更改文本,更改自定义属性的值,厌倦了在隐藏伪元素时更改其值,以及在最后一个关键帧中更改其值(因为动画根据填充模式属性的“向前”值给出该值)*/
     @keyframes showText {
      2% {
        opacity: 1;
        visibility: visible;
      }
      98% {

        opacity: 1;
        visibility: visible;
      }
      99% {
        --animation-sentence: '你知道你应该离开,对吧?';
        opacity: 0;
        visibility: hidden;
      }
      100% {
        --animation-sentence: '这么多事情要做,这么少时间...';
      }
    }
    @keyframes showNewText {
      2% {
        --animation-sentence: '这么多事情要做,这么少时间...';
        opacity: 1;
        visibility: visible;
      }
      98% {

        opacity: 1;
        visibility: visible;
      }
      99% {
        --animation-sentence: '这么多事情要做,这么少时间...';
        opacity: 0;
        visibility: hidden;
      }
      100% {
        --animation-sentence: '好吧,你似乎很关心这个.这是一把只给你的钥匙..';
      }
    }
    @keyframes showFinalText {
      2% {
        opacity: 1;
        visibility: visible;
      }
      98% {
        opacity: 1;
        visibility: visible;
      }
      100% {
        opacity: 0;
        visibility: hidden;
      }
    }
  </style>
</head>
<body>
<!-- 包括在项目中使用的svg -->
<svg style="display: none;">
  <symbol id="keyhole" xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 26.458333 26.458334"><g transform="translate(0 -270.542)"><circle cx="13.229" cy="279.141" r="8.599" fill="#f1eedb" paint-order="stroke fill markers"/><path d="M10.516 283.271h5.427c1.164 0 1.768.861 2.102 1.802l3.59 10.125c.334.94-.937 1.802-2.102 1.802H6.926c-1.165 0-2.437-.861-2.103-1.802l3.59-10.125c.334-.94.938-1.802 2.103-1.802z" fill="#f1eedb" paint-order="stroke fill markers"/><circle r="6.06" cy="279.141" cx="13.229" fill="#282b24" paint-order="stroke fill markers"/><path d="M11.502 283.76h3.455c.741 0 1.126.733 1.338 1.534l2.286 8.614c.213.8-.597 1.534-1.338 1.534H9.216c-.742 0-1.551-.733-1.339-1.534l2.286-8.614c.212-.8.597-1.534 1.339-1.534z" fill="#282b24" paint-order="stroke fill markers"/></g></symbol>
  <symbol id="key" xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 26.458333 26.458334"><circle cx="13.229" cy="279.141" r="8.599" paint-order="stroke fill markers" transform="matrix(0 -.76923 .7499 0 -202.882 23.405)" fill="#f1eedb"/><circle r="8.599" cy="279.141" cx="13.229" paint-order="stroke fill markers" transform="matrix(0 -.5887 .57392 0 -153.756 21.017)" fill="#282b24"/><path fill="#f1eedb" paint-order="stroke fill markers" d="M12.03 12.13h14.428v2.2H12.03z"/><path fill="#f1eedb" paint-order="stroke fill markers" d="M18.147 12.13h2.895v6.772h-2.895zM22.113 12.13h2.716v5.065h-2.716z"/></symbol>
  <symbol id="ghost" xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 26.458333 26.458334"><g transform="translate(0 -270.542)"><path d="M4.63 279.293c0-4.833 3.85-8.751 8.6-8.751 4.748 0 8.598 3.918 8.598 8.75H13.23zM4.725 279.293h16.914c.052 0 .19.043.19.096l-.095 14.329c0 .026-.011.05-.028.068a.093.093 0 0 1-.067.028c-.881 0-1.235-1.68-2.114-1.616-.995.072-1.12 2.082-2.114 2.154-.88.064-1.233-1.615-2.115-1.615-.881 0-1.233 1.615-2.114 1.615-.881 0-1.233-1.615-2.114-1.615-.882 0-1.236 1.679-2.115 1.615-.994-.072-1.12-2.082-2.114-2.154-.88-.063-1.41 1.077-2.114 1.616-.021.016-.05-.01-.067-.028a.097.097 0 0 1-.028-.068v-14.33c0-.052.042-.095.095-.095z" fill="#f1eedb" paint-order="stroke fill markers"/><path d="M15.453 281.27a1.987 1.94 0 0 1-.994 1.68 1.987 1.94 0 0 1-1.987 0 1.987 1.94 0 0 1-.994-1.68h1.988z" fill="#282b24" paint-order="stroke fill markers"/><g fill="#282b24" transform="matrix(1 0 0 1.0177 .283 -5.653)"><ellipse cx="10.205" cy="278.668" rx="1.231" ry="1.181" paint-order="stroke fill markers"/><ellipse ry="1.181" rx="1.231" cy="278.668" cx="16.159" paint-order="stroke fill markers"/><ellipse ry=".331" rx=".853" cy="280.936" cx="10.205" opacity=".5" paint-order="stroke fill markers"/><ellipse cx="16.159" cy="280.936" rx=".853" ry=".331" opacity=".5" paint-order="stroke fill markers"/></g><ellipse ry=".614" rx="8.082" cy="296.386" cx="13.229" opacity=".1" fill="#f1eedb" paint-order="stroke fill markers"/></g></symbol>
</svg>

<!-- 在一个容器中包括一个标题、段落和锁眼的svg -->
<div class="container">
  <h1>403</h1>
  <p>access not granted</p>
  <svg class="keyhole">
    <use href="#keyhole"/>
  </svg>
</div>

<!-- 在容器外部,使它们相对于主体绝对定位,包括一个用于钥匙的svg和一个用于鬼影的svg -->
<svg class="key">
  <use href="#key"/>
</svg>

<!--
  将svg嵌套在div中,为svg和div提供相同的类div和svg在通过transform属性转换元素时表现不同,
  从而在文本(包含在div上的伪元素中)和svg之间提供了很好的距离
-->
<div class="ghost">
  <svg class="ghost">
    <use href="#ghost"/>
  </svg>
</div>
</body>
<script>
  // 以项目中使用的DOM中的元素为目标

  /**
   * 钥匙和钥匙孔的svg
   * 标题和段落
   */
  const key = document.querySelector(".key");
  const keyhole = document.querySelector(".keyhole");
  const ghost = document.querySelector(".ghost");

  const heading = document.querySelector("h1");
  const paragraph = document.querySelector("p");

  // 对于timout的长度,请考虑--animation-duration自定义属性,并在根元素上添加一个小延迟检索属性
  const root = document.querySelector(":root");
  const rootStyles = getComputedStyle(root);

  // 检索动画持续时间自定义属性
  // 这被指定为“40s”,以秒为单位,因此解析数字并以毫秒为单位将其包括在内
  const animationDuration = parseInt(rootStyles.getPropertyValue("--animation-duration"))*1000;
  let keyTimer = animationDuration*9/8;

  // 检索钥匙的尺寸(使钥匙正好位于光标所在的位置)
  const keyBox = key.getBoundingClientRect();
  // console.log(keyBox);

  // 钥匙和钥匙孔动画
  // 在指定的时间范围内包括超时
  const timeoutID = setTimeout(() => {
    // 在指定的时间后,将光标更改为似乎抓住了钥匙
    key.parentElement.parentElement.style.cursor = "grab";

    // 通过触发默认情况下暂停的动画,引入钥匙和钥匙孔svg元素
    key.style.animationPlayState = "running";
    keyhole.style.animationPlayState = "running";

    // 将钥匙上的指针事件设置为none,以允许在钥匙孔上发生鼠标悬停事件
    // 钥匙实际上是代替普通光标使用的,并且会重叠在所有内容的顶部
    key.style.pointerEvents = "none";

    // 当光标悬停在窗口中的任何位置时,调用一个函数来更新钥匙的位置并使其与光标匹配
    window.addEventListener("mousemove", updateKeyPosition);

    // 当光标悬停在钥匙孔上时,调用一个函数来授予访问权限并删除当前侦听器
    keyhole.addEventListener("mouseover", grantAccess);

    clearTimeout(timeoutID);
  }, keyTimer);


  // 定义根据鼠标坐标(以及钥匙自身的尺寸)更新绝对定位钥匙的位置的功能
  const updateKeyPosition = (e) => {
    let x = e.clientX;
    let y = e.clientY;
    key.style.left = x - keyBox.width/1.5;
    key.style.top = y - keyBox.height/2;
  };

  // 定义通知用户授予访问权限的功能
  const grantAccess = () => {

    // 恢复光标
    key.parentElement.parentElement.style.cursor = "default";

    // 更改标题和段落元素的文本
    heading.textContent = '🎉 yay 🎉';
    paragraph.textContent = 'access granted';

    // 从文档流中删除钥匙和钥匙孔的svg元素
    keyhole.style.display = "none";
    key.style.display = "none";

    // 删除事件侦听器,尤其是窗口上的侦听器
    window.removeEventListener("mousemove", updateKeyPosition);
    keyhole.removeEventListener("mouseover", grantAccess);
  };

</script>
</html>

PS:发现我用文字写太生硬了,干的噎嗓子,干脆在代码里加注释了。文章来源地址https://www.toymoban.com/news/detail-459806.html

到了这里,关于分享一个403界面给大家的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 必做的高收益自媒体平台,分享给大家

    现在市面上的自媒体平台是非常多的,大大小小加起来也有30好几个,但是要说到哪些平台收益比较高,那就不得不提到下面这个几个主流平台,今天就给大家分享一下收益比较高的几个主流平台。 第一个:百家号 百家号平台目前的收益单价在众多自媒体平台来说真的算是非

    2024年02月12日
    浏览(38)
  • 这几个ai写作生成器分享给大家

    大家知道吗,现在市场有许多ai写作软件,它们已经能够模仿人类的写作风格,帮大家轻松地生成文章。我对于非常感兴趣,于是就上网查了一下有可以ai写作的软件吗?结果真的找到几款不错的软件,今天借这个机会我将它们分享给你。 以下是今天分享的ai写作软件 一:A

    2024年02月15日
    浏览(57)
  • 微软文字转语音不能试用了,分享三个方法给大家!

    最近很多小伙伴告诉我,微软文字转语音不能在线试用了,这是因为微软关闭了官方的使用页面,所以现在不能直接使用微软的网页版进行文字转语音了。 那么我们还有没有更好的方法去“白嫖”微软的文字转语音呢? 答案是肯定的,今天再给大家分享三个可以白嫖微软文

    2024年02月11日
    浏览(48)
  • 分享几个源码网站奉献给大家(持续更新中……)

    1.51源码: http://www.51aspx.com/ 2.源码之家: http://www.codejia.com/ 3.源码网: http://www.codepub.com/ 4.虾客源码: http://www.xkxz.com/ 5.多多源码: http://www.morecode.net/ 6.洪越源代码: http://www.softhy.net/ 7.锋网源码:http://www.fwvv.net/ 8.代码爱好者:http://www.codefans.com/ 9.爱源码:http://www.aiyuanma

    2024年01月16日
    浏览(54)
  • 如何从视频中提取音频?分享三个免费的方法给大家!

    在数字时代,视频和音频的使用越来越广泛。有时,您可能希望从视频中提取音频,以便单独使用或与他人分享。无需购买昂贵的软件或具备专业技能,下面将介绍三种免费的方法,帮助您从视频中提取音频。这些方法简单易行,适用于任何人。 方法一:使用剪映 剪映是一

    2024年02月06日
    浏览(57)
  • 免费分享一些Open Ai的key,供大家使用

    谁创造了ChatGPT? ChatGPT由人工智能和研究公司OpenAI创建。该公司于2022年11月30日发布推出了ChatGP OpenAI还负责创建流行的画图模型DALL-E和自动语音识别系统Whisper。 ChatGPT官方的运营成本大概是多少? GPT-3 训练一次的成本约为 140 万美元。 对于一些更大的 LLM(大型语言模型),

    2024年02月05日
    浏览(81)
  • 免费使用微软Azure进行文字转语音!分享三个方法给大家!

    作为一个短视频制作的爱好者,使用了非常多的文字转语音工具,其中最接近真人发声的还是微软的文字转语音工具,这也是目前非常多的自媒体制作者在使用的文字转语音工具,目前有21种发声角色可以选择,而且可以自己挑整语速以及音调等功能,所以今天就给大家分享

    2024年02月01日
    浏览(53)
  • 迟到的秋招经验分享贴,希望能帮到大家

          由于毕业之前各种各样的事情,去年的秋招经验一直没有整理分享,现在趁周末尽可能多的将之前的资料整理一下,方便各位找工作的师弟师妹们参考,也算将自己的一点点经验分享给大家,希望能帮到大家。 (1) 一定要学会抱团取暖 。       各位同学身边肯定

    2023年04月08日
    浏览(49)
  • cajviewer怎么转换成pdf格式,分享几个方法给大家!

    CAJViewer是一款常用的文献阅读软件,它主要用于打开和阅读中国知网等数据库中的CAJ格式文件。然而,有时候我们可能需要将这些CAJ文件转换为PDF格式,以便更方便地与他人分享或者进行打印。本文将介绍两到三种将CAJViewer文件转换为PDF格式的方法,其中之一是使用记灵在线

    2024年02月08日
    浏览(102)
  • 和大家分享一下学习清风老师的数学建模课的过程

    作为一名大一数学系的新生,就读于某中上游985大学,为了锻炼自己的能力和为以后保研做准备,所以想参加数学建模大赛,于是便早早的组好了队友,想着早起的鸟儿有虫吃,起初是在学长学姐的建议下买了司守奎老师的《数学建模算法与应用》想着看书自学大干一番,可

    2024年04月25日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包