Làm cách nào tôi có thể thêm bóng hộp ở một bên của một phần tử?


445

Tôi cần tạo bóng hình hộp trên một số blockphần tử, nhưng chỉ (ví dụ) ở bên phải của nó. Cách tôi làm là bọc phần tử bên trong box-shadowvào bên ngoài padding-rightoverflow:hidden;vì vậy không thể nhìn thấy ba mặt khác của bóng.

Có cách nào tốt hơn để đạt được điều này? Giống như box-shadow-right?

EDIT : Ý định của tôi là chỉ tạo ra phần dọc của bóng tối. Chính xác giống như những gì repeat-ycủa quy tắc background:url(shadow.png) 100% 0% repeat-ysẽ làm.


3
xem xét các công cụ giới hạn của css về mặt bóng hộp Tôi nghĩ rằng cách tiếp cận của bạn đã khá tốt. Nó không quá lộn xộn và có tác động khá nhỏ về mặt ngữ nghĩa: chỉ là một div vô nghĩa.
Bazzz

Dưới đây là một bóng css đẹp: stackoverflow.com/a/20596554/1491212
Armel Larcier

Câu trả lời:


567

Có, bạn có thể sử dụng thuộc tính trải bóng của quy tắc bóng hộp:

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

Thuộc tính thứ tư có -2pxbóng lan rộng, bạn có thể sử dụng nó để thay đổi độ lan rộng của bóng, làm cho nó xuất hiện rằng bóng chỉ ở một bên.

Điều này cũng sử dụng các quy tắc định vị bóng 10pxgửi nó sang bên phải (bù ngang) và 0pxgiữ nó dưới phần tử (bù dọc.)

5px là bán kính mờ :)

Ví dụ cho bạn ở đây .


11
Cảm ơn bạn đã chỉ ra một cái gì đó mà tôi không biết, nhưng ý định của tôi là chỉ tạo ra phần dọc của bóng tối. Chính xác giống như nền tảng: url (Shadow.png) lặp lại 100% 0% sẽ làm gì.
Untilda

4
@Tillda bạn nên đánh dấu đây là câu trả lời để nó xuất hiện trên đầu cho những người khác đang tìm kiếm giải pháp. Tôi gần như bỏ qua phương pháp tạo kiểu này để đọc các bình luận và chấp nhận câu trả lời.
Devin G Rhode

6
Điều này hoạt động rất tốt nếu bạn không có ý định cho bóng tối giảm dần ở các góc. Bản thân tôi cũng đã đưa ra giải pháp này nhưng trong hầu hết các trường hợp (đối với một bóng ở một bên), việc đặt bóng nhỏ hơn phần tử là sai, do đó phá vỡ ảo ảnh (nếu nó được dự định như vậy) cho rằng phần tử đó là " nâng lên "hoặc" 3D ".
Steven Lu

1
@ Mr.Alien Cảm ơn vì điều đó, tôi mới xóa tiền tố vì các box-shadowquy tắc đã được chuẩn hóa.
Kyle

5
nhưng bóng này không có mờ, và bao gồm cả mờ làm cho nó đi ra từ các phần khác. Và nếu bạn tính đến điều đó bằng cách giảm lây lan, nó sẽ kết thúc sớm ở phía bạn thực sự muốn nó. UGHHHHH
Muhammad Umer

37

Giải pháp tự tạo của tôi rất dễ chỉnh sửa:

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

Bản trình diễn:
http://jsfiddle.net/jDyQt/103


1
Có vẻ như một người nào đó thẳng thắn nhất - chỉ là div container đang khiến tôi không vui bằng cách nào đó;)
BananaAcid

1
Đây là giải pháp thực sự duy nhất. Câu trả lời được chấp nhận vẫn có mờ ở trên và dưới của bóng, chỉ ở vị trí khác nhau.
Jelle Blaauw

Điều này không hoạt động với tôi trong Microsoft Edge hoặc Internet Explorer 11. Vẫn còn một chút bóng ở các mặt khác, tùy thuộc vào mức thu phóng. Các trình duyệt khác là tốt mặc dù.
Sam

Câu trả lời tại stackoverflow.com/a/24220224/238753 hoạt động tương tự như thế này nhưng không có vấn đề tương thích trình duyệt mà câu trả lời này có
Sam

24

Để có được hiệu ứng cắt xén ở hai bên, bạn có thể sử dụng các phần tử giả với độ dốc nền.

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

sẽ thêm một hiệu ứng giống như bóng tối ở bên trái và bên phải của các yếu tố thường tạo thành một tài liệu.


giải pháp hoàn hảo, vì nó chỉ thêm hiệu ứng bóng cho một bên của một yếu tố mà không làm lộn xộn đánh dấu.
Liquinaut

1
So với phương pháp lây lan tiêu cực, điều này có lợi thế là không co lại ở các góc.
Kevin Christopher Henry

3
@BananaAcid Tôi đã tạo một bản demo cho bất kỳ ai cần nó: jsfiddle.net/jDyQt/1198
zeckdude

Thật tuyệt, điều này hoạt động hoàn hảo trên Chrome, Safari, Firefox, IE11 & Edge mà không có tác dụng phụ nào đối với tôi
Sam

15

Chỉ cần sử dụng :: after hoặc :: trước phần tử giả để thêm bóng. Làm cho nó 1px và đặt nó vào bất cứ phía nào bạn muốn. Dưới đây là ví dụ về đầu trang.

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>


Cái này vẫn tràn ra ngoài rìa, nhưng có thể là điều mà một số người muốn
Sam

5

Đây là ví dụ của tôi:

.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

Đây là một hack nhỏ mà tôi đã làm.

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

1. Tạo một <div class="one_side_shadow"></div>quyền bên dưới phần tử mà tôi muốn tạo bóng hộp một phía (trong trường hợp này tôi muốn một bóng trong một phía để id="element"đến từ phía dưới)

2. Sau đó, tôi tạo một thông thường box-shadowbằng cách sử dụng bù dọc âm để đẩy bóng lên trên một phía.

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

2

Đây có thể là một cách đơn giản

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

Gán điều này cho bất kỳ div


1

Đây là một codepen để chứng minh cho mỗi bên hoặc một đoạn làm việc:

.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

Trang web này đã giúp tôi: https://gist.github.com/ocean90/1268328 (Lưu ý rằng trên trang web đó, bên trái và bên phải được đảo ngược kể từ ngày của bài đăng này ... nhưng chúng hoạt động như mong đợi). Chúng được sửa trong mã dưới đây.

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

Những gì tôi làm là tạo một khối dọc cho bóng và đặt nó bên cạnh vị trí của phần tử khối của tôi. Hai khối sau đó được bọc thành một khối khác:

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

ví dụ jsFiddle ở đây .


0

Ok, đây là một thử thêm. Sử dụng các yếu tố giả và xin lỗi hộp bóng tối trên chúng.

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

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.