บทความเปิดศักราชใหม่ จาก thaicss.com เรามาว่ากันในเรื่องง่ายๆ แต่ใช้ได้ใช้ดี โดยไม่ต้องพึ่งพา ไดเกียว แต่ประการใด นั่นก็คือการทำเงา ให้กับ Element ใดๆ ที่เราต้องการ
CSS3 Box Shadow เป็น Property ที่บรรจุเอาไว้ใน CSS Backgrounds and Border Module Level 3 ถือเป็น Miscellaneous Effects ของ Module นี้ โดยใน Miscellaneous Effects มี 2 ตัว ตัวแรกคือ box-shadow ที่กำลังจะพูดถึง และตัวที่สองคือ box-decoration-break เอาไว้พูดถึงในโอกาสหน้า (ถ้ายังมีอยู่)
box-shadow สามารถใส่ค่าการทำ drop-shadow ได้มากกว่า 1 สี โดยการใช้ คอมม่า ในการแบ่งการสั่งงาน
หลักการสั่งงานของคำสั่งมีดังนี้
ตัวอย่าง Code:
div {
box-shadow: 5px 5px 10px 10px rgba(50,50,50,.4);
}
หรือ
* {box-shadow: 5px 5px 15px 5px rgba(50, 50, 50, .5) inset;}
- เลขค่าแรก คือการสั่งงาน เงา แนวนอน เลขบวกคือ ด้านขวา เลขลบ คือด้านซ้าย
- เลขตัวที่สอง คือการสั่งงาน แนวตั้ง เลขบวกคือ ด้านล่าง เลขลบ คือด้านบน
- เลขตัวที่สาม คือการสั่ง ค่าการเบลอ ว่าจะเบลอประมาณไหน เริ่มจากค่า โรงงานคือ ศูนย์ และเป็นค่าบวก
- เลขตัวที่สี่ คือการสั่งขอบเขตการขยายตัวของการเบลอ (a spread distance) ใช้เป็นค่า บวกเท่านั้น
- สีของเงา สามารถใส่ได้ตามหลักการของ W3C ซึ่ง อ้างอิงจาก CSS Colors Module Level 3
- inset คือคำสั่งให้ เงาเด้งกลับเข้าไปในกล่อง ซึ่งคล้ายๆ การสั่ง inner shadow ของ Adobe Photoshop
ตัวอย่างเช่น
<div title="ตัวอย่าง box shadow แบบ inset"> Box Shadow inset </div>
<div title="ตัวอย่าง box shadow แบบ outset หรือแบบมาตรฐาน"> Box Shadow มาตรฐาน </div>
*[title^="ตัวอย่าง"] {
width: 150px;
height: 70px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 10px;
background: #fff;
margin: 10px auto 20px auto;
}
*[title~="inset"] {
-webkit-box-shadow: 5px 5px 15px 5px rgba(50, 50, 50, .5) inset;
-moz-box-shadow: 5px 5px 15px 5px rgba(50, 50, 50, .5) inset;
box-shadow: 5px 5px 15px 5px rgba(50, 50, 50, .5) inset;
}
*[title~="outset"] {
-webkit-box-shadow: 5px 5px 15px 5px rgba(50, 50, 50, .5);
-moz-box-shadow: 5px 5px 15px 5px rgba(50, 50, 50, .5);
box-shadow: 5px 5px 15px 5px rgba(50, 50, 50, .5);
}

ต่อไปเราลองมาเขียนแบบผสม เพื่อให้ box นั้นแสดง เงา มากกว่า 1 แบบลองดูครับ
<div title="ตัวอย่าง box shadow แบบ mixed"> Box Shadow ผสม </div>
*[title~="mixed"] {
-webkit-box-shadow: 0px 0px 20px 0px rgba(50, 50, 50, .5),
0px -25px 35px 0px rgba(50, 50, 50, .3) inset;
-moz-box-shadow: 0px 0px 20px 0px rgba(50, 50, 50, .5),
0px -25px 35px 0px rgba(50, 50, 50, .3) inset;
box-shadow: 0px 0px 20px 0px rgba(50, 50, 50, .5),
0px -25px 35px 0px rgba(50, 50, 50, .3) inset;
-moz-border-radius: 8px;
-webkit-border-radius: 8px;
border-radius: 8px;
height: 50px;
line-height: 25px;
color: rgba(100, 100, 100, .8);
text-shadow: 1px 1px 0 rgba(255, 255, 255, .6);
border: solid 1px rgba(255, 255, 255, .05);
background: rgba(200, 200, 200, .2);
margin-top: 40px;
text-align: center;
}

การนำไปประยุกต์ใช้งาน
เราจะนำการเขียน box-shadow ไปประยุกต์ใช้กับงานของเราในอนาคตได้อย่างไร ตอนนี้ผมขอยกตัวอย่างการทำ Horrizontal Navigation หรือ การทำ เมนูแนวนอน ง่ายๆ แล้วใช้ box-shadow เข้าร่วมด้วย พอเป็นยาถ่ายก็แล้วกันนะครับ
HTML:
<h2 title="เมนูอย่างง่าย">ตัวอย่างการเขียน Navigation</h2>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">Blog</a></li>
<li><a href="#">About Us</a></li>
<li><a href="#">Contact Us</a></li>
</ul>
CSS:
h2[title="เมนูอย่างง่าย"]+ul>li {
display: inline-block;
list-style: none;
}
h2[title="เมนูอย่างง่าย"]+ul>li:not(:first-child) {
margin-left: 8px;
}
h2[title="เมนูอย่างง่าย"]+ul>li>a {
display: block;
padding: 0px 10px;
line-height: 30px;
-moz-border-radius: 8px;
-webkit-border-radius: 8px;
border-radius: 8px;
border: solid 1px rgba(255, 255, 255, .1);
text-decoration: none;
font-weight: 700;
-webkit-transition-duration: .3s, .5s;
-o-transition-duration: .3s, .5s;
-moz-transition-duration: .3s, .5s;
transition-duration: .3s, .5s;
}
h2[title="เมนูอย่างง่าย"]+ul>li:first-child>a {
-webkit-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px -15px 35px 0px rgba(50, 50, 50, .3) inset;
-moz-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px -15px 35px 0px rgba(50, 50, 50, .3) inset;
box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px -15px 35px 0px rgba(50, 50, 50, .3) inset;
color: rgba(100, 100, 100, .8);
text-shadow: 1px 1px 0 rgba(255, 255, 255, .6);
background: rgba(200, 200, 200, .2);
}
h2[title="เมนูอย่างง่าย"]+ul>li:first-child>a:hover {
-webkit-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px 15px 35px 0px rgba(50, 50, 50, .3) inset;
-moz-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px 15px 35px 0px rgba(50, 50, 50, .3) inset;
box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px 15px 35px 0px rgba(50, 50, 50, .3) inset;
}
h2[title="เมนูอย่างง่าย"]+ul>li:nth-child(2)>a {
-webkit-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px -15px 35px 0px rgba(65, 96, 29, .4) inset;
-moz-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px -15px 35px 0px rgba(65, 96, 29, .3) inset;
box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px -15px 35px 0px rgba(65, 96, 29, .3) inset;
color: rgba(43, 59, 26, .8);
text-shadow: 1px 1px 0 rgba(255, 255, 255, .8);
background: rgba(163, 222, 96, .7);
}
h2[title="เมนูอย่างง่าย"]+ul>li:nth-child(2)>a:hover {
-webkit-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px 15px 35px 0px rgba(89, 133, 39, .3) inset;
-moz-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px 15px 35px 0px rgba(50, 50, 50, .3) inset;
box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px 15px 35px 0px rgba(50, 50, 50, .3) inset;
}
h2[title="เมนูอย่างง่าย"]+ul>li:nth-child(3)>a {
-webkit-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px -15px 35px 0px rgba(158, 11, 15, .8) inset;
-moz-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px -15px 35px 0px rgba(158, 11, 15, .8) inset;
box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px -15px 35px 0px rgba(158, 11, 15, .8) inset;
color: rgba(158, 11, 15, 1);
text-shadow: 1px 1px 0 rgba(255, 255, 255, .4);
background: rgba(247, 17, 24, .6);
}
h2[title="เมนูอย่างง่าย"]+ul>li:nth-child(3)>a:hover {
-webkit-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px 15px 35px 0px rgba(158, 11, 15, .8) inset;
-moz-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px 15px 35px 0px rgba(158, 11, 15, .8) inset;
box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px 15px 35px 0px rgba(158, 11, 15, .8) inset;
}
h2[title="เมนูอย่างง่าย"]+ul>li:nth-child(4)>a {
-webkit-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px -15px 35px 0px rgba(9, 72, 146, .8) inset;
-moz-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px -15px 35px 0px rgba(9, 72, 146, .8) inset;
box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px -15px 35px 0px rgba(9, 72, 146, .8) inset;
color: rgba(0, 41, 89, 1);
text-shadow: 1px 1px 0 rgba(255, 255, 255, .4);
background: rgba(52, 145, 255, .6);
}
h2[title="เมนูอย่างง่าย"]+ul>li:nth-child(4)>a:hover {
-webkit-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px 15px 35px 0px rgba(9, 72, 146, .8) inset;
-moz-box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px 15px 35px 0px rgba(9, 72, 146, .8) inset;
box-shadow: 0px 0px 10px 0px rgba(50, 50, 50, .5),
0px 15px 35px 0px rgba(9, 72, 146, .8) inset;
}
ภาพตัวอย่าง:

หรือสามารถเข้าไปดูตัวอย่างโค้ดได้จาก:
ตัวอย่างการเขียน CSS Box-shadow
หมายเหตุ:
จากตัวอย่างโค้ด ผมเขียน Properties แปลกๆ อย่างเช่น box-sizing: border-box; เข้ามา หลายคนอาจจะเกิดอาการ งง ว่ามันคืออะไร ขออธิบายเพิ่มเติมน้อยๆ เล็กๆ นะครับ box-sizing: คือการกำหนดขนาดการแสดงผลของ box model ซึ่งมี ค่า content-box และ border-box โดยปกติแล้ว เวลาที่เรากำหนดขนาดของ box ใดๆ โดยให้ความกว้าง เช่น width: 100px; เมื่อเราใส่ padding เข้าไป อีกข้างละ 10px ความกว้างนั้นจะกลายเป็น 120px ทันที แต่เมื่อไหร่ก็ตามที่เราสั่ง box-sizing เป็น content-box เข้าไป ความกว้างนั้นจะไม่ขยาย กลายเป็นพื้นที่การแสดงผลต่างหากที่ถูกลดลง
จริงๆ แล้วผมเขียนบทความเรื่อง Box model เอาไว้แล้ว หรือเปล่าวะ
มีความสุขกับการใช้ชีวิตครับ
4 Responses to CSS3 Box Shadow : ทำ Drop shadow ด้วย CSS3