Створення CSS3 box-тіні з усіх боків, крім однієї


115

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

Я буду використовувати для цього box-shadowвластивість CSS3 , але не можу знайти спосіб затінити лише ті частини, які я хочу.

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

Макет вкладки

     _______ _______ _______
    | | | | | |
____ | _______ | __ | | __ | _______ | ______

Тіньова лінія.

Тінь піднімалася б вгору від горизонтальних ліній і назовні від вертикальних.

                _______
               | |
_______________ | | _________________

Ось живий приклад:

Будь-яка допомога там, генії?


23
@the_drow Re: CSS3, мені подобається вважати дизайнерські функції, такі як тіні для крапель, закруглені кути тощо, нагородою для тих користувачів, які користуються сучасними браузерами.
bloudermilk

3
ЯК це саме те, що мені було потрібно, радий, питання вже існує. Я теж хочу застосувати це до вкладки точно так, як ви показали, wow wow wow: D
Jorge Israel Peña

Ще одним чудовим способом вирішення цієї проблеми є використання псевдоелементів, детальну інформацію див. У моїй відповіді.
Silver Ringvee

Детальніше для псевдо-елемента-рішення тут: stackoverflow.com/a/38372215/4769218
Silver Ringvee

Я знаю, що це старе питання, але чи відомі розміри вкладок? Або вони гнучкі? Я можу уявити, що може бути встановлена ​​висота, але не ширина?
Лука

Відповіді:


72

У вашому зразку створіть поділ у #content за допомогою цього стилю

#content_over_shadow {
    padding: 1em;
    position: relative; /* look at this */
    background:#fff;    /* a solid background (non transparent) */
}

і змініть стиль #content (видаліть прокладки) та додайте тінь

#content {
    font-size: 1.8em;
    box-shadow: 0 0 8px 2px #888; /* line shadow */
}

додати тіні на вкладки:

#nav li a {
    margin-left: 20px;
    padding: .7em .5em .5em .5em;
    font-size: 1.3em;
    color: #FFF;
    display: inline-block;
    text-transform: uppercase;
    position: relative;
    box-shadow: 0 0 8px 2px #888; /* the shadow */
}

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

1
Так. Вам знадобиться перелив: прихований на nav, щоб він працював.
Боб Сприн

1
"Тіньова лінія", показана в, #content_over_shadowнасправді повинна бути в #contentстилі "s"
AppleGrew

Ну це рішення Мабі було правильним у 2009 році, але зараз це не так. Правильна відповідь - stackoverflow.com/a/9800481/835753
Гільгерме Феррейра

Рішення з псевдо елемента: stackoverflow.com/a/38372215/4769218
Срібло Ringvee

25

Відріжте його від переливу.

div div {box-shadow:0 0 5px #000; height:20px}
div {overflow:hidden;height:25px; padding:5px 5px 0 5px}
<div><div>tab</div></div>


3
Ось також приклад розрізання його за допомогою переповнення starikovs.com/2011/11/09/css3-one-side-shadow .
starikovs

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

Чудово працює! Батьківський z-index
дів

Зараз я використовую це рішення, я отримую деякі проблеми з дочірнім елементом, які потрібно переповнювати (як у Facebook, як кнопка).
Лонікс

1
Не дуже корисно для найбільш чуйних конструкцій, оскільки ви повинні встановити висоту елементів
Jonathan Tonge

13

Ви можете використовувати безліч тіней CSS без будь-яких інших дівок, щоб отримати бажаний ефект, із застереженнями відсутність тіней по кутах.

div.shadow {
    -webkit-box-shadow: 0 -3px 3px -3px black, 3px 0px 3px -3px black, -3px 0px 3px -3px black;
    -moz-box-shadow:    0 -3px 3px -3px black, 3px 0px 3px -3px black, -3px 0px 3px -3px black;
    box-shadow:         0 -3px 3px -3px black, 3px 0px 3px -3px black, -3px 0px 3px -3px black;
    height: 25px
}
 <div style="height: 25px"><div class="shadow">tab</div></div>

Загалом, хоча це дуже не нав'язливо.


1
Це було б чудовим рішенням, але, як ви кажете, кути хиткі. jsfiddle.net/mahemoff/ZStTr
mahemoff

1
Працював як шарм для моїх вставних тіньових потреб із закругленими кутами. Дякую!
Бруно Елі

9

Ще одним досить творчим способом вирішення цієї проблеми є додавання: після або: перед псевдоелементом до одного з елементів. У моєму випадку це виглядає приблизно так:

#magik_megamenu>li:hover>a:after {
    height: 5px;
    width: 100%;
    background: white;
    content: '';
    position: absolute;
    bottom: -3px;
    left: 0;
}

Перегляньте знімок екрана, зробивши псевдоелемент червоним, щоб зробити його більш помітним.

Перегляньте знімок екрана, зробивши псевдоелемент червоним, щоб зробити його більш помітним.


7

Особисто мені подобається найкраще знайдене тут рішення: http://css3pie.com/demos/tabs/

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

затінена вкладка зі станом наведення курсора

ОНОВЛЕННЯ:

Насправді я помилився. Ви можете змусити прийняте рішення підтримувати стан, що наведено вище. Зробити це:

Замість того, щоб мати позитивного родича на a, покладіть його на клас a.active із z-індексом, який вище, ніж у вашого #content div (який має тінь на ньому), але нижче, ніж z-індекс у вашому content_wrapper.

Наприклад:

<nav class="ppMod_Header clearfix">
    <h1 class="ppMod_PrimaryNavigation-Logo"><a class="ppStyle_Image_Logo" href="/">My company name</a></h1>
    <ul class="ppList_PrimaryNavigation ppStyle_NoListStyle clearfix">
        <li><a href="/benefits">Benefits</a></li>
        <li><a class="ppStyle_Active" href="/features">Features</a></li>
        <li><a href="/contact">Contact</a></li>
        <li><a href="/company">Company</a></li>
    </ul>
</nav>
<div id="ppPage-Body">
    <div id="ppPage-BodyWrap">
        content goes here
    </div>
</div>

то з вашим css:

#ppPage-Body
    box-shadow: 0 0 12px rgba(0,0,0,.75)
    position: relative /* IMPORTANT PART */

#ppPage-BodyWrap
    background: #F4F4F4
    position: relative /* IMPORTANT PART */
    z-index: 4 /* IMPORTANT PART */


.ppList_PrimaryNavigation li a:hover
    background: #656565
    -webkit-border-radius: 6px 6px 0 0
    -moz-border-radius: 6px 6px 0 0
    border-radius: 6px 6px 0 0

.ppList_PrimaryNavigation li a.ppStyle_Active
    background: #f4f4f4
    color: #222
    -webkit-border-radius: 6px 6px 0 0
    -moz-border-radius: 6px 6px 0 0
    border-radius: 6px 6px 0 0
    -webkit-box-shadow: 0 0 12px rgba(0,0,0,0.75)
    -moz-box-shadow: 0 0 12px rgba(0,0,0,0.75)
    box-shadow: 0 0 12px rgba(0,0,0,0.75)
    position: relative /* IMPORTANT PART */
    z-index: 3 /* IMPORTANT PART */

7

Оновлення:

clip-path тепер підтримується у всіх основних браузерах.


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

Якщо ви готові використовувати експериментальну технологію лише з частковою підтримкою , ви можете використовувати clip-pathвластивість .

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

У вашому випадку ви використовуєте clip-path: inset (px px px px); де значення пікселів обчислюються від краю, про який йде мова (див. нижче).

#container {
    box-shadow: 0 0 8px 2px #888;
    clip-path: inset(-8px -8px 0px -8px);
}

Це буде вирізати відповідний дів на:

  • 8 пікселів зверху (щоб включити тінь)
  • 8 пікселів за межами правого краю (щоб включити тінь)
  • 0 пікселів знизу (щоб приховати тінь)
  • 8 пікселів поза лівим краєм (щоб включити тінь)

Зауважте, що між значеннями пікселів не знаходяться коми.

Розмір div може бути гнучким.


На жаль, існує прогалина, де дві тіні перекриваються.
sbaechler

@sbaechler Ви можете розробити? Де тіні перекриваються?
Лука

4

ви можете приховати тінь, використовуючи також декілька тіньових коробок.

поле-тінь: 0 10px 0 #fff, 0 0 10px #ccc;


1

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

box-shadow: -1px -1px 1px #000;

на одному прольоті і

box-shadow: 1px -1px 1px #000;

на іншому. Може працювати!

Якщо тіні перекриваються, ви навіть можете використовувати 3 тіні - одну піксель вліво, одну піксель вправо і одну піксель вгору, або як би товсті ви їх не хотіли.


0

Я зробив свого роду хак, не ідеальний, але це виглядає нормально:

<ul class="tabs">
<li class="tab active"> Tab 1 </li>
<li class="tab"> Tab 2 </li>
<li class="tab"> Tab 3 </li>
</ul>

<div class="tab-content">Content of tab goes here</div>

SCSS

 .tabs { list-style-type: none; display:flex;align-items: flex-end;
  .tab {
    margin: 0;
    padding: 4px 12px;
    border: 1px solid $vivosBorderGrey2;
    background-color:$vivosBorderGrey2;
    color: $vivosWhite;
    border-top-right-radius: 8px;
    border-top-left-radius: 8px;
    border-bottom: 0;
    margin-right: 2px;
    font-size: 14px;
    outline: none;
    cursor: pointer;
    transition: 0.2s;
    &.active {
      padding-bottom: 10px;
      background-color: #ffffff;
      border-color: #eee;
      color: $vivosMedGrey;
      border-bottom-color: transparent;
      box-shadow: 0px -3px 8px -3px rgba(0, 0, 0, 0.1);
    }
    &:hover {padding-bottom: 10px;
    }
   } 

.tabContent {
  border: 1px solid #eee;
  padding:10px;
  margin-top: -1px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.