coverPiccoverPic

CSS 实现边框进入退出特效

效果

下面用 CSS 动画实现元素边框的进入/退出特效,鼠标移入时从左上角开始展示边框,移出时边框消失。

实现

众所周知,CSS 目前暂时没有办法操作边框长度,我们可以利用两个伪元素来实现这一点。元素本体使用position: relative;协助伪元素定位。

html
  1. <div class="box">我是内容喵</div>
css
  1. .box {
  2. --border-border: 2px;
  3. --color: rgb(14, 190, 225);
  4. --duration: 0.5s;
  5. border: 2px solid transparent;
  6. position: relative;
  7. color: var(--color);
  8. height: 36px;
  9. width: auto;
  10. display: inline-flex;
  11. align-items: center;
  12. padding: 0 16px;
  13. text-align: center;
  14. box-sizing: border-box;
  15. background-color: black;
  16. }

伪元素::before::after使用绝对定位,鼠标移出时宽高为 0,边框透明:

css
  1. .box::before, .box::after {
  2. content: "";
  3. position: absolute;
  4. margin-top: calc(0px - var(--border-border));
  5. margin-left: calc(0px - var(--border-border));
  6. width: 0px;
  7. height: 0px;
  8. box-sizing: border-box;
  9. border-style: solid;
  10. font-size: 0;
  11. top: 0;
  12. left: 0;
  13. border-color: transparent;
  14. border-width: var(--border-border);
  15. }

鼠标移入时,展示对应的边框颜色,这里::before操纵上右的边框,::after操作左下的,然后宽高延申覆盖元素本体:

css
  1. .box:hover::before {
  2. width: calc(100% + 2 * var(--border-border));
  3. height: calc(100% + 2 * var(--border-border));
  4. border-top-color: var(--color);
  5. border-right-color: var(--color);
  6. transition: width calc(var(--duration) / 2) linear,
  7. height calc(var(--duration) / 2) calc(var(--duration) / 2) linear,
  8. border-right-color 0s calc(var(--duration) / 2),
  9. }
  10. .box:hover::after {
  11. width: calc(100% + 2 * var(--border-border));
  12. height: calc(100% + 2 * var(--border-border));
  13. border-bottom-color: var(--color);
  14. border-left-color: var(--color);
  15. transition: width calc(var(--duration) / 2) calc(var(--duration) / 2) linear,
  16. height calc(var(--duration) / 2) linear,
  17. border-bottom-color 0s calc(var(--duration) / 2);
  18. }

这时候,你可能会发现,两个伪元素边框交界处有一点是没有颜色的,这样子我们可以把其中一个伪元素,在适合的时候,加上剩余的两个方向的边框:

css
  1. .box:hover::before {
  2. width: calc(100% + 2 * var(--border-border));
  3. height: calc(100% + 2 * var(--border-border));
  4. border-top-color: var(--color);
  5. border-right-color: var(--color);
  6. border-left-color: var(--color);
  7. border-bottom-color: var(--color);
  8. transition: width calc(var(--duration) / 2) linear,
  9. height calc(var(--duration) / 2) calc(var(--duration) / 2) linear,
  10. border-right-color 0s calc(var(--duration) / 2),
  11. border-bottom-color 0s var(--duration);
  12. }

然后鼠标移出,边框消失,以::before为例,边框出现是先上后右的,我们需要写一个新的transition操作退出的动画,否则退出时也先上后右,太怪了。

css
  1. .box::before {
  2. transition: width calc(var(--duration) / 2) calc(var(--duration) / 2) linear,
  3. height calc(var(--duration) / 2) linear,
  4. border-top-color 0s calc(var(--duration)),
  5. border-right-color 0s calc(var(--duration) / 2);
  6. }
  7. .box::after {
  8. transition: width calc(var(--duration) / 2) linear,
  9. height calc(var(--duration) / 2) calc(var(--duration) / 2) linear,
  10. border-left-color 0s calc(var(--duration)),
  11. border-bottom-color 0s calc(var(--duration) / 2);
  12. }

嗯~~~就这样,边框动画就做好了。

更多的动画

同理,可以实现更多类似的动画:

0 条评论未登录用户
Ctrl or + Enter 评论
© 2023-2025 LittleRangiferTarandus, All rights reserved.
🌸 Run