คอมพิวเตอร์ Windows อินเทอร์เน็ต

พื้นหลังคู่ วิธีสร้างภาพพื้นหลัง CSS หลายภาพ โค้ดตัวอย่าง: หลายภาพสำหรับพื้นหลัง

เมื่อเราพูดถึงคุณสมบัติ background-image ในตอนต้นของส่วนนี้ เราไม่ได้พูดถึงสิ่งใดสิ่งหนึ่ง: ใน CSS3 คุณสามารถเพิ่มพื้นหลังได้หลายรายการสำหรับองค์ประกอบเดียวโดยเพียงแค่แสดงรายการโดยคั่นด้วยเครื่องหมายจุลภาค สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อองค์ประกอบที่มีพื้นหลังมีความกว้างหรือความสูงที่เปลี่ยนแปลงได้ และพื้นหลังต้องปรับขนาดของมัน

วิธีตั้งค่าหลายพื้นหลังใน CSS

เราจะแสดงตัวอย่างที่อาจเป็นประโยชน์ในทางปฏิบัติให้คุณดู ลองนึกภาพว่าเราจำเป็นต้องวางบล็อกข้อความไว้ในเฟรม เฟรมเป็นไฟล์กราฟิกในรูปแบบ PNG:


ในงานนี้ เราไม่ทราบความสูงของข้อความ - เราไม่ทราบว่าข้อความจะพอดีกับกรอบอย่างสมบูรณ์หรือเกินขอบเขต เนื่องจากค่าที่ไม่รู้จักนี้ เราจึงไม่สามารถเสี่ยงที่จะใช้ภาพวาดเฟรมดั้งเดิมเป็นพื้นหลังได้ แต่ด้วย CSS เราสามารถบังคับให้เส้นขอบนี้ยาวขึ้นได้ตามต้องการ ในการทำเช่นนี้ คุณจะต้องแบ่งภาพวาดต้นฉบับในตัวแก้ไขกราฟิกออกเป็นสามส่วน - บน ล่าง และกลาง - และบันทึกแต่ละไฟล์แยกกัน แบบนี้:

ด้านบนของกรอบ


ด้านล่างของกรอบ


กลางกรอบ


เราจะสร้างพื้นหลังโดยให้ภาพตรงกลางเฟรมซ้ำตามแนวแกน Yในขณะที่ด้านบนและด้านล่างของเฟรมจะไม่ซ้ำกัน มาเพิ่มพื้นหลังทั้งสามให้กับองค์ประกอบ และเขียนสไตล์ที่จำเป็นอื่นๆ ด้วย:

กรอบ (ภาพพื้นหลัง: url (https://goo.gl/tKyzHt), / * ด้านบนของเฟรม * / url (https://goo.gl/SUKymM), / * ด้านล่างของเฟรม * / url (https: //goo.gl/Km7HVV); / * ตรงกลางของเส้นขอบ * / background-position: ตำแหน่งกึ่งกลางด้านบน, / * ตำแหน่งด้านบนของเส้นขอบ * / ตำแหน่งกึ่งกลางด้านล่าง / * ตำแหน่งด้านล่างของเส้นขอบ * / ตำแหน่งกึ่งกลางด้านบน; / * ตำแหน่ง ของกรอบตรงกลาง * / background -repeat: no-repeat / * ด้านบนของกรอบไม่ซ้ำ * / no-repeat / * ด้านล่างของเฟรมไม่ซ้ำ * / repeat-y; / * ตรงกลาง ของเฟรมซ้ำในแนวตั้ง * / background-size: contain; / * ที่นี่สำหรับพื้นหลังทั้งหมดมีค่าเท่ากัน * / height: auto; / * ความสูงของบล็อกขึ้นอยู่กับปริมาณของเนื้อหา * / width: 400px; / * block width ได้รับการแก้ไขแล้ว * / padding: 30px; / * block padding * /)

พื้นหลังแต่ละอันต้องคั่นด้วยเครื่องหมายจุลภาค และหลังจากท้ายสุดคือเครื่องหมายอัฒภาค ซึ่งระบุจุดสิ้นสุดของการประกาศ เพื่อความสะดวกและอ่านโค้ดได้ง่ายขึ้น เราขอแนะนำให้คุณระบุ URL แต่ละรายการในบรรทัดใหม่

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

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

มาดูผลลัพธ์กันดีกว่า:


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


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


แน่นอนว่าสามารถใช้พื้นหลังหลายๆ แบบเพื่อวัตถุประสงค์อื่นได้เช่นกัน เราได้แสดงตัวอย่างเพียงหนึ่งตัวอย่างจากหลายๆ ตัวอย่าง ลองนึกภาพสถานการณ์ของคุณและฝึกฝนโดยใช้กลุ่มภูมิหลัง

การใช้สัญกรณ์ย่อ

คุณสมบัติพื้นหลังยังยอมรับค่าหลายค่า ในกรณีของการใช้พื้นหลังหลายๆ แบบ การใช้อักษรย่ออาจสะดวกกว่ามาก เพราะจะทำให้สับสนได้ยากขึ้น มาเขียนโค้ดของเราใหม่สำหรับเฟรมเวิร์ก:

พื้นหลัง: url (https://goo.gl/tKyzHt) กึ่งกลางบน / มีไม่ซ้ำ / * ด้านบนของเฟรม * / url (https://goo.gl/SUKymM) ด้านล่างตรงกลาง / มีไม่ซ้ำ, / * ล่างสุดของเฟรม * / url (https://goo.gl/Km7HVV) ตรงกลางบน / มี repeat-y; / * ตรงกลางเฟรม * /

ตัวเลือกนี้ดูยุ่งยากน้อยลงและเข้าใจง่ายขึ้น

งาน

เพิ่มภาพพื้นหลังสองรูปสำหรับบล็อกโดยใช้ CSS3

สารละลาย

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

ตัวอย่างเช่น ลองสร้างเส้นตกแต่งแนวตั้งทางด้านซ้ายและด้านขวาของบล็อก ในการทำเช่นนี้ อันดับแรก เราจะเตรียมภาพที่ควรจะทำซ้ำในแนวตั้งโดยไม่มีตะเข็บ ในรูป 1 แสดงภาพพื้นหลังที่จะแสดงตามขอบด้านซ้ายและในรูปที่ 2 ภาพที่จะแสดงทางด้านขวา

ข้าว. 1. ภาพพื้นหลังสำหรับเส้นขอบด้านซ้าย

ข้าว. 2. ภาพพื้นหลังสำหรับเส้นขอบด้านขวา

เป็นองค์ประกอบบล็อกที่เพิ่มพื้นหลัง แท็กมักจะใช้

เนื่องจากสะดวกและเก่งกาจ เพื่อที่จะแยกความแตกต่างจากองค์ประกอบอื่น ๆ คลาสบล็อกจึงถูกเพิ่มเข้าไป (ตัวอย่างที่ 1)

ตัวอย่างที่ 1. ภาพพื้นหลังสองภาพ

HTML5 CSS3 IE Cr Op Sa Fx

สองภาพพื้นหลัง

ในช่วง 11 เดือนของนาฬิกา ผู้ดำเนินการวิทยุดำเนินการสื่อสาร 8642 ช่วงโดยมีปริมาณทั้งหมด 300625 กลุ่ม นี่เป็นเพียงโทรเลขอุตุนิยมวิทยาและทางอากาศเท่านั้น ได้รับจากสถานีวิทยุ Cape Chelyuskin 7450 กลุ่ม

ผลลัพธ์ของตัวอย่างนี้แสดงในรูปที่ 3.

). วันนี้เราจะมาพูดถึงคุณสมบัติที่น่าสนใจอีกอย่างหนึ่งเล็กน้อย - การใช้ภาพหลายภาพในพื้นหลัง

องค์ประกอบของพื้นหลัง

มีเหตุผลหลายประการที่โดยทั่วไปแล้ว คุณอาจต้องจัดองค์ประกอบภาพหลายภาพในพื้นหลัง โดยเหตุผลที่สำคัญที่สุด ได้แก่:

  • ประหยัดทราฟฟิกตามขนาดของภาพ หากแต่ละภาพรวมกันมีน้ำหนักน้อยกว่าภาพที่มีเลเยอร์แบนๆ และ
  • ความต้องการพฤติกรรมอิสระของแต่ละเลเยอร์ เช่น เมื่อใช้เอฟเฟกต์พารัลแลกซ์
อาจมีเหตุผลอื่น ๆ ที่เหมาะสม :)

แนวทางสุดคลาสสิค

ดังนั้น เราจำเป็นต้องวางภาพพื้นหลังหลายภาพไว้เหนืออีกภาพหนึ่ง งานนี้มักจะแก้ไขอย่างไร? ง่ายมาก: บล็อกถูกสร้างขึ้นสำหรับภาพพื้นหลังแต่ละภาพและกำหนดภาพพื้นหลังที่เกี่ยวข้อง บล็อกจะซ้อนกันภายในกันหรือวางในแถวที่มีกฎการวางตำแหน่งที่เหมาะสม นี่เป็นตัวอย่างง่ายๆ:

บล็อกที่มีคลาส "ตกปลา" ภายใน "นางเงือก" เพื่อการสาธิตเท่านั้น

ตอนนี้บางสไตล์:
.sample1 .sea, .sample1 .mermaid, .sample1 .fishing (สูง: 300px; กว้าง: 480px; ตำแหน่ง: ญาติ;) .sample1 .sea (พื้นหลัง: url (สื่อ / sea.png) ทำซ้ำ-x บนซ้าย;) .sample1 .mermaid (พื้นหลัง: url (media / mermaid.svg) ทำซ้ำ x ล่างซ้าย;) .sample1 .fish (พื้นหลัง: url (media / fish.svg) ไม่ทำซ้ำ ความสูง: 70px ความกว้าง: 100px ซ้าย : 30px; ด้านบน: 90px; ตำแหน่ง: สัมบูรณ์;) .sample1 .fishing (พื้นหลัง: url (media / fishing.svg) ไม่มีการทำซ้ำด้านบนขวา 10px;)

ผลลัพธ์:

ในตัวอย่างนี้ มีพื้นหลังซ้อนกันสามแบบและบล็อกหนึ่งมีปลา อยู่ถัดจากบล็อก "พื้นหลัง" ตามทฤษฎีแล้ว ปลาสามารถเคลื่อนย้ายได้ เช่น ใช้ JavaScript หรือ CSS3 Transitions / Animations

อย่างไรก็ตาม ตัวอย่างนี้ใช้รูปแบบการจัดตำแหน่งพื้นหลังใหม่สำหรับ ".fishing" ซึ่งกำหนดไว้ใน CSS3 ด้วย:
พื้นหลัง: url (สื่อ / fishing.svg) ไม่ซ้ำ ด้านบนขวา 10px;
ปัจจุบันรองรับใน IE9 + และ Opera 11+ แต่ไม่รองรับใน Firefox 10 และ Chrome 16 ดังนั้นผู้ใช้ในสองเบราว์เซอร์ล่าสุดจะยังไม่สามารถจับปลาได้

ภูมิหลังที่หลากหลาย

คุณลักษณะใหม่ที่เพิ่มเข้ามาใน CSS3 ได้รับการช่วยเหลือ - ความสามารถในการกำหนดภาพพื้นหลังหลายภาพสำหรับองค์ประกอบเดียวในคราวเดียว ดูเหมือนว่านี้:

และรูปแบบที่สอดคล้องกัน:
.sample2 .sea (ความสูง: 300px; ความกว้าง: 480px; ตำแหน่ง: ญาติ; background-image: url ("media / fishing.svg"), url ("media / mermaid.svg"), url ("media / sea. png "); ตำแหน่งพื้นหลัง: บนขวา 10px, ซ้ายล่าง, ซ้ายบน; background-repeat: ไม่ซ้ำ, ทำซ้ำ-x, ทำซ้ำ-x;) .sample2 .fish (พื้นหลัง: url (" media / fish.svg ") ห้ามทำซ้ำ ความสูง: 70px ความกว้าง: 100px ซ้าย: 30px ด้านบน: 90px ตำแหน่ง: สัมบูรณ์;)
ในการกำหนดรูปภาพหลายรูป คุณต้องใช้กฎรูปภาพพื้นหลัง โดยระบุรูปภาพแต่ละรูปโดยคั่นด้วยเครื่องหมายจุลภาค สามารถใช้กฎเพิ่มเติม รวมถึงรายการเพื่อกำหนดตำแหน่ง การทำซ้ำ และพารามิเตอร์อื่นๆ สำหรับแต่ละรูปภาพได้ ให้ความสนใจกับลำดับการแสดงภาพ: เรียงชั้นจากซ้ายไปขวาจากบนสุดไปล่างสุด

ผลลัพธ์จะเหมือนกันทุกประการ:

กฎข้อเดียว

หากไม่จำเป็นต้องเลือกปลาในบล็อกแยกต่างหากสำหรับการปรับแต่งในภายหลัง สามารถเขียนทั้งภาพใหม่ได้ด้วยกฎง่ายๆ ข้อเดียว:

รูปแบบ:
.sample3 .sea (ความสูง: 300px; ความกว้าง: 480px; ตำแหน่ง: ญาติ; background-image: url ("media / fishing.svg"), url ("media / mermaid.svg"), url ("media / fish. svg "), url (" media / sea.png "); background-position: บนขวา 10px, ล่างซ้าย, 30px 90px, ซ้ายบน; background-repeat: no-repeat, repeat-x;)

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

ในกรณีนี้ จะเทียบเท่ากับคำอธิบายนี้:
พื้นหลัง-ซ้ำ: ไม่ซ้ำ, ทำซ้ำ-x, ไม่ซ้ำ, ซ้ำ-x;

ยิ่งสั้น

หากคุณจำ CSS 2.1 ได้ จะกำหนดความสามารถในการอธิบายภาพพื้นหลังในลักษณะที่กระชับ แล้วหลายภาพล่ะ? นอกจากนี้ยังเป็นไปได้:

ตัวอย่างที่ 4 .sea (ความสูง: 300px ความกว้าง: 480px ตำแหน่ง: ญาติ พื้นหลัง: url ("media / fishing.svg") ด้านบนขวา 10px no-repeat, url ("media / mermaid.svg") ล่างซ้าย repeat-x , url ("media / fish.svg") 30px 90px ไม่ซ้ำ, url ("media / sea.png") ทำซ้ำ-x;)

แต่โปรดทราบว่าตอนนี้คุณไม่สามารถข้ามค่าได้ (เว้นแต่จะตรงกับค่าเริ่มต้น) อย่างไรก็ตาม หากคุณต้องการกำหนดสีของภาพพื้นหลัง จะต้องทำในเลเยอร์สุดท้าย

ภาพไดนามิก

หากองค์ประกอบเป็นแบบคงที่หรือไดนามิกไม่เกินขึ้นอยู่กับขนาดของคอนเทนเนอร์ พื้นหลังหลายอันจะทำให้การออกแบบเพจง่ายขึ้นอย่างเห็นได้ชัด แต่ถ้าคุณต้องการทำงานกับแต่ละองค์ประกอบขององค์ประกอบอย่างอิสระจากจาวาสคริปต์ (ย้าย เลื่อน ฯลฯ)
นี่คือตัวอย่างจากชีวิตจริง - ธีมที่มีดอกแดนดิไลอันในยานเดกซ์:


หากคุณขุดลงไปในรหัส คุณจะเห็นสิ่งนี้:
...

บล็อกที่มีคลาส "b-fluff-bg", "b-fluff__cloud" และ "b-fluff__item" มีภาพพื้นหลังที่ทับซ้อนกัน ยิ่งไปกว่านั้น พื้นหลังที่มีเมฆจะเลื่อนไปเรื่อย ๆ และดอกแดนดิไลออนก็บินผ่านหน้าจอ

สามารถเขียนใหม่โดยใช้พื้นหลังหลายอันได้หรือไม่ โดยหลักการแล้วใช่ แต่ให้ 1) รองรับคุณสมบัตินี้ในเบราว์เซอร์เป้าหมายและ ... 2) อ่านต่อ;)

ฉันจะเพิ่มลำโพงในหลายพื้นหลังได้อย่างไร ในสถานการณ์เช่นนี้ จะสะดวกกว่าในมุมมองภายใน เบราว์เซอร์จะกระจายพารามิเตอร์แต่ละรายการของภาพพื้นหลังตามกฎที่เหมาะสม ตัวอย่างเช่น สำหรับการจัดตำแหน่งจะมี "ตำแหน่งพื้นหลัง" และสำหรับการชดเชย คุณจะต้องเปลี่ยนเท่านั้น อย่างไรก็ตาม มีค่าใช้จ่ายสำหรับการใช้รูปภาพหลายรูป - กฎนี้ (และกฎที่คล้ายกัน) ต้องระบุตำแหน่งสำหรับพื้นหลังทั้งหมดที่ตั้งไว้สำหรับบล็อกของคุณ และคุณไม่สามารถเลือกได้

หากต้องการเพิ่มแอนิเมชั่นให้กับพื้นหลังด้วยปลา คุณสามารถใช้รหัสต่อไปนี้:
$ (เอกสาร) .ready (ฟังก์ชัน () (var sea = $ (". sample5 .sea"); var fishesX = 30; var fishesY = 90; var fishX = 0; var fishY = 0; var mermaidX = 0; var t = 0; ฟังก์ชัน animationLoop () (fishesY = 90 + Math.floor (30 * Math.sin (t ++ / 180.0)); if (- fishesX< 0) fishesX = 480; mermaidX += 0.5; if(mermaidX >480) นางเงือกX = 0; ปลาY = -10 + (10 * Math.cos (t * 0.091)); ปลาX = 10 + (5 * Math.sin (t * 0.07)); sea.style.backgroundPosition = "top" + fishY + "px right" + fishX + "px" + mermaidX + "px bottom" + fishesX + "px" + fishesY + "px, ซ้ายบน"; window.requestAnimFrame (animationLoop); ) animationLoop (); ));
ที่ไหน
window.requestAnimFrame = (ฟังก์ชัน () (return window.requestAnimationFrame || window.msRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.webkitRequestAnimationFrame || (ฟังก์ชัน (โทรกลับ)) (60 );));) );

และอีกอย่าง แอนิเมชั่นสามารถทำได้ผ่านการเปลี่ยน CSS3 / แอนิเมชั่น แต่นี่เป็นหัวข้อสำหรับการสนทนาแยกต่างหาก

Parallax และโต้ตอบ

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

ภาพพื้นหลังหลายภาพมีประโยชน์ในสถานการณ์เช่นนี้ เนื่องจากในขณะที่เรากำลังพูดถึงแต่พื้นหลังเท่านั้น (ไม่ใช่เนื้อหา) การใช้ภาพเหล่านี้จะช่วยให้คุณหลีกเลี่ยงไม่ให้โค้ด html และ DOM ยุ่งเหยิง แต่ทุกอย่างต้องแลกมาด้วยราคา: ฉันไม่สามารถเข้าถึงองค์ประกอบแต่ละองค์ประกอบด้วยชื่อ รหัส คลาส หรือพารามิเตอร์อื่นๆ ฉันต้องจำลำดับขององค์ประกอบในองค์ประกอบในโค้ดให้ชัดเจน และสำหรับการเปลี่ยนแปลงพารามิเตอร์ขององค์ประกอบใดๆ แต่ละครั้ง อันที่จริง ฉันต้องกาวบรรทัดที่อธิบายค่าของพารามิเตอร์นี้สำหรับองค์ประกอบทั้งหมดและอัปเดต องค์ประกอบทั้งหมด

Sea.style.backgroundPosition = "top" + fishY + "px right" + fishX + "px," + mermaidX + "px bottom" + fishesX + "px" + fishesY + "px, ซ้ายบน";

ฉันแน่ใจว่าสิ่งนี้สามารถหุ้มด้วยโค้ดจาวาสคริปต์ที่สะดวก ซึ่งจะควบคุมการจำลองเสมือนของความสัมพันธ์กับแต่ละเลเยอร์ ในขณะที่ปล่อยให้โค้ด html ของหน้าสะอาดที่สุด

ความเข้ากันได้คืออะไร?

เบราว์เซอร์ยอดนิยมเวอร์ชันใหม่ทั้งหมด รวมถึง IE9 + รองรับหลายภาพ (คุณสามารถตรวจสอบได้ เช่น caniuse)

คุณยังสามารถใช้ Modernizr เพื่อจัดเตรียมเบราว์เซอร์ที่ไม่สนับสนุนพื้นหลังหลายแบบพร้อมทางเลือกอื่น ตามที่ Chris Coyier เขียนไว้ในบันทึกของเขาเกี่ยวกับลำดับเลเยอร์เมื่อใช้พื้นหลังหลายอัน ให้ทำดังนี้:

เนื้อหา Multiplebgs (/ * การประกาศ BG หลายอันที่ยอดเยี่ยมที่อยู่เหนือความเป็นจริงและลูกไก่ที่ไร้เหตุผล * /) .no-multiplebgs เนื้อหา (/ * laaaaaame fallback * /)
หากคุณสับสนเกี่ยวกับการใช้ JS เพื่อจัดเตรียมความเข้ากันได้แบบย้อนหลัง คุณสามารถประกาศพื้นหลังได้สองครั้ง อย่างไรก็ตาม สิ่งนี้ก็มีข้อเสียในรูปแบบของการโหลดทรัพยากรสองครั้งที่เป็นไปได้ (ขึ้นอยู่กับการนำการประมวลผล css ไปใช้งานในเบราว์เซอร์เฉพาะ):

/ * หลาย bg สำรอง * / พื้นหลัง: # 000 url (...) ...; / * การประกาศ BG หลายอันที่ยอดเยี่ยมซึ่งอยู่เหนือความเป็นจริงและลูกไก่ที่ไม่มีตัวตน * / URL พื้นหลัง (... ), url (... ), url (... ), # 000 url (... );

หากคุณได้เริ่มคิดเกี่ยวกับ Windows 8 แล้ว โปรดทราบว่าคุณสามารถใช้พื้นหลังได้หลายแบบเมื่อพัฒนาแอปพลิเคชันสไตล์เมโทร เนื่องจากมีการใช้เอ็นจิ้นเดียวกันภายในเช่นเดียวกับใน IE10

ป.ล. ในหัวข้อ: ฉันอดไม่ได้ที่จะจำบทความมหัศจรรย์เกี่ยวกับ

สามารถเพิ่มภาพพื้นหลังหลายภาพลงในองค์ประกอบเดียวได้โดยใช้คุณสมบัติพื้นหลังเดียว วิธีนี้ช่วยให้คุณใช้องค์ประกอบเดียวเพื่อสร้างพื้นหลังที่ซับซ้อนหรือรูปภาพเดียว โดยแสดงหลายครั้งด้วยการตั้งค่าที่ต่างกัน รูปภาพทั้งหมดที่มีพารามิเตอร์จะแสดงรายการโดยคั่นด้วยเครื่องหมายจุลภาค ในขณะเดียวกันก็มีการระบุรูปภาพก่อน ซึ่งจะแสดงที่ด้านบนของรูปภาพที่เหลือ และรูปภาพสุดท้ายตามลำดับคือรูปภาพที่ต่ำที่สุด ตัวอย่างที่ 1 แสดงวิธีการสร้างพื้นหลังที่มีสามภาพ

ตัวอย่างที่ 1. ภูมิหลังสามประการ

พื้นหลัง

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

ข้าว. 1. พื้นหลังที่มีสามภาพ

รูปภาพแยกต่างหากสำหรับพื้นหลังทำให้คุณสามารถเปลี่ยนตำแหน่งและเคลื่อนไหวได้ดังที่แสดงในตัวอย่างที่ 2

ตัวอย่างที่ 2 พื้นหลังเคลื่อนไหว

พื้นหลัง

ตอนนี้เรามาดูวิธีการใช้รูปภาพหนึ่งภาพเพื่อสร้างบล็อกที่มีกรอบ (รูปที่ 2) ความกว้างของบล็อกได้รับการแก้ไข และความสูงจะยืดออกขึ้นอยู่กับปริมาณของเนื้อหาของบล็อก

ข้าว. 2. กรอบวาดด้วยมือ

รูปภาพแสดงส่วนบนและส่วนล่างอย่างชัดเจน ซึ่งจะต้องตัดในโปรแกรมแก้ไขกราฟิกและจัดวางในแนวนอน เลือกส่วนตรงกลางเพื่อให้ทำซ้ำในแนวตั้งโดยไม่มีตะเข็บ รูปภาพมีรูปแบบการทำซ้ำที่เด่นชัด ดังนั้นจึงไม่ควรมีปัญหากับการเลือก เป็นผลให้คุณจะได้ภาพที่เตรียมไว้ (รูปที่ 3) กล่องตาหมากรุกแสดงถึงความโปร่งใส ช่วยให้คุณสามารถตั้งค่าพื้นหลังสีพร้อมกับรูปภาพและเปลี่ยนสไตล์ได้อย่างง่ายดาย

ข้าว. 3.เตรียมภาพพื้นหลัง

พื้นหลังจะแสดงโดยคุณสมบัติพื้นหลัง และยังตั้งค่าพิกัดของส่วนที่ต้องการด้วย พารามิเตอร์ของแต่ละพื้นหลังจะแสดงรายการคั่นด้วยเครื่องหมายจุลภาค และในกรณีนี้ ลำดับของพารามิเตอร์มีความสำคัญ เราต้องการให้ส่วนบนและส่วนล่างของบล็อกไม่ทับซ้อนกัน ดังนั้นเราจึงวางมันไว้ก่อน (ตัวอย่างที่ 3) สีพื้นหลังถูกระบุเป็นครั้งสุดท้าย

ตัวอย่างที่ 3 ภาพพื้นหลังหลายภาพ

พื้นหลัง

Huitzilopochtli - "พ่อมดฮัมมิ่งเบิร์ด" เทพเจ้าแห่งสงครามและดวงอาทิตย์

Tezcatlipoca - "กระจกสูบบุหรี่" เทพเจ้าหลักของ Aztecs

มนุษย์ได้ถวายเครื่องบูชาแก่พระเจ้าทั้งสองพระองค์

พื้นหลังแรกวาดเส้นขอบด้านบนของกล่อง พื้นหลังที่สองวาดด้านล่าง และที่สามวาดเส้นขอบแนวตั้ง สุดท้ายคือสีที่มองเห็นได้ในส่วนกลางโปร่งใสของบล็อก (รูปที่ 4)

). วันนี้เราจะมาพูดถึงคุณสมบัติที่น่าสนใจอีกอย่างหนึ่งเล็กน้อย - การใช้ภาพหลายภาพในพื้นหลัง

องค์ประกอบของพื้นหลัง

มีเหตุผลหลายประการที่โดยทั่วไปแล้ว คุณอาจต้องจัดองค์ประกอบภาพหลายภาพในพื้นหลัง โดยเหตุผลที่สำคัญที่สุด ได้แก่:

  • ประหยัดทราฟฟิกตามขนาดของภาพ หากแต่ละภาพรวมกันมีน้ำหนักน้อยกว่าภาพที่มีเลเยอร์แบนๆ และ
  • ความต้องการพฤติกรรมอิสระของแต่ละเลเยอร์ เช่น เมื่อใช้เอฟเฟกต์พารัลแลกซ์
อาจมีเหตุผลอื่น ๆ ที่เหมาะสม :)

แนวทางสุดคลาสสิค

ดังนั้น เราจำเป็นต้องวางภาพพื้นหลังหลายภาพไว้เหนืออีกภาพหนึ่ง งานนี้มักจะแก้ไขอย่างไร? ง่ายมาก: บล็อกถูกสร้างขึ้นสำหรับภาพพื้นหลังแต่ละภาพและกำหนดภาพพื้นหลังที่เกี่ยวข้อง บล็อกจะซ้อนกันภายในกันหรือวางในแถวที่มีกฎการวางตำแหน่งที่เหมาะสม นี่เป็นตัวอย่างง่ายๆ:

บล็อกที่มีคลาส "ตกปลา" ภายใน "นางเงือก" เพื่อการสาธิตเท่านั้น

ตอนนี้บางสไตล์:
.sample1 .sea, .sample1 .mermaid, .sample1 .fishing (สูง: 300px; กว้าง: 480px; ตำแหน่ง: ญาติ;) .sample1 .sea (พื้นหลัง: url (สื่อ / sea.png) ทำซ้ำ-x บนซ้าย;) .sample1 .mermaid (พื้นหลัง: url (media / mermaid.svg) ทำซ้ำ x ล่างซ้าย;) .sample1 .fish (พื้นหลัง: url (media / fish.svg) ไม่ทำซ้ำ ความสูง: 70px ความกว้าง: 100px ซ้าย : 30px; ด้านบน: 90px; ตำแหน่ง: สัมบูรณ์;) .sample1 .fishing (พื้นหลัง: url (media / fishing.svg) ไม่มีการทำซ้ำด้านบนขวา 10px;)

ผลลัพธ์:

ในตัวอย่างนี้ มีพื้นหลังซ้อนกันสามแบบและบล็อกหนึ่งมีปลา อยู่ถัดจากบล็อก "พื้นหลัง" ตามทฤษฎีแล้ว ปลาสามารถเคลื่อนย้ายได้ เช่น ใช้ JavaScript หรือ CSS3 Transitions / Animations

อย่างไรก็ตาม ตัวอย่างนี้ใช้รูปแบบการจัดตำแหน่งพื้นหลังใหม่สำหรับ ".fishing" ซึ่งกำหนดไว้ใน CSS3 ด้วย:
พื้นหลัง: url (สื่อ / fishing.svg) ไม่ซ้ำ ด้านบนขวา 10px;
ปัจจุบันรองรับใน IE9 + และ Opera 11+ แต่ไม่รองรับใน Firefox 10 และ Chrome 16 ดังนั้นผู้ใช้ในสองเบราว์เซอร์ล่าสุดจะยังไม่สามารถจับปลาได้

ภูมิหลังที่หลากหลาย

คุณลักษณะใหม่ที่เพิ่มเข้ามาใน CSS3 ได้รับการช่วยเหลือ - ความสามารถในการกำหนดภาพพื้นหลังหลายภาพสำหรับองค์ประกอบเดียวในคราวเดียว ดูเหมือนว่านี้:

และรูปแบบที่สอดคล้องกัน:
.sample2 .sea (ความสูง: 300px; ความกว้าง: 480px; ตำแหน่ง: ญาติ; background-image: url ("media / fishing.svg"), url ("media / mermaid.svg"), url ("media / sea. png "); ตำแหน่งพื้นหลัง: บนขวา 10px, ซ้ายล่าง, ซ้ายบน; background-repeat: ไม่ซ้ำ, ทำซ้ำ-x, ทำซ้ำ-x;) .sample2 .fish (พื้นหลัง: url (" media / fish.svg ") ห้ามทำซ้ำ ความสูง: 70px ความกว้าง: 100px ซ้าย: 30px ด้านบน: 90px ตำแหน่ง: สัมบูรณ์;)
ในการกำหนดรูปภาพหลายรูป คุณต้องใช้กฎรูปภาพพื้นหลัง โดยระบุรูปภาพแต่ละรูปโดยคั่นด้วยเครื่องหมายจุลภาค สามารถใช้กฎเพิ่มเติม รวมถึงรายการเพื่อกำหนดตำแหน่ง การทำซ้ำ และพารามิเตอร์อื่นๆ สำหรับแต่ละรูปภาพได้ ให้ความสนใจกับลำดับการแสดงภาพ: เรียงชั้นจากซ้ายไปขวาจากบนสุดไปล่างสุด

ผลลัพธ์จะเหมือนกันทุกประการ:

กฎข้อเดียว

หากไม่จำเป็นต้องเลือกปลาในบล็อกแยกต่างหากสำหรับการปรับแต่งในภายหลัง สามารถเขียนทั้งภาพใหม่ได้ด้วยกฎง่ายๆ ข้อเดียว:

รูปแบบ:
.sample3 .sea (ความสูง: 300px; ความกว้าง: 480px; ตำแหน่ง: ญาติ; background-image: url ("media / fishing.svg"), url ("media / mermaid.svg"), url ("media / fish. svg "), url (" media / sea.png "); background-position: บนขวา 10px, ล่างซ้าย, 30px 90px, ซ้ายบน; background-repeat: no-repeat, repeat-x;)

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

ในกรณีนี้ จะเทียบเท่ากับคำอธิบายนี้:
พื้นหลัง-ซ้ำ: ไม่ซ้ำ, ทำซ้ำ-x, ไม่ซ้ำ, ซ้ำ-x;

ยิ่งสั้น

หากคุณจำ CSS 2.1 ได้ จะกำหนดความสามารถในการอธิบายภาพพื้นหลังในลักษณะที่กระชับ แล้วหลายภาพล่ะ? นอกจากนี้ยังเป็นไปได้:

ตัวอย่างที่ 4 .sea (ความสูง: 300px ความกว้าง: 480px ตำแหน่ง: ญาติ พื้นหลัง: url ("media / fishing.svg") ด้านบนขวา 10px no-repeat, url ("media / mermaid.svg") ล่างซ้าย repeat-x , url ("media / fish.svg") 30px 90px ไม่ซ้ำ, url ("media / sea.png") ทำซ้ำ-x;)

แต่โปรดทราบว่าตอนนี้คุณไม่สามารถข้ามค่าได้ (เว้นแต่จะตรงกับค่าเริ่มต้น) อย่างไรก็ตาม หากคุณต้องการกำหนดสีของภาพพื้นหลัง จะต้องทำในเลเยอร์สุดท้าย

ภาพไดนามิก

หากองค์ประกอบเป็นแบบคงที่หรือไดนามิกไม่เกินขึ้นอยู่กับขนาดของคอนเทนเนอร์ พื้นหลังหลายอันจะทำให้การออกแบบเพจง่ายขึ้นอย่างเห็นได้ชัด แต่ถ้าคุณต้องการทำงานกับแต่ละองค์ประกอบขององค์ประกอบอย่างอิสระจากจาวาสคริปต์ (ย้าย เลื่อน ฯลฯ)
นี่คือตัวอย่างจากชีวิตจริง - ธีมที่มีดอกแดนดิไลอันในยานเดกซ์:


หากคุณขุดลงไปในรหัส คุณจะเห็นสิ่งนี้:
...

บล็อกที่มีคลาส "b-fluff-bg", "b-fluff__cloud" และ "b-fluff__item" มีภาพพื้นหลังที่ทับซ้อนกัน ยิ่งไปกว่านั้น พื้นหลังที่มีเมฆจะเลื่อนไปเรื่อย ๆ และดอกแดนดิไลออนก็บินผ่านหน้าจอ

สามารถเขียนใหม่โดยใช้พื้นหลังหลายอันได้หรือไม่ โดยหลักการแล้วใช่ แต่ให้ 1) รองรับคุณสมบัตินี้ในเบราว์เซอร์เป้าหมายและ ... 2) อ่านต่อ;)

ฉันจะเพิ่มลำโพงในหลายพื้นหลังได้อย่างไร ในสถานการณ์เช่นนี้ จะสะดวกกว่าในมุมมองภายใน เบราว์เซอร์จะกระจายพารามิเตอร์แต่ละรายการของภาพพื้นหลังตามกฎที่เหมาะสม ตัวอย่างเช่น สำหรับการจัดตำแหน่งจะมี "ตำแหน่งพื้นหลัง" และสำหรับการชดเชย คุณจะต้องเปลี่ยนเท่านั้น อย่างไรก็ตาม มีค่าใช้จ่ายสำหรับการใช้รูปภาพหลายรูป - กฎนี้ (และกฎที่คล้ายกัน) ต้องระบุตำแหน่งสำหรับพื้นหลังทั้งหมดที่ตั้งไว้สำหรับบล็อกของคุณ และคุณไม่สามารถเลือกได้

หากต้องการเพิ่มแอนิเมชั่นให้กับพื้นหลังด้วยปลา คุณสามารถใช้รหัสต่อไปนี้:
$ (เอกสาร) .ready (ฟังก์ชัน () (var sea = $ (". sample5 .sea"); var fishesX = 30; var fishesY = 90; var fishX = 0; var fishY = 0; var mermaidX = 0; var t = 0; ฟังก์ชัน animationLoop () (fishesY = 90 + Math.floor (30 * Math.sin (t ++ / 180.0)); if (- fishesX< 0) fishesX = 480; mermaidX += 0.5; if(mermaidX >480) นางเงือกX = 0; ปลาY = -10 + (10 * Math.cos (t * 0.091)); ปลาX = 10 + (5 * Math.sin (t * 0.07)); sea.style.backgroundPosition = "top" + fishY + "px right" + fishX + "px" + mermaidX + "px bottom" + fishesX + "px" + fishesY + "px, ซ้ายบน"; window.requestAnimFrame (animationLoop); ) animationLoop (); ));
ที่ไหน
window.requestAnimFrame = (ฟังก์ชัน () (return window.requestAnimationFrame || window.msRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.webkitRequestAnimationFrame || (ฟังก์ชัน (โทรกลับ)) (60 );));) );

และอีกอย่าง แอนิเมชั่นสามารถทำได้ผ่านการเปลี่ยน CSS3 / แอนิเมชั่น แต่นี่เป็นหัวข้อสำหรับการสนทนาแยกต่างหาก

Parallax และโต้ตอบ

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

ภาพพื้นหลังหลายภาพมีประโยชน์ในสถานการณ์เช่นนี้ เนื่องจากในขณะที่เรากำลังพูดถึงแต่พื้นหลังเท่านั้น (ไม่ใช่เนื้อหา) การใช้ภาพเหล่านี้จะช่วยให้คุณหลีกเลี่ยงไม่ให้โค้ด html และ DOM ยุ่งเหยิง แต่ทุกอย่างต้องแลกมาด้วยราคา: ฉันไม่สามารถเข้าถึงองค์ประกอบแต่ละองค์ประกอบด้วยชื่อ รหัส คลาส หรือพารามิเตอร์อื่นๆ ฉันต้องจำลำดับขององค์ประกอบในองค์ประกอบในโค้ดให้ชัดเจน และสำหรับการเปลี่ยนแปลงพารามิเตอร์ขององค์ประกอบใดๆ แต่ละครั้ง อันที่จริง ฉันต้องกาวบรรทัดที่อธิบายค่าของพารามิเตอร์นี้สำหรับองค์ประกอบทั้งหมดและอัปเดต องค์ประกอบทั้งหมด

Sea.style.backgroundPosition = "top" + fishY + "px right" + fishX + "px," + mermaidX + "px bottom" + fishesX + "px" + fishesY + "px, ซ้ายบน";

ฉันแน่ใจว่าสิ่งนี้สามารถหุ้มด้วยโค้ดจาวาสคริปต์ที่สะดวก ซึ่งจะควบคุมการจำลองเสมือนของความสัมพันธ์กับแต่ละเลเยอร์ ในขณะที่ปล่อยให้โค้ด html ของหน้าสะอาดที่สุด

ความเข้ากันได้คืออะไร?

เบราว์เซอร์ยอดนิยมเวอร์ชันใหม่ทั้งหมด รวมถึง IE9 + รองรับหลายภาพ (คุณสามารถตรวจสอบได้ เช่น caniuse)

คุณยังสามารถใช้ Modernizr เพื่อจัดเตรียมเบราว์เซอร์ที่ไม่สนับสนุนพื้นหลังหลายแบบพร้อมทางเลือกอื่น ตามที่ Chris Coyier เขียนไว้ในบันทึกของเขาเกี่ยวกับลำดับเลเยอร์เมื่อใช้พื้นหลังหลายอัน ให้ทำดังนี้:

เนื้อหา Multiplebgs (/ * การประกาศ BG หลายอันที่ยอดเยี่ยมที่อยู่เหนือความเป็นจริงและลูกไก่ที่ไร้เหตุผล * /) .no-multiplebgs เนื้อหา (/ * laaaaaame fallback * /)
หากคุณสับสนเกี่ยวกับการใช้ JS เพื่อจัดเตรียมความเข้ากันได้แบบย้อนหลัง คุณสามารถประกาศพื้นหลังได้สองครั้ง อย่างไรก็ตาม สิ่งนี้ก็มีข้อเสียในรูปแบบของการโหลดทรัพยากรสองครั้งที่เป็นไปได้ (ขึ้นอยู่กับการนำการประมวลผล css ไปใช้งานในเบราว์เซอร์เฉพาะ):

/ * หลาย bg สำรอง * / พื้นหลัง: # 000 url (...) ...; / * การประกาศ BG หลายอันที่ยอดเยี่ยมซึ่งอยู่เหนือความเป็นจริงและลูกไก่ที่ไม่มีตัวตน * / URL พื้นหลัง (... ), url (... ), url (... ), # 000 url (... );

หากคุณได้เริ่มคิดเกี่ยวกับ Windows 8 แล้ว โปรดทราบว่าคุณสามารถใช้พื้นหลังได้หลายแบบเมื่อพัฒนาแอปพลิเคชันสไตล์เมโทร เนื่องจากมีการใช้เอ็นจิ้นเดียวกันภายในเช่นเดียวกับใน IE10

ป.ล. ในหัวข้อ: ฉันอดไม่ได้ที่จะจำบทความมหัศจรรย์เกี่ยวกับเรื่องนี้ได้