前端小练-平台首页介绍+动画

news2024/9/26 1:24:58

文章目录

  • 前言
  • 结构
  • 头部
    • 外部容器
    • 文字
  • 主体
    • 小球动画
    • 打字机动画
      • 特效实现
      • 监控
  • 完整代码
  • 总结

前言

时间飞逝,快大四了,刚好最近看不下去考研的,而且要准备这个毕设选题了,然后就想着怎么能够把自己所学的东西都用上,一开始是打算做操作系统的,但是难度还是有点大,最重要的是,除了锻炼自己没有太大的意义,最起码以后,在我的代码库当中可能用不上,所以我就想换一样,于是我打算做一个AI算法开放平台。其实也就是开放API,让后让大家调用。目前是打算集成6个算法,其实也是我以前做过的,老粉应该是知道的,我就不废话 了。

那么来看看今天,做出的一个首页的效果吧:

请添加图片描述
那么这个页面的话,也是使用这个vue3 做的一个开放。

结构

我们先来看看这个页面的一个基本结构。那么首先的话,这个整个页面是采用Flex布局做的。
在这里插入图片描述

这里的话,我先分为两个部分。一个是首页头部的,那个背景图片,然后是介绍啥的。
之后是我们的主体。当然这个还没提取组件,只是一个大页面。

那么同样的,从上到下都是Flex布局。

头部

ok,我们现在一个一个模块来进行说明。首先是我们的头部模块。
在这里插入图片描述
那么这里的话,大概也是两个部分,一个是最外面的div,然后是两个里面的div,分别是上下文。

外部容器

我们先看到外部的容器。

    <div class="top zoom">
      <div class="title tracking-in-contract">
        Huterox AI 
      </div>
      <div class="content">
        Huterox 的开源 AI 算法开放平台
      </div>
    </div>

在这里我们有背景图片,然后还有动画。

.top{
  background-position: center;
  flex-direction: column;
  width: 100%;
  height: 600px;
  display: flex;
  background-color: #02162e;
  background-image: url('../../assets/img/bg.jpg');
  background-size: cover;
}

.zoom {
  /* background-size: 125%; */
  -webkit-animation: zoom 10s infinite alternate ease-in-out both;
	        animation: zoom 10s infinite alternate ease-in-out both;
}
@keyframes zoom {
  0% {
    background-size: 100%;
  }
  100% {
    background-size: 125%;
  }
}

文字

之后的话,是我们的文字,文字分为两个部分,标题和内容。
那么标题的话,也是动画的。

首先是标题的动画。

.title{
  margin-top: 200px;
  font-size: 80px;
  color: white;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 100px;
}
.tracking-in-contract {
	-webkit-animation: tracking-in-contract 5s cubic-bezier(0.215, 0.610, 0.355, 1.000) both;
	        animation: tracking-in-contract 5s cubic-bezier(0.215, 0.610, 0.355, 1.000) both;
}
@-webkit-keyframes tracking-in-contract {
  0% {
    letter-spacing: 1em;
    opacity: 0;
  }
  40% {
    opacity: 0.6;
  }
  100% {
    letter-spacing: normal;
    opacity: 1;
  }
}
@keyframes tracking-in-contract {
  0% {
    letter-spacing: 1em;
    opacity: 0;
  }
  40% {
    opacity: 0.6;
  }
  100% {
    letter-spacing: normal;
    opacity: 1;
  }
}

之后是我们的内容文字,这个的话,就居中就好了。


.content{
  font-size: 50px;
  display: flex;
  color: white;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 100px;
}

主体

然后是我们的主体的实现。
主体也是分为了5部分。
在这里插入图片描述

这里的话,内容比较多,我主要就说一下核心的实现就好了。

小球动画

首先,我们来看到,这个小球的动画
(这里说一下,这个首页的素材是由这个New Bing生成的)
在这里插入图片描述
我们主要先说这个,因为,其他的实现都是类似的,其实也是直接cv组合就好了。
首先是我们的HTML代码
在这里插入图片描述
然后,我们这个动画的话,其实主要是是由anime来做的。

    RunGui(){
      anime({
      targets: '#alternate .el',
      translateX: 100,
      direction: 'alternate',
      loop: true
    });
    },

打字机动画

之后的话,就是打字机的特效,这个其实也是。

特效实现

首先,我们先看到这个特效的实现。这里主要有两个点,一个是特效实现,还有一个是监控。也就是说,只有在页面滚动到那个地方的时候,我才给你加载这个动画。

首先这个是打字机的实现

 Typewriter(refDom,showString){
      const textContainer = refDom
      const text = showString
      let charIndex = 0
      const animateText = () => {
        textContainer.innerHTML = text.slice(0, charIndex)
        charIndex++

        if (charIndex <= text.length) {
          anime({
            targets: textContainer,
            opacity: [1,1],
            duration: 100,
            easing: 'linear',
            complete: animateText
          })
        }
      }
      animateText()
    }

我们先定位到那个Dom,然后一个一个加元素就好了。没办法,css不会,也就会布个局。

监控

然后就是监控了。

    /**
     * 打字机特效,通过anime.js来实现,传入定位的Dome,显示的文字
     * 还有是否一直监听
     */
    TypewriterDom(refDom,showString,runover,func){
      // 创建 IntersectionObserver 实例
      const io = new IntersectionObserver(entries => {
      entries.forEach(entry => {
        if (entry.isIntersecting) { 
          this.Typewriter(refDom,showString)
          //一次就好,避免资源浪费
          if(func){
            func()
          }
          if(runover){
            io.unobserve(refDom);
          }
         }
        });
      });
    // 开始监听
      io.observe(refDom);
    },

这里我们主要通过这个IntersectionObserver来实现监控。
然后在mounted里面加载
在这里插入图片描述

完整代码

🆗,我们最后来看到我们的完整代码。

<template>
  <div class="container">
    <div class="top zoom">
      <div class="title tracking-in-contract">
        Huterox AI 
      </div>
      <div class="content">
        Huterox 的开源 AI 算法开放平台
      </div>
    </div>
    <div class="main  color-change-5x">
      <div class="jianjie">
          <div class="part">
            <div class="partTitle">
              开放视觉
            </div>
            <div class="partContent">
              图像识别,目标检测,人体关键点检测
            </div>
          </div>
          <div class="part">
            <div class="partTitle">
              数据云盘
            </div>
            <div class="partContent">
              自定义数据集,定制化模型训练
            </div>
          </div>
          <div class="part">
            <div class="partTitle">
              内容生成
            </div>
            <div class="partContent">
              文本到内容,2D到3D,无限可能
            </div>
          </div>
      </div>
      <div class="jieshao">
        <div class="jie">
          <div class="jieleft zoom">
          </div>
          <div class="jieright">
            <div class="jierighttop">
              <!--方块特效 -->
              <div id="alternate">
                <div class="square1 el"></div>
              </div>
            </div>
            <!-- 文字说明 -->
            <div class="jierightbot" ref="box"></div>
          </div>
        </div>
      </div>
      <div class="jieshao">
        <div class="jie">
          <div class="jieleft1">
            <div class="jierighttop1">
              <!--特效 -->
              <div id="svgAttributes"> <svg width="256" height="256" viewBox="0 0 128 128">
              <polygon points="64 68.8628077439766 8.574 99.98498600107975 63.240037962811925 67.54607512963132 64 3.984986001079744 64.75996203718807 67.54607512963132 119.426 99.98498600107975 " fill="currentColor">
              </polygon>
              </svg> 
              </div>
            </div>
            <!-- 文字说明 -->
            <div class="jierightbot" ref="box1"></div>
          </div>
          <div class="jieright1 zoom">
          </div>
        </div>
      </div>
      <!-- 第三部分的 -->
      <div class="jieshao">
        <div class="jie">
          <div class="jieleft2 zoom">
          </div>
          <div class="jieright">
            <div class="jierighttop1">
              <!--特效 -->
                <div id="morphing"> <svg width="280" height="280" viewBox="0 0 140 140">
                <g fill="none" fill-rule="evenodd">
                <g fill="currentColor" fill-opacity=".15" transform="translate(0 6)">
                <polygon points="70 0 136.574 48.369 111.145 126.631 28.855 126.631 3.426 48.369"></polygon>
                <polygon points="70 18 119.455 53.931 100.565 112.069 39.435 112.069 20.545 53.931"></polygon>
                <polygon points="70 34.86 101.727 57.911 89.609 95.209 50.391 95.209 38.273 57.911"></polygon>
                <polygon points="70 50.898 84.864 61.697 79.186 79.171 60.814 79.171 55.136 61.697"></polygon>
                </g>
                <polygon class="polymorph" stroke-width="1" stroke="currentColor" points="70 26.11463815070492 119.44960952054677 60.24460952054677 101.51329527398553 119.49685719179845 52.0989047945323 99.51636184929508 5.540638150704919 55.11534287671938 "></polygon>
                </g>
                </svg> 
              </div>
            </div>
            <!-- 文字说明 -->
            <div class="jierightbot" ref="box2"></div>
          </div>
        </div>
      </div>
      <!-- 底部 -->
      <div class="footer">
        <!-- 特效 -->
        <div class="footershow">
          <div id="penner">
          <div class="line">
            <div class="small stretched square linear" style="transform: translateX(8.32375px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InQuad" style="transform: translateX(1.41935px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InCubic" style="transform: translateX(0.872133px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InQuart" style="transform: translateX(0.302639px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InQuint" style="transform: translateX(0.552566px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InSine" style="transform: translateX(0.301091px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InExpo" style="transform: translateX(0.437774px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InCirc" style="transform: translateX(0.625275px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InBack" style="transform: translateX(-3.78142px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square OutQuad" style="transform: translateX(15.4575px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square OutCubic" style="transform: translateX(23.5359px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square OutQuart" style="transform: translateX(38.4933px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square OutQuint" style="transform: translateX(35.4011px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square OutSine" style="transform: translateX(12.371px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square OutExpo" style="transform: translateX(43.1485px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square OutCirc" style="transform: translateX(75.0978px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square OutBack" style="transform: translateX(40.8483px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InOutQuad" style="transform: translateX(0.970785px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InOutCubic" style="transform: translateX(0.805919px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InOutQuart" style="transform: translateX(0.162609px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InOutQuint" style="transform: translateX(0.130278px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InOutSine" style="transform: translateX(1.35859px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InOutExpo" style="transform: translateX(0.0959568px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InOutCirc" style="transform: translateX(1.56201px);"></div>
          </div>
          <div class="line">
            <div class="small stretched square InOutBack" style="transform: translateX(-6.36447px);"></div>
          </div>
        </div>
        </div>
        <div class="footText">
          Huterox is Awesome
        </div>
      </div>
    </div>    
  </div>
</template>
<script>
import anime from 'animejs'
export default {
  name:'index',
  mounted() {
    const jieright1 = "集成众多视觉算法,高效,稳定完成图像识别,目标检测,人体关键点检测等多项任务。"
    this.TypewriterDom(this.$refs.box,jieright1,true,this.RunGui)
    const jieright2 = "开放云盘,支持自定义数据集,定制化任务,快速导入数据。"
    this.TypewriterDom(this.$refs.box1,jieright2,true,this.RunGui1)    
    const jieright3 = "支持内容生成技术,文本到图像,图像2D到3D,未来可期,无所不能。"
    this.TypewriterDom(this.$refs.box2,jieright3,true,this.RunGui2)

    this.RunGui3()
  },
  methods:{

    RunGui3(){
      var penner = anime.timeline({loop: true,direction: 'alternate',duration: 150,});
      penner
        .add({
          targets: '#penner .linear', translateX: 1100, offset: 0,
          easing: 'linear',
        })
        .add({
          targets: '#penner .InQuad', translateX: 1100, offset: 0,
          easing: 'easeInQuad',
        })
        .add({
          targets: '#penner .InCubic', translateX: 1100, offset: 0,
          easing: 'easeInCubic',
        })
        .add({
          targets: '#penner .InQuart', translateX: 1100, offset: 0,
          easing: 'easeInQuart',
        })
        .add({
          targets: '#penner .InQuint', translateX: 1100, offset: 0,
          easing: 'easeInQuint',
        })
        .add({
          targets: '#penner .InSine', translateX: 1100, offset: 0,
          easing: 'easeInSine',
        })
        .add({
          targets: '#penner .InExpo', translateX: 1100, offset: 0,
          easing: 'easeInExpo',
        })
        .add({
          targets: '#penner .InCirc', translateX: 1100, offset: 0,
          easing: 'easeInCirc',
        })
        .add({
          targets: '#penner .InBack', translateX: 1100, offset: 0,
          easing: 'easeInBack',
        })
        .add({
          targets: '#penner .OutQuad', translateX: 1100, offset: 0,
          easing: 'easeOutQuad',
        })
        .add({
          targets: '#penner .OutCubic', translateX: 1100, offset: 0,
          easing: 'easeOutCubic',
        })
        .add({
          targets: '#penner .OutQuart', translateX: 1100, offset: 0,
          easing: 'easeOutQuart',
        })
        .add({
          targets: '#penner .OutQuint', translateX: 1100, offset: 0,
          easing: 'easeOutQuint',
        })
        .add({
          targets: '#penner .OutSine', translateX: 1100, offset: 0,
          easing: 'easeOutSine',
        })
        .add({
          targets: '#penner .OutExpo', translateX: 1100, offset: 0,
          easing: 'easeOutExpo',
        })
        .add({
          targets: '#penner .OutCirc', translateX: 1100, offset: 0,
          easing: 'easeOutCirc',
        })
        .add({
          targets: '#penner .OutBack', translateX: 1100, offset: 0,
          easing: 'easeOutBack',
        })
        .add({
          targets: '#penner .InOutQuad', translateX: 1100, offset: 0,
          easing: 'easeInOutQuad',
        })
        .add({
          targets: '#penner .InOutCubic', translateX: 1100, offset: 0,
          easing: 'easeInOutCubic',
        })
        .add({
          targets: '#penner .InOutQuart', translateX: 1100, offset: 0,
          easing: 'easeInOutQuart',
        })
        .add({
          targets: '#penner .InOutQuint', translateX: 1100, offset: 0,
          easing: 'easeInOutQuint',
        })
        .add({
          targets: '#penner .InOutSine', translateX: 1100, offset: 0,
          easing: 'easeInOutSine',
        })
        .add({
          targets: '#penner .InOutExpo', translateX: 1100, offset: 0,
          easing: 'easeInOutExpo',
        })
        .add({
          targets: '#penner .InOutCirc', translateX: 1100, offset: 0,
          easing: 'easeInOutCirc',
        })
        .add({
          targets: '#penner .InOutBack', translateX: 1100, offset: 0,
          easing: 'easeInOutBack',
          
        });
    },

    RunGui2(){
      anime({
      targets: '#morphing .polymorph',
      points: [
        { value: '70 41 118.574 59.369 111.145 132.631 60.855 84.631 20.426 60.369' },
        { value: '70 6 119.574 60.369 100.145 117.631 39.855 117.631 55.426 68.369' },
        { value: '70 57 136.574 54.369 89.145 100.631 28.855 132.631 38.426 64.369' },
        { value: '70 24 119.574 60.369 100.145 117.631 50.855 101.631 3.426 54.369' }
      ],
      easing: 'easeOutQuad',
      duration: 2000,
      loop: true
    });
    },

    RunGui1(){
      anime({
        targets: '#svgAttributes polygon',
        points: '64 128 8.574 96 8.574 32 64 0 119.426 32 119.426 96',
        easing: 'easeInOutExpo',
        duration: 3000,
        loop: true
      });
    },

    RunGui(){
      anime({
      targets: '#alternate .el',
      translateX: 100,
      direction: 'alternate',
      loop: true
    });
    },

    /**
     * 打字机特效,通过anime.js来实现,传入定位的Dome,显示的文字
     * 还有是否一直监听
     */
    TypewriterDom(refDom,showString,runover,func){
      // 创建 IntersectionObserver 实例
      const io = new IntersectionObserver(entries => {
      entries.forEach(entry => {
        if (entry.isIntersecting) { 
          this.Typewriter(refDom,showString)
          //一次就好,避免资源浪费
          if(func){
            func()
          }
          if(runover){
            io.unobserve(refDom);
          }
         }
        });
      });
    // 开始监听
      io.observe(refDom);
    },

    Typewriter(refDom,showString){
      const textContainer = refDom
      const text = showString
      let charIndex = 0
      const animateText = () => {
        textContainer.innerHTML = text.slice(0, charIndex)
        charIndex++

        if (charIndex <= text.length) {
          anime({
            targets: textContainer,
            opacity: [1,1],
            duration: 100,
            easing: 'linear',
            complete: animateText
          })
        }
      }
      animateText()
    }
  } 
}
</script>

<style scoped>

.footText{
  display: flex;
  width: 100%;
  height: 100px;
  justify-content: center;
  align-items: center;
  font-size: 50px;
  color: whitesmoke;
}
.square{
  margin-left: 80px;
  margin-top: 2px;
  border-radius: 5px;
  width: 150px;
  height: 10px;
  background-color: #0d6cd8;
}
.footershow{
  display: flex;
  align-items: center;
  width: 100%;
  height: 400px;
  align-items: center;
  border-block-end: 3px whitesmoke solid;
}
.footer{
  margin-top: 1%;
  width: 100%;
  height: 600px;
  display: flex;
  flex-direction: column;
}

.jieleft2{
  margin-left: 10%;
  width: 40%;
  height: 500px;
  display: flex;
  background-size: cover;
  background-position: center;
  border-radius: 50px;
  background-image: url(../../assets/img/neirong.jpg);
}

.jierighttop1{
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 200px;
  display: flex;
  color: whitesmoke;
  font-size: 30px;
}

.jieright1{
  border-radius: 50px;
  background-image: url(../../assets/img/yunpan.jpg);
  background-size: cover;
  background-position: center;
  margin-left: 2%;
  width: 40%;
  height: 500px;
  display: flex;
  flex-direction: column;
}

.jieleft1{
  flex-direction: column;
  margin-left: 10%;
  width: 40%;
  height: 500px;
  display: flex;
}


.square1{
  height: 100px;
  border-radius: 100px;
  width: 100px;
  background-color: rgb(33, 138, 231);
}
.jierighttop{
  align-items: center;
  width: 100%;
  height: 200px;
  display: flex;
  color: whitesmoke;
  font-size: 30px;
}

.jierightbot{
  width: 100%;
  height: 200px;
  display: flex;
  align-items: center;
  color: whitesmoke;
  font-size: 30px;
}
.jieright{
  margin-left: 2%;
  width: 40%;
  height: 500px;
  display: flex;
  flex-direction: column;
}


.jieleft{
  margin-left: 10%;
  width: 40%;
  height: 500px;
  display: flex;
  background-size: cover;
  background-position: center;
  border-radius: 50px;
  background-image: url(../../assets/img/shijue.jpg);
}

.jie{
  width: 100%;
  height: 300px;
  display: flex;
}
.jieshao{
  margin-top: 1%;
  width: 100%;
  height: 600px;
  display: flex;
  flex-direction: column;
}
.partTitle{
  color: whitesmoke;
  font-size: 50px;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 150px;
}

.partTitle:hover {
	-webkit-animation: text-pop-up-top 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
	        animation: text-pop-up-top 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
}

@-webkit-keyframes text-pop-up-top {
  0% {
    -webkit-transform: translateY(0);
            transform: translateY(0);
    -webkit-transform-origin: 50% 50%;
            transform-origin: 50% 50%;
    text-shadow: none;
  }
  100% {
    -webkit-transform: translateY(-20px);
            transform: translateY(-20px);
    -webkit-transform-origin: 50% 50%;
            transform-origin: 50% 50%;
  }
}
@keyframes text-pop-up-top {
  0% {
    -webkit-transform: translateY(0);
            transform: translateY(0);
    -webkit-transform-origin: 50% 50%;
            transform-origin: 50% 50%;
    text-shadow: none;
  }
  100% {
    -webkit-transform: translateY(-20px);
            transform: translateY(-20px);
    -webkit-transform-origin: 50% 50%;
            transform-origin: 50% 50%;
  }
}



.partContent{
  color: whitesmoke;
  font-size: 20px;
  align-items: center;
  justify-content: center;
  display: flex;
  width: 100%;
}
.part{
  width: 33%;
  height: 300px;
  display: flex;
  flex-direction: column;
}
.jianjie{
  display: flex;
  width: 100%;
  margin: 0 auto;
  display: flex;
  height: 250px;
  border-block-end: 3px whitesmoke solid;
}
.main{
  display: flex;
  flex-direction: column;
  width: 100%;
}
.box_center{
  margin: 20px;
  width: 100%;
  width: 100%;
  background-color: #0d6cd8;
}

.content{
  font-size: 50px;
  display: flex;
  color: white;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 100px;
}
.title{
  margin-top: 200px;
  font-size: 80px;
  color: white;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 100px;
}
.tracking-in-contract {
	-webkit-animation: tracking-in-contract 5s cubic-bezier(0.215, 0.610, 0.355, 1.000) both;
	        animation: tracking-in-contract 5s cubic-bezier(0.215, 0.610, 0.355, 1.000) both;
}
@-webkit-keyframes tracking-in-contract {
  0% {
    letter-spacing: 1em;
    opacity: 0;
  }
  40% {
    opacity: 0.6;
  }
  100% {
    letter-spacing: normal;
    opacity: 1;
  }
}
@keyframes tracking-in-contract {
  0% {
    letter-spacing: 1em;
    opacity: 0;
  }
  40% {
    opacity: 0.6;
  }
  100% {
    letter-spacing: normal;
    opacity: 1;
  }
}

.top{
  background-position: center;
  flex-direction: column;
  width: 100%;
  height: 600px;
  display: flex;
  background-color: #02162e;
  background-image: url('../../assets/img/bg.jpg');
  background-size: cover;
}
.zoom {
  /* background-size: 125%; */
  -webkit-animation: zoom 10s infinite alternate ease-in-out both;
	        animation: zoom 10s infinite alternate ease-in-out both;
}
@keyframes zoom {
  0% {
    background-size: 100%;
  }
  100% {
    background-size: 125%;
  }
}
.container{
    display: flex;
    flex-direction: column;
    align-items: center;
    width: 100%;
    display: flex;
    margin: 0 auto;
}
.color-change-5x {
	-webkit-animation: color-change-5x 8s linear infinite alternate both;
	        animation: color-change-5x 8s linear infinite alternate both;
}

@-webkit-keyframes color-change-5x {
  0% {
    background: #363637;
  }
  25% {
    background: #414142;
  }
  50% {
    background: #272a2d;
  }
  75% {
    background: #464646;
  }
  100% {
    background: #151515;
  }
}
@keyframes color-change-5x {
  0% {
    background: #02162e;
  }
  25% {
    background:  #26262f;
  }
  50% {
    background: rgb(60, 60, 65);
  }
  75% {
    background: #1d1d2e;
  }
  100% {
    background:#212d2d;
  }
}

</style>

总结

ok,以上就是全部内容了,bye~bye

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

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

相关文章

Vue H5项目如何在PC端时布局居中展示,而不全屏拉伸

目录 1、场景再现&#xff1a;在PC端时 H5项目布局被拉伸2、代码实现3、最终效果图4、疑惑 1、场景再现&#xff1a;在PC端时 H5项目布局被拉伸 2、代码实现 在App.vue中的写入&#xff0c;vue2 的在mounted中写入&#xff0c;vue3的写在onMounted写入。 逻辑讲解&#xff1a…

Android 全局黑白化-模拟颜色空间

概述 平台&#xff1a; RK3568 Android 11在一些特殊的日子&#xff0c;如默哀日、灾难日&#xff0c;纪念日&#xff0c;哀悼日等&#xff0c;许多的APP、网页、海报等都开始使用黑白色主题。Android 的全局黑白实现方案&#xff0c;可以考虑使用模拟颜色空间的方法。 借助硬…

RabbitMQ高阶使用消息推送

目录 1 从打车开始说起1.1 需要解决的问题1.2 消息推送 2 消息推送2.1 什么是消息推送2.2 方案介绍2.2.1 ajax短轮询2.2.2 长轮询2.2.3 WebSocket 2.3 WS实现消息推送2.3.1 架构介绍2.3.2 暂存数据2.3.2.1 什么是MongoDB2.3.2.2 插入数据2.3.2.3 查询数据 2.4.1 轮询任务2.4.1.…

学生党暑假在家赚钱得方法,足不出户轻松赚取买鞋钱

很多学生党都想在暑假期间赚点零花钱&#xff0c;最好是能在家就赚钱。在家里赚零花钱有许多途径&#xff0c;今天我来和大家分享一些方法。 1、问答在各大平台上非常普遍。 我们可以在各大平台上找到各种各样的问答。 如今&#xff0c;问答平台越来越多&#xff0c;提供的奖…

平凯星辰重磅支持 2023 开放原子全球开源峰会,开源数据库分论坛成功召开

2023 年 6 月 11 日至 13 日&#xff0c;以“开源赋能&#xff0c;普惠未来”为主题的 2023 开放原子全球开源峰会开幕式暨高峰论坛在北京成功举办。企业级开源分布式数据库厂商平凯星辰联合创始人兼 CTO 黄东旭受邀出席峰会参与开源论道圆桌&#xff0c;担任开源数据库分论坛出…

吴恩达ChatGPT课爆火

点上方计算机视觉联盟获取更多干货 没想到时至今日&#xff0c;ChatGPT竟还会犯低级错误&#xff1f; 吴恩达大神最新开课就指出来了&#xff1a; ChatGPT不会反转单词&#xff01; 比如让它反转下lollipop这个词&#xff0c;输出是pilollol&#xff0c;完全混乱。 哦豁&#…

C++14中返回类型推导的使用

使用C14中的auto返回类型&#xff0c;编译器将尝试自动推导(deduce)返回类型: namespace {int xx 1; auto f() { return xx; } // return type is int const auto& f3() { return xx; } // return type is const int&auto multiply(int a, int b) { return (a * b); …

【阅读论文】时间序列数据清洗:一项调查

文章目录 摘要一、引言A.问题陈述B.问题挑战C. 组织 二、基于平滑的清洗算法A.移动平均B.自动注册C.卡尔曼滤波模型D.总结和讨论 三、基于约束的混合算法A. 顺序依赖 (OD)B.序列相关性C.速度约束D.总结和讨论 四、基于统计的CLEANING算法A.最大似然B.马尔可夫模型C.二项抽样D.时…

基于51单片机设计的井下瓦斯监控系统

一、项目介绍 井下瓦斯监控系统是煤矿安全生产中非常重要的一部分,防止井下瓦斯爆炸事故的发生,保障煤矿工人的人身安全。由于地下环境特殊,需要特殊的监测系统来实时监测瓦斯浓度等关键指标,并及时报警以便采取措施进行处理。 瓦斯气体,又称沼气,是一种轻质烃类气体,…

基于的滤波器设计

一,带通滤波器设计指标。 1&#xff0c;中心频率。中心频率:通常定义为带通滤波器&#xff08;或带阻滤波器&#xff09;频率的几何平均值&#xff0c;在对数坐标下&#xff0c;即为两个3dB点之间的中点&#xff0c;一般用两个3dB点的算术平均来表示。滤波器通频带中间的频率&…

网工大题题型总结(1)-------网络安全方面考察

&#xff08;1&#xff09;2018年上半年 试题二 &#xff08;3&#xff09;常见的无线网络安全隐患有 IP 地址欺骗、数据泄露、(8)、(9)、双络通信被窃听等; 为保护核心业务数据区域的安全&#xff0c;网络管理员在设备①处部署(10)实现核心业务区域边界 防护;在设备②处部署…

C++11特性之左值引用和右值引用

3.1二者的对比之内置类型 内置类型的无名对象&#xff08;右值&#xff09;为纯右值&#xff0c;其值本身不可改变 int main() {int a10;const int b20;int& raa;//ok,左值引用const int& rbb;//ok&#xff0c;常性左值引用const int& crv30;//ok,也叫万能引用&a…

网络安全竞赛——综合靶机渗透测试ZHCS-2全过程解析教程

任务一:综合靶机渗透测试 任务环境说明: 服务器场景:ZHCS-2(关闭连接)服务器场景操作系统:版本不详扫描目标靶机将靶机开放的所有端口,当作flag提交(例:21,22,23) FLAG:22,80 扫描目标靶机将靶机的http服务版本信息当作flag提交(例:apache 2.3.4) FLAG: ligh…

Vue3 Hooks函数使用及封装思想

目录 一. 什么是hooks函数&#xff1f; 二、如何封装一个hooks函数 三、Hooks 常用 Demo &#xff08;1&#xff09;验证码倒计时 &#xff08;2&#xff09;防抖 &#xff08;3&#xff09;节流 一. 什么是hooks函数&#xff1f; 专业解释&#xff1a;Vue 3中的Hooks函数…

Nucleo-F411RE (STM32F411)LL库体验 8 - PWM的使用

Nucleo-F411RE &#xff08;STM32F411&#xff09;LL库体验 8 - PWM的使用 1、简述 LD2连接PA5&#xff0c;而PA5可以映射TIM2_CH1&#xff0c;配合TIM2&#xff0c;可以输出PWM。 本片文章大量工作是添加了shell命令&#xff0c;可以通过pwm命令开关pwm以及设置pwm的频率&am…

数字图像处理期末考点整理(全)

计算&#xff1a;傅里叶变换&#xff0c;双线性插值&#xff0c;直方图均衡化&#xff0c;灰度共生矩阵&#xff0c;霍夫曼编码&#xff0c;区域增长/合并&#xff0c;中值滤波 简答&#xff1a;窗口/模板处理&#xff0c;BMP文件存储格式&#xff0c;滤波器和平滑算子的特点&…

Servlet (上篇)

哥几个来学 Servlet 啦 ~~ 目录 &#x1f332;一、什么是 Servlet &#x1f333;二、第一个 Servlet 程序 &#x1f347;1. 创建项目 &#x1f348;2. 引入依赖 &#x1f349;3. 创建目录 &#x1f34a;4. 编写代码 &#x1f34b;5. 打包程序 &#x1f96d;6. 部署程序…

client-go的Indexer三部曲之二:性能测试

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《client-go的Indexer》系列的第二篇&#xff0c;在前文咱们通过实例掌握了client-go的Indexer的基本功能&#xff0c;本篇咱们尝试对下面这…

css小兔鲜项目搭建

目录 精灵图 精灵图的使用步骤 背景图片大小 background连写 文字阴影 盒子阴影 过渡 骨架标签 SEO三大标签 版心的介绍 css书写顺序 项目结构搭建 精灵图 场景&#xff1a;项目中将多张小图片&#xff0c;合并成一张大图片&#xff0c;这张大图片称之为精灵图 优点…

c语言实现 顺序存储和链式存储(几种链表)

目录 一、简介 二、一些问题 1、递归free 2、free单向循环链表&#xff1a; 3、free单向链表 4、free双向循环链表 5、free使用数组实现链式存储结构 6、sizeof&#xff08;&#xff09;求字符串大小的问题 三、总结 一、简介 花了几天的时间从头开始使用c语言…