CSS-тени box-shadow

Для практики и развлечения я пытаюсь воссоздать следующий логотип на чистом CSS в одном элементе.

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

До сих пор мне удавалось создавать полосы с помощью псевдоэлемента и некоторых теней, а также задавать цвета B с помощью градиента и background-clip: text.

Обычно я бы использовал повернутый элемент или маску для нанесения теней, но, поскольку я создал полосы с помощью теней блока, я не знаю, как бы я, и даже если бы я мог, применить их к отдельной тени (технически говоря, они Это все одна тень, но я имею в виду нанесение ее на один штрих, не закрывая другие)

Вот что у меня есть

Мой код

<div class='B'>B</div>

body {
    background:#FFF8E6;
}
.B {
    position:absolute;
    top:50%;
    left:50%;
    margin-top:-150px;
    line-height:236px;
    font-size:225pt;
    font-weight:bold;
    font-family:'Carrois Gothic SC', sans-serif;
    background-image:-webkit-gradient(linear, left top, left bottom, color-stop(9%, #FFBF7F), color-stop(9%, #F4A668), color-stop(19.6%, #F4A668), color-stop(19.9%, #F38669), color-stop(28.7%, #F38669), color-stop(29%, #AF9F88), color-stop(49%, #AF9F88), color-stop(49%, #cfb698), color-stop(70%, #cfb698), color-stop(70%, #ecd2b1));
    color:transparent;
    -webkit-background-clip: text;
}
.B:after {
    content:'';
    z-index:-1;
    position:absolute;
    left:-387px;
    height:45px;
    width:150px;
    border-radius: 0px 0px 0px 50px;
    box-shadow: 180px -12px 0 -9pt #FFBF7F, 220px -12px 0 -9pt #FFBF7F, 276px -12px 0 -9pt #FFBF7F, 215px 11px 0 -8pt #F4A668, 220px 11px 0 -8pt #F4A668, 275px 11px 0 -8pt #F4A668, 255px 33px 0 -8pt #F38669, 275px 33px 0 -8pt #F38669, 255px 56px 0 -9pt #898481, 276px 56px 0 -9pt #898481,
    /* I DON'T KNOW HOW TO FLIP THESE WITHOUT ADDING AN ELEMENT */
    275px 78px 0 -8pt #A4978E, 300px 101px 0 -8pt #B8A28A,
    /************************************************************/
    250px 90px 0 0px #CABBA8, 190px 45px 0 0px #CCBCAC, 150px 0 0 0px #FCCDA1;
}

Я не думаю, что это возможно, но меня всегда удивляла изобретательность пользователей SO.

TL,DR Как создать эти диагональные тени, не добавляя дополнительных элементов? Я был бы открыт для альтернативных способов, чем метод, который я использую, если это необходимо

РЕДАКТИРОВАНИЕ: Вот окончательный результат


person Zach Saucier    schedule 18.01.2014    source источник
comment
Вальс, я ищу ваш вклад в частности   -  person Zach Saucier    schedule 18.01.2014
comment
Непросто... посмотрю :-)   -  person vals    schedule 18.01.2014


Ответы (2)


Ну не мог я оставить этот вопрос открытым...

Я не смог решить это, используя ваш подход. Сделать наклонные тени было выполнимо, сделать их обрезанными под круглыми границами — нет (по крайней мере, я не нашел способа).

Альтернатива: использование огромного количества фонов:

.B:before {
    content:'';
    position:absolute;
    left: -237px;
    height:135px;
    width: 258px;
    background-image: linear-gradient(0deg,#898481,#898481),
            radial-gradient(circle at bottom right, #898481 22px, transparent 22px),
            linear-gradient(0deg,#898481,#898481),
            radial-gradient(circle at bottom right, #898481 22px, transparent 22px),
            linear-gradient(196deg,rgba(0, 0, 0, 0.97) -21px,transparent 27px),            
            radial-gradient(circle at top right, #ccbcac 44px, transparent 30px),
            linear-gradient(0deg,#ccbcac,#ccbcac),
            linear-gradient(0deg,#898481,#898481), 
            radial-gradient(circle at top right, #898481 22px, transparent 22px),
            linear-gradient(187deg,#B46550 2px,#f38669 24px),
            radial-gradient(circle at top right, #f38669 22px, transparent 22px),
            linear-gradient(196deg,rgba(60, 60, 60, 0.97) -21px,transparent 27px),
            radial-gradient(circle at top right, #ccbcac 44px, transparent 30px),
            linear-gradient(0deg,#ccbcac,#ccbcac), 
            linear-gradient(190deg,#AC6D3B -11px,#f4a668 28px),
            radial-gradient(circle at top right, #f4a668 22px, transparent 22px),
            linear-gradient(0deg,#ffbf7f,#ffbf7f), 
            radial-gradient(circle at top right, #ffbf7f 22px, transparent 22px),
            radial-gradient(circle at top right, #fccda1 44px, transparent 30px),
            linear-gradient(0deg,#FCCDA1,#fccda1); 
    background-position: 
          185px 110px, 163px 110px, 163px 88px, 144px 88px, 106px 88px,
          41px 88px, 137px 88px,            
          142px 66px, 120px 66px,
          142px 44px, 120px 44px,
           64px 44px,42px 44px, 
78px 44px,   97px 22px, 76px 22px, 65px 0px, 43px -1px, 0px 0px, 44px 0px;
    background-size: 198px 22px, 22px 22px,198px 22px, 22px 22px, 76px 22px, 96px 44px, 200px 44px,198px 22px, 22px 22px,198px 22px, 22px 22px, 96px 44px, 44px 44px, 200px 44px, 198px 22px, 22px 22px, 198px 22px, 22px 22px, 44px 44px, 200px 44px;
    background-repeat: no-repeat;    
}

Большинство фонов используются для воспроизведения той части дизайна, которая у вас уже была. Чтобы получить форму, вам нужен прямоугольный фон с круглым слева.

Для теней используются 2 техники.

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

Более сложными являются те, которые перекрывают часть круга. Здесь мне нужно было использовать другое отдельное фоновое изображение для тени.

результат

Я только проверил результат в Chrome.

Конечно, этот прием можно использовать и в письме:

обновлен CSS для письма

.B {
    position:absolute;
    top: 200px;
    left: 300px;
    margin-top:-150px;
    line-height:236px;
    font-size:225pt;
    font-weight:bold;
    font-family:'Carrois Gothic SC', sans-serif;
    background-image: 
         linear-gradient(187deg,#FFBF7F,#FFBF7F),
         linear-gradient(187deg,#cc8650,#F4A668),
         linear-gradient(195deg,#B46550,#F38669),
         linear-gradient(187deg,#8A7668 25px,#AF9F88 35px),
         linear-gradient(187deg,#af9678,#cfb698),
         linear-gradient(187deg,#dcc2a1,#ecd2b1);
    background-position: 
          0px 0px, 0px 9%, 0px 20%, 0px 30%, 0px 60%, 0px 100%;
    background-size: 200px 9%, 200px 11%, 200px 10%, 200px 30%, 200px 30%, 200px 30%, 200px 40%;
    background-repeat: no-repeat;
    color: transparent;
    -webkit-background-clip: text;
}

прокомментированные фоны CSS

background-image: linear-gradient(0deg,#898481,#898481),   /* second small bar in last big bar */
    radial-gradient(circle at bottom right, #898481 22px, transparent 22px),
    linear-gradient(0deg,#898481,#898481),                 /* first small bar in last big bar */
    radial-gradient(circle at bottom right, #898481 22px, transparent 22px),
    linear-gradient(196deg,rgba(0, 0, 0, 0.97) -21px,transparent 27px),        /* shadow */    
    radial-gradient(circle at top right, #ccbcac 44px, transparent 30px),    /* last big bar */ 
    linear-gradient(0deg,#ccbcac,#ccbcac),
    linear-gradient(0deg,#898481,#898481),          /* second small bar in second big bar */
    radial-gradient(circle at top right, #898481 22px, transparent 22px),    
    linear-gradient(187deg,#B46550 2px,#f38669 24px),  /* first small bar in 2nd big bar (shadowed) */
    radial-gradient(circle at top right, #f38669 22px, transparent 22px),     
    linear-gradient(196deg,rgba(60, 60, 60, 0.97) -21px,transparent 27px),   /* shadow on second big bar */
    radial-gradient(circle at top right, #ccbcac 44px, transparent 30px),   /* second big bar */    
    linear-gradient(0deg,#ccbcac,#ccbcac), 
    linear-gradient(190deg,#AC6D3B -11px,#f4a668 28px),  /* second small bar on top (shadowed) */
    radial-gradient(circle at top right, #f4a668 22px, transparent 22px),   
    linear-gradient(0deg,#ffbf7f,#ffbf7f),                        /* first small bar on top */
    radial-gradient(circle at top right, #ffbf7f 22px, transparent 22px),
    radial-gradient(circle at top right, #fccda1 44px, transparent 30px), /* big bar on top */
    linear-gradient(0deg,#FCCDA1,#fccda1); 

Не идеально, но вы можете получить тень в кругах с помощью еще одного шага радиального градиента:

radial-gradient(circle at top right, #fccda1 42px, #AC8D70 44px, transparent 45px)

Ограничение состоит в том, что тень в этом случае должна быть концентрической по отношению к границе. Альтернативой может быть установка другого фона, может быть эллиптического.

тени на кругах

person vals    schedule 18.01.2014
comment
В любом случае, я пытаюсь поддерживать Chrome только из-за свойства background-clip. Всегда выручаешь меня, Вальс. У меня есть пара вопросов. 1. Вы наложили тени на все полосы? Я не вижу их на большинстве нижних полос, вероятно, потому, что они слишком темные (легкое исправление). 2. Если бы я хотел, чтобы тени были и на букве B, мне пришлось бы использовать тот же подход с несколькими фоновыми изображениями, а не с одним большим градиентом, который я использую, верно? Потому что я предпочитаю оставить в нем возможность менять буквы, и он по-прежнему будет функционировать, но если это невозможно, все будет в порядке. - person Zach Saucier; 19.01.2014
comment
Была ли у вас какая-то методология размещения столбцов? Пара комментариев была бы полезна, чтобы показать, что к чему. - person Zach Saucier; 19.01.2014
comment
Я добавил комментарии к фону. Они создаются в том же порядке, в котором вы их видите, слева направо и сверху вниз, но начиная с первого фона (то есть последнего в списке). Вы можете использовать эту технику в письмах, для этого я добавил CSS, но я думаю, что это можно сделать в общем виде. В моем примере я установил проценты там, где это необходимо, и установил избыточную ширину, поэтому она должна покрывать все буквы (надеюсь). - person vals; 20.01.2014
comment
Потрясающее, умное использование градиентов для теней! Мне удалось сделать его намного более похожим на оригинал, но мне все еще не хватает части: тени на краях круглой части стержней. Я попытался добавить еще один параметр к радиальным градиентам, но это только сделало край более квадратным. Нужно ли мне создавать еще один радиальный градиент или есть более простой способ? - person Zach Saucier; 20.01.2014
comment
Добавлено 2 тени на первые круги. не идеально... Чтобы было лучше, нужен был бы другой фон, я думаю. - person vals; 20.01.2014
comment
Большое спасибо vals! Ваши творческие приемы с CSS поражают меня, несмотря на то, что я писал статьи на эту тему ^^ - person Zach Saucier; 20.01.2014
comment
@ZachSaucier Привет! ты онлайн ? - person vals; 21.01.2014
comment
Могу ли я как-нибудь отправить вам сообщение за пределами стека? Если с электронной почтой все в порядке, напишите мне zachsaucier (at) gmail - person Zach Saucier; 23.01.2015

Я бы посоветовал вам разделить каждую строку на отдельный DIV и использовать следующий код для создания желаемого ЭФФЕКТА ТЕНИ:

/*==================================================
 *                SHADOW EFFECT 
 * ===============================================*/

.div
{
  position: relative;
}
.div:after
{
  z-index: -1;
  position: absolute;
  content: "";
  bottom: 9px;
  right: 10px;
  left: auto;
  width: 50%;
  top: 80%;
  max-width:300px;
  background: #777;
  -webkit-box-shadow: 0 19px 10px #777;
  -moz-box-shadow: 0 15px 10px #777;
  box-shadow: 0 15px 10px #777;
  -webkit-transform: rotate(3deg);
  -moz-transform: rotate(3deg);
  -o-transform: rotate(3deg);
  -ms-transform: rotate(3deg);
  transform: rotate(3deg);
}  

Это будет очень полезно для достижения желаемого результата. Вы можете изменить его в соответствии с вашими потребностями и требованиями.

Надеюсь, что это поможет вам!

person Jiteen    schedule 18.01.2014