Làm thế nào để tạo bóng đổ chỉ ở một bên của một phần tử?


230

Có cách nào để giảm bóng chỉ ở phía dưới không?. Tôi có một menu với 2 hình ảnh cạnh nhau. Tôi không muốn có bóng đúng vì nó chồng lên hình ảnh bên phải. Tôi không thích sử dụng hình ảnh cho việc này vì vậy có một cách để chỉ thả nó ở phía dưới như:

box-shadow-bottom: 10px #FFF; hoặc tương tự?

-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
Tài liệu tham khảo câu trả lời được chấp nhận của bạn box-shadow-bottomkhông tồn tại và không được ai hỗ trợ. Xem nicolasgallagher.com/css-drop-shadows-without-images/demo để biết các kỹ thuật bóng hộp hợp pháp.
Paul Ailen

@Paul ... Tôi có một lỗi đánh máy, nó đã được sửa.
Hristo

1
Các ý kiến ​​trong ví dụ CSS của bạn là sai lệch - filtercũng sẽ hoạt động trong IE8 và IE9. Không cần -ms-filtertrong trường hợp này.
Mathias Bynens

Bạn có thể điều chỉnh bóng css thực tế này: stackoverflow.com/a/20596554/1491212
Armel Larcier

Câu trả lời:


234

CẬP NHẬT 4

Tương tự như bản cập nhật 3 nhưng với css hiện đại (= quy tắc ít hơn) để không yêu cầu định vị đặc biệt trên phần tử giả.

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

CẬP NHẬT 3

Tất cả các câu trả lời trước đây của tôi đã được sử dụng đánh dấu thêm để tạo hiệu ứng này, điều này không nhất thiết cần thiết. Tôi nghĩ rằng đây là một giải pháp sạch hơn nhiều ... mẹo duy nhất là chơi xung quanh với các giá trị để có được vị trí đúng của bóng cũng như cường độ / độ mờ phù hợp của bóng. Đây là một câu đố mới, sử dụng các yếu tố giả :

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

CẬP NHẬT 2

Rõ ràng, bạn có thể làm điều này chỉ với một tham số phụ cho CSS hộp bóng như mọi người khác đã chỉ ra. Đây là bản demo:

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;

Đây sẽ là một giải pháp tốt hơn. Tham số bổ sung được thêm vào được mô tả là:

Chiều dài thứ tư là một khoảng cách lây lan. Các giá trị dương làm cho hình dạng bóng mở rộng theo mọi hướng theo bán kính chỉ định. Các giá trị âm làm cho hình dạng bóng bị co lại.

CẬP NHẬT

Kiểm tra bản demo tại jsFiddle: http://jsfiddle.net/K88H9/4/

Những gì tôi đã làm là tạo ra một "phần tử bóng" ẩn đằng sau phần tử thực mà bạn muốn có một cái bóng. Tôi đã làm cho chiều rộng của "phần tử bóng" chính xác nhỏ hơn phần tử thực tế gấp 2 lần bóng bạn chỉ định; sau đó tôi căn chỉnh nó đúng cách.

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

Câu trả lời gốc

Có, bạn có thể làm điều này với cùng một cú pháp bạn đã cung cấp. Giá trị đầu tiên kiểm soát định vị ngang và giá trị thứ hai kiểm soát định vị dọc. Vì vậy, chỉ cần đặt giá trị đầu tiên và giá trị 0pxthứ hai thành bất kỳ giá trị bù nào bạn muốn như sau:

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

Để biết thêm thông tin về bóng hộp, hãy kiểm tra những điều sau:

Tôi hi vọng cái này giúp được.


2
Bạn không nhất thiết phải thêm một div trống để đạt được một bóng mờ. Giá trị thứ ba đó trong khai báo: box-shadow: 0 2px 4px #000000là giá trị mờ. Xem tại đây http://jsfiddle.net/K88H9/7/ . Nhưng bạn sẽ nhận thấy rằng có một chút mờ bên trái và bên phải của phần tử, trong đó không có giải pháp của Hristo.

9
Không có thuộc tính đáy hộp và hiệu ứng này chắc chắn không cần thêm yếu tố. Kinh quá.
Lea Verou

7
box-shadow-bottom, trong khi sáng tạo, không thực sự tồn tại.
miketaylr

3
chill guys ... đó là một lỗi đánh máy
Hristo

1
@gryzzly ... Tôi đã chỉnh sửa câu trả lời của mình, tôi đã không thấy lỗi đánh máy của mình cho đến khi mọi người chỉ ra. Xin lỗi vì điều đó.
Hristo

71

Chỉ cần sử dụng tham số trải rộng để làm cho bóng nhỏ hơn:

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

Bản thử trực tiếp: http://dabblet.com/gist/a8f8ba527f5cff607327

Để không nhìn thấy bất kỳ bóng nào ở hai bên, bán kính (giá trị tuyệt đối của) bán kính trải rộng (tham số thứ 4) cần giống với bán kính mờ (tham số thứ 3).


1
Điều này không thực sự hoạt động. Thoạt nhìn, nó xuất hiện như thể cái bóng chỉ ở phía dưới nhưng thực tế nó vẫn lan ra hai bên. Ví dụ của Everbody là với một hộp màu xanh khá đậm ... làm cho hộp màu trắng và bạn sẽ thấy tất cả bóng tối.
Chris L

@Chris M: chỉ cần tăng tham số lây lan: thử 4 ví dụ với box-shadow:0 8px 4px -6pxvà bạn sẽ chỉ thấy bóng dưới cùng!
T30

1
một lần nữa, làm cho hộp TRẮNG như trong câu đố này và bạn sẽ vẫn thấy bóng ở mọi phía và bây giờ nó không làm cho nó đi hết xuống phía dưới. bạn sẵn sàng đi bao xa để thông số lây lan để thoát khỏi các bên? Ngoài ra, có lẽ tốt nhất cho người có 151 đại diện để không chỉnh sửa câu trả lời của người có đại diện 7k. để lại nó trong một bình luận.
Chris L

1
@ T30 Tất nhiên cuối cùng bạn có thể thoát khỏi các bên bằng cách giảm tham số lây lan hơn nữa. Nhưng bây giờ bóng của bạn không ở bất cứ đâu gần với chiều rộng của hộp của bạn. Bạn có một hộp 84px với bóng 72px.
Chris L

1
Cập nhật câu trả lời. Nhưng về cơ bản, thiếu bán kính trải rộng và điều chỉnh bù Y, không ai có thể làm được gì nhiều. Có thể sử dụng một gradient thay vì một cái bóng? Ngoài ra, tôi không ngại mọi người chỉnh sửa bài đăng của mình, nhưng tôi không đánh giá cao những người chỉnh sửa bài đăng của tôi để thêm câu được viết bằng một số ngôn ngữ giống như tiếng Anh. Tôi cũng không phải là người nói tiếng Anh bản địa và tôi hiểu các thách thức, nhưng nếu tôi đang chỉnh sửa bài đăng của người khác, tôi sẽ cảm thấy đủ trách nhiệm để kiểm tra lại xem những gì tôi đã thêm có ý nghĩa và ngữ pháp không lúng túng sai.
Lea Verou

30

Nếu bạn có một màu cố định trên nền, bạn có thể ẩn hiệu ứng bóng bên với hai bóng mặt nạ có cùng màu của nền và mờ = 0, ví dụ:

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

Lưu ý rằng bóng đen phải là bóng cuối cùng và có mức chênh lệch âm (-3px) để ngăn không cho nó mở rộng ra ngoài các góc.

Ở đây fiddle (thay đổi màu của bóng mặt nạ để xem nó thực sự hoạt động như thế nào ).

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

nhập mô tả hình ảnh ở đây


1
Sẽ tốt hơn nhiều nếu sử dụng transparentmàu cho bóng mặt nạ, phải không?
Thiên thần Joseph Piscola

@AngelJosephPiscola: Gợi ý thông minh .. Thực hiện trong câu trả lời, cảm ơn!
T30

@ T30 tuyệt vời, nhưng lưu ý rằng với mặt nạ trong suốt, bạn không cần phải có nền màu cố định;)
Angel Joseph Piscola

Tôi đã thử nghiệm nó tốt hơn và bóng trong suốt không hoạt động , vì vậy tôi đã khôi phục các chỉnh sửa cuối cùng
T30

6

Tôi nghĩ đây là những gì bạn đang theo đuổi?

.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
Yêu nó khi mọi người chỉ đơn giản là không hiểu. Phải, anh ta đang rối tung với sự lan rộng của cái bóng đầu tiên (màu trắng) sẽ che đi phần rìa của cái bóng thật (màu đen). Đây là cách duy nhất lành mạnh để có được một bóng đơn hướng hoàn hảo. Đặc biệt hữu ích khi bạn cần có cùng một bóng trên 2 phần của menu.
Zeno Popovici

5

Luôn luôn tốt hơn để đọc thông số kỹ thuật . Không có thuộc box-shadow-bottomtính và như Lea chỉ ra, bạn phải luôn đặt thuộc tính không có tiền tố ở dưới cùng, sau các thuộc tính có tiền tố.

Vậy nó là:

.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
Có bóng từ hai bên
shinzou

2

Làm thế nào về việc chỉ sử dụng một div có chứa tràn được đặt thành ẩn và một số phần đệm ở phía dưới? Đây dường như là giải pháp đơn giản nhất.

Rất tiếc phải nói rằng tôi đã không nghĩ về điều này bản thân mình nhưng đã nhìn thấy nó ở một nơi khác .

Sử dụng một phần tử để bọc phần tử lấy bóng hộp và tràn: ẩn trên trình bao bọc, bạn có thể làm cho bóng hộp thêm biến mất và vẫn có đường viền có thể sử dụng được. Điều này cũng khắc phục vấn đề trong đó phần tử nhỏ hơn có vẻ như vì sự lây lan.

Như thế này:

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

Nội dung ở đây

Vẫn là một giải pháp thông minh khi nó phải được thực hiện bằng CSS thuần túy!

Như đã nói của Jorgen Evens .


+1 cho giải pháp. Ngoài padding-bottom(giả sử 5px), bạn cũng có thể đặt âm margin-bottom(of5px) để bù cho không gian đã thêm.
fabio.sang

2

Bạn cũng có thể sử dụng clip-pathđể cắt (ẩn) tất cả các cạnh tràn nhưng cạnh bạn muốn hiển thị:

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

Xem đường dẫn clip (MDN) . Các đối số polygonlà điểm trên cùng bên trái , điểm trên cùng bên phải , điểm dưới cùng bên phải và điểm dưới cùng bên trái . Bằng cách đặt cạnh dưới thành 200%(hoặc bất kỳ số nào lớn hơn 100%), bạn hạn chế tràn của bạn thành chỉ cạnh dưới.


Vì vậy, ... về cơ bản, clip-path là phần tràn: thuộc tính ẩn trên steroid. Đây là sạch sẽ. ;)
Craig

1

Tôi cũng cần một cái bóng nhưng chỉ dưới một hình ảnh và đặt ở bên trái và bên phải. Điều này làm việc cho tôi:

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

Yếu tố này được áp dụng cho hình ảnh toàn trang (980px x 300px).

Nếu nó hữu ích khi thay đổi cài đặt, chúng sẽ chạy như sau:

bóng ngang, bóng dọc, khoảng cách mờ, trải rộng (tức là kích thước bóng) và màu sắc.


1

Nó là tốt hơn để tìm kiếm bóng tối:

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

mã này hiện đang sử dụng trên web stackoverflow.



0

Nếu nền của bạn là vững chắc (hoặc bạn có thể tái tạo nó bằng CSS), bạn có thể sử dụng gradient tuyến tính theo cách đó:

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>

Điều này sẽ tạo ra một gradient 5px ở dưới cùng của phần tử, từ màu đen ở độ mờ 30% đến hoàn toàn trong suốt. Phần còn lại của yếu tố có nền trắng. Tất nhiên, thay đổi 2 điểm dừng màu cuối cùng của gradient tuyến tính, bạn có thể làm cho nền hoàn toàn trong suốt.


0

Bạn cũng có thể thực hiện một gradient ở phía dưới - điều này hữu ích cho tôi vì bóng tôi muốn là một phần tử đã trong suốt, vì vậy tôi không phải lo lắng về bất kỳ việc cắt nào:

&: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%);
    }

Chỉ cần làm cho các thuộc tính "dưới cùng" và "chiều cao" khớp và đặt các giá trị rgba của bạn thành bất cứ thứ gì bạn muốn chúng ở trên cùng / dưới cùng của bóng tối


0

Bạn có thể làm điều đó như thế này:

Cú pháp chung:

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

Ví dụ: chúng tôi chỉ muốn tạo bóng dưới cùng với màu đỏ,

Vì vậy, để làm điều đó, chúng ta phải đặt tất cả các tùy chọn bên trong đó chúng ta phải đặt các tùy chọn bóng hộp phía dưới và đặt tất cả các tùy chọn khác trống như sau:

.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

cập nhật trên người khác câu trả lời của anh ấy trong suốt thay vì màu trắng để nó cũng hoạt động trên các nền màu khác.

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

bóng bên trong

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

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.