CSS3 box-shadow: inset chỉ có thể thực hiện một hoặc hai mặt? thích viền trên?


80

Tôi tự hỏi về sự hỗ trợ cho bóng bên trong cụ thể bên trong css3.

Tôi biết điều này hoạt động tốt trên các trình duyệt được hỗ trợ.

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

Tôi chỉ tò mò không biết có cách nào để đạt được điều gì đó như:

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

Có thể có bản sao của Cách chỉ tạo bóng hộp ở hai bên trái và phải , có câu trả lời và giải thích chi tiết hơn.
brichins

Câu trả lời:


147

Đây là những gì làm việc cho tôi:

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

Ví dụ: http://jsfiddle.net/23Egu/


9
Giải pháp thanh lịch nhất cho đến nay.
enyo 14/09/12

Tuyệt vời! Tôi đã vật lộn với điều này mãi mãi, nhưng dòng đơn này mang lại đường viền một bên sexy nhất từ ​​trước đến nay. Cảm ơn anh bạn!
Sliq

12
Cần lưu ý rằng bạn có thể chuyển nó thành box-shadow: inset 1px -4px 9px -6px;bóng dưới.
Justin Russell

7
Bóng bên trái: Bóng box-shadow: inset 4px 1px 9px -6px; bên phải:box-shadow: inset -4px 1px 9px -6px;
bryanbraun

hmm vì vậy tất cả những gì chúng tôi đang làm là sử dụng giá trị chênh lệch lớn và sau đó phủ định nó bằng cách sử dụng hiệu ứng mờ âm. Clever
Samiullah Khan,

11

Tôi không nghĩ rằng bạn thực sự cần box-shadow-topvì nếu bạn đặt offsetxthành 0 và offsetythành bất kỳ giá trị dương nào thì chỉ có bóng còn lại ở trên cùng.

nếu bạn muốn có bóng ở trên và bóng ở dưới, bạn chỉ có thể sử dụng hai div:

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

nếu bạn muốn loại bỏ bóng ở các bên, hãy sử dụng rgbathay vì hexmàu và đặt lớn hơn offsety:

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

bằng cách này, bạn cung cấp cho bóng đổ có độ mờ hơn để các bên luôn bị ẩn và với độ bù trừ nhiều hơn, bạn sẽ có được độ mờ ít hơn

đầy đủ ví dụ:

<!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>

Và bóng sẽ được lan rộng hơn bạn có thể muốn. Và các bên cũng đã thay đổi. Nó chắc chắn là một kết quả khác với những gì box-shadow-topsẽ cung cấp. chỉnh sửa Nhưng đó là cách tôi cũng thường làm =)
Rudie

@Rudie, nếu bạn muốn loại bỏ bóng ở các bên, hãy sử dụng rgbathay vì hexmàu và đặt lớn hơn offsety: box-shadow: 0 5px 5px rgba (0,0,0, .5) theo cách này, bạn tạo bóng mờ hơn để các bên luôn bị ẩn và với nhiều bù đắp hơn, bạn sẽ có được ít độ mờ hơn
seler

3
FYI, thay vì có hai div lồng nhau để đạt được bóng trên và bóng dưới cùng một lúc, bạn có thể làm điều đó với một div bằng cách sử dụng điều này:box-shadow:inset 0 1px 5px black, inset 0 -1px 5px black;
Jake Wilson

10

bằng cách sử dụng :beforeaftercác phần tử có bóng thông thường bị cắt bởi overflow:hiddenhộp mẹ như trong ví dụ này: 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>

Đây là kỹ thuật đã làm việc cho tôi. Trong trường hợp của tôi, #element có thể cuộn được, vì vậy tôi phải thay đổi vị trí thành cố định để nó hoạt động.
Mihai Răducanu

5

Bạn có thể sử dụng gradient nền cho tác phẩm trong hầu hết các trường hợp:

Ví dụ về SCSS (với la bàn):

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

1
Đôi khi chúng ta chỉ cần lùi lại và nghĩ về những gì chúng ta đang cố gắng hoàn thành. Và đây thường là những gì chúng ta đang theo đuổi với bóng hộp bên trong một mặt. Xuất sắc. Tôi sẽ ủng hộ hai lần nếu có thể!
random_user_name

Khi tôi lần đầu tiên nhìn thấy bình luận này, tôi đã nghĩ rằng nó có vẻ phức tạp chưa từng có, nhưng nó hoạt động hoàn hảo. Cảm ơn bạn!!
Alex,

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);

Công việc này thật đáng yêu :)

Đây là codepen minh họa nó: http://codepen.io/poopsplat/pen/cGBLy


3

Đối với cùng một bóng nhưng chỉ ở trên cùng:

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

Để có bóng theo một hướng, bạn phải phủ định thông số "mờ" bằng thông số "spread" và sau đó điều chỉnh thông số "h-pos" và / hoặc "v-pos" bằng cùng một giá trị này. Nó không hoạt động với đường viền đối diện hoặc đường viền ba. Bạn phải thêm một định nghĩa nữa.

Các ví dụ khác tại đây: http://codepen.io/GBMan/pen/rVXgqP



1

Tôi chỉ gặp vấn đề này bản thân mình. Giải pháp mà tôi tìm thấy là với nhiều hộp bóng (mỗi bên một bóng mà bạn muốn có bóng của mình). Đây là định nghĩa:

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

Đây là cách nghĩ về nó:

  • đầu tiên, hãy đặt chênh lệch 0 (điều này sẽ vô hiệu hóa hiệu ứng ở tất cả các bên)
  • độ lệch h (nếu bạn đặt là dương, nó sẽ ép ở phía bên trái, nếu bạn đặt là âm, ở phía bên phải)
  • v-offset (nếu bạn đặt là dương, nó sẽ truyền ở mặt trên, nếu bạn đặt là âm, ở mặt dưới

Ở đây bạn có thể thấy trường hợp của tôi với hộp bóng ở ba mặt (trái, trên, phải và dưới cùng màu với nền để tạo ra hiệu ứng mà tôi muốn - bên trái và bên phải đi xuống dưới cùng ) https://codepen.io/cponofrei/pen/eMMyQX


0

Bạn có thể tạo bóng một mặt, bóng bên trong bằng cách đặt div của bạn thành overflow:hiddenvà thêm các phần tử bóng dọc theo đường viền.

Đặt bóng bên trong trên đường viền trên cùng và dưới cùng của một vạch chia:

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);
}

Nhiều người cho rằng việc thêm đánh dấu bổ sung như thế này là không hợp ngữ nghĩa và là một cách làm không tốt. Điều này có thể đạt được bằng cách sử dụng insetvà sáng tạo bằng cách sử dụng các giá trị của css box-shadow. Hãy nhớ rằng bạn có thể xếp chồng các bóng hộp trên cùng một phần tử. Vì vậy, người ta có thể sử dụng một cái gì đó như @Jakobud đã nói trong một bình luận ở trên: box-shadow:inset 0 1px 5px black, inset 0 -1px 5px black; Một cách khác, chỉ hơi khó chịu hơn là thêm đánh dấu không cần thiết, là sử dụng :before:afterbộ chọn. Nhưng tại sao phải làm điều đó nếu bạn có thể làm điều đó bằng cách trực tiếp chọn và tạo kiểu cho phần tử gốc.
ORyan

0

box-shadowlà cho cả bốn mặt. Bạn không thể thay đổi điều đó (chưa?). 4 kích thước trong box-shadowđịnh nghĩa là OffsetX, offsetY, BlurSpread.


1
Spread và Blur không giống nhau. Có các giá trị riêng biệt cho từng loại. Vì vậy, về mặt kỹ thuật có 6. Inset/Outset, OffsetX, OffsetY, BlurRadius, SpreadRadiusColor. Như những người khác đã chỉ ra, bạn có thể chỉ định một bên như thế nàybox-shadow: inset 0 8px 6px -6px black;
ORyan

1
Thật. Tôi đã thay đổi câu trả lời để phản ánh tất cả 4 kích thước .
Rudie

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.