css实现一个自适应多边形带有内阴影的边框

效果预览

在这里插入图片描述
如图所示,整个边框的折线是用clip-path实现的,使用box-shadow做阴影的话右上角及右下角的阴影是会被裁剪掉的,尝试了一些常规办法都实现不了,每次到这种时候,心里一定要暗示自己:css的奇技淫巧都是"障眼法"…
解决方案就是在右下角和右上角再分别绘制一个把方块补齐的多边形,给多边形加drop-shadow属性添加外阴影.这样就只有阴影部分被边框的clip-path裁剪进来,实现上述效果.
代码如下,是一个vue组件,能够自适应不同的内容

<template>
  <div class="container">
    <div
      class="wrap"
      @click="click"
      :style="`padding:${padding}; text-align:${position};`"
    >
      <slot></slot>
      <div class="border-left-top"></div>
      <div class="right-top">
        <div class="right-top-box"></div>
      </div>
      <div class="border-left-bottom"></div>
      <div class="right-bottom">
        <div class="right-bottom-box"></div>
      </div>
    </div>

    <div class="border-decorate">
      <img src="@/assets/bigSreen/border.png" alt="" />
    </div>
  </div>
</template>
<script>
export default {
  props: {
    padding: {
      type: String,
      default: "15px 20px",
    },
    position: {
      type: String,
      default: "left",
    },
  },
  methods: {
    click() {
      this.$emit("click");
    },
  },
};
</script>
<style lang="scss" scoped>
@mixin border {
  position: absolute;
  width: 13px;
  height: 13px;
  border-color: #0cbeff;
  border-style: solid;
  border-width: 3px;
}
.container {
  position: relative;
  overflow-y: hidden;
  .wrap {
    width: 100%;
    height: 100%;
    // color: #00a9e0;
    box-shadow: 0px 0px 10px #104781 inset;
    // background-color: rgb(141, 83, 83);
    clip-path: polygon(
      0 0,
      calc(100% - 100px) 0,
      calc(100% - 85px) 15px,
      calc(100% - 15px) 15px,
      100% 30px,
      100% calc(100% - 20px),
      calc(100% - 20px) 100%,
      0 100%
    );
    .border-left-top {
      @include border;
      left: 0;
      top: 0;
      border-right-width: 0;
      border-bottom-width: 0;
      // border-radius: 10px 0 0 0;
    }
    .border-left-bottom {
      @include border;
      left: 0;
      bottom: 0;
      border-top-width: 0;
      border-right-width: 0;
      // border-radius: 0 0 0 10px;
    }
    .right-top {
      position: absolute;
      top: 0;
      right: 0;
      filter: drop-shadow(0 0 10px #104781);
      .right-top-box {
        position: absolute;
        background-color: #104781;
        height: 30px;
        width: 100px;
        top: 0;
        right: 0;
        clip-path: polygon(0 0, 100px 0, 100px 30px, 85px 15px, 15px 15px);
      }
    }
    .right-bottom {
      position: absolute;
      bottom: 0;
      right: 0;
      filter: drop-shadow(0 0 10px #104781);
      .right-bottom-box {
        position: absolute;
        background-color: #104781;
        height: 20px;
        width: 20px;
        bottom: 0;
        right: 0;
        clip-path: polygon(100% 0, 100% 100%, 0 100%);
      }
    }
  }
  .border-decorate {
    position: absolute;
    right: 8px;
    top: -8px;
    transform: scale(0.8, 0.7);
  }
}
</style>

总结

clip-path属性的兼容性还不是太好,edge和360浏览器上试了试,效果挺奇怪的,所以慎用.
不好实现的东西先在网上搜案例,拓宽思路,实在找不到案例时只能求助"障眼法".但前提是必须对css有足够深入的认识,不然是没法做到融会贯通的.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值