前端小练-产品宣传页面

news2024/11/25 21:32:03

文章目录

  • 前言
  • 页面结构
    • 固定钉
    • 头部
    • 轮播
    • JS特效
  • 完整代码
  • 总结

前言

经过一个月的爆肝,花费了一个月(期间还花费了将近半个月的时间打比赛,还要备研)算是把数二高数的内容强化了一遍,接下来刷熟练度即可,可惜的是我现在要改数1。但是值得庆幸的是,线代和概率论可以洒洒水~,只是高数部分还有头疼的无穷级数和曲面积分。其实曲面积分,二重积分,微分方程,多元微分其实除了运算量大并没有什么难度(包括应用部分)。但是级数的话和前面的极限还有证明联系比较紧密,这个在思路上我觉得反而麻烦,至于中值定理核心大部分的题型是凑F,然后用罗尔定理。

所以说,如果继续坚持开发算法平台的话,我肯定是无法赶上第一波答辩了。考研和毕设我都要,我是真不想明年大四下学期还要回学校,我又没有女朋友,需要回来陪女朋友~

那么废话不多说,昨天也是干到1点多,把这个新的毕设方案的首页写出来了。先看看看效果吧:
请添加图片描述

在这里插入图片描述
请添加图片描述

实在是想不到文案了,不然的话,直接继续套。这次的话,没有办法不适合暗黑风格,只能这样干。

页面结构

老规矩,我们先来分析一下这个页面的结构,这个结构:

<template>

    <!-- 左边的固定钉 -->
    <el-affix :offset="150">
      <div class="affix-left">
        <div class="affix-item heartbeat">
          <img class="affix-img" src="~@/assets/image/download.png">
          <div class="affix-p">下载</div>
        </div>
        <div class="affix-item heartbeat">
          <img class="affix-img" src="~@/assets/image/document.png">
          <div class="affix-p">文档</div>
        </div>
        <div class="affix-item heartbeat">
          <img class="affix-img" src="~@/assets/image/assert.png">
          <div class="affix-p">解析</div>
        </div>
      </div>
    </el-affix>
    
    <!-- 接下来是我们的首页主体部分 -->
    <div class="main">
      <!-- 文字背景介绍部分 -->
        <div class="show-part color-change-2x">
          <!-- 第一部分 -->
          <div class="show-p1">
            FREE AND EASY TO LEARN 
          </div>
          <div class="show-p2">
            Hlang
          </div>
          <div class="show-p3">
            开源中文教学编程语言 BY Huterox
          </div>
        </div>

        <!-- 简介轮播图 -->
        <div class="content-canv">
          <div class="container">
            <div class="clip clip-1">
              <div class="content">
                <h1 class="title">开源</h1>
                <h3 class="paragraph">基于Python编写的教学中文编程语言,完全开源,并附带开发教程。</h3>
              </div>
            </div>
            <div class="clip clip-2">
              <div class="content">
                <h1 class="title">中文</h1>
                <h3 class="paragraph">中文编程,快速上手,培养编程思维。</h3>
              </div>
            </div>
            <div class="clip clip-3">
              <div class="content">
                <h1 class="title">易学</h1>
                <h3 class="paragraph">充分发挥母语优势,适合小学生教学。且生态将不断完善,兼容Python。</h3>
              </div>
            </div>
          </div>
        </div>

        <!-- 具体的文字宣传 -->
        <div class="show-centent-text">

            <div class="s-c-text" ref="box1">
                
            </div>

            <div class="s-c-text" ref="box2">
              我们的中文编程语言致力于打破语言壁垒,让编程更加亲切和易于学习。
              无论你是否具备编程经验,我们的中文编程语言都能够以你熟悉和理解的方式呈现,
              使你能够快速上手并掌握编程技能。
            </div>

            <div class="s-c-text" ref="box3">
              
            </div>
        </div>

        <!-- 尾部图片 -->

        <div class="buttom zoom">
          <div class="title-bu tracking-in-contract" ref="box4">
         
          </div>
          <div class="content-bu"  ref="box5">
            未来可期,创造无限可能
          </div>
        </div>

        <!-- 尾部特效,文字 -->

        <div class="bu-show">
            <div class="svg-bu-show">
               <!--特效 -->
              <div id="svgAttributes"> 
                <svg width="512" height="512" 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="but-show-cent glitch-wrapper">
              <div class="glitch" data-text="JOIN US FUTURE IS BEST">
                JOIN US FUTURE IS BEST
              </div>
            </div>

        </div>

        <!-- footer -->
        <div class="footer">
        <!-- 特效 -->
        <div class="footershow">
          <div id="penner">
          <div class="line">
            <div class="small color-change-2x stretched square linear" style="transform: translateX(8.32375px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InQuad" style="transform: translateX(1.41935px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InCubic" style="transform: translateX(0.872133px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InQuart" style="transform: translateX(0.302639px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InQuint" style="transform: translateX(0.552566px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InSine" style="transform: translateX(0.301091px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InExpo" style="transform: translateX(0.437774px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InCirc" style="transform: translateX(0.625275px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InBack" style="transform: translateX(-3.78142px);"></div>
          </div>
          <div class="line">
            <div class="small  color-change-2x stretched square OutQuad" style="transform: translateX(15.4575px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square OutCubic" style="transform: translateX(23.5359px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square OutQuart" style="transform: translateX(38.4933px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square OutQuint" style="transform: translateX(35.4011px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square OutSine" style="transform: translateX(12.371px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square OutExpo" style="transform: translateX(43.1485px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square OutCirc" style="transform: translateX(75.0978px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square OutBack" style="transform: translateX(40.8483px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutQuad" style="transform: translateX(0.970785px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutCubic" style="transform: translateX(0.805919px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutQuart" style="transform: translateX(0.162609px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutQuint" style="transform: translateX(0.130278px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutSine" style="transform: translateX(1.35859px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutExpo" style="transform: translateX(0.0959568px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutCirc" style="transform: translateX(1.56201px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutBack" style="transform: translateX(-6.36447px);"></div>
          </div>
        </div>
        </div>
        <div class="footText">
          Huterox is Awesome
        </div>
      </div>

    </div>
</template>

结构的话其实就是这几大块,首先是固定的,然后是头部,中间,底部,和footer

固定钉

这个固定钉的话,怎么说呢,实际上是自己写的,只是外面套了一个el-affix,实际上你换成div是一样的效果,因为样式都是自己做的。
只是用了它的 offset。没啥用。

    <el-affix :offset="150">
      <div class="affix-left">
        <div class="affix-item heartbeat">
          <img class="affix-img" src="~@/assets/image/download.png">
          <div class="affix-p">下载</div>
        </div>
        <div class="affix-item heartbeat">
          <img class="affix-img" src="~@/assets/image/document.png">
          <div class="affix-p">文档</div>
        </div>
        <div class="affix-item heartbeat">
          <img class="affix-img" src="~@/assets/image/assert.png">
          <div class="affix-p">解析</div>
        </div>
      </div>
    </el-affix>

结构的话很清晰,大概就是这样:

在这里插入图片描述

这里的话主要是还有一个特效,心脏的特效。


@-webkit-keyframes heartbeat {
  from {
    -webkit-transform: scale(1);
            transform: scale(1);
    -webkit-transform-origin: center center;
            transform-origin: center center;
    -webkit-animation-timing-function: ease-out;
            animation-timing-function: ease-out;
  }
  10% {
    -webkit-transform: scale(0.91);
            transform: scale(0.91);
    -webkit-animation-timing-function: ease-in;
            animation-timing-function: ease-in;
  }
  17% {
    -webkit-transform: scale(0.98);
            transform: scale(0.98);
    -webkit-animation-timing-function: ease-out;
            animation-timing-function: ease-out;
  }
  33% {
    -webkit-transform: scale(0.87);
            transform: scale(0.87);
    -webkit-animation-timing-function: ease-in;
            animation-timing-function: ease-in;
  }
  45% {
    -webkit-transform: scale(1);
            transform: scale(1);
    -webkit-animation-timing-function: ease-out;
            animation-timing-function: ease-out;
  }
}
@keyframes heartbeat {
  from {
    -webkit-transform: scale(1);
            transform: scale(1);
    -webkit-transform-origin: center center;
            transform-origin: center center;
    -webkit-animation-timing-function: ease-out;
            animation-timing-function: ease-out;
  }
  10% {
    -webkit-transform: scale(0.91);
            transform: scale(0.91);
    -webkit-animation-timing-function: ease-in;
            animation-timing-function: ease-in;
  }
  17% {
    -webkit-transform: scale(0.98);
            transform: scale(0.98);
    -webkit-animation-timing-function: ease-out;
            animation-timing-function: ease-out;
  }
  33% {
    -webkit-transform: scale(0.87);
            transform: scale(0.87);
    -webkit-animation-timing-function: ease-in;
            animation-timing-function: ease-in;
  }
  45% {
    -webkit-transform: scale(1);
            transform: scale(1);
    -webkit-animation-timing-function: ease-out;
            animation-timing-function: ease-out;
  }
}



.heartbeat:hover {
  -webkit-animation: heartbeat 1.5s ease-in-out infinite both;
          animation: heartbeat 1.5s ease-in-out infinite both;
}
  .affix-img{
    margin-top: 10px;
    width: 30px;
    height: 30px;
  }

  .affix-p{
    height: 20px;
    font-size: 10px;
  }
  .affix-item{
    cursor: pointer;
    width: 100%;
    height: 70px;
    border-radius: 80px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-items: center;
    text-align: center;
    background-color: whitesmoke;
    -webkit-box-shadow: 0px 0px 10px 0px rgba(40,163,235,1);
    -moz-box-shadow: 0px 0px 10px 0px rgba(40,163,235,1);
    box-shadow: 0px 0px 10px 0px rgba(40,163,235,1);

  }
  .affix-left{
    position: fixed;
    width: 70px;
    display: flex;
    flex-direction: column;
    justify-items: center;
    align-items: center;
    gap: 25px;
    z-index: 100;
    opacity: 0.5

  }

头部

之后是我们的头部。
在这里插入图片描述
这部分的结构也很明显。一个flex,然后是列作为主轴。

 <!-- 文字背景介绍部分 -->
        <div class="show-part color-change-2x">
          <!-- 第一部分 -->
          <div class="show-p1">
            FREE AND EASY TO LEARN 
          </div>
          <div class="show-p2">
            Hlang
          </div>
          <div class="show-p3">
            开源中文教学编程语言 BY Huterox
          </div>
        </div>

然后这里的话,就主要是一个渐变,就没了。

.show-p3{
  font-family: cursive;
  margin-top: 10px;
  color: whitesmoke;
  font-size: 50px;
  display: flex;
  justify-items: center;
  align-items: center;
}
.show-p2{
  font-family: 'Courier New', Courier, monospace;
  margin-top: 10px;
  color: whitesmoke;
  font-size: 80px;
  display: flex;
  font-weight:bolder;
  justify-items: center;
  align-items: center;
}
.show-p1{

  font: 10em sans-serif;
  font-weight:bolder;
  font-family: system-ui;
  margin-top: 100px;
  color: rgba(9, 101, 239, 0.26);
  font-size: 60px;
  display: flex;
  justify-items: center;
  align-items: center;
}
.show-part{
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-items: center;
  width: 100%;
  height: 450px;
  background-color: rgb(6, 223, 151);
}

.color-change-2x {
	-webkit-animation: color-change-2x 2s linear infinite alternate both;
	        animation: color-change-2x 2s linear infinite alternate both;
}

@-webkit-keyframes color-change-2x {
  0% {
    background: rgb(178, 194, 195);
  }
  100% {
    background: #75aabb;
  }
}
@keyframes color-change-2x {
  0% {
    background: #8db0bd;
  }
  100% {
    background: #6eb4cb;
  }
}

轮播

这个效果的话,叫啥我不是很清楚,反正但是是要做轮播的,但是太丑了,就做成这样的。
在这里插入图片描述

    <!-- 简介轮播图 -->
        <div class="content-canv">
          <div class="container">
            <div class="clip clip-1">
              <div class="content">
                <h1 class="title">开源</h1>
                <h3 class="paragraph">基于Python编写的教学中文编程语言,完全开源,并附带开发教程。</h3>
              </div>
            </div>
            <div class="clip clip-2">
              <div class="content">
                <h1 class="title">中文</h1>
                <h3 class="paragraph">中文编程,快速上手,培养编程思维。</h3>
              </div>
            </div>
            <div class="clip clip-3">
              <div class="content">
                <h1 class="title">易学</h1>
                <h3 class="paragraph">充分发挥母语优势,适合小学生教学。且生态将不断完善,兼容Python。</h3>
              </div>
            </div>
          </div>
        </div>

然后是对应的CSS

.content-canv{
  width: 100%;
  height: 600px;
  background-color: whitesmoke;
  display: flex;
  justify-items: center;
  align-items: center;

}


.container {
  border-radius: 30px;
  background-color: whitesmoke;
  height: 600px;
  max-width: 100%;
  position: relative;
  width: 1000px;
  margin: 0 auto;

}

.clip {
  border-radius: 30px;
  background: var(--white)
  url('https://images.unsplash.com/photo-1599694927440-e321028bc146?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=3300&q=80')
  100% / cover no-repeat;
  border: 0.1rem solid var(--cod-gray);
  bottom: 0rem;
  left: -0.2rem;
  position: absolute;
  right: 0rem;
  top: 0rem;
  transition: clip-path 330ms var(--transform-function);
}

.clip-1 {
  background-size:cover;
  border-radius: 30px;
  clip-path: polygon(0 0, 47% 0, 21% 100%, 0% 100%);
  background-image: url('../../src/assets/image/card1.png');
}

.clip-2 {
  background-size:cover;
  border-radius: 30px;
  background-image: url('../../src/assets/image/card2.png');
  clip-path: polygon(43% 0, 100% 0, 38% 100%, 13% 100%);
}

.clip-3 {
  background-size:cover;
  width: 100%;
  height: 100%;
  border-radius: 30px;
  background-image: url('../../src/assets/image/card3.png');
  clip-path: polygon(100% 0, 100% 0, 100% 100%, 38% 100%);
}

.content {

  height: 100%;
  width: 100%;
  display: flex;
  flex-direction: column;
  justify-items: center;
  align-items: center;
  border-radius: 30px;
  background-color: var(--white);
  bottom: 0;
  display: flex;
  flex-direction: column;
  left: 0;
  opacity: 0;
  padding: 1rem;
  pointer-events: none;
  position: absolute;
  transform: translateY(100%);
  transition: transform 330ms var(--transform-function) 100ms,
  opacity 330ms var(--transform-function) 150ms;
  width: 75%;
}

.title {
  font-family: cursive;
  margin-top: 50%;
  display: flex;
  align-items: center;
  justify-items: center;
  color: whitesmoke;
  height: 80px;
  width: 100%;
  line-height: 1.1;
}

.paragraph {
  font-family: cursive;
  height: 40px;
  width: 100%;
  display: flex;
  align-items: center;
  justify-items: center;
  border-radius: 30px;
  color: whitesmoke;
  line-height: 1.1;
}

/* Effect */
.container:hover .clip {
  clip-path: polygon(100% 0, 100% 0, 100% 100%, 100% 100%);
}

.container .clip:hover {
  clip-path: polygon(0 0, 100% 0, 100% 100%, 0% 100%);
}

.clip:hover .content {
  opacity: 1;
  transform: translateY(0);
}

JS特效

之后的话,就是先前也做过的打字机特效。这个的话真没啥。当然还有别的,这个的话就是anime.js做的。

然后这里的话,其实整个特效是分两个部分组成的:
1. 本身DIV的一个CSS布局
2. JS部分产生的特效
所以的话,要写很简单,先正常布局,然后想你要啥,然后写逻辑即可。


<script>
import anime from 'animejs'
export default {

  mounted() {

    const part1 = "以汉字和常用词汇作为编程语法的基础,我们的产品让编程变得更加容易理解和应用。"
    this.TypewriterDom(this.$refs.box1,part1,true,null)

    // const part2 = "我们的中文编程语言致力于打破语言壁垒,让编程更加亲切和易于学习。无论你是否具备编程经验,我们的中文编程语言都能够以你熟悉和理解的方式呈现,使你能够快速上手并掌握编程技能。"
    // this.TypewriterDom(this.$refs.box2,part2,true,null)

    const part3 = "作为开源项目,这个中文编程语言的源代码可供学生、教师、研究人员以及业界专业人士自由使用。"
    this.TypewriterDom(this.$refs.box3,part3,true,null)

    const part4 = "加入我们"
    this.TypewriterDom(this.$refs.box4,part4,true,null)

    this.RunButSvg()
    this.RunFooter()

  },
  methods:{

    // footer特效

    RunFooter(){
      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',
          
        });
    },


    // 底部的svg特效
    RunButSvg(){
      anime({
        targets: '#svgAttributes polygon',
        points: '64 128 8.574 96 8.574 32 64 0 119.426 32 119.426 96',
        easing: 'easeInOutExpo',
        duration: 2000,
        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>


完整代码

okey,那么接下来的话就看到,完整的代码。

<template>

    <!-- 左边的固定钉 -->
    <el-affix :offset="150">
      <div class="affix-left">
        <div class="affix-item heartbeat">
          <img class="affix-img" src="~@/assets/image/download.png">
          <div class="affix-p">下载</div>
        </div>
        <div class="affix-item heartbeat">
          <img class="affix-img" src="~@/assets/image/document.png">
          <div class="affix-p">文档</div>
        </div>
        <div class="affix-item heartbeat">
          <img class="affix-img" src="~@/assets/image/assert.png">
          <div class="affix-p">解析</div>
        </div>
      </div>
    </el-affix>
    
    <!-- 接下来是我们的首页主体部分 -->
    <div class="main">
      <!-- 文字背景介绍部分 -->
        <div class="show-part color-change-2x">
          <!-- 第一部分 -->
          <div class="show-p1">
            FREE AND EASY TO LEARN 
          </div>
          <div class="show-p2">
            Hlang
          </div>
          <div class="show-p3">
            开源中文教学编程语言 BY Huterox
          </div>
        </div>

        <!-- 简介轮播图 -->
        <div class="content-canv">
          <div class="container">
            <div class="clip clip-1">
              <div class="content">
                <h1 class="title">开源</h1>
                <h3 class="paragraph">基于Python编写的教学中文编程语言,完全开源,并附带开发教程。</h3>
              </div>
            </div>
            <div class="clip clip-2">
              <div class="content">
                <h1 class="title">中文</h1>
                <h3 class="paragraph">中文编程,快速上手,培养编程思维。</h3>
              </div>
            </div>
            <div class="clip clip-3">
              <div class="content">
                <h1 class="title">易学</h1>
                <h3 class="paragraph">充分发挥母语优势,适合小学生教学。且生态将不断完善,兼容Python。</h3>
              </div>
            </div>
          </div>
        </div>

        <!-- 具体的文字宣传 -->
        <div class="show-centent-text">

            <div class="s-c-text" ref="box1">
                
            </div>

            <div class="s-c-text" ref="box2">
              我们的中文编程语言致力于打破语言壁垒,让编程更加亲切和易于学习。
              无论你是否具备编程经验,我们的中文编程语言都能够以你熟悉和理解的方式呈现,
              使你能够快速上手并掌握编程技能。
            </div>

            <div class="s-c-text" ref="box3">
              
            </div>
        </div>

        <!-- 尾部图片 -->

        <div class="buttom zoom">
          <div class="title-bu tracking-in-contract" ref="box4">
         
          </div>
          <div class="content-bu"  ref="box5">
            未来可期,创造无限可能
          </div>
        </div>

        <!-- 尾部特效,文字 -->

        <div class="bu-show">
            <div class="svg-bu-show">
               <!--特效 -->
              <div id="svgAttributes"> 
                <svg width="512" height="512" 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="but-show-cent glitch-wrapper">
              <div class="glitch" data-text="JOIN US FUTURE IS BEST">
                JOIN US FUTURE IS BEST
              </div>
            </div>

        </div>

        <!-- footer -->
        <div class="footer">
        <!-- 特效 -->
        <div class="footershow">
          <div id="penner">
          <div class="line">
            <div class="small color-change-2x stretched square linear" style="transform: translateX(8.32375px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InQuad" style="transform: translateX(1.41935px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InCubic" style="transform: translateX(0.872133px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InQuart" style="transform: translateX(0.302639px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InQuint" style="transform: translateX(0.552566px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InSine" style="transform: translateX(0.301091px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InExpo" style="transform: translateX(0.437774px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InCirc" style="transform: translateX(0.625275px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InBack" style="transform: translateX(-3.78142px);"></div>
          </div>
          <div class="line">
            <div class="small  color-change-2x stretched square OutQuad" style="transform: translateX(15.4575px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square OutCubic" style="transform: translateX(23.5359px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square OutQuart" style="transform: translateX(38.4933px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square OutQuint" style="transform: translateX(35.4011px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square OutSine" style="transform: translateX(12.371px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square OutExpo" style="transform: translateX(43.1485px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square OutCirc" style="transform: translateX(75.0978px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square OutBack" style="transform: translateX(40.8483px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutQuad" style="transform: translateX(0.970785px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutCubic" style="transform: translateX(0.805919px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutQuart" style="transform: translateX(0.162609px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutQuint" style="transform: translateX(0.130278px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutSine" style="transform: translateX(1.35859px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutExpo" style="transform: translateX(0.0959568px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutCirc" style="transform: translateX(1.56201px);"></div>
          </div>
          <div class="line">
            <div class="small color-change-2x stretched square InOutBack" style="transform: translateX(-6.36447px);"></div>
          </div>
        </div>
        </div>
        <div class="footText">
          Huterox is Awesome
        </div>
      </div>

    </div>
</template>

<script>
import anime from 'animejs'
export default {

  mounted() {

    const part1 = "以汉字和常用词汇作为编程语法的基础,我们的产品让编程变得更加容易理解和应用。"
    this.TypewriterDom(this.$refs.box1,part1,true,null)

    // const part2 = "我们的中文编程语言致力于打破语言壁垒,让编程更加亲切和易于学习。无论你是否具备编程经验,我们的中文编程语言都能够以你熟悉和理解的方式呈现,使你能够快速上手并掌握编程技能。"
    // this.TypewriterDom(this.$refs.box2,part2,true,null)

    const part3 = "作为开源项目,这个中文编程语言的源代码可供学生、教师、研究人员以及业界专业人士自由使用。"
    this.TypewriterDom(this.$refs.box3,part3,true,null)

    const part4 = "加入我们"
    this.TypewriterDom(this.$refs.box4,part4,true,null)

    this.RunButSvg()
    this.RunFooter()

  },
  methods:{

    // footer特效

    RunFooter(){
      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',
          
        });
    },


    // 底部的svg特效
    RunButSvg(){
      anime({
        targets: '#svgAttributes polygon',
        points: '64 128 8.574 96 8.574 32 64 0 119.426 32 119.426 96',
        easing: 'easeInOutExpo',
        duration: 2000,
        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>


/* footer */

.footText{
  display: flex;
  width: 100%;
  height: 100px;
  justify-content: center;
  align-items: center;
  font-size: 50px;
  color: whitesmoke;
  background-color: rgb(40, 46, 90);
}
.square{
  margin-left: 230px;
  margin-top: 2px;
  border-radius: 5px;
  width: 100px;
  height: 2px;
  background-color: #0a62c6b0;
}
.footershow{
  display: flex;
  align-items: center;
  justify-items: center;
  width: 100%;
  height: 120px;
  align-items: center;
  border-block-end: 3px whitesmoke solid;
}
.footer{
  margin-top: 1%;
  width: 100%;
  display: flex;
  flex-direction: column;

}




/* 尾部特效 */

.glitch-wrapper {
   width: 100%;
   height: 100%;
   display: flex;
   align-items: center;
   justify-content: center;
   text-align: center;
}

.glitch {
   position: relative;
   font-size: 100px;
   font-weight: bold;
   color: whitesmoke;
   letter-spacing: 3px;
   z-index: 1;
}

.glitch:before {
   content: attr(data-text);
   position: absolute;
   top: 0;
   left: -2px;
   width: 100%;
   color: 50px;

   overflow: hidden;
   clip: rect(0, 900px, 0, 0);
   animation: noise-before 3s infinite linear alternate-reverse;
}

.glitch:after {
   content: attr(data-text);
   position: absolute;
   top: 0;
   left: 2px;
   width: 100%;
   color: 50px;
   overflow: hidden;
   clip: rect(0, 900px, 0, 0);
   animation: noise-after 2s infinite linear alternate-reverse;
}

@keyframes noise-before {
   0% {
      clip: rect(61px, 9999px, 52px, 0);
   }
   5% {
      clip: rect(33px, 9999px, 144px, 0);
   }
   10% {
      clip: rect(121px, 9999px, 115px, 0);
   }
   15% {
      clip: rect(144px, 9999px, 162px, 0);
   }
   20% {
      clip: rect(62px, 9999px, 180px, 0);
   }
   25% {
      clip: rect(34px, 9999px, 42px, 0);
   }
   30% {
      clip: rect(147px, 9999px, 179px, 0);
   }
   35% {
      clip: rect(99px, 9999px, 63px, 0);
   }
   40% {
      clip: rect(188px, 9999px, 122px, 0);
   }
   45% {
      clip: rect(154px, 9999px, 14px, 0);
   }
   50% {
      clip: rect(63px, 9999px, 37px, 0);
   }
   55% {
      clip: rect(161px, 9999px, 147px, 0);
   }
   60% {
      clip: rect(109px, 9999px, 175px, 0);
   }
   65% {
      clip: rect(157px, 9999px, 88px, 0);
   }
   70% {
      clip: rect(173px, 9999px, 131px, 0);
   }
   75% {
      clip: rect(62px, 9999px, 70px, 0);
   }
   80% {
      clip: rect(24px, 9999px, 153px, 0);
   }
   85% {
      clip: rect(138px, 9999px, 40px, 0);
   }
   90% {
      clip: rect(79px, 9999px, 136px, 0);
   }
   95% {
      clip: rect(25px, 9999px, 34px, 0);
   }
   100% {
      clip: rect(173px, 9999px, 166px, 0);
   }
}

@keyframes noise-after {
   0% {
      clip: rect(26px, 9999px, 33px, 0);
   }
   5% {
      clip: rect(140px, 9999px, 198px, 0);
   }
   10% {
      clip: rect(184px, 9999px, 89px, 0);
   }
   15% {
      clip: rect(121px, 9999px, 6px, 0);
   }
   20% {
      clip: rect(181px, 9999px, 99px, 0);
   }
   25% {
      clip: rect(154px, 9999px, 133px, 0);
   }
   30% {
      clip: rect(134px, 9999px, 169px, 0);
   }
   35% {
      clip: rect(26px, 9999px, 187px, 0);
   }
   40% {
      clip: rect(147px, 9999px, 137px, 0);
   }
   45% {
      clip: rect(31px, 9999px, 52px, 0);
   }
   50% {
      clip: rect(191px, 9999px, 109px, 0);
   }
   55% {
      clip: rect(74px, 9999px, 54px, 0);
   }
   60% {
      clip: rect(145px, 9999px, 75px, 0);
   }
   65% {
      clip: rect(153px, 9999px, 198px, 0);
   }
   70% {
      clip: rect(99px, 9999px, 136px, 0);
   }
   75% {
      clip: rect(118px, 9999px, 192px, 0);
   }
   80% {
      clip: rect(1px, 9999px, 83px, 0);
   }
   85% {
      clip: rect(145px, 9999px, 98px, 0);
   }
   90% {
      clip: rect(121px, 9999px, 154px, 0);
   }
   95% {
      clip: rect(156px, 9999px, 44px, 0);
   }
   100% {
      clip: rect(67px, 9999px, 122px, 0);
   }
}









.bu-show{

  display: flex;
  justify-items: center;
  align-items: center;
  height: 600px;
  width: 100%;

  background: rgba(179,220,237,1);
  background: -moz-linear-gradient(left, rgba(179,220,237,1) 0%, rgba(41,184,229,1) 50%, rgba(188,224,238,1) 100%);
  background: -webkit-gradient(left top, right top, color-stop(0%, rgba(179,220,237,1)), color-stop(50%, rgba(41,184,229,1)), color-stop(100%, rgba(188,224,238,1)));
  background: -webkit-linear-gradient(left, rgba(179,220,237,1) 0%, rgba(41,184,229,1) 50%, rgba(188,224,238,1) 100%);
  background: -o-linear-gradient(left, rgba(179,220,237,1) 0%, rgba(41,184,229,1) 50%, rgba(188,224,238,1) 100%);
  background: -ms-linear-gradient(left, rgba(179,220,237,1) 0%, rgba(41,184,229,1) 50%, rgba(188,224,238,1) 100%);
  background: linear-gradient(to right, rgba(179,220,237,1) 0%, rgba(41,184,229,1) 50%, rgba(188,224,238,1) 100%);
  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#b3dced', endColorstr='#bce0ee', GradientType=1 );

}

.svg-bu-show{


  margin-left: 150px;
  display: flex;
  justify-items: center;
  align-items: center;
  padding-left: 50px;
  width: 600px;
  height: 600px;
}

.but-show-cent{
  display: flex;
  margin-left: 150px;
  justify-items: center;
  align-items: center;
  width: 600px;
  height: 600px;
}

/* 尾部图片文字 */

.content-bu{
  font-weight: bolder;
  font-family: cursive;
  font-size: 50px;
  display: flex;
  color: white;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 100px;
}
.title-bu{
  font-family: cursive;
  font-weight: bolder;
  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;
  }
}



.buttom{
  background-position: center;
  flex-direction: column;
  width: 100%;
  height: 600px;
  display: flex;
  background-image: url('../../src/assets/image/bgcard.png');
  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%;
  }
}



/* 具体文字宣传 */

.s-c-text{

  padding-top: 30px;
  width: 100%;
  font-weight:bolder;
  margin: 0 auto;
  font-family: cursive;
  word-wrap: break-word;
  font-size: 30px;
  color: #6eb4cb;
  border-radius: 30px;

}

.show-centent-text:hover{

  margin-top: 10px;
  -webkit-box-shadow: 5px 5px 50px 0px rgba(105,170,214,1);
  -moz-box-shadow: 5px 5px 50px 0px rgba(105,170,214,1);
  box-shadow: 5px 5px 50px 0px rgba(105,170,214,1);
}

.s-c-text:hover{

  -webkit-box-shadow: 5px 5px 50px 0px rgba(105,170,214,1);
  -moz-box-shadow: 5px 5px 50px 0px rgba(105,170,214,1);
  box-shadow: 5px 5px 50px 0px rgba(105,170,214,1);
}


.show-centent-text{
  
  display: flex;
  justify-items: center;
  align-items: center;
  border-radius: 30px;
  cursor: default;
  height: 300px;
  width: 80%;
  margin: 0 auto;
  column-count: 3;
  column-gap: 57px;
  column-rule: 6px solid #1192e7;
}


/* 简介轮播图 */
.content-canv{
  width: 100%;
  height: 600px;
  background-color: whitesmoke;
  display: flex;
  justify-items: center;
  align-items: center;

}


.container {
  border-radius: 30px;
  background-color: whitesmoke;
  height: 600px;
  max-width: 100%;
  position: relative;
  width: 1000px;
  margin: 0 auto;

}

.clip {
  border-radius: 30px;
  background: var(--white)
  url('https://images.unsplash.com/photo-1599694927440-e321028bc146?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=3300&q=80')
  100% / cover no-repeat;
  border: 0.1rem solid var(--cod-gray);
  bottom: 0rem;
  left: -0.2rem;
  position: absolute;
  right: 0rem;
  top: 0rem;
  transition: clip-path 330ms var(--transform-function);
}

.clip-1 {
  background-size:cover;
  border-radius: 30px;
  clip-path: polygon(0 0, 47% 0, 21% 100%, 0% 100%);
  background-image: url('../../src/assets/image/card1.png');
}

.clip-2 {
  background-size:cover;
  border-radius: 30px;
  background-image: url('../../src/assets/image/card2.png');
  clip-path: polygon(43% 0, 100% 0, 38% 100%, 13% 100%);
}

.clip-3 {
  background-size:cover;
  width: 100%;
  height: 100%;
  border-radius: 30px;
  background-image: url('../../src/assets/image/card3.png');
  clip-path: polygon(100% 0, 100% 0, 100% 100%, 38% 100%);
}

.content {

  height: 100%;
  width: 100%;
  display: flex;
  flex-direction: column;
  justify-items: center;
  align-items: center;
  border-radius: 30px;
  background-color: var(--white);
  bottom: 0;
  display: flex;
  flex-direction: column;
  left: 0;
  opacity: 0;
  padding: 1rem;
  pointer-events: none;
  position: absolute;
  transform: translateY(100%);
  transition: transform 330ms var(--transform-function) 100ms,
  opacity 330ms var(--transform-function) 150ms;
  width: 75%;
}

.title {
  font-family: cursive;
  margin-top: 50%;
  display: flex;
  align-items: center;
  justify-items: center;
  color: whitesmoke;
  height: 80px;
  width: 100%;
  line-height: 1.1;
}

.paragraph {
  font-family: cursive;
  height: 40px;
  width: 100%;
  display: flex;
  align-items: center;
  justify-items: center;
  border-radius: 30px;
  color: whitesmoke;
  line-height: 1.1;
}

/* Effect */
.container:hover .clip {
  clip-path: polygon(100% 0, 100% 0, 100% 100%, 100% 100%);
}

.container .clip:hover {
  clip-path: polygon(0 0, 100% 0, 100% 100%, 0% 100%);
}

.clip:hover .content {
  opacity: 1;
  transform: translateY(0);
}

/* 结束简介轮播图 */

/* 首页文字部分css */
.show-p3{
  font-family: cursive;
  margin-top: 10px;
  color: whitesmoke;
  font-size: 50px;
  display: flex;
  justify-items: center;
  align-items: center;
}
.show-p2{
  font-family: 'Courier New', Courier, monospace;
  margin-top: 10px;
  color: whitesmoke;
  font-size: 80px;
  display: flex;
  font-weight:bolder;
  justify-items: center;
  align-items: center;
}
.show-p1{

  font: 10em sans-serif;
  font-weight:bolder;
  font-family: system-ui;
  margin-top: 100px;
  color: rgba(9, 101, 239, 0.26);
  font-size: 60px;
  display: flex;
  justify-items: center;
  align-items: center;
}
.show-part{
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-items: center;
  width: 100%;
  height: 450px;
  background-color: rgb(6, 223, 151);
}

.color-change-2x {
	-webkit-animation: color-change-2x 2s linear infinite alternate both;
	        animation: color-change-2x 2s linear infinite alternate both;
}

@-webkit-keyframes color-change-2x {
  0% {
    background: rgb(178, 194, 195);
  }
  100% {
    background: #75aabb;
  }
}
@keyframes color-change-2x {
  0% {
    background: #8db0bd;
  }
  100% {
    background: #6eb4cb;
  }
}

/* 结束首页文字部分css */


/* 首页布局 */

.main{
  background-color: whitesmoke;
  margin-top: 0px;
  width: 100%;
  gap: 60px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-items: center;

}
/* 结束首页布局css */



/* 固定钉css */


@-webkit-keyframes heartbeat {
  from {
    -webkit-transform: scale(1);
            transform: scale(1);
    -webkit-transform-origin: center center;
            transform-origin: center center;
    -webkit-animation-timing-function: ease-out;
            animation-timing-function: ease-out;
  }
  10% {
    -webkit-transform: scale(0.91);
            transform: scale(0.91);
    -webkit-animation-timing-function: ease-in;
            animation-timing-function: ease-in;
  }
  17% {
    -webkit-transform: scale(0.98);
            transform: scale(0.98);
    -webkit-animation-timing-function: ease-out;
            animation-timing-function: ease-out;
  }
  33% {
    -webkit-transform: scale(0.87);
            transform: scale(0.87);
    -webkit-animation-timing-function: ease-in;
            animation-timing-function: ease-in;
  }
  45% {
    -webkit-transform: scale(1);
            transform: scale(1);
    -webkit-animation-timing-function: ease-out;
            animation-timing-function: ease-out;
  }
}
@keyframes heartbeat {
  from {
    -webkit-transform: scale(1);
            transform: scale(1);
    -webkit-transform-origin: center center;
            transform-origin: center center;
    -webkit-animation-timing-function: ease-out;
            animation-timing-function: ease-out;
  }
  10% {
    -webkit-transform: scale(0.91);
            transform: scale(0.91);
    -webkit-animation-timing-function: ease-in;
            animation-timing-function: ease-in;
  }
  17% {
    -webkit-transform: scale(0.98);
            transform: scale(0.98);
    -webkit-animation-timing-function: ease-out;
            animation-timing-function: ease-out;
  }
  33% {
    -webkit-transform: scale(0.87);
            transform: scale(0.87);
    -webkit-animation-timing-function: ease-in;
            animation-timing-function: ease-in;
  }
  45% {
    -webkit-transform: scale(1);
            transform: scale(1);
    -webkit-animation-timing-function: ease-out;
            animation-timing-function: ease-out;
  }
}



.heartbeat:hover {
  -webkit-animation: heartbeat 1.5s ease-in-out infinite both;
          animation: heartbeat 1.5s ease-in-out infinite both;
}
  .affix-img{
    margin-top: 10px;
    width: 30px;
    height: 30px;
  }

  .affix-p{
    height: 20px;
    font-size: 10px;
  }
  .affix-item{
    cursor: pointer;
    width: 100%;
    height: 70px;
    border-radius: 80px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-items: center;
    text-align: center;
    background-color: whitesmoke;
    -webkit-box-shadow: 0px 0px 10px 0px rgba(40,163,235,1);
    -moz-box-shadow: 0px 0px 10px 0px rgba(40,163,235,1);
    box-shadow: 0px 0px 10px 0px rgba(40,163,235,1);

  }
  .affix-left{
    position: fixed;
    width: 70px;
    display: flex;
    flex-direction: column;
    justify-items: center;
    align-items: center;
    gap: 25px;
    z-index: 100;
    opacity: 0.5

  }

  /* 固定钉css代码完毕 */

</style>
  
  

总结

okey,以上就是全部内容了。比较实在,代码全给了,内容看起来比较多~没办法,本博主就是很长,不像某些博主是吧,那么短还有藏着掖着。

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

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

相关文章

VirtualBox Ubuntu无法安装增强功能以及无法复制粘贴踩坑记录

在VirtualBox安装增强功能想要和主机双向复制粘贴&#xff0c;中间查了很多资料&#xff0c;终于是弄好了。记录一下过程&#xff0c;可能对后来人也有帮助&#xff0c;我把我参考的几篇主要的博客都贴上来了&#xff0c;如果觉得我哪里讲得不清楚的&#xff0c;可以去对应的博…

前端生成图片验证码怎么做?

##题记&#xff1a;我们实现一个功能首先想一下我们需要做哪些工作&#xff0c;比如我们需要生成一个随机的图片验证码&#xff0c;我们需要一个就是点击事件获取验证码&#xff0c;通过接口我们去获取图片路径进行渲染就行&#xff0c;这里边还要牵扯一件事情就是获取一个随机…

uniapp开发小程序-实现中间凸起的 tabbar

一、效果展示&#xff1a; 二、代码实现&#xff1a; 1.首先在pages.json文件中进行tabbar的样式和列表配置&#xff0c;代码如下&#xff1a; {"pages": [ //pages数组中第一项表示应用启动页&#xff0c;参考&#xff1a;https://uniapp.dcloud.io/collocation/p…

Stable Diffusion AI绘画学习指南【本地环境搭建win+mac】

一、硬件配配置要求 系统&#xff1a;windows 10 / Mac os 硬盘&#xff1a;C 盘预留 15GB 以上&#xff0c;其他盘 50GB 以上,Stable Ddiffusion的很多大模型都是以 GB 起步。 显卡&#xff1a;4GB 以上&#xff0c;建议 8GB, 效率高&#xff0c;能玩大尺寸的图 CPU&…

Socks IP轮换:为什么是数据挖掘和Web爬取的最佳选择?

在数据挖掘和Web爬取的过程中&#xff0c;IP轮换是一个非常重要的概念。数据挖掘和Web爬取需要从多个网站或来源获取数据&#xff0c;而这些网站通常会对来自同一IP地址的请求进行限制或封锁。为了避免这些问题&#xff0c;数据挖掘和Web爬取过程中需要使用Socks IP轮换技术。在…

Redis秒杀:一人一单问题及初步解决

优惠券秒杀一人一单 前言一、需求以及之前存在的问题二、增加一人一单逻辑1.初步代码2.封装一人一单逻辑3.控制锁的粒度 三、事务控制问题四、总结 前言 跟随黑马虎哥学习redis&#xff1a; 这是我认为b站上最好的redis教程&#xff0c;各方面讲解透彻&#xff0c;知识点覆盖…

Mr. Cappuccino的第53杯咖啡——Mybatis源码分析

Mybatis源码分析 Mybatis源码分析入口1. 读取配置文件总结 2. 解析配置文件核心代码&#xff08;一&#xff09;核心代码&#xff08;二&#xff09;分析parse()方法分析build()方法 总结 3. 获取SqlSession总结 4. 获取mapper代理对象总结 5. 使用mapper代理对象执行Sql语句二…

基于SpringBoot+Vue的会员制医疗预约服务管理信息系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Android Studio log的快捷键和使用

输入logi&#xff0c;然后按下Tab键&#xff0c;会自动补全一条info级别的打印日志。输入logw&#xff0c;按下Tab键&#xff0c;会自动补全一条warn级别的打印日志&#xff0c;以此类推。 如下图所示&#xff1a;

C#项目发布

C#项目发布 vs code 打包iis 配置 vs code 打包 iis 配置

VMware Linux Centos 配置网络并设置为静态ip

在root用户下进行以下操作 1. 查看子网ip和网关 &#xff08;1&#xff09;进入虚拟网络编辑器 &#xff08;2&#xff09;进入NAT设置 &#xff08;3&#xff09;记录子网IP和子网掩码 2. 修改网络配置文件 &#xff08;1&#xff09;cd到网络配置文件路径下 [rootlo…

【视觉SLAM入门】5.1. 特征提取和匹配--FAST,ORB(关键点描述子),2D-2D对极几何,本质矩阵,单应矩阵,三角测量,三角化矛盾

"不言而善应" 0. 基础知识1. 特征提取和匹配1.1 FAST关键点1.2 ORB的关键点--改进FAST1.3 ORB的描述子--BRIEF1.4 总结 2. 对极几何&#xff0c;对极约束2.1 本质矩阵(对极约束)2.1.1 求解本质矩阵2.1.2 恢复相机运动 R &#xff0c; t R&#xff0c;t R&#xff0c;…

推荐几款小众且无广告的软件,你值得拥有

你是否喜欢一些小众且无广告的软件&#xff1f;如果是的话&#xff0c;我这边有一些给你推荐的。 护眼软件——EyeLoveU ​ EyeLoveU是一款免费的护眼软件&#xff0c;可以在你使用电脑一段时间后&#xff0c;提醒你该让眼睛休息。EyeLoveU是一种智能的眼睛保护程序&#xff…

python tkinker界面

import tkinter from PIL import Image, ImageTkdog tkinter.Tk() # 设置图片描绘的坐标&#xff0c;注意乘号是字母x dog.geometry(500x500200100) # 不允许修改大小 dog.resizable(False, False) # 不显示标题栏 dog.overrideredirect(True) # 设置白色透明色&#xff0c;这…

【玩转pandas系列】数据清洗(文末送书福利)

文章目录 一、重复值检测二、元素替换1️⃣ 元素替换replace2️⃣ 数据映射map 三、修改索引1️⃣ 修改索引名rename2️⃣ 设置索引和重置索引 四、数据处理1️⃣ apply与applymap2️⃣ transform 五、异常值处理六、抽样聚合函数1️⃣ 抽样2️⃣ 数学函数 七、分组聚合&#x…

DAY16_VUE基本用法详细版

目录 0 HBuilderX修改注释0 HBuilderX 修改.VUE中的注释颜色1 Vue入门1.1 什么是Vue1.2 Vue优点1.3 Vue案例1.3.1入门案例1.3.2 v-cloak属性1.3.3.1 v-text 指令1.3.3.2 v-html 指令1.3.3.3 v-pre 指令1.3.3.4 v-once 指令1.3.3.5 v-model 指令 1.3.4 MVVM思想 1.4 事件绑定1.4…

OpenLayers入门,OpenLayers如何加载WFS服务的要素资源数据

专栏目录: OpenLayers入门教程汇总目录 前言 本章讲解如何使用OpenLayers加载WFS服务的要素资源数据。 WFS规范介绍 WFS是基于地理要素级别的数据共享和数据操作,WFS规范定义了若干基于地理要素(Feature)级别的数据操作接口,并以 HTTP 作为分布式计算平台。通过 WFS服…

如何将工作可视化管理,工作流程管理

看板利用了对视觉内容的偏好&#xff0c;可以帮助团队理解和分析在工作中发生了什么&#xff0c;遇到了哪些问题和瓶颈&#xff0c;我们可以通过看板更好的可视化工作流程&#xff0c;可以在看板内自定义工作流程&#xff0c; 首先创建工作流任务看板 通过Leangoo领歌敏捷看板…

AD21 PCB设计的高级应用(七)盲埋孔的设置

&#xff08;七&#xff09;盲埋孔的设置 1.盲埋孔的设置2.Pad/Via模板的使用 1.盲埋孔的设置 随着目前便携式产品的设计朝着小型化和高密度的方向发展,PCB的设计难度也越来越大,对 PCB 的生产工艺提出了更高的要求。在目前大部分的便携式产品中 0.65mm间距以下 BGA封装均使用…

C#+WPF上位机开发(模块化+反应式)

在上位机开发领域中&#xff0c;C#与C两种语言是应用最多的两种开发语言&#xff0c;在C语言中&#xff0c;与之搭配的前端框架通常以QT最为常用&#xff0c;而C#语言中&#xff0c;与之搭配的前端框架是Winform和WPF两种框架。今天我们主要讨论一下C#和WPF这一对组合在上位机开…