ฉันจะเพิ่ม box-shadow ที่ด้านหนึ่งขององค์ประกอบได้อย่างไร


445

ฉันต้องการสร้าง box-shadow ในblockองค์ประกอบบางอย่างแต่เพียง (ตัวอย่าง) ทางด้านขวา วิธีที่ฉันทำคือห่อองค์ประกอบภายในด้วยbox-shadowด้านนอกด้วยpadding-rightและoverflow:hidden;ดังนั้นทั้งสามด้านของเงาจึงมองไม่เห็น

มีวิธีที่ดีกว่าในการบรรลุเป้าหมายนี้หรือไม่? ชอบbox-shadow-rightไหม

แก้ไข : ความตั้งใจของฉันคือการสร้างเฉพาะส่วนแนวตั้งของเงา เหมือนกับสิ่งrepeat-yที่กฎbackground:url(shadow.png) 100% 0% repeat-yจะทำ


3
เมื่อพิจารณาถึงเครื่องมือที่ จำกัด ของ css ในแง่ของ box-shadow ฉันคิดว่าแนวทางของคุณค่อนข้างดีอยู่แล้ว มันไม่เกะกะเกินไปและมีผลกระทบเล็กน้อยในแง่ของความหมาย: เพียงแค่ div ที่ไม่มีความหมาย
Bazzz

นี่คือ css side-shadow ที่ดี: stackoverflow.com/a/20596554/1491212
Armel Larcier

คำตอบ:


567

ใช่คุณสามารถใช้คุณสมบัติการกระจายเงาของกฎกล่องเงา:

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

คุณสมบัติที่สี่มี-2pxการกระจายเงาคุณสามารถใช้เพื่อเปลี่ยนการแพร่กระจายของเงาทำให้ปรากฏว่าเงาอยู่ด้านเดียวเท่านั้น

สิ่งนี้ยังใช้กฎการกำหนดตำแหน่งเงา10pxส่งไปทางขวา (ออฟเซ็ตแนวนอน) และ0pxเก็บไว้ภายใต้องค์ประกอบ (ออฟเซ็ตแนวตั้ง)

5px คือรัศมีการเบลอ :)

ตัวอย่างเช่นคุณอยู่ที่นี่


12
ขอบคุณสำหรับการชี้ให้เห็นสิ่งที่ฉันไม่รู้ แต่ความตั้งใจของฉันคือการสร้างเฉพาะส่วนแนวตั้งของเงา เหมือนกับพื้นหลังใด: url (shadow.png) ทำซ้ำ 100% 0% y
tillda

4
@Tillda คุณควรทำเครื่องหมายว่านี่เป็นคำตอบเพื่อให้คนอื่นค้นหาวิธีแก้ปัญหา ฉันเกือบจะเลิกวิธีการจัดแต่งทรงผมนี้อ่านความคิดเห็นและคำตอบที่ได้รับการยอมรับ
Devin G Rhode

6
วิธีนี้ใช้งานได้ดีถ้าคุณไม่ต้องการให้เงาลดทอนมุม ฉันคิดวิธีแก้ปัญหานี้ด้วยตัวเอง แต่ในกรณีส่วนใหญ่ (สำหรับเงาด้านหนึ่ง) มันผิดที่จะมีเงาเล็กกว่าองค์ประกอบจึงเป็นการทำลายภาพลวงตา (ถ้าตั้งใจ) องค์ประกอบที่กล่าวว่า " ยก "หรือ" 3D "
Steven Lu

1
@ Mr.Alien ขอบคุณสำหรับสิ่งที่ฉันเพิ่งลบคำนำหน้าตามbox-shadowกฎที่ได้มาตรฐาน
Kyle

5
แต่เงานี้ไม่มีความพร่ามัวและรวมถึงความพร่ามัวทำให้มันออกมาจากส่วนอื่น ๆ และถ้าคุณคำนึงถึงสิ่งนั้นด้วยการลดสเปรดมันจะสิ้นสุดลงก่อนเวลาที่คุณต้องการ UGHHHHH
Muhammad Umer

37

วิธีแก้ไขปัญหาของฉันที่แก้ไขได้ง่าย:

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

ตัวอย่าง:
http://jsfiddle.net/jDyQt/103


1
ดูเหมือนว่าอย่างใดมากที่สุดตรงไปข้างหน้าหนึ่ง - เพียงแค่ div ภาชนะที่ทำให้ฉันมีความสุขอย่างใด;)
BananaAcid

1
นี่เป็นทางออกที่แท้จริงเพียงอย่างเดียว คำตอบที่ยอมรับยังคงพร่ามัวบนและล่างของเงาเพียงแค่ตำแหน่งที่แตกต่าง
Jelle Blaauw

สิ่งนี้ไม่ได้ผลสำหรับฉันใน Microsoft Edge หรือ Internet Explorer 11 ยังมีเงาอีกด้านหนึ่งขึ้นอยู่กับระดับการซูม เบราว์เซอร์อื่น ๆ ใช้งานได้ดี
แซม

คำตอบที่stackoverflow.com/a/24220224/238753ทำงานเช่นนี้ แต่ไม่มีปัญหาความเข้ากันได้ของเบราว์เซอร์ที่คำตอบนี้มี
Sam

24

เพื่อให้ได้เอฟเฟ็กต์ที่ถูกตัดได้ถึงสองด้านคุณสามารถใช้องค์ประกอบหลอกด้วยการไล่ระดับสีพื้นหลัง

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

จะเพิ่มเอฟเฟกต์คล้ายเงาที่ด้านซ้ายและขวาขององค์ประกอบที่โดยปกติแล้วจะสร้างเอกสารขึ้นมา


โซลูชั่นที่สมบูรณ์แบบเนื่องจากมันเพิ่มเอฟเฟกต์เงาให้กับด้านหนึ่งขององค์ประกอบเท่านั้นโดยไม่เกะกะมาร์คอัป
Liquinaut

1
เปรียบเทียบกับวิธีการแพร่กระจายเชิงลบนี้มีข้อดีของการไม่หดตัวที่มุม
Kevin Christopher Henry

3
@BananaAcid ฉันสร้างตัวอย่างสำหรับทุกคนที่ต้องการมัน: jsfiddle.net/jDyQt/1198
zeckdude

ดีนี้ทำงานอย่างสมบูรณ์ทั่ว Chrome, Safari, Firefox, IE11 และขอบไม่มีผลข้างเคียงสำหรับฉัน
แซม

15

เพียงใช้ :: after หรือ :: ก่อนองค์ประกอบหลอกเพื่อเพิ่มเงา ทำให้มันมีขนาด 1px และวางไว้ที่ด้านใดด้านหนึ่งที่คุณต้องการ ด้านล่างเป็นตัวอย่างของด้านบน

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>


อันนี้ยังคงทะลักผ่านขอบ แต่อาจเป็นสิ่งที่บางคนต้องการ
Sam

5

นี่คือตัวอย่างของฉัน:

.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

นี่คือแฮ็คเล็กน้อยที่ฉันทำ

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

1.สร้าง<div class="one_side_shadow"></div>ใต้องค์ประกอบที่ฉันต้องการสร้างเงากล่องด้านเดียว (ในกรณีนี้ฉันต้องการเงาแทรกด้านเดียวสำหรับid="element"มาจากด้านล่าง)

2.จากนั้นฉันสร้างรูปทรงปกติbox-shadowโดยใช้ออฟเซ็ตแนวตั้งเชิงลบเพื่อผลักเงาขึ้นด้านเดียว

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

2

นี่อาจเป็นวิธีที่ง่าย

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

มอบหมายสิ่งนี้ให้กับฝ่ายใดก็ได้


1

นี่คือcodepen ที่จะสาธิตให้เห็นในแต่ละด้านหรือตัวอย่างข้อมูลที่ใช้งานได้:

.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

ไซต์นี้ช่วยฉันได้ที่: https://gist.github.com/ocean90/1268328 (โปรดทราบว่าในเว็บไซต์นั้นทางด้านซ้ายและขวาจะถูกย้อนกลับ ณ วันที่โพสต์นี้ ... แต่ทำงานได้ตามที่คาดหวัง) พวกเขาได้รับการแก้ไขในรหัสด้านล่าง

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

ตัวอย่าง jsFiddle ที่นี่


0

ตกลงนี่เป็นอีกหนึ่งลอง ใช้องค์ประกอบหลอกและ aplying porperty กล่องเงาเหนือพวกเขา

HTML:

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

เขื่อง:

.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-pathอยู่ในขณะนี้ (2020) หนึ่งในวิธีที่ง่ายที่สุดในการบรรลุกล่องเงาที่ด้านข้างที่เฉพาะเจาะจงขององค์ประกอบเฉพาะอย่างยิ่งเมื่อผลที่ต้องการคือ "ทำความสะอาดตัด" เงาที่ขอบโดยเฉพาะอย่างยิ่ง (ซึ่งผมเชื่อว่าสิ่งที่สหกรณ์เดิมมองหา) เช่น นี้:

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

... เมื่อเทียบกับเงาที่ถูกลดทอน / ลด / การทำให้ผอมบางเช่นนี้:

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

เพียงใช้ CSS ต่อไปนี้กับองค์ประกอบที่เป็นปัญหา:

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

ที่ไหน:

  • Apx ตั้งค่าการมองเห็นเงาสำหรับขอบด้านบน
  • Bpx ขวา
  • Cpx ด้านล่าง
  • Dpx ซ้าย

ป้อนค่า 0 สำหรับขอบใด ๆ ที่ควรซ่อนเงาและค่าลบ (เช่นเดียวกับรัศมีเงาพร่ามัวกล่อง - Xpx) ไปที่ขอบใด ๆ ที่ควรแสดงเงา


@tillda ขุดคำถามอายุสิบปีขึ้นมา - แค่สงสัยว่าฉันตีความข้อกำหนดครั้งต่อกาลของคุณถูกต้องหรือไม่ (โดยเฉพาะเอฟเฟกต์เงาตัด) - ฉันพยายามทำสิ่งนี้ให้สำเร็จและถามคำถามของคุณใน กระบวนการ.
ลุค
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.