Чи може CSS3 box-shadow: inset робити лише одну або дві сторони? як кордон?


80

Мені цікаво про підтримку сторонніх специфічних внутрішніх тіней у css3.

Я знаю, що це чудово працює в підтримуваних браузерах.

div { box-shadow:inset 0px 1px 5px black; }

Мені просто цікаво, чи є спосіб досягти чогось типу:

div { box-shadow-top:inset 0px 1px 5px black; }

Можливий дублікат " Як отримати поле-тінь" лише зліва та справа , що містить більш докладні відповіді та пояснення.
brichins

Відповіді:


147

Це те, що мені вдалося:

box-shadow: inset 1px 4px 9px -6px;

Приклад: http://jsfiddle.net/23Egu/


9
Наразі найелегантніше рішення.
enyo

Чудово! Я боровся з цим назавжди, але ця одна лінія приносить найсексуальніший бічний кордон за всю історію. Дякую, чоловіче!
Sliq

12
Варто зазначити, що ви можете переключити це на box-shadow: inset 1px -4px 9px -6px;нижню тінь.
Джастін Рассел

7
Тінь зліва: Тінь з box-shadow: inset 4px 1px 9px -6px; правого боку:box-shadow: inset -4px 1px 9px -6px;
bryanbraun

хм, отже, все, що ми робимо, це те, що ми використовуємо велике значення розповсюдження, а потім заперечуємо його, використовуючи негативне розмиття. Розумний
Саміулла Хан

11

Я не думаю, що вам насправді потрібно, box-shadow-topтому що якщо ви встановите offsetxзначення 0 і offsetyбудь-яке позитивне значення, то лише залишилася тінь буде зверху.

якщо ви хочете мати тінь зверху, а тінь знизу, ви можете просто використовувати два div:

<div style="box-shadow:inset 0 1px 5px black;">
  <div style="box-shadow:inset 0 -1px 5px black;">
    some content
  </div>
</div>

якщо ви хочете позбутися тіні з боків, використовуйте rgbaзамість hexкольору та встановіть більше offsety:

box-shadow:inset 0 5px 5px rgba(0,0,0,.5) 

таким чином ви надаєте тіні більше непрозорості, тому сторони залишаються прихованими, а з більшим зміщенням ви отримуєте менше непрозорості

повний приклад:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <style type="text/css">
            body {
                background: #1C1C1C;
            }
            div {
                margin: 50px auto;
                width: 200px;
                height: 200px;
                background: #fff;
                -webkit-border-radius: 20px;
                -khtml-border-radiust: 20px;
                -moz-border-radius: 20px;
                -o-border-radius: 20px;
                border-radius: 20px;
                box-shadow:inset 0px 5px 5px rgba(0,0,0,.5); 
            }
            div > div {
                background:none;
                box-shadow:inset 0px -5px 5px rgba(0,0,0,.5); 
            }
        </style>
    </head>
    <body>
        <div><div></div></div>
    </body>
</html>

І тінь буде більш розповсюдженою, ніж ви хотіли б. І сторони також змістилися. Це, безумовно, інший результат, ніж box-shadow-topдав би.редагувати Але так я зазвичай це теж роблю =)
Руді

@Rudie, якщо ти хочеш позбутися тіні з боків, використовуй rgbaзамість hexкольору та встанови більший offsety: box-shadow: 0 5px 5px rgba (0,0,0, .5) таким чином ти надаєш тіні більшої прозорості, щоб сторони залишалися прихованими і з більшим зміщенням ви отримуєте менше непрозорості
продавець

3
FYI, замість того, щоб мати два вкладених div для одночасного отримання верхньої та нижньої тіней, ви можете зробити це одним div, використовуючи це:box-shadow:inset 0 1px 5px black, inset 0 -1px 5px black;
Jake Wilson

10

використання :beforeта afterелементи з регулярними тінями, вирізаними overflow:hiddenна батьківському полі, як у цьому прикладі: http://dabblet.com/gist/2585782

CSS

/**
 * Top and Bottom inset shadow
 */


#element{
  background-color: #E3F2F7;
  height: 55px;
  position: relative; /* to position pseudo absolute*/
  overflow: hidden; /* to cut of overflow shadow*/
  margin-top: 200px;    
}

#element:before , #element:after{
  content: "\0020";
  display: block;
  position: absolute;
  width: 100%;
  height: 1px; /* when 0 no shadow is displayed*/
  box-shadow: #696c5c 0 0 8px 0;
}

#element:before { top: -1px} /* because of height: 1*/
#element:after { bottom: -1px}  /* because of height: 1*/

HTML

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

Це техніка, яка спрацювала у мене. У моєму випадку #element можна було прокручувати, тому мені довелося змінити положення на липке, щоб він працював.
Міхай Редукану,

5

У більшості випадків для використання можна використовувати фоновий градієнт:

Приклад SCSS (з компасом):

@include background(linear-gradient(top, #666 1%, #999 3%, #ddd 6%, #f6f6f6 9%, #f6f6f6 92%, #ddd 94%, #999 97%, #666 99%) );

1
Іноді нам потрібно просто відступити і подумати про те, що ми намагаємось досягти. І це часто те, що ми шукаємо за допомогою однобічної внутрішньої тіні. Блискуче. Я б двічі проголосував, якби міг!
random_user_name

Коли я вперше побачив цей коментар, я подумав, що це виглядає складно, щоб коли-небудь працювати, але він спрацював чудово. Дякую!!
Алекс

4
box-shadow: inset 5px 0 5px -5px rgba(0,0,0,0.5),inset -5px 0 5px -5px rgba(0,0,0,0.5);
-moz-box-shadow: inset 5px 0 5px -5px rgba(0,0,0,0.5),inset -5px 0 5px -5px rgba(0,0,0,0.5);
-webkit-box-shadow: inset 5px 0 5px -5px rgba(0,0,0,0.5),inset -5px 0 5px -5px rgba(0,0,0,0.5);
-o-box-shadow: inset 5px 0 5px -5px rgba(0,0,0,0.5),inset -5px 0 5px -5px rgba(0,0,0,0.5);

Це працює просто чудово :)

Ось код, що його ілюструє: http://codepen.io/poopsplat/pen/cGBLy


3

Для тієї самої тіні, але тільки зверху:

box-shadow: inset 0px 6px 5px -5px black;

Щоб тінь рухалася в одному напрямку, вам доведеться заперечити параметр "розмиття" параметром "розповсюдження", а потім відрегулювати параметри "h-pos" та / або "v-pos" за цим самим значенням. Це не працює з протилежною або потрійною межею. Ви повинні додати ще одне визначення.

Більше прикладів тут: http://codepen.io/GBMan/pen/rVXgqP



1

Я просто мав цю проблему сам. Я знайшов рішення з кількома тінями (по одному для кожної сторони, від якої ви хочете, щоб ваша тінь була). Ось визначення:

box-shadow: none|h-offset v-offset blur spread color |inset|initial|inherit;

Ось як це думати:

  • спочатку зробіть спред 0 (це вимкне ефект з усіх боків)
  • h-зміщення (якщо ви встановите його як позитивне, воно буде подано з лівого боку, якщо ви встановите його негативним, з правого боку)
  • v-зміщення (якщо ви встановите його як додатне, воно буде відтворюватися на верхній стороні, якщо ви встановите його негативним, на нижній стороні

Тут ви можете бачити мій корпус із тіньовою коробкою з трьох сторін (ліва, верхня, права та нижня - того самого кольору, що і фон, щоб створити ефект, який я хотів - ліва сторона та права йдуть аж до низу ) https://codepen.io/cponofrei/pen/eMMyQX


0

Ви можете створити односторонню внутрішню тінь, встановивши div overflow:hiddenі додавши елементи тіні вздовж меж.

Встановіть внутрішню тінь на верхню та нижню межі поділу:

HTML

<div id="innerShadow">
    <div id="innerShadowTop">
        Content...
    <div id="innerShadowBottom">
</div>

CSS

#innerShadow
{
    position: relative;
    overflow: hidden;
}

#innerShadowTop
{
    width: 100%;
    height: 1px;
    margin: 0;
    padding: 0;
    position: absolute;
    top: -1px;
    -moz-box-shadow: 0px 1px 6px 1px rgba(0, 0, 0, 0.65);
    -webkit-box-shadow: 0px 1px 6px 1px rgba(0, 0, 0, 0.65);
    -o-box-shadow: 0px 1px 6px 1px rgba(0, 0, 0, 0.65);
    box-shadow: 0px 1px 6px 1px rgba(0, 0, 0, 0.65);
}

#bannerShadowBottom
{
    width: 100%;
    height: 1px;
    margin: 0;
    padding: 0;
    position: absolute;
    bottom: -1px;
    -moz-box-shadow: 0px -1px 6px 1px rgba(0, 0, 0, 0.65);
    -webkit-box-shadow: 0px -1px 6px 1px rgba(0, 0, 0, 0.65);
    -o-box-shadow: 0px -1px 6px 1px rgba(0, 0, 0, 0.65);
    box-shadow: 0px -1px 6px 1px rgba(0, 0, 0, 0.65);
}

Багато хто стверджує, що додавання такої розмітки не є семантичним і є поганою практикою. Цього можна досягти, використовуючи insetта займаючись творчістю, використовуючи значення box-shadow css. Пам'ятайте, що ви можете складати тіні для вікон на один і той же елемент. Тож можна було б використати щось на зразок @Jakobud, сказаного у наведеному вище коментарі: box-shadow:inset 0 1px 5px black, inset 0 -1px 5px black; Інший спосіб, який є лише трохи менш образливим, ніж додавання непотрібної розмітки, - це використання :beforeта :afterселектори. Але навіщо це робити, якщо ви можете це зробити, безпосередньо вибравши та уклавши оригінальний елемент.
ORyan

0

box-shadowдля всіх чотирьох сторін. Ви не можете змінити цього (ще?). В 4 розмірів в box-shadowвизначенні є OffsetX, offsetY, Blurі Spread.


1
Спред і розмиття - це не одне і те ж. Для кожного існують окремі значення. Таким чином , технічно є 6. Inset/Outset, OffsetX, OffsetY, BlurRadius, SpreadRadiusі Color. Як зазначали інші, ви можете вказати одну сторону такbox-shadow: inset 0 8px 6px -6px black;
ORyan

1
Правда. Я змінив відповідь, щоб відобразити всі 4 розміри .
Руді

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