鼠标悬浮动画

纯CSS动画实现,在可以跳转的a标签上悬浮出现从无到有的包围效果,看图:

这个悬浮框选择了VUE的绿色,本来使黑色的,哈哈,还不错 先亮CSS完整代码:

<style>
/*元素样式,这个我最不在行,先做一个简单的出来,后面慢慢打磨*/
ul {
  overflow: hidden;
} /* 这个是浏览器的原因默认会有边距和填充 */
/* *{ margin:0; padding:0; } */
#root {
  height: 100%;
  display: flex;
  flex-direction: row;
}
#part_left {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  width: 350px;
  flex-shrink: 0;
  background-color: #e4e8ec;
}

#ico {
  display: flex;
  margin-top: 20px;
  justify-content: center;
}
img {
  width: 120px;
}
#jump {
  height: 180px;
  display: flex;
  flex-direction: row;
  justify-content: space-between;
}
#jump ul {
  display: flex;
  width: 100%;
  flex-wrap: wrap; /*项目允许换行*/
  justify-content: space-around;
  margin: 0;
  padding: 30px;
  text-align: center;
}
#jump ul li {
  list-style-type: none;
  margin-top: 12px;
  width: 80px;
  font-weight: 600;
  font-size: 22px;
}

#only_menu {
  display: flex;
}
#menu_list {
  display: flex;
  width: 100%;
  flex-wrap: wrap;
  margin: 0;
  justify-content: space-around;
  padding: 30px;
  text-align: center;
}

#menu_list li {
  list-style-type: none;
  margin-top: 12px;
  width: 80px;
  font-weight: 500;
  font-size: 25px;
}

#part_right {
  display: flex;
  width: 100%;
  top: 50px;
  right: 50px;
  background-color: #e4e8ec;
}
#url_list li {
  list-style-type: none;
}
.menu_target {
  list-style-type: none;
  font-weight: 800;
  font-size: 28px;
}
.url_list_data {
  display: flex;
  flex-wrap: wrap;
  width: 100%;
}

.url_list_data li {
  margin-top: 12px;
  margin-bottom: 18px;
  width: 200px;
  height: 40px;
  background: #e4e8ec;
  display: flex;
  justify-content: center;
  align-items: center;
}
.url_list_data li a {
  font-weight: 500;
  font-size: 25px;
}

.btn {
  position: relative;
  padding: 10px 20px;
  border-top-right-radius: 10px;
  border-bottom-left-radius: 10px;
  transition: all 0.5s;
}

.btn::after,
.btn::before {
  content: " ";
  width: 10px;
  height: 10px;
  position: absolute;
  border: 0px solid #e4e8ec;
  transition: all 1s;
}

.btn::after {
  top: -1px;
  left: -1px;
  border-top: 5px solid #41B883;
  border-left: 5px solid #41B883;
}

.btn::before {
  bottom: -1px;
  right: -1px;
  border-bottom: 5px solid #41B883;
  border-right: 5px solid #41B883;
}

.btn:hover {
  border-top-right-radius: 10px;
  border-bottom-left-radius: 10px;
}
.btn:hover::before,
.btn:hover::after {
  width: 100%;
  height: 100%;
}
复制代码

部分HTML代码(只有右半部分的代码):

    <div id="part_right">
      <!-- 右侧网站导航栏 -->
      <ul id="url_list">
        <li v-for="item in url_lists" :key="item.ID">
          <!-- v:for嵌套循环,循环里面就不能用id定位元素了,要用class -->
          <div class="one_part">
            <div class="menu_target">{{ item.Name }}</div>
            <div class="url_list_data card">
              <li
                v-for="url_data in item.UrlLists"
                :key="url_data.ID"
                class="data-container"
              >
                <a :href="url_data.URL" class="btn">{{ url_data.Name }}</a>
              </li>
            </div>
          </div>
        </li>
      </ul>
    </div>
复制代码
总结

:before :after 选择器

CSS动画原理主要是使用了CSS伪元素,现在元素前后添加内容为空格高宽为10的文字:

.btn::after,
.btn::before {
  content: " ";
  width: 10px;
  height: 10px;
  position: absolute;
  border: 0px solid #e4e8ec;
  transition: all 1s;
}
复制代码

然后使用:hover用来监听鼠标的悬浮状态,悬浮之前高宽都是:

  width: 10px;
  height: 10px;
复制代码

悬浮之后扩充到100%:

.btn:hover::before,
.btn:hover::after {
  width: 100%;
  height: 100%;
}
复制代码

最后使用# transition 属性来控制动画的过渡时长 最后这个绿色的狂并不是伪元素本身,而是它的border,尝试去掉了一个top,效果如图:

到此为止就实现了一个简单的动画设置。