Skip to content

流动边框

效果展示

实现原理

用背景进行旋转,超出想显示的范围则 hidden ,就有以上的效果,可以用 after 或者 before 元素来实现也可以。

示例代码

vue
<!-- 流动边框.vue -->
<template>
  <div class="main">
    <demo1></demo1>
    <demo2></demo2>

    <div class="demo3">
      <demo style=""></demo>
    </div>

    <div class="border-image-clip-path"></div>

  </div>
</template>

<script setup>
import demo from './流动边框-组件.vue'
import demo1 from './流动边框-demo-1.vue'
import demo2 from './流动边框-demo-2.vue'

</script>

<style lang="scss" scoped>
.main{
  display: flex;
  gap: 10px;
}

.demo3{
  position: relative;
  width: 200px;
  height: 100px;
  border: 1px solid blue;
  background-color: red;
}


.border-image-clip-path {
    width: 200px;
    height: 100px;
    margin: auto;
    border: 10px solid;
    border-image: linear-gradient(45deg, gold, deeppink) 1;
    clip-path: inset(0px round 10px);
    animation: huerotate 6s infinite linear;
    filter: hue-rotate(360deg);
}

@keyframes huerotate {
    0% {
        filter: hue-rotate(0deg);
    }
    100% {
        filter: hue-rorate(360deg);
    }
}

</style>
vue
<!-- ./流动边框-demo-1.vue -->

<template>
  <div class="demo-box">

    <div class="box">
      <div class="under"></div>
      <!-- <span></span> -->
    </div>

    <div class="box">
      <div class="under"></div>
      <span></span>
    </div>

  </div>
</template>

<style scoped lang="scss">
.demo-box {
  display: flex;

  .box {
    position: relative;
    width: 100px;
    height: 100px;
    overflow: hidden;
    border-radius: 4px;
    &:last-of-type{
      margin-left: 10px;
    }

    .under {
      position: relative;
      width: 0px;
      height: 0px;
      border-top: 100px solid yellow;
      border-right: 100px solid green;
      border-bottom: 100px solid red;
      border-left: 100px solid blueviolet;
      left: -50px;
      top: -50px;
      animation: rotate 10s linear infinite;
    }

    span {
      position: absolute;
      top: 8px;
      bottom: 8px;
      left: 8px;
      right: 8px;
      border-radius: 4px;
      background-size: cover;
      background-image: url(https://img-blog.csdnimg.cn/20201011132854978.jpg);
      background-color: white;
      border: 1px solid blue;
    }
  }
}

@keyframes rotate {
  to {
    transform: rotate(1turn);
  }
}
</style>
vue
<!-- ./流动边框-demo-1.vue -->

<template>
  <div class="demo-box">

    <div class="box">
      <div class="under2"></div>
      <!-- <span></span> -->
    </div>

    <div class="box">
      <div class="under2"></div>
      <span></span>
    </div>

  </div>
</template>

<style scoped lang="scss">
.demo-box {
  display: flex;

  .box {
    position: relative;
    width: 100px;
    height: 100px;
    overflow: hidden;
    border-radius: 4px;
    &:last-of-type{
      margin-left: 10px;
    }

    .under2 {
      position: absolute;
      width: 0px;
      height: 0px;
      border-top: 100px solid rgb(0, 255, 13);
      border-right: 100px solid rgb(45, 218, 203);
      border-bottom: 100px solid rgb(255, 106, 156);
      border-left: 100px solid rgb(251, 255, 26);
      left: -50px;
      top: -50px;
      animation: rotate2 2s linear infinite;
    }

    span {
      position: absolute;
      top: 8px;
      bottom: 8px;
      left: 8px;
      right: 8px;
      border-radius: 4px;
      background-size: cover;
      background-image: url(https://img-blog.csdnimg.cn/20201011132854978.jpg);
      background-color: white;
    }
  }
}

@keyframes rotate2 {
  0% {
    transform: rotate(0turn);
  }

  to {
    transform: rotate(-1turn);
  }
}
</style>

参考学习