Как использовать свойство clip-path для границы в css - PullRequest
2 голосов

Ответы [ 3 ]

3 голосов
/ 20 июня 2020

добавьте градиент, чтобы заполнить недостающие пробелы:

.test {
  background: red;
  width: 100px;
  height: 100px;
  box-sizing:border-box;
  
  /* CORNERS */
    clip-path: polygon(10px 0%, calc(100% - 10px) 0%, 100% 10px, 100% calc(100% - 10px), calc(100% - 10px) 100%, 10px 100%, 0% calc(100% - 10px), 0% 10px);
}

.test:hover {
  --grad:transparent 49.5%,green 50%;
  background: 
    linear-gradient(to top right   ,var(--grad)) top    right,
    linear-gradient(to top left    ,var(--grad)) top    left,
    linear-gradient(to bottom right,var(--grad)) bottom right,
    linear-gradient(to bottom left ,var(--grad)) bottom left,
    white;
  background-size:13px 13px; /* 10px of the clip-path + 3px of border */
  background-repeat:no-repeat;
  background-origin:border-box;
  cursor: pointer;
  
  border: 3px solid green;
}
<div class='test'>
 </div>
1 голос
/ 20 июня 2020

Я отвечу на свой комментарий для удобства чтения:

Для информации , если clip-path используется на двухуровневом контейнере, можно добавить тень вокруг полупрозрачных краев с помощью фильтра drop-shadow().

  • clip-path, применяемого к дочернему
  • drop-shadow() к родительскому
  • без размытия, это выглядит как граница независимо от формы : https://jsfiddle.net/q9tdpvfg/

демонстрация jsfiddle в приведенном ниже фрагменте:

.test div {
  background: red;
  width: 100px;
  height: 100px;
  /* CORNERS */
  clip-path: polygon(10px 0%, calc(100% - 10px) 0%, 100% 10px, 100% calc(100% - 10px), calc(100% - 10px) 100%, 10px 100%, 0% calc(100% - 10px), 0% 10px);
}

.test:hover {
  filter: drop-shadow(0px 3px 0px green) drop-shadow(3px 0px 0px green) drop-shadow(-3px 0px 0px green) drop-shadow(0px -3px 0px green);
  /* made 1 for each sides */
}

.test:hover div {
  background: white;
  cursor: pointer;
}

.test {
  width: max-content;
}

.test div {
  /* demo purpose */
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
}
<div class='test'>
  <div>
    TEST
  </div>
</div>
0 голосов
/ 20 июня 2020

Насколько мне известно, на самом деле невозможно сделать рамку вокруг элемента с помощью clip-path. Этот метод использует внутренние и внешние элементы. Источник: https://codepen.io/bennettfeely/pen/azJWWX/

.outside {
  position: relative;
    width: 70vmin;
    height: 70vmin;
    background: red;
    -webkit-clip-path: polygon(50% 0%, 83% 12%, 100% 43%, 94% 78%, 68% 100%, 32% 100%, 6% 78%, 0% 43%, 17% 12%);
clip-path: polygon(50% 0%, 83% 12%, 100% 43%, 94% 78%, 68% 100%, 32% 100%, 6% 78%, 0% 43%, 17% 12%);
}

.inside {
  position: absolute;
  top: 5px;
  left: 5px;
  right: 5px;
  bottom: 5px;
  background: red;
  -webkit-clip-path: polygon(50% 0%, 83% 12%, 100% 43%, 94% 78%, 68% 100%, 32% 100%, 6% 78%, 0% 43%, 17% 12%);
  clip-path: polygon(50% 0%, 83% 12%, 100% 43%, 94% 78%, 68% 100%, 32% 100%, 6% 78%, 0% 43%, 17% 12%);
}

.inside:hover {
  background: white;
  transition: all .2s;
}

.outside:hover {
  background: green;
  transition: all .2s;
}

/* Center the demo */
html, body { height: 100%; }
body {
    display: flex;
    justify-content: center;
    align-items: center;
  background: papayawhip;
}
<div class="outside">
  <div class="inside"></div>
</div>
...