【Ten Mins Effect】 - 01 创意列表悬停效果

287 阅读3分钟

大家好,这里是初心Yearth,欢迎来到 10 mins css,每天花 10 分钟,实现要给简单精美的 css 效果。

那么下面我们直接进入正题,先来看看今天的效果展示吧:

图片1
图片1

分析

不难看出,想要实现上面的效果,关键点在于 hover 效果,而这个 hover 效果分解如下:

  • 左侧按钮变色
  • 左侧按钮变宽,包裹住文本区域
  • 左侧按钮小幅度变大,同时向右小幅度偏移
  • 当鼠标移开之后,按钮先回复原来的形状,然后恢复原来的颜色

知道了流程,那么我们尝试先实现一个单独的 list item。

首先自然是基本的样式:

<section class="container">
  <li>
    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit.</p>
  </li>
</section>

:root {
  --theme-color#03a9f4;
  --bg-color#182b3c;
  --text-color#ffffff;
  --default-length32px;
}
* {
  margin0;
  padding0;
}
body {
  height100vh;
  width100vw;
  display: flex;
  justify-content: center;
  align-items: center;
  backgroundvar(--theme-color);
}
.container {
  padding40px;
  backgroundvar(--bg-color);
  box-shadow0 15px 25px #00000040;
}

.container li {
  list-style: none;
  colorvar(--text-color);
  padding-leftvar(--default-length);
}

效果如下:

图片2
图片2

接下来是左边按钮的实现,这里可以借助 before 和 after,就不用再增加额外的 dom 了。

.container li::before {
  content"";
  box-sizing: border-box;
  position: absolute;
  top0;
  left0;
  widthcalc(var(--default-length) * 8);
  heightcalc(var(--default-length) * 8);
  border-radius50%;
  border2px solid var(--theme-color);
}

.container li::after {
  content"";
  position: absolute;
  background: transparent;
  topcalc(var(--default-length) * 2.75);
  leftcalc(var(--default-length) * 2.5);
  widthcalc(var(--default-length) * 2);
  heightcalc(var(--default-length) * 2);
  border-top2px solid var(--text-color);
  border-right2px solid var(--text-color);
  transformrotate(45deg);
}

效果如下:

图片3
图片3

接下来实现 hover 效果,这里只要抓住几个关键点即可:

  • hover 的时候,按钮先变色,后变宽,所以需要分别设置 background 和 witdh 的延迟
  • 变宽之后不能覆盖文字,所以需要设置文字的 z-index
.container li::before {
  content"";
  box-sizing: border-box;
  position: absolute;
  top0;
  left0;
  widthcalc(var(--default-length) * 8);
  heightcalc(var(--default-length) * 8);
  border-radiuscalc(var(--default-length) * 8);
  border2px solid var(--theme-color);
  transition: background 0.5s, width 0.5s;
  transition-delay0.5s0s;
}
.container li:hover::before {
  backgroundvar(--theme-color);
  transition-delay0s0.5s;
  width100%;
}

.container li::after {
  content"";
  position: absolute;
  background: transparent;
  topcalc(var(--default-length) * 2.75);
  leftcalc(var(--default-length) * 2.5);
  widthcalc(var(--default-length) * 2);
  heightcalc(var(--default-length) * 2);
  border-top2px solid var(--text-color);
  border-right2px solid var(--text-color);
  transformrotate(45deg);
  transition0.5s;
  transition-delay0;
}

.container li:hover::after {
  leftcalc(var(--default-length) * 4);
  transition-delay0.5s;
  transformrotate(45degscale(1.2);
}

效果如下:

图片4
图片4

到了这一步,就已经没什么问题了,感兴趣的读者可以看看这个效果的在线 demo:创意列表悬停效果