Как делать блоки такого вида?

223
18 апреля 2018, 04:38

Каким образом лучше всего делать блоки такого вида?

Чтобы при масштабировании форма была адаптивна и текст не выходил за границы блока.

Answer 1

Решение SVG

Решение адаптивно, работает во всех браузерах.
Текст и знак параграфа находятся внутри блока SVG, поэтому никогда не нарушится их взаимное положение и текст не выйдет за пределы блока при любом изменении размеров окна браузера. Рамки и текст будут изменяться пропорционально.

* { 
  margin: 0; 
  padding: 0; 
} 
 
.container { 
  width: 100%; 
  height: 100%; 
}
<div class="container"> 
  <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-10 -10 500 500">  
    <polygon points="0,0 50,0 65,15 160,15 160,100 0,100" stroke="gray" fill="none" /> 
    <text x="10" y="30" font-size="24" fill="gray">&#167;</text> 
    <text x="30" y="35" font-size="14" fill="black">TYPOGRAPHY</text>  
    <g font-size="12" fill="gray"> 
      <text x="15" y="50">Lorem ipsum dolor sit,</text> 
      <text x="15" y="62">amet consectetur adipisicing </text> 
      <text x="15" y="74">adipisicing elit Phasellus </text> 
      <text x="15" y="86">tincidunt dignissim nibh</text> 
    </g> 
  </svg> 
</div>

Второй вариант блока с тенью

  • Для реализации тени под первый полигон добавляем второй полигон и смещаем его на 2px вправо и вниз: <polygon transform="translate(2 2)"

  • Чтобы тень не выглядела грубо, размываем её фильтром Гаусса - feGaussianBlur

* { 
  margin: 0; 
  padding: 0; 
} 
 
.container { 
  width: 100%; 
  height: 100%; 
}
<div class="container"> 
  <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-10 -10 500 500"> 
    <defs> 
      <filter id="dropshadow" width="130%" height="130%"> 
        <feGaussianBlur in="SourceAlpha" stdDeviation="4"/>  
        <feOffset dx="2" dy="2" result="offsetblur"/>  
      </filter> 
    </defs>     
    <polygon transform="translate(2 2)" points="0,0 50,0 65,15 160,15 160,100 0,100" fill="rgba(0,0,0,0.5)" filter="url(#dropshadow)"/> 
    <polygon points="0,0 50,0 65,15 160,15 160,100 0,100" stroke="gray" fill="white" fill-opacity="1"/> 
    <text x="10" y="30" font-size="32" fill="gray">&#167;</text> 
    <text x="35" y="35" font-size="14" fill="black">TYPOGRAPHY</text>  
    <g font-size="12" fill="gray"> 
      <text x="15" y="50">Lorem ipsum dolor sit,</text> 
      <text x="15" y="62">amet consectetur adipisicing</text> 
      <text x="15" y="74">adipisicing elit Phasellus</text> 
      <text x="15" y="86">tincidunt dignissim nibh</text> 
    </g> 
  </svg> 
</div>

Answer 2
Решение на CSS:

* { 
  margin: 0; 
  padding: 0; 
} 
 
.wrapper { 
  position: relative; 
  max-width: 250px; 
  margin: 3rem; 
  padding: 1rem; 
  border: 1px solid gray; 
} 
 
.angle, 
.in, 
.in2, 
.in2::before { 
  position: absolute; 
  height: 30px; 
} 
 
.angle { 
  overflow: hidden; 
  width: 160px; 
  top: -30px; 
  left: -1px; 
} 
 
.in { 
  top: 0; 
  left: -10px; 
  width: 150px; 
  background-color: gray; 
  transform: skew(25deg); 
} 
 
.in2 { 
  top: 1px; 
  left: 1px; 
  width: 130px; 
  background-color: white; 
} 
 
.in2::before { 
  content: ""; 
  position: absolute; 
  right: -8.4px; 
  width: 25px; 
  background-color: white; 
  transform: skew(25deg); 
} 
 
.text { 
  max-width: 350px; 
  word-spacing: 3px; 
}
<div class="wrapper"> 
  <div class="angle"> 
    <div class="in"></div> 
    <div class="in2"></div> 
  </div> 
  <div class="text"> 
    <h1>Lorem</h1> 
    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Porro necessitatibus deleniti perspiciatis excepturi quia facere? Porro necessitatibus deleniti perspiciatis excepturi quia facere?</p> 
  </div> 
</div>

Решение на SVG:

* { 
  margin: 0; 
  padding: 0; 
} 
 
h2 { 
  margin: 1rem 0.3rem 0 0.3rem; 
} 
 
p { 
  font-size: 13px; 
  padding: 0 0.3rem; 
}  
.container { 
width:100%; 
height:100%; 
}
<div class="container"> 
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-10 -10 500 500"> 
  <polygon points="0,0 50,0 65,15 130,15 130,100 0,100" stroke="gray" fill="none"/> 
  <foreignObject width="150"> 
    <h2>Lorem</h2> 
    <p>Lorem ipsum dolor sit, amet consectetur adipisicing elit.</p> 
  </foreignObject> 
</svg> 
</div>

Answer 3

CSS и clip-path:

.block, 
.block:before { 
   clip-path: polygon(0 0, 50% 0, 70% 20%, 100% 20%, 100% 100%, 0 100%); 
   z-index: -1; 
} 
.block { 
  width: 200px; 
  height: 200px; 
  background-color: black; 
  position: relative; 
} 
 
.block:before { 
  content: ''; 
  width: 198px; 
  height: 198px; 
  background: white; 
  display: block; 
  position: absolute; 
  top: 1px; 
  left: 1px; 
} 
.inner { 
  padding: 50px 10px 10px; 
}
<div class="block"><div class="inner">Lorem text</div></div>

READ ALSO
Изображение на весь экран при клике

Изображение на весь экран при клике

У меня есть вот такой код

152
Стилизация раскрывающегося списка

Стилизация раскрывающегося списка

Задачи: 1стилизовать выпадающий список, чтобы он выглядел так

190
Прокрутка до якоря на маленьких экранах

Прокрутка до якоря на маленьких экранах

Добрый день коллегиЕсть сайт на bootstrap, он отлично сжимается на мобилке/планшете/нетбуке, без косяков

176
Слайдер с наложением друг на друга

Слайдер с наложением друг на друга

Как можно реализовать подобный слайдер с неким наложением текущей картинки поверх

179