CSS3 Box-shadow для псевдо-элементов до и после

Мне нужно создать что-то вроде этого, чтобы разделить разделы в мобильном дизайне:

введите здесь описание изображения

Я могу легко создать угловую часть с помощью CSS, но мне трудно получить правильную тень блока. Проблема в том, что мне нужна только тень окна в нижней части до и после псевдоэлементов. Но он добавляется со всех сторон, поэтому, когда два элемента встречаются посередине, образуя точку, тени блока перекрываются.

См. здесь, например:

введите здесь описание изображения

Вот что у меня есть (jsfiddle: https://jsfiddle.net/47zqjzmf/1/ )

HTML:

<div class="wrapper">
  <div class="inner"></div>
</div>

CSS:

.wrapper {
  display: inline-block;
  background: #fff;
  width: 300px;
  height: 300px;
  overflow: hidden;
}

.inner {
  position: relative;
  background: lightblue;
  width: 100%;
  height: 120px;
}

.inner:before, .inner:after {
    content: '';
    position: absolute;
    bottom: -10px;
    width: calc(50% + 5px);
    height: 20px;
    background-color: #fff;
    box-shadow: 1px 1px 10px 1px #000;
}

.inner:before {
  left: -2px;
  transform: rotate(7deg);
}

.inner:after {
  right: -2px;
  transform: rotate(-7deg);
}

Любые предложения о том, как я могу добиться этого эффекта?


person MP_Webby    schedule 27.12.2017    source источник


Ответы (4)


box-shadow вам не поможет, потому что, как следует из названия свойства, оно предназначено для ящиков. Вам поможет filter: drop-shadow(). Кроме того, вместо создания этих двух прямоугольников псевдоэлементов вы можете использовать свойство clip-path.

.element {
  width: 300px;
  color: white;
  filter: drop-shadow(0 0 15px black);
}

.element__clip {
  -webkit-clip-path: polygon(100% 0, 100% 80%, 50% 100%, 0 80%, 0 0);
  clip-path: polygon(100% 0, 100% 80%, 50% 100%, 0 80%, 0 0);
  background: blue;
}
<div class="element">
  <div class="element__clip">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent ultrices, lorem id pellentesque sollicitudin, mauris massa aliquam velit, ut sagittis tellus justo non turpis. In tempor at dui et placerat. Aliquam dolor lorem, maximus non nunc sit amet, condimentum aliquam neque. Suspendisse potenti. Aliquam laoreet purus sed arcu elementum varius. Nullam ante tortor, elementum sit amet justo vel, mollis dapibus massa. Sed ultricies dapibus eros ac laoreet. Maecenas posuere arcu enim, non interdum ipsum vulputate nec. Nulla iaculis orci ac mattis accumsan. Praesent id auctor ipsum. Aenean cursus arcu placerat nunc consectetur, feugiat tincidunt felis placerat. Quisque id sagittis mi. Curabitur tincidunt consequat orci, eu congue metus ultrices at. Aenean luctus justo et pharetra tristique.</div>
</div>

person Albert221    schedule 27.12.2017
comment
Это отличное решение. Каким будет лучший кросс-браузерный подход для использования filter и clip-path? Я предполагаю, что для старых браузеров не будет запасных вариантов? - person MP_Webby; 27.12.2017
comment
Вот полифилл для filter: drop-shadow(): github.com/Schepp/CSS-Filters-Polyfill вот для clip-path: github.com/AlfonsoFilho/ClipPath Я не знаю, будут ли они работать вместе. . - person Albert221; 27.12.2017
comment
Но filter имеет неплохую поддержку браузера согласно CanIUse. Только clip-path не поддерживается ни в IE, ни в Edge. - person Albert221; 27.12.2017

Попробуйте добавить разные значения по оси X теней, чтобы они не перекрывались.

.inner:before {box-shadow: -2px 2px 3px 1px rgba(0,0,0,.1)}
.inner:after {box-shadow: 2px 2px 3px 1px rgba(0,0,0,.1)}

body {
  position: relative;
  text-align: center;
}

.wrapper {
  display: inline-block;
  background: #fff;
  width: 300px;
  height: 300px;
  overflow: hidden;
}

.inner {
  position: relative;
  background: lightblue;
  width: 100%;
  height: 120px;
}

.inner:before, .inner:after {
    content: '';
    position: absolute;
    bottom: -10px;
    width: calc(50% + 5px);
    height: 20px;
    background-color: #fff;
}
.inner:before {
      box-shadow: -2px 2px 3px 1px rgba(0,0,0,.1);
}
.inner:after {
      box-shadow: 2px 2px 3px 1px rgba(0,0,0,.1);
}

.inner:before {
    left: -2px;
    -webkit-transform: rotate(7deg);
    -moz-transform: rotate(7deg);
    -ms-transform: rotate(7deg);
    -o-transform: rotate(7deg);
    transform: rotate(7deg);
}

.inner:after {
  right: -2px;
    -webkit-transform: rotate(-7deg);
    -moz-transform: rotate(-7deg);
    -ms-transform: rotate(-7deg);
    -o-transform: rotate(-7deg);
    transform: rotate(-7deg);
}
<div class="wrapper">
  <div class="inner"></div>
</div>

person Nathalia Xavier    schedule 27.12.2017
comment
Это очень близко. Однако, когда я увеличиваю распространение тени блока, я все еще получаю перекрытие - см. обновленную скрипту: jsfiddle.net /47zqjzmf/4. Распространение и rgba должны быть достаточно высокими в соответствии с дизайном, над которым я работаю. Любые идеи? * редактировать: обновлена ​​ссылка jsfiddle - person MP_Webby; 27.12.2017
comment
Я протестировал множество различных решений с треугольниками и преобразованиями CSS, но ни одно из них не сработало так хорошо, как это. Я предлагаю поиграть с box-shadow и значениями. Как дизайнер, я обычно не люблю большие значения разброса и темные тени, более тонкие тени выглядят более профессионально. Вы также можете использовать градиент от черного к цвету bg на следующем div. Тень не будет иметь форму треугольника, но все равно будет выглядеть так, как будто она находится внизу. Надеюсь, я помог - person Nathalia Xavier; 27.12.2017

Попробуйте с этим:

.inner:before, .inner:after {
    content: '';
    position: absolute;
    bottom: -10px;
    width: calc(50% + 5px);
    height: 20px;
    background-color: #fff;
    box-shadow: 3px 4px 4px -1px #000000;
}

https://jsfiddle.net/47zqjzmf/2/

person pinturic    schedule 27.12.2017

Пробовал другое решение с градиентным фоном. Это не похоже на треугольную тень, но все же выглядит так, как будто ниже находится следующий элемент div.

body {
  position: relative;
  text-align: center;
}

.wrapper {
  display: inline-block;
  background: #fff;
  width: 300px;
  height: 300px;
  overflow: hidden;
}

.inner {
  position: relative;
  background: lightblue;
  width: 100%;
  height: 120px;
}

.inner:before, .inner:after {
    content: '';
    position: absolute;
    bottom: -10px;
    width: calc(50% + 5px);
    height: 20px;
    background-color: #fff;
}

.inner:before {
  left: -2px;
  transform: rotate(7deg);
}

.inner:after {
  right: -2px;
  transform: rotate(-7deg);
}


.content {
  padding: 20px;
/* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#cccccc+0,ffffff+15,000000+100&0.65+0,0+100 */
background: -moz-linear-gradient(top, rgba(204,204,204,0.65) 0%, rgba(255,255,255,0.55) 15%, rgba(0,0,0,0) 100%); /* FF3.6-15 */
background: -webkit-linear-gradient(top, rgba(204,204,204,0.65) 0%,rgba(255,255,255,0.55) 15%,rgba(0,0,0,0) 100%); /* Chrome10-25,Safari5.1-6 */
background: linear-gradient(to bottom, rgba(204,204,204,0.65) 0%,rgba(255,255,255,0.55) 15%,rgba(0,0,0,0) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#a6cccccc', endColorstr='#00000000',GradientType=0 ); /* IE6-9 */
}
<div class="wrapper">
  <div class="inner"></div>
  <div class="content">
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
  </div>
</div>

person Nathalia Xavier    schedule 27.12.2017