Jak mogę dodać cień z jednej strony elementu?


445

Muszę utworzyć cień pola na jakimś blockelemencie, ale tylko (na przykład) po jego prawej stronie. Sposób w jaki to zrobić jest owinięcie elementu wewnętrznego ze box-shadowdo zewnętrznej jednego z padding-righta overflow:hidden;więc trzy pozostałe boki cienia nie są widoczne.

Czy jest jakiś lepszy sposób na osiągnięcie tego? Jak box-shadow-right?

EDYCJA : Moim zamiarem jest stworzenie tylko pionowej części cienia. Dokładnie to samo, co zrobiłaby repeat-yreguła background:url(shadow.png) 100% 0% repeat-y.


3
biorąc pod uwagę ograniczone narzędzia css pod względem cieniowania, myślę, że twoje podejście jest już całkiem dobre. Nie jest zbyt zagracony i ma dość niewielki wpływ pod względem semantyki: tylko jeden bezsensowny div.
Bazzz

Oto ładny cień boczny css: stackoverflow.com/a/20596554/1491212
Armel Larcier

Odpowiedzi:


567

Tak, możesz użyć właściwości rozprzestrzeniania się cienia reguły box-shadow:

.myDiv
{
  border: 1px solid #333;
  width: 100px;
  height: 100px;
  box-shadow: 10px 0 5px -2px #888;
}
<div class="myDiv"></div>

Czwarta właściwość -2pxto rozkład cieni, którego możesz użyć, aby zmienić rozkład cieni, sprawiając wrażenie, że cień jest tylko z jednej strony.

To również używa reguł pozycjonowania cienia, 10pxwysyła go w prawo (przesunięcie w poziomie) i 0pxutrzymuje pod elementem (przesunięcie w pionie).

5px to promień rozmycia :)

Przykład dla ciebie tutaj .


12
Dziękuję za wskazanie czegoś, czego nie wiedziałem, ale moim zamiarem było stworzenie tylko pionowej części cienia. Dokładnie to samo, co zrobiłoby tło: url (shadow.png) 100% 0% repeat-y.
tillda

4
@Tillda powinieneś zaznaczyć to jako odpowiedź, aby pojawiło się na górze dla innych szukających rozwiązania. Prawie odrzuciłem tę metodę stylizacji czytając komentarze i zaakceptowałem odpowiedź.
Devin G Rhode

6
Działa to świetnie, jeśli cień nie ma osłabiać się w rogach. Ja również wymyśliłem to rozwiązanie, ale w większości przypadków (w przypadku cienia po jednej stronie) błędem jest, aby cień był mniejszy od elementu, w ten sposób przełamując iluzję (jeśli byłby tak zamierzony), że wspomniany element jest „ podniesiony ”lub„ 3D ”.
Steven Lu

1
@ Mr.Alien Dzięki za to, właśnie usunąłem prefiks, ponieważ box-shadowreguły zostały znormalizowane.
Kyle

5
ale ten cień nie ma rozmycia, a wraz z rozmyciem powoduje, że wychodzi z innych części. A jeśli weźmiesz to pod uwagę poprzez zmniejszenie spreadu, kończy się on przedwcześnie po stronie, której naprawdę chcesz. UGHHHHH
Muhammad Umer

37

Moje samodzielne rozwiązanie, które można łatwo edytować:

HTML:

<div id="anti-shadow-div">
    <div id="shadow-div"></div>
</div>

css:

#shadow-div{
    margin-right:20px; /* Set to 0 if you don't want shadow at the right side */
    margin-left:0px; /* Set to 20px if you want shadow at the left side */
    margin-top:0px; /* Set to 20px if you want shadow at the top side */
    margin-bottom:0px; /* Set to 20px if you want shadow at the bottom side */
    box-shadow: 0px 0px 20px black; 
    height:100px;
    width:100px;
    background: red;
}

#anti-shadow-div{
    margin:20px;
    display:table;
    overflow:hidden;
}​

Demo:
http://jsfiddle.net/jDyQt/103


1
Wydaje się jakoś najprostszym - po prostu div kontenera sprawia, że ​​jestem nieszczęśliwy;)
BananaAcid

1
To jedyne prawdziwe rozwiązanie. Akceptowana odpowiedź wciąż ma rozmycie na górze i na dole cienia, tylko w innej pozycji.
Jelle Blaauw

Nie działało to dla mnie w przeglądarce Microsoft Edge lub Internet Explorer 11. Po obu stronach nadal było trochę cienia, w zależności od poziomu powiększenia. Inne przeglądarki były w porządku.
Sam

Odpowiedź na stackoverflow.com/a/24220224/238753 działała tak samo, ale bez problemów ze zgodnością przeglądarki, które ma ta odpowiedź
Sam

24

Aby uzyskać efekt obcięcia z maksymalnie dwóch stron, możesz użyć pseudoelementów z gradientami tła.

header::before, main::before, footer::before, header::after, main::after, footer::after {
    display:    block;
    content:    '';
    position:   absolute;
    width:      8px;
    height:     100%;
    top:        0px;
}

header::before, main::before, footer::before {
    left:       -8px;
    background: linear-gradient(to left, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0));
}

header::after, main::after, footer::after {
    right:      -8px;
    background: linear-gradient(to right, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0));
}

doda ładny efekt przypominający cień po lewej i prawej stronie elementów, które normalnie tworzą dokument.


idealne rozwiązanie, ponieważ dodaje efekt cienia tylko do jednej strony elementu bez zaśmiecania znaczników.
Liquinaut

1
W porównaniu z metodą rozprzestrzeniania ujemnego ma to tę zaletę, że nie zmniejsza się w rogach.
Kevin Christopher Henry

3
@BananaAcid Stworzyłem demo dla każdego, kto tego potrzebuje: jsfiddle.net/jDyQt/1198
zeckdude

Fajnie, działało to doskonale w Chrome, Safari, Firefox, IE11 i Edge bez efektów ubocznych dla mnie
Sam

15

Wystarczy dodać :: pseudo lub :: przed pseudoelementem, aby dodać cień. Zrób 1px i umieść po dowolnej stronie. Poniżej znajduje się przykład góry.

footer {
   margin-top: 50px;
   color: #fff;
   background-color: #009eff;
   text-align: center;
   line-height: 90px;
   position: relative;
}

footer::after {
    content: '';
    position: absolute;
    width: 100%;
    height: 1px;
    top: 0;
    left: 0;
    z-index: -1;
    box-shadow: 0px 0px 10px 1px rgba(0, 0, 0, 0.75);
}
<footer>top only box shadow</footer>


Ten wciąż rozlewa się poza krawędź, ale może być tym, czego niektórzy chcą
Sam

5

Oto mój przykład:

.box{
        
        width: 400px; 
        height: 80px; 
        background-color: #C9C; 
        text-align: center; 
        font: 20px normal Arial, Helvetica, sans-serif; 
        color: #fff; 
        padding: 100px 0 0 0;
        -webkit-box-shadow: 0 8px 6px -6px black;
           -moz-box-shadow: 0 8px 6px -6px black;
                box-shadow: 0 8px 6px -6px black;
    }
<div class="box">
</div>


4

Oto mały hack, który zrobiłem.

<div id="element"><!--element that I want an one-sided inset shadow from the bottom--></div> 
<div class="one_side_shadow"></div>

1. Utwórz <div class="one_side_shadow"></div>tuż pod elementem, który chcę utworzyć cień ramki jednostronnej (w tym przypadku chcę, aby jednostronny cień był wstawiany id="element"od dołu)

2. Następnie utworzyłem regularne, box-shadowużywając ujemnego przesunięcia pionowego, aby przesunąć cień w górę na jedną stronę.

`box-shadow: 0 -8px 20px 2px #DEDEE3;`

2

To może być prosty sposób

border-right : 1px solid #ddd;
height:85px;    
box-shadow : 10px 0px 5px 1px #eaeaea;

Przypisz to dowolnemu div


1

Oto kodepen do zademonstrowania dla każdej strony lub działający fragment kodu:

.boxes {
  display: flex;
  flex-wrap: wrap;
}

.box {
  margin: 20px;
  border: 1px solid #ccc;
  font-family: Helvetica Neue, Arial, sans-serif;
  font-weight: 100;
  letter-spacing: 2px;
  color: #999;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  flex: 1;
  padding: 40px;
  line-height: 1.4em;
}

.top {
  box-shadow: 0 -5px 5px -5px #333;
}

.right {
  box-shadow: 5px 0 5px -5px #333;
}

.bottom {
  box-shadow: 0 5px 5px -5px #333;
}

.left {
  box-shadow: -5px 0 5px -5px #333;
}
<div class="boxes">
  <div class="box top">Top Only</div>
  <div class="box right">Right Only</div>
  <div class="box bottom">Bottom Only</div>
  <div class="box left">Left Only</div>
</div>


0

Ta strona pomogła mi: https://gist.github.com/ocean90/1268328 (Zwróć uwagę, że na tej stronie lewy i prawy są odwrócone na dzień tego postu ... ale działają zgodnie z oczekiwaniami). Zostały one poprawione w poniższym kodzie.

<!DOCTYPE html>
<html>
    <head>
        <title>Box Shadow</title>

        <style>
            .box {
                height: 150px;
                width: 300px;
                margin: 20px;
                border: 1px solid #ccc;
            }

            .top {
                box-shadow: 0 -5px 5px -5px #333;
            }

            .right {
                box-shadow: 5px 0 5px -5px #333;
            }

            .bottom {
                box-shadow: 0 5px 5px -5px #333;
            }

            .left {
                box-shadow: -5px 0 5px -5px #333;
            }

            .all {
                box-shadow: 0 0 5px #333;
            }
        </style>
    </head>
    <body>
        <div class="box top"></div>
        <div class="box right"></div>
        <div class="box bottom"></div>
        <div class="box left"></div>
        <div class="box all"></div>
    </body>
</html>

0
div {
 border: 1px solid #666;
    width: 50px;
    height: 50px;
    -webkit-box-shadow: inset 10px 0px 5px -1px #888 ;
}

0

To, co robię, to utworzenie pionowego bloku dla cienia i umieszczenie go obok miejsca, w którym powinien znajdować się mój element bloku. Dwa bloki są następnie pakowane w inny blok:

<div id="wrapper">
    <div id="shadow"></div>  
    <div id="content">CONTENT</div>  
</div>

<style>

div#wrapper {
  width:200px;
  height:258px;      
}

div#wrapper > div#shadow {
  display:inline-block;
  width:1px;
  height:100%;
  box-shadow: -3px 0px 5px 0px rgba(0,0,0,0.8)
}

div#wrapper > div#content {
  display:inline-block;
  height:100%;
  vertical-align:top;
}

</style>

Przykład jsFiddle tutaj .


0

Ok, oto jeszcze jedna próba. Używanie pseudoelementów i nakładanie na nich porowatości cienia.

HTML:

<div class="no-relevant-box">
  <div class="div-to-shadow-1"></div>
  <div class="div-to-shadow-2"></div>
</div>

sass:

.div-to-shadow-1, .div-to-shadow-2
  height: 150px
  width: 150px
  overflow: hidden
  transition: all 0.3s ease-in-out
  &::after
    display: block
    content: ''
    position: relative
    top: 0
    left: 100%
    height: 100%
    width: 10px
    border: 1px solid mediumeagreen
    box-shadow:  0px 7px 12px rgba(0,0,0,0.3)
  &:hover
    border: 1px solid dodgerblue
    overflow: visible

https://codepen.io/alex3o0/pen/PrMyNQ


0

clip-pathjest obecnie (2020 r.) jednym z najprostszych sposobów uzyskania cieni na określonych bokach elementów, szczególnie gdy wymaganym efektem jest cień „czystego cięcia” na określonych krawędziach (który, jak sądzę, pierwotnie szukał PO)), taki jak to:

.shadow-element {
    border: 1px solid #333;
    width: 100px;
    height: 100px;
    box-shadow: 0 0 15px rgba(0,0,0,0.75);
    clip-path: inset(0px -15px 0px 0px);
}
<div class="shadow-element"></div>

... w przeciwieństwie do osłabionego / zmniejszonego / przerzedzającego się cienia:

.shadow-element {
    border: 1px solid #333;
    width: 100px;
    height: 100px;
    box-shadow: 15px 0px 15px -10px rgba(0,0,0,0.75);
}
<div class="shadow-element"></div>

Po prostu zastosuj następujący CSS do danego elementu:

box-shadow: 0 0 Xpx [hex/rgba]; /* note 0 offset values */
clip-path: inset(Apx Bpx Cpx Dpx);

Gdzie:

  • Apx ustawia widoczność cienia dla górnej krawędzi
  • Bpx dobrze
  • Cpx Dolny
  • Dpx lewo

Wprowadź wartość 0 dla wszystkich krawędzi, na których cień powinien być ukryty, a wartość ujemną (taką samą, jak promień rozmycia ramki-cienia - Xpx) dla wszystkich krawędzi, na których cień powinien zostać wyświetlony.


@tillda, pogłębiając dziesięcioletnie pytanie - zastanawiam się, czy poprawnie zinterpretowałem twoje dawne wymagania (konkretnie efekt odcięcia cienia) - starałem się to osiągnąć i natknąłem się na twoje pytanie w proces.
Łukasz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.