CSS——边框过渡效果

CSS------边框过渡效果

今天浅浅的水一下边框过渡效果。

按钮边框过渡效果

小小的解释一波

这里采用了一个外围的容器盒子,为了实现容器盒子的水平居中(这个简单)和垂直居中(这个就稍微复杂一些,往后可能会出一期专门设置垂直居中的文章),我还是请出了 Flex弹性盒子 ,真的是太好用了。

这里将body设置为弹性容器,然后再通过弹性容器 justify-contentalign-items 分别实现水平和垂直居中。不是很了解的同学可以查看 CSS------弹性盒子布局(display: flex),里面内容很详细。

css 复制代码
display: flex;
justify-content: center;
align-items: center;

这时候发现,容器里面的按钮是如何对齐的呢?这里我想让弹性盒子歇一歇。然后我就投机取巧地设置父盒子是按钮的三倍大小(宽高都是等比例的),这样的话,我只需要将按钮水平、竖直地移动自身长度地100%,就可以实现水平和垂直的居中了。(虽然可行,但是不推荐)

css 复制代码
 .container {
   width: 360px;
   height: 216px;
   text-align: center;

 }

 .button {
   position: relative;
   width: 120px;
   height: 72px;
   translate: 100% 100%;
   line-height: 72px;
 }

关键的动画效果是如何制作的呢?

这里我首先创建了按钮地两个伪元素,然后对伪元素进行操作,这里采用了clip-path属性,其具体使用可以参考MDN(inset()函数),这里我使用inset()裁剪出了矩形区域,其中的值是确保初始时候每条边上的线长都为30px。

css 复制代码
.button::before {
  clip-path: inset(0 90px 42px 0);
}

.button::after {
  clip-path: inset(42px 0 0 90px);
}

然后使用伪类在鼠标悬停时做出改变

css 复制代码
.button:hover::before {
  clip-path: inset(0 0 0 0)
}

.button:hover::after {
  clip-path: inset(0 0 0 0)
}

为了实现平滑过渡,我们为伪元素添加了动画延时效果

css 复制代码
transition: 1s ease;

源代码

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>边框过渡</title>
  <style>
    * {
      padding: 0;
      margin: 0;
    }

    a {
      text-decoration: none;
      color: #fff;
      font-size: 1.5rem;
    }

    body {
      width: 100vw;
      height: 100vh;
      background-image: radial-gradient(circle at center, rgba(10, 10, 10, 0.5), #000);
      display: flex;
      justify-content: center;
      align-items: center;
    }

    .container {
      width: 360px;
      height: 216px;
      text-align: center;

    }

    .button {
      position: relative;
      width: 120px;
      height: 72px;
      translate: 100% 100%;
      line-height: 72px;
    }

    .button::before,
    .button::after {
      box-sizing: border-box;
      content: '';
      width: 120px;
      height: 72px;
      border: 1px solid #fff;
      position: absolute;
      top: 0px;
      left: 0px;
      transition: 1s ease;
    }

    .button::before {
      clip-path: inset(0 90px 42px 0);
    }

    .button::after {
      clip-path: inset(42px 0 0 90px);
    }

    .button:hover::before {
      clip-path: inset(0 0 0 0)
    }

    .button:hover::after {
      clip-path: inset(0 0 0 0)
    }
  </style>
</head>

<body>
  <main class="container">
    <div class="button"><a href="javascript:;">按钮</a></div>
  </main>
</body>

</html>
相关推荐
baiduopenmap11 分钟前
百度世界2024精选公开课:基于地图智能体的导航出行AI应用创新实践
前端·人工智能·百度地图
loooseFish19 分钟前
小程序webview我爱死你了 小程序webview和H5通讯
前端
请叫我欧皇i31 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
533_34 分钟前
[vue] 深拷贝 lodash cloneDeep
前端·javascript·vue.js
guokanglun40 分钟前
空间数据存储格式GeoJSON
前端
zhang-zan1 小时前
nodejs操作selenium-webdriver
前端·javascript·selenium
猫爪笔记1 小时前
前端:HTML (学习笔记)【2】
前端·笔记·学习·html
brief of gali1 小时前
记录一个奇怪的前端布局现象
前端
Json_181790144802 小时前
电商拍立淘按图搜索API接口系列,文档说明参考
前端·数据库
风尚云网3 小时前
风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计
前端·css·学习·html·html5·风尚云网