วิธีรับเงากล่องด้านซ้ายและขวาเท่านั้น


222

มีวิธีใดที่จะทำให้กล่องเงาอยู่ทางด้านซ้ายและขวา (แนวนอน?) โดยไม่มีแฮ็กหรือรูปภาพ ฉันใช้:

box-shadow: 0 0 15px 5px rgba(31, 73, 125, 0.8);

แต่มันให้เงารอบ ๆ

ฉันไม่มีพรมแดนล้อมรอบองค์ประกอบ

คำตอบ:


262

หมายเหตุ:ฉันขอแนะนำให้ดูคำตอบของ @ Hamishด้านล่าง; ไม่เกี่ยวข้องกับ "การปิดบัง" ที่ไม่สมบูรณ์ในโซลูชันที่อธิบายไว้ที่นี่


คุณสามารถเข้าใกล้ด้วยกล่องเงาหลายกล่อง หนึ่งสำหรับแต่ละด้าน

box-shadow: 12px 0 15px -4px rgba(31, 73, 125, 0.8), -12px 0 8px -4px rgba(31, 73, 125, 0.8);

http://jsfiddle.net/YJDdp/

แก้ไข

เพิ่มอีกสองกล่องเงาสำหรับด้านบนและด้านล่างขึ้นด้านหน้าเพื่อปกปิดคราบเลือดที่ไหลออกมา

box-shadow: 0 9px 0px 0px white, 0 -9px 0px 0px white, 12px 0 15px -4px rgba(31, 73, 125, 0.8), -12px 0 15px -4px rgba(31, 73, 125, 0.8);

http://jsfiddle.net/LE6Lz/


1
ตกลง. ขอบคุณ มี shdow เล็กน้อยที่ด้านบน & ล่างเช่นกันอาจเนื่องมาจากความพร่ามัว / รัศมี แต่ฉันเดาว่าต้องอยู่กับมัน
Jawad

5
-1: เงาไม่ไปถึงมุมพวกเขาสิ้นสุดพิกเซลไม่กี่ก่อน
Francisco Corrales Morales

4
ฉันไม่อยากจะเชื่อเลยว่าโซลูชันนี้ได้รับการจัดอันดับสูงมาก มันขยายวัตถุไปทางด้านบนและด้านล่าง (โดยใช้เงาทึบ) ดังนั้นจึงมีประโยชน์เฉพาะเมื่อ div อยู่บนพื้นหลังที่เหมือนกันและสามารถมีพื้นที่ด้านบนและด้านล่างได้ จำกัด มากและเชื่อมโยงกับการแก้ปัญหาบริบทแน่นอน ทางออกของ Hamish นั้นเหนือกว่าและเรียบง่ายกว่า
Ejaz

มีทางออกที่ดีกว่า (2020) ดูคำตอบของลุคด้านล่าง: stackoverflow.com/a/62367058/760777
RWC

171

ฉันไม่พอใจกับการโค้งมนบนและล่างของเงาในโซลูชันของ Deefour ดังนั้นฉันจึงสร้างขึ้นเอง

inset box-shadow สร้างเงาที่มีความสวยงามด้วยการตัดด้านบนและด้านล่าง

ในการใช้เอฟเฟกต์นี้ที่ด้านข้างขององค์ประกอบของคุณให้สร้างองค์ประกอบหลอกสององค์ประกอบ:beforeและ:afterวางตำแหน่งไว้ที่ด้านข้างขององค์ประกอบต้นฉบับ

div:before, div:after {
  content: " ";
  height: 100%;
  position: absolute;
  top: 0;
  width: 15px;
}
div:before {
  box-shadow: -15px 0 15px -15px inset;
  left: -15px;
}
div:after {
  box-shadow: 15px 0 15px -15px inset;
  right: -15px;
}

div {
  background: #EEEEEE;
  height: 100px;
  margin: 0 50px;
  width: 100px;
  position: relative;
}
<div></div>


แก้ไข

คุณอาจใช้งานclip-pathได้ตามที่แสดงในคำตอบของ @ Luke ทั้งนี้ขึ้นอยู่กับการออกแบบของคุณ อย่างไรก็ตามโปรดทราบว่าในหลายกรณีนี้ยังคงส่งผลให้เกิดเงาที่ด้านบนและล่างตามที่คุณเห็นในตัวอย่างนี้:

div {
  width: 100px;
  height: 100px;
  background: #EEE;
  box-shadow: 0 0 15px 0px #000;
  clip-path: inset(0px -15px 0px -15px);
  position: relative;
  margin: 0 50px;
}
<div></div>


9
ฉลาดมาก. บันทึก:afterความต้องการของคุณtop: 0ด้วย
Sprintstar

1
ฉันต้องเพิ่มdisplay: inline-blockคลาสหลอกให้ตัวอย่างของคุณทำงาน สรุป: เป็นทางออกที่ดี +1
Morpheus

7
ฉันคิดว่านี่ควรเป็นคำตอบที่ถูกต้องเนื่องจากวิธีการแก้ปัญหาที่ให้ผลลัพธ์อย่างแท้จริงใน "เงากล่องด้านซ้ายและขวาเท่านั้น" คำตอบที่ทำเครื่องหมายว่าถูกต้องยังคงผลลัพธ์ในเงาด้านบนและด้านล่าง
ลุค

2
ฉันคิดว่านี่น่าจะเป็นคำตอบที่ยอมรับได้ เพราะหนึ่งโดย @Deefour ทำงานได้ดีโดยที่ปล่อยให้มุมด้านบนและด้านล่างว่างเปล่า ในทางกลับกันการแก้ปัญหานี้เป็นเพียงที่สมบูรณ์แบบ
Rishabh Shah

1
@Hamish ใช่นั่นคือสิ่งที่ผมทำตอนนี้ :-) สงสารหนึ่งคุณลักษณะที่น่าสนใจของวิธีนี้ก็คือว่ามัน (ปกติ) ไม่notrequre ผู้ช่วยเหลือใด ๆ<div>องค์ประกอบ :-)
Raabe


26

วิธีการคลาสสิก: การแพร่กระจายเชิงลบ

CSS box-shadowใช้ 4 พารามิเตอร์: h-shadow, v-shadow, เบลอ, การแพร่กระจาย:

box-shadow: 10px 0 8px -8px black;

V-เงา (เงา Verical) ตั้งค่าเป็น 0

เบลอพารามิเตอร์เพิ่มผลการไล่ระดับสี แต่เพิ่มยังมีเงาเล็กน้อยบนเส้นขอบแนวตั้ง (หนึ่งเราต้องการที่จะได้รับการกำจัด)

การแพร่กระจายเชิงลบช่วยลดเงาบนเส้นขอบทั้งหมด: คุณสามารถเล่นกับมันโดยพยายามลบเงาแนวดิ่งเล็ก ๆ นั้นโดยไม่ส่งผลกระทบใด ๆ ต่อขอบด้านข้างมากเกินไป (ง่ายกว่าสำหรับเงาขนาดเล็ก 5 ถึง 10px)

นี่คือตัวอย่างซอ


วิธีที่สอง: แอบโซลูท div ที่ด้านข้าง

เพิ่ม div ว่างในองค์ประกอบของคุณและจัดรูปแบบด้วยการจัดตำแหน่งที่แน่นอนดังนั้นมันจึงไม่ส่งผลกระทบต่อเนื้อหาองค์ประกอบ

นี่คือซอกับตัวอย่างของเงาด้านซ้าย

<div id="container">
  <div class="shadow"></div>
</div>

.shadow{
    position:absolute;
    height: 100%;
    width: 4px;
    left:0px;
    top:0px;
    box-shadow: -4px 0 3px black;
}

ประการที่สาม: เงากาว

หากคุณมีพื้นหลังคงที่คุณสามารถซ่อนเอฟเฟกต์เงาด้านข้างด้วยสองเงาที่มีสีเดียวกันของพื้นหลังและเบลอ = 0 ตัวอย่าง:

box-shadow: 
    0 -6px white,          // Top Masking Shadow
    0 6px white,           // Bottom Masking Shadow
    7px 0 4px -3px black,  // Left-shadow
    -7px 0 4px -3px black; // Right-shadow

ฉันได้เพิ่มการแพร่กระจายเชิงลบอีกครั้ง (-3px) ลงในเงาดำดังนั้นมันจึงไม่ยืดเลย

นี่ซอ


4

วิธีนี้ใช้ได้ดีสำหรับเบราว์เซอร์ทั้งหมด:

-webkit-box-shadow: -7px 0px 10px 0px #000, 7px 0px 10px 0px #000;
-moz-box-shadow: -7px 0px 10px 0px #000, 7px 0px 10px 0px #000;
box-shadow: -7px 0px 10px 0px #000, 7px 0px 10px 0px #000;

3
มันใช้งานไม่ได้แม้แต่นิดเดียว อาจมีการเปลี่ยนแปลงรูปแบบ แต่สิ่งนี้บอกว่าจะย้ายเงาไปทางซ้าย 7 พิกเซล, 0 พิกเซลลง, เบลอด้านนอก 10 พิกเซลและขยายความเบลอ 0 พิกเซล ทำลายมันลง: เบลอ 17 พิกเซลทางด้านซ้ายเบลอ 10 พิกเซลที่ด้านบนและด้านล่างและเบลอ 3 พิกเซลทางด้านขวา ฉันได้รับอะไร
john ktejik

4

การสาธิต

คุณต้องใช้หลายbox-shadow;อย่าง คุณสมบัติสิ่งที่ใส่เข้าไปทำให้ดูดีและอยู่ภายใน

div {
    box-shadow: inset 0 12px  15px -4px rgba(31, 73, 125, 0.8), inset 0 -12px  8px -4px rgba(31, 73, 125, 0.8);
    width: 100px;
    height: 100px;
    margin: 50px;
    background: white;
}


2

clip-pathคือตอนนี้ (2020) วิธีที่ดีที่สุดที่ฉันได้พบเพื่อให้ได้เงาบนกล่องขององค์ประกอบเฉพาะโดยเฉพาะอย่างยิ่งเมื่อผลที่ต้องการคือเงา "clean cut" ที่ขอบเฉพาะเช่น:

.shadow-element {
    width: 100px;
    height: 100px;
    background-color: #FFC300;
    box-shadow: 0 0 10px 5px rgba(0,0,0,0.75);
    clip-path: inset(0px -15px 0px -15px);

    /* position and left properties required to bring element out from edge of parent
    so that shadow can be seen; margin-left would also achieve the same thing */
    position: relative;
    left: 15px;
}
<div class="shadow-element"></div>

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

.shadow-element {
    width: 100px;
    height: 100px;
    background-color: #FFC300;
    box-shadow: 15px 0 15px -10px rgba(0,0,0,0.75), -15px 0 15px -10px rgba(0,0,0,0.75);

    /* position and left properties required to bring element out from edge of parent
    so that shadow can be seen; margin-left would also achieve the same thing */
    position: relative;
    left: 15px;
}
<div class="shadow-element"></div>


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

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

ที่ไหน:

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

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


1
นี่คือคำตอบที่ดีที่สุด มันง่ายยิ่งขึ้น คุณสามารถใช้เงาโดยตรงกับภาพของคุณ ทำงานเหมือนจับใจ ตัวอย่าง: img.shadowed {box-shadow: 0 0 15px rgba (0,0,0,0.75); clip-path: inset (0px -15px 0px -15px); }
RWC

แม้ในตัวอย่างของคุณคุณสามารถเห็นมุมด้านบนและด้านล่างของส่วนโค้งของเงา แต่ก็อาจใช้ได้ดีในบางกรณี
แฮมมิช

@ หนามคุณกำลังดูclip-pathตัวอย่างหรือไม่ มีตัวอย่างโค้ด 2 ชุด การใช้งานครั้งแรกclip-pathและมีความสะอาดหมดจดโดยไม่มี "มุมด้านบนและด้านล่างโค้ง" - เหมือนโซลูชันของคุณ (แต่ต้องการ CSS น้อยกว่า) ตัวอย่างโค้ดที่สองเป็นเพียงตัวอย่างสำหรับการเปรียบเทียบ - โซลูชันจำนวนมากส่งผลให้เกิดกล่องเงากระจายซึ่งมักจะไม่ใช่สิ่งที่ผู้คนต้องการบรรลุ
ลุค

หากคุณต้องการเงาแข็งแกร่งคุณสามารถปรับเปลี่ยนคุณสมบัติเพื่อสิ่งที่ต้องการbox-shadow 0 0 10px 5px rgba(0,0,0,0.75);หมายเหตุเพิ่มมูลค่าและลดลงspread blur-radius
ลุค

@Hamish ฉันได้อัปเดตตัวอย่างแรกเพื่อแสดงให้เห็นแล้ว
ลุค


0

นีซแทรกลงบนด้านซ้ายและขวาสำหรับนักดำน้ำภาพหรือเนื้อหาภายใน

สำหรับเงาที่ใส่เข้าไปทางด้านซ้ายและด้านขวาของภาพหรือเนื้อหาอื่น ๆ ให้ใช้วิธีนี้

*** ดัชนี z: -1 เป็นกลอุบายที่ดีเมื่อแสดงภาพหรือวัตถุภายในด้วยสิ่งที่ใส่เข้าไป

<html>
<div class="shadowcontainer">
<img src="https://www.google.es/images/srpr/logo11w.png" class="innercontent" style="with:100%"/>
</div>

<style>

.shadowcontainer{
display:inline-flex;
box-shadow: inset -40px 0px 30px -30px rgba(0,0,0,0.9),inset 40px 0px 30px -30px rgba(0,0,0,0.9);
}

.innercontent{
z-index:-1
}
</style>
</html>

0

ในบางสถานการณ์คุณสามารถซ่อนเงาด้วยคอนเทนเนอร์อื่น เช่นหากมี DIV ด้านบนและด้านล่าง DIV ด้วยเงาคุณสามารถใช้position: relative; z-index: 1;กับ DIV ที่อยู่โดยรอบ


0

สำหรับแนวนอนเท่านั้นคุณสามารถหลอกกล่องเงาโดยใช้โอเวอร์โฟลว์ใน div parent:

<div class="parent">
  <div class="box-shadow">content</div>
</div>

.parent{
  overflow:hidden;
}
.box-shadow{
  box-shadow: box-shadow: 0 5px 5px 0 #000;
}

0

ความคิดอื่นอาจสร้างองค์ประกอบหลอกเลือนมืดในที่สุดด้วยความโปร่งใสในการเลียนแบบเงา ทำให้มีความสูงน้อยลงเล็กน้อยและกว้างมากขึ้น


0

คุณสามารถใช้ 1 div ภายในเพื่อ "ลบ" เงา:

.yourdiv{
    position:relative;
    width:400px;
    height:400px;
    left:10px;
    top:40px;
    background-color:white;
    box-shadow: 0px 0px 1px 0.5px #5F5F5F;

}
.erase{
    position:absolute;
    width:100%;
    top:50%;
    height:105%;
    transform:translate(0%,-50%);
    background-color:white;
}

คุณสามารถเล่นกับ "height:%;" และ "ความกว้าง:%;" เพื่อลบเงาที่คุณต้องการ


0

ไม่ว่าด้วยเหตุผลใดคำตอบที่ให้ไว้ที่นี่จะไม่ได้ผลในกรณีของฉัน ดังนั้นฉันจึงมีความคิดสร้างสรรค์ นี่เป็นทางออกใหม่สำหรับทุกท่านที่ใช้ในสถานที่ของlinear-gradient()box-shadow

p {
  padding: 1rem;
  background-color: #b55;
  color: white;
  background-image: linear-gradient(90deg, rgba(0,0,0,0.5), rgba(0,0,0,0) .5rem, rgba(0,0,0,0), rgba(0,0,0,0.0) calc(100% - .5rem), rgba(0,0,0,0.5));
}
<p>Testing</p>

แม้ว่าฉันจะไม่ได้มองหาเหตุผลก็ตาม แต่นี่ไม่ใช่ "กล่อง" คุณ (เรา) กำลังพยายามก่อตัวขึ้นดังนั้นฉันคิดว่าอาจพูดได้ว่าbox-shadowมันไม่สมเหตุสมผลเลยที่จะเริ่มต้น


0

ฉันพยายามคัดลอก bootstrap shadow-sm ทางด้านขวานี่คือรหัสของฉัน:

.shadow-rs{
    box-shadow: 5px 0 5px -4px rgba(237, 241, 235, 0.8);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.