Як створити тінь для краплі лише на одній стороні елемента?


230

Чи є спосіб скинути тінь лише на дно ?. У мене є меню з 2 зображеннями поруч. Я не хочу правильної тіні, оскільки вона перекриває потрібне зображення. Мені не подобається використовувати для цього зображення, тож є спосіб опустити їх лише на дно, наприклад:

box-shadow-bottom: 10px #FFF; чи подібне?

-moz-box-shadow: 0px 3px 3px #000;
-webkit-box-shadow: 0px 3px 3px #000;
box-shadow-bottom: 5px #000;
/* For IE 8 */
-ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=180, Color='#000000')";
/* For IE 5.5 - 7 */
filter: progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=180, Color='#000000');

8
Ваші прийняті посилання на відповіді, box-shadow-bottomяких не існує, і їх ніхто не підтримує. Дивіться nicolasgallagher.com/css-drop-shadows-without-images/demo щодо законних методів тіньового вікна.
Пол Ірландський

@Paul ... У мене був помилка друку, її виправлено.
Христо

1
Коментарі у вашому прикладі CSS вводять в оману - filterвони працюватимуть і в IE8 та IE9. У -ms-filterцьому випадку не потрібно .
Mathias Bynens

Ви можете адаптувати цю реалістичну тінь css css: stackoverflow.com/a/20596554/1491212
Armel Larcier

Відповіді:


234

ОНОВЛЕННЯ 4

Те саме, що оновлення 3, але з сучасним css (= менше правил), так що не потрібно спеціального розміщення на псевдоелементі.

#box {
    background-color: #3D6AA2;
    width: 160px;
    height: 90px;
    position: absolute;
    top: calc(10% - 10px);
    left: calc(50% - 80px);
}

.box-shadow:after {
    content:"";
    position:absolute;
    width:100%;
    bottom:1px;
    z-index:-1;
    transform:scale(.9);
    box-shadow: 0px 0px 8px 2px #000000;
}
<div id="box" class="box-shadow"></div>

ОНОВЛЕННЯ 3

Усі мої попередні відповіді використовували додаткову розмітку для створення цього ефекту, який необов'язково потрібен. Я вважаю це набагато чистішим рішенням ... єдиний трюк - це грати зі значеннями, щоб отримати правильне розташування тіні, а також правильну силу / непрозорість тіні. Ось нова загадка з використанням псевдоелементів :

http://jsfiddle.net/UnsungHero97/ARRRZ/2/

HTML

<div id="box" class="box-shadow"></div>

CSS

#box {
    background-color: #3D6AA2;
    width: 160px;
    height: 90px;
    margin-top: -45px;
    margin-left: -80px;
    position: absolute;
    top: 50%;
    left: 50%;
}

.box-shadow:after {
    content: "";
    width: 150px;
    height: 1px;
    margin-top: 88px;
    margin-left: -75px;
    display: block;
    position: absolute;
    left: 50%;
    z-index: -1;
    -webkit-box-shadow: 0px 0px 8px 2px #000000;
       -moz-box-shadow: 0px 0px 8px 2px #000000;
            box-shadow: 0px 0px 8px 2px #000000;
}

ОНОВЛЕННЯ 2

Мабуть, ви можете зробити це за допомогою лише додаткового параметра до CSS-box-shadow, як всі інші тільки що вказали. Ось демонстрація:

http://jsfiddle.net/K88H9/821/

CSS

-webkit-box-shadow: 0 4px 4px -2px #000000;
   -moz-box-shadow: 0 4px 4px -2px #000000;
        box-shadow: 0 4px 4px -2px #000000;

Це було б кращим рішенням. Додатковий параметр, який додається, описується як:

Четверта довжина - відстань поширення. Позитивні значення змушують форму тіні розширюватися в усіх напрямках за заданим радіусом. Негативні значення призводять до того, що форма тіні стискається.

ОНОВЛЕННЯ

Ознайомтеся з демонстрацією на jsFiddle: http://jsfiddle.net/K88H9/4/

Що я зробив, це створити "тіньовий елемент", який ховався б за фактичним елементом, який ви хотіли б мати. Я зробив ширину "тіньового елемента" точно меншою, ніж фактичний елемент, у 2 рази більше вказаної вами тіні; потім я її правильно вирівняв.

HTML

<div id="wrapper">
    <div id="element"></div>
    <div id="shadow"></div>
</div>

CSS

#wrapper {
    width: 84px;
    position: relative;
}
#element {
    background-color: #3D668F;
    height: 54px;
    width: 100%;
    position: relative;
    z-index: 10;
}
#shadow {
    background-color: #3D668F;
    height: 8px;
    width: 80px;
    margin-left: -40px;
    position: absolute;
    bottom: 0px;
    left: 50%;
    z-index: 5;
    -webkit-box-shadow: 0px 2px 4px #000000;
       -moz-box-shadow: 0px 2px 4px #000000;
            box-shadow: 0px 2px 4px #000000;
}

Оригінальний відповідь

Так, ви можете зробити це за тим самим синтаксисом, який ви вказали. Перше значення керує горизонтальним розташуванням, а друге значення - вертикальним. Тому просто встановіть перше значення, 0pxа друге - будь-який зсув, який ви хочете, наступним чином:

-webkit-box-shadow: 0px 5px #000000;
   -moz-box-shadow: 0px 5px #000000;
        box-shadow: 0px 5px #000000;

Для отримання додаткової інформації про тіньові коробки, перегляньте такі:

Я сподіваюся, що це допомагає.


2
Для досягнення розмитості тіні вам не обов’язково додавати порожній роздільник. Це третє значення в декларації: box-shadow: 0 2px 4px #000000це значення розмиття. Дивіться тут http://jsfiddle.net/K88H9/7/ . Але ви помітите, що зліва і справа від елемента є трохи розмиття, де в рішенні Христо немає.

9
Немає властивості "тінь-дно", і цей ефект, безумовно, не потребує додаткових елементів. Гидота.
Леа Веру

7
box-shadow-bottom, хоча творчий, насправді не існує.
miketaylr

3
холодні хлопці ... це був типовий фріггін
Христо

1
@gryzzly ... Я відредагував свою відповідь, не побачив свого друку, поки всі не вказали на це. Вибач за це.
Христо

71

Просто використовуйте параметр спред, щоб зменшити тінь:

.shadow {
  -webkit-box-shadow: 0 6px 4px -4px black;
  -moz-box-shadow: 0 6px 4px -4px black;
  box-shadow: 0 6px 4px -4px black;
}
<div class="shadow">Some content</div>

Демонстраційна демонстрація: http://dabblet.com/gist/a8f8ba527f5cff607327

Щоб не побачити жодної тіні з боків, (абсолютне значення) радіуса розширення (4-й параметр) повинен бути таким же, як радіус розмиття (3-й параметр).


1
це насправді не працює. на перший погляд здається, що тінь знаходиться лише внизу, але насправді вона все ще поширюється повз сторони. Приклади усіх колись із досить синьою коробкою ... зробіть коробку білою, і ви побачите всю тінь.
Кріс Л

@Chris M: просто збільшить параметр розповсюдження: спробуйте 4 прикладу, box-shadow:0 8px 4px -6pxі ви побачите лише нижню тінь!
T30,

1
ще раз зробіть поле БІЛО, як у цій загадці і ви все одно побачите тінь на всьому боці, а також тепер це не зробить його повним дном. як далеко ви готові піти на параметр розповсюдження, щоб позбутися від сторін? Також, мабуть, найкраще, щоб хтось із 151 повтором не редагував відповідь когось із 7k повтором. залиште це в коментарі.
Кріс Л

1
@ T30 Звичайно, ви з часом можете позбутися сторін, ще більше зменшивши параметр спред. Але тепер ваша тінь ніде не наближається до ширини коробки. У вас є 84px вікно з тінню 72px.
Кріс Л

1
Оновлена ​​відповідь. Але в основному, якщо не скоротити радіус розповсюдження і скорегувати зміщення Y, не можна зробити багато чого. Може використовувати градієнт замість тіні? Також я не заперечую проти того, щоб люди редагували мої публікації, але я не ціную людей, які редагують мої повідомлення, щоб додавати пропозиції, написані якоюсь англійською мовою. Я також не є носієм англійської мови, і я розумію проблеми, але якби я редагував чужу посаду, я відчував би достатню відповідальність хоча б ще раз перевірити, що те, що я додав, має сенс, а граматика не є бентежно неправильно.
Леа Веру

30

Якщо у вас є фіксований колір на тлі, ви можете приховати ефект бічної тіні двома маскувальними тінями, що мають однаковий колір фону і розмиття = 0, наприклад:

box-shadow: 
    -6px 0 white,         /*Left masking shadow*/
    6px 0 white,          /*Right masking shadow*/
    0 7px 4px -3px black; /*The real (slim) shadow*/

Зауважте, що чорна тінь повинна бути останньою і мати негативне поширення (-3 пікселя), щоб не допустити її розширення за кути.

Тут загадка (змініть колір маскуючих тіней, щоб побачити, як це насправді працює).

div{
    width: 100px;
    height: 100px;
    border: 1px solid pink;
    box-shadow: -6px 0 white, 6px 0 white, 0 7px 5px -2px black;
}
<div></div>

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


1
Було б набагато краще використовувати transparentколір для маскуючих тіней, ні?
Ангел Йосиф Піскола

@AngelJosephPiscola: Розумний натяк .. Реалізовано у відповіді, дякую!
Т30

@ T30 дивовижно, але зауважте, що для прозорої маски вам не потрібен фіксований кольоровий фон;)
Ангел Йосиф Піскола

Я перевірив це краще, і прозора тінь не працює , тому я скасував останні зміни
T30,

6

Я думаю, що це те, що ти шукаєш?

.shadow {
  -webkit-box-shadow: 0 0 0 4px white, 0 6px 4px black;
  -moz-box-shadow: 0 0 0 4px white, 0 6px 4px black;
  box-shadow: 0 0 0 4px white, 0 6px 4px black;
}
<div class="shadow">wefwefwef</div>


2
Любіть це, коли люди просто не розуміють. Так, він возиться з поширенням першої тіні (білої), яка покриє межі реальної тіні (чорної). Це єдиний розумний спосіб отримати ідеальну однонаправлену тінь. Особливо корисно, коли вам потрібно мати однакову тінь у двох частинах меню.
Зенон Поповичі

5

Завжди краще прочитати характеристики . Немаєbox-shadow-bottom властивості, і як вказує Леа, завжди слід розміщувати неперефіксовану властивість у нижній частині, після встановленої.

Отже, це:

.shadow {
  -webkit-box-shadow: 0px 2px 4px #000000;
  -moz-box-shadow: 0px 2px 4px #000000;
  box-shadow: 0px 2px 4px #000000;
}
<div class="shadow">Some content</div>


1
Там тінь з боків
shinzou

2

Як щодо просто використання вмістуючого div, у якого переповнення встановлено на приховане, а внизу трохи накладки? Це здається набагато найпростішим рішенням.

Вибачте, що я не думав про це, але бачив це десь в іншому місці .

Використовуючи елемент, щоб обернути елемент, отримуючи тінь поля та перелив: прихований на обгортці ви могли змусити зайву тінь коробки зникнути і все ще мати зручну межу. Це також виправляє проблему, коли елемент менший, як здається, через розповсюдження.

Подобається це:

#wrapper { padding-bottom: 10px; overflow: hidden; }
#elem { box-shadow: 0 0 10px black; }

Тут розміщено вміст

Ще розумне рішення, коли це потрібно робити в чистому CSS!

Як сказав Йорген Евенс .


+1 для рішення. На додаток до padding-bottom(скажімо, 5px), ви також можете встановити мінус margin-bottom(-5px), щоб компенсувати доданий простір.
fabio.sang

2

Ви також clip-pathможете скопіювати (приховати) всі перелиті краї, окрім того, що ви хочете показати:

.shadow {
  box-shadow: 0 4px 4px black;
  clip-path: polygon(0 0, 100% 0, 100% 200%, 0 200%);
}

Див. Кліп-шлях (MDN) . Аргументами polygonє точка верхній лівий , верхній правий , нижній правий і нижній лівий . Встановивши нижній край на200% (або будь-яке число, що перевищує 100%), ви обмежите свій перелив лише нижнім краєм.


Отже ... в основному, clip-path - це переповнення: прихована властивість стероїдів. Це чисто. ;)
Крейг

1

Мені також була потрібна тінь, але тільки під зображенням і встановлена ​​трохи вліво і вправо. Це працювало для мене:

.box-shadow {
   -webkit-box-shadow: 5px 35px 30px -25px #888888;
      -moz-box-shadow: 5px 35px 30px -25px #888888;
           box-shadow: 5px 35px 30px -25px #888888;
}

Елемент, до якого застосовується, - це зображення на всій сторінці (980px x 300px).

Якщо це допомагає під час налаштування параметрів, вони виконуються наступним чином:

горизонтальна тінь, вертикальна тінь, відстань розмиття, поширення (тобто розмір тіні) та колір.


1

Краще шукати тінь:

.header{
    -webkit-box-shadow: 0 -8px 73px 0 rgba(0,0,0,0.2);
    -moz-box-shadow: 0 -8px 73px 0 rgba(0,0,0,0.2);
    box-shadow: 0 -8px 73px 0 rgba(0,0,0,0.2);
}

цей код зараз використовується в stackoverflow web.



0

Якщо ваш фон суцільний (або ви можете відтворити його за допомогою CSS), ви можете використовувати лінійний градієнт таким чином:

div {
  background-image: linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 5px, #fff 5px, #fff 100%)
}
<div>
<p>Foobar</p>
<p>test</p>
</div>

Це створить градієнт 5 пікселів в нижній частині елемента, від чорного при 30% непрозорості до повністю прозорого. Решта елемента має біле тло. Звичайно, змінивши останні два зупинки кольору лінійного градієнта, ви могли зробити фон повністю прозорим.


0

Ви також можете зробити градієнт на нижній частині - це було мені корисно, оскільки тінь, яку я хотів, була на елементі, який уже був напівпрозорим, тому мені не потрібно було турбуватися про будь-яке вирізання:

&:after {
      content:"";
      width:100%;
      height: 8px;
      position: absolute;
      bottom: -8px;
      left: 0;
      background: linear-gradient(to bottom, rgba(0,0,0,0.65) 0%,rgba(0,0,0,0) 100%);
    }

Просто встановіть відповідність властивостей "знизу" та "висота" та встановіть значення rgba таким чином, щоб вони знаходились у верхній / нижній частині тіні


0

Ви можете зробити це так:

Загальний синтаксис:

selector {
   box-shadow: topBoxShadow, bottomBoxShadow, rightBoxShadow, leftBoxShadow
}

Приклад: ми хочемо зробити лише нижню тінь з червоного кольору,

щоб зробити це, ми повинні встановити всі параметри сторін, де нам потрібно встановити параметри тіні нижнього поля та встановити всі інші порожніми, як слід:

.box {
     -moz-box-shadow: 0 0 0 transparent ,0 0 10px red, 0 0 0 transparent, 0 0 0 transparent
     -o-box-shadow: 0 0 0 transparent ,0 0 10px red, 0 0 0 transparent, 0 0 0 transparent
     -webkit-box-shadow: 0 0 0 transparent ,0 0 10px red, 0 0 0 transparent, 0 0 0 transparent
     box-shadow: 0 0 0 transparent ,0 0 10px red, 0 0 0 transparent, 0 0 0 transparent
}

-1

оновіть на когось іншого свою відповідь прозорими сторонами замість білого, щоб він працював і на інших кольорах.

body {
  background: url(http://s1.picswalls.com/wallpapers/2016/03/29/beautiful-nature-backgrounds_042320876_304.jpg)
}

div {
  background: url(https://www.w3schools.com/w3css/img_avatar3.png) center center;
  background-size: contain;
  width: 100px;
  height: 100px;
  margin: 50px;
  border: 5px solid white;
  box-shadow: 0px 0 rgba(0, 0, 0, 0), 0px 0 rgba(0, 0, 0, 0), 0 7px 7px -5px black;
}
<div>
</div>


-3

внутрішня тінь

 .shadow {
   -webkit-box-shadow: inset 0 0 9px #000;
   -moz-box-shadow: inset 0 0 9px #000;
   box-shadow: inset 0 0 9px #000;
 }
<div class="shadow">wefwefwef</div>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.