Как сделать фигуры в background только c помощью css

135
20 декабря 2019, 23:30

Пробовал сделать с помощью

transform: perspective(7px) rotateX(2deg);

и вроде получилось с первым пунктом но вот остальные не получается подогнать пожалуйста помогите и дайте как можно развернутый ответ.

Answer 1

Вариант с использованием clip-path

* { 
  padding: 0; 
  margin: 0; 
  box-sizing: border-box; 
} 
 
body { 
  background: orange; 
} 
 
.menu { 
  display: flex; 
  justify-content: center; 
} 
 
.menu>li { 
  position: relative; 
  list-style: none; 
  filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .75)); 
} 
 
.menu>li+li { 
  margin-left: -15px; 
} 
 
.menu>li:nth-of-type(1) { 
  z-index: 1; 
} 
 
.menu>li:nth-of-type(3) { 
  z-index: 2; 
} 
 
.menu>li:nth-of-type(4) { 
  z-index: 1; 
} 
 
.menu>li>a { 
  display: flex; 
  align-items: center; 
  justify-content: center; 
  background: #fff; 
  width: 120px; 
  height: 70px; 
  -webkit-clip-path: polygon(0 0, 100% 0, 85% 100%, 15% 100%); 
  clip-path: polygon(0 0, 100% 0, 85% 100%, 15% 100%); 
} 
 
.menu>li:nth-of-type(2)>a, 
.menu>li:nth-of-type(4)>a { 
  -webkit-clip-path: polygon(0 0, 100% 0, 80% 100%, 15% 100%); 
  clip-path: polygon(0 0, 100% 0, 80% 100%, 15% 100%); 
} 
 
.menu>li:nth-of-type(3)>a { 
  z-index: 1; 
} 
 
.menu>li:nth-of-type(3)>a, 
.menu>li:nth-of-type(6)>a { 
  -webkit-clip-path: polygon(0 0, 100% 0, 90% 100%, 10% 90%); 
  clip-path: polygon(0 0, 100% 0, 90% 100%, 10% 90%); 
} 
 
.menu>li:hover { 
  z-index: 5; 
}
<ul class="menu"> 
  <li><a href="#">Menu 1</a></li> 
  <li><a href="#">Menu 2</a></li> 
  <li><a href="#">Menu 3</a></li> 
  <li><a href="#">Menu 4</a></li> 
  <li><a href="#">Menu 5</a></li> 
  <li><a href="#">Menu 6</a></li> 
</ul>

Answer 2

Вот собрал на svg+d3.js формы блоков генерируются более менее случайным образом

let d = "Alle tekst komt van schrijvers die".split(" "); 
let left = 0; 
let groups = d3.select('svg') 
  .selectAll('g') 
  .data(d)  
  .enter() 
  .append('g') 
  .attr('transform', d => { 
    let t = `translate(${20+left*10}, -1)`; 
    left += d.length+1; 
    return t; 
  }) 
  .on('click', function() { 
    d3.selectAll('g').classed('active', false); 
    d3.select(this).raise().classed('active', true); 
  }); 
      
 
  groups.append('path') 
        .attr('d', d => ` 
          M${-10-rnd(10)},0  
          L${rnd(-10)},${20+rnd(10)} 
          L${d.length*10},${20+rnd(10)} 
          L${d.length*10+rnd(10)},0 Z 
        `) 
     
 
function rnd(base){ 
  return Math.random()*base; 
} 
 
groups.append('text')   
      .text(d => d) 
      .attr('y', 15)
body { 
  margin:0; 
  background-color: rgba(255,222,0,1); 
} 
 
path { 
  stroke: black; 
  fill: white; 
  cursor: pointer; 
  filter:url(#shadow); 
  transition: 200ms; 
} 
 
path:hover { 
  fill: lightgray; 
} 
 
text { 
  pointer-events:none; 
  font-family: monospace; 
  cursor: pointer; 
} 
 
g.active path { 
  fill: wheat; 
} 
 
g.active path:hover { 
  fill: lightgray; 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script> 
<svg viewbox="0 0 500 150"> 
   
  <defs> 
    <filter id="shadow" height="130%"> 
      <feGaussianBlur in="SourceAlpha" stdDeviation="3"/> 
      <feOffset dx="2" dy="2" result="offsetblur"/>  
      <feComponentTransfer> 
        <feFuncA type="linear" slope="0.5"/> 
      </feComponentTransfer> 
      <feMerge>  
        <feMergeNode/>  
        <feMergeNode in="SourceGraphic"/> 
      </feMerge> 
    </filter> 
  </defs> 
 
</svg>

Answer 3

Используйте ntc-child. Например если вы используйте transform: perspective(7px) rotateX(2deg); для div с классом menu, то код будет таким:

div.menu:nth-child(1) {
transform: perspective(7px) rotateX(2deg);
}

Далее вам надо, чтобы код для остальных отличался, тогда далее:

div.menu:nth-child(2) {
    transform: ...
    }
div.menu:nth-child(3) {
    transform: ...
    }

и т.д.

READ ALSO
Структура большого React проекта

Структура большого React проекта

Интересует вопрос касательно структуры файлов в React проектах

148
Вопрос по javascript и canvas

Вопрос по javascript и canvas

Почему всем объектам присваиваются одни координаты?

116
Как присвоить класс при нажатии на внутренний блок?

Как присвоить класс при нажатии на внутренний блок?

Есть несколько таких блоков кода, как при нажатии на кнопку отправить присвоить классу mainli ещё один класс active?

119