วิธีสร้างการออกแบบ 3 มิติด้วยคุณสมบัติการแปลง CSS3

เผยแพร่แล้ว: 2023-03-16

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

การแปลงร่าง 3 มิติอาจมีรายละเอียดค่อนข้างมาก และอาจซับซ้อนขึ้นได้หากมีชิ้นส่วนต่างๆ จำนวนมากรวมกัน ดังนั้นการเริ่มต้นด้วยองค์ประกอบพื้นฐานจึงมีประโยชน์ แนวคิดเหล่านี้บางส่วนอาจดูคุ้นเคย แต่ "z" เป็นสิ่งที่จะดูใหม่เมื่อทำงานในรูปแบบ 3 มิติ การแปลง 3 มิติขยายการแปลง CSS 2 มิติให้รวมแกน z ทำให้สามารถแปลงองค์ประกอบ DOM เป็น 3 มิติได้

แกน Z คืออะไร?

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

ภาพประกอบแทนแกน X, Y และ Z

ตัวอย่างการแปลง 3 มิติ

คุณสมบัติพื้นฐานสำหรับการแปลงร่าง 3 มิติ ได้แก่ translate3d , scale3d , rotateX , rotateY , rotateZ , perspective และ matrix3d อาร์กิวเมนต์เพิ่มเติมรวมอยู่ใน translate3d , scale3d และ matrix3d ​​เนื่องจากใช้อาร์กิวเมนต์สำหรับ x, y และ z คุณสมบัติมาตราส่วนใช้ค่าสำหรับมุมและเปอร์สเปคทีฟยังใช้ค่าเดียว

แปลภาษา

แปลZ()

กำหนดการแปล 3 มิติโดยใช้ค่าแกน z เท่านั้น คุณอาจจำการแปล x และ y จากการแปลแบบ 2 มิติ แนวคิดนี้เหมือนกันกับ translateX() , translateY() และ translateZ() เพราะแต่ละค่าใช้ค่าความยาวที่ย้ายองค์ประกอบตามระยะทางที่ระบุตามแกนที่ถูกต้อง

3d-design-translate-z

ในตัวอย่างนี้ translateZ(-20px) จะย้ายองค์ประกอบออกห่างจากตัวแสดง 20 พิกเซล

นี่คือข้อมูลโค้ดเพื่อสร้างตัวอย่างนี้:

 -webkit-transform: translateZ(-20px); -ms-transform: translateZ(-20px); transform: translateZ(-20px);

แปล3d()

ฟังก์ชัน translate3d() ใช้เพื่อย้ายตำแหน่งขององค์ประกอบในพื้นที่ 3 มิติ การแปลงนี้สร้างขึ้นโดยการระบุพิกัดที่กำหนดการเคลื่อนที่ในแต่ละทิศทาง

transform: translate3d(20px, -15px, 70px); ย้ายรูปภาพ 20 พิกเซลไปตามแกน x บวก 15 พิกเซลบนแกน y ลบ จากนั้น 70 พิกเซลไปตามแกน z บวก

3d-ออกแบบ-แปล-3d

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

 -webkit-transform: translate3d(20px, -15px, 70px); -ms-transform: translate3d(20px, -15px, 70px); transform: translate3d(20px, -15px, 70px);

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

3d-design-translate-3d-perspective
คุณสมบัติเปอร์สเป็คทีฟถูกเพิ่มให้กับตัวอย่างนี้

หมุน

ฟังก์ชัน rotate3d() จะหมุนองค์ประกอบในพื้นที่ 3 มิติตามมุมที่กำหนดรอบแกน สิ่งนี้สามารถเขียนเป็น rotate(x, y, z, angle)

หมุน X()

ค่าพิกเซลใช้ไม่ได้ที่นี่ ต้องเป็นองศา เมธอด rotateX() จะหมุนองค์ประกอบรอบแกน x ตามองศาที่กำหนด ดูว่าสี่เหลี่ยมผืนผ้าสั้นลงอย่างไร? กำลังหมุนไปตามแกน x ตัวอย่างนี้แสดงการหมุนที่ 55 องศา

3d-ออกแบบ-หมุน-x
 -ms-transform: rotateX(55deg); /* IE 9 */ -webkit-transform: rotateX(55deg); /* Safari */ transform: rotateX(55deg);

หมุนY()

เมธอด rotateY() จะหมุนองค์ประกอบรอบแกน y สังเกตว่าสี่เหลี่ยมผืนผ้าด้านล่างไม่กว้างเท่าด้านบน? มันถูกหมุนเพื่อให้ดูเหมือนไม่กว้างเท่าสี่เหลี่ยมผืนผ้าด้านบน เพราะมันกำลังหมุนไป 60 องศา

3d-ออกแบบ-หมุน-y
 -ms-transform: rotateY(60deg); /* IE 9 */ -webkit-transform: rotateY(60deg); /* Safari */ transform: rotateY(60deg);

หมุนZ()

เมธอด rotateZ() จะหมุนองค์ประกอบรอบแกน z ตามองศาที่กำหนด ในกรณีนี้ ค่าคือ 120 องศา

3d-ออกแบบ-หมุน-z
 -ms-transform: rotateZ(120deg); /* IE 9 */ -webkit-transform: rotateZ(120deg); /* Safari */ transform: rotateZ(120deg);

หมุน 3 มิติ ()

ฟังก์ชัน rotate3d(1, -1, 1, 45deg) หมุนภาพตามแกน y เป็นมุม 45 องศา โปรดทราบว่าคุณสามารถใช้ค่าลบเพื่อหมุนองค์ประกอบไปในทิศทางตรงกันข้ามได้

3d-ออกแบบ-หมุน-3d

เนื่องจากสิ่งนี้ซับซ้อนกว่าข้อกำหนดเฉพาะของแกนเดียว ดังนั้น rotate3d จึงแยกย่อยได้ดังนี้: rotate3d(x,y,z,angle) โดยที่ x=1, y=-1, z=1 และมุมการหมุน = 45 องศา .

รหัสสำหรับสไตล์นี้มีลักษณะดังนี้:

 -ms-transform: rotate3d(1, -1, 1, 45deg); /* IE 9 */ -webkit-transform: rotate3d(1, -1, 1, 45deg); /* Safari */ transform: rotate3d(1, -1, 1, 45deg);

การทดสอบพื้นฐาน

ตามเข็มนาฬิกาตามแนวแกน x 45 องศา

หมุน-3d-ตามเข็มนาฬิกา-แกน x-45 องศา
 transform: rotate3d(1, 0, 0, 45deg);

ตามเข็มนาฬิกาตามแนวแกน y 45 องศา

หมุนตามเข็มนาฬิกาตามแกน y-45 องศา
 transform: rotate3d(0, 1, 0, 45deg);

ตามเข็มนาฬิกาตามแกน z 45 องศา

3d-design-clockwise-z-axis-45-deg
 transform: rotate3d(0, 0, 1, 45deg);

เป็นมูลค่าการกล่าวขวัญว่าบางครั้งการหมุนจะไม่สังเกตเห็นได้ขึ้นอยู่กับค่าที่ระบุ ตัวอย่างเช่น สิ่งนี้จะไม่สังเกตเห็น: transform: rotate3d(0, 0, 0, 50deg);

ทัศนคติ

นี่อาจเป็นการเปลี่ยนแปลงที่มี "มิติ" มากที่สุด นี่คือที่ที่คุณจะได้รับมุมมองอย่างแท้จริง หากคุณใช้การแปลงแบบ 3 มิติกับองค์ประกอบโดยไม่ได้ตั้งค่าเปอร์สเปคทีฟ เอฟเฟกต์ที่ได้จะไม่ปรากฏเป็นสามมิติ นี่คือสิ่งที่สามารถเพิ่มลงในคุณสมบัติด้านบนได้เช่นกัน

ในการเปิดใช้งานพื้นที่ 3 มิติ องค์ประกอบต้องมีมุมมอง สามารถใช้ได้สองวิธี: โดยใช้คุณสมบัติ transform หรือคุณสมบัติเปอร์ perspective

คุณสมบัติ transform จะมีลักษณะดังนี้: transform: perspective(600px); และคุณสมบัติเปอร์สเปคทีฟจะมีลักษณะดังนี้: perspective: 600px; .

ตัวอย่างต่อไปนี้จะมีการเปลี่ยนแปลงระหว่างทั้งสอง ดังนั้นอย่าลืมดูโค้ดอย่างใกล้ชิด

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

ตำแหน่งของจุดที่หายไปสามารถปรับแต่งได้เช่นกัน เป็นสิ่งที่ควรค่าแก่การกล่าวถึงและการทดลองอีกมาก เนื่องจากเกี่ยวข้องกับมุมมองของ CSS ตามค่าเริ่มต้น จุดที่หายไปของพื้นที่ 3 มิติจะอยู่ที่กึ่งกลาง ใช้คุณสมบัติจุดกำเนิดมุมมองเพื่อเปลี่ยนตำแหน่งของจุดที่หายไป มันจะมีลักษณะดังนี้: perspective-origin: 15% 55%

มุมมองการออกแบบ 3 มิติ
ตัวอย่างด้านซ้ายตั้งค่าไว้ที่ประมาณ 800px มุมมองทางด้านขวาดูรุนแรงกว่ามาก โดยตั้งค่าเป็น 200px

มาตราส่วน

สเกลZ()

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

เพื่อให้เข้าใจมาตราส่วน (Z) อย่างถ่องแท้ ลองเล่นกับค่าแล้วคุณจะเห็นมุมมองที่ "คมชัดขึ้น" ด้วยค่าที่มากขึ้น

3d-ออกแบบขนาด-z
ตัวอย่างทางซ้ายมีค่า 2 และตัวอย่างทางขวามีค่า 8

สเกล3d(x,y,z)

ฟังก์ชัน scale3d() เปลี่ยนขนาดขององค์ประกอบและเขียนเป็น scale(x, y, z) เช่นเดียวกับ scaleZ มันไม่ชัดเจนว่าเปอร์สเป็คทีฟมีลักษณะอย่างไรเว้นแต่จะใช้กับ perspective

3d-ออกแบบขนาด-3d

ตัวอย่างนี้ใช้สิ่งนี้:

 -ms-transform: perspective(500px) scale3d(0.8, 2, 0.2); /* IE 9 */ -webkit-transform: perspective(500px) scale3d(0.8, 2, 0.2); /* Safari */ transform: perspective(500px) scale3d(0.8, 2, 0.2);

หมายเหตุโดยย่อ: หากพิกัดทั้งสามของเวกเตอร์เท่ากัน สเกลจะสม่ำเสมอและจะไม่มีความแตกต่างที่เห็นได้ชัดเจน

 transform: scale3d(1, 1, 1); /* unchanged */ transform: scale3d(2, 2, 2); /* twice the original size */

เมทริกซ์ 3d()

เมทริกซ์ 2 มิติรับได้ 6 ค่า ในขณะที่เมทริกซ์ 3 มิติรับได้ 16 (เมทริกซ์ 4×4)! มันจะเป็นโพสต์ที่ยาวมากหากรายละเอียดทั้งหมดครอบคลุม ดังนั้นหากคุณต้องการสำรวจแนวคิดนี้เพิ่มเติม ฉันขอแนะนำการทดลอง matrix3d ​​แบบโต้ตอบนี้บน Codepen

3d-เมทริกซ์

นี่ matrix3d(a, b, 0, 0, c, d, 0, 0, 0, 0, 1, 0, tx, ty, 0, 1)

วิธีสร้าง
ภาพเคลื่อนไหวพร้อมการแปลง 3 มิติ

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

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

วิธีสร้างการพลิกการ์ด

ใครไม่ชอบเล่นไพ่? ตัวอย่างนี้มีการ์ดสองด้านและคุณสามารถดูทั้งสองด้านได้โดยการพลิกการ์ดด้วยการแปลงร่าง หากคุณดูที่แท็ก body เอฟเฟกต์ส่วนใหญ่มาจากคุณสมบัติเปอร์ perspective กำหนดเป็น 500px ค่าที่ต่ำกว่าเช่น 100px จะดู "เบ้" มาก

นี่คือ HTML เริ่มต้น:

 <div class="wrapper"> div class="side-one"></div> <div class="side-two"></div> </div>

CSS คือสิ่งที่ทำให้มันเกิดขึ้น:

 body { -webkit-perspective: 500px; perspective: 500px; } .wrapper { -webkit-transition: all 1s ease-in; transition: all 1s ease-in; -webkit-transform-style: preserve-3d; transform-style: preserve-3d; position: relative; margin: 100px auto; width: 250px; height: 250px; cursor: pointer; } .wrapper div { position: absolute; -webkit-backface-visibility: hidden; backface-visibility: hidden; width: 100%; height: 100%; border-radius: 10px; background-position: 50% 50%; background-size: 150px; background-repeat: no-repeat; box-shadow: inset 0 0 45px rgba(255,255,255,.3), 0 12px 20px -10px rgba(0,0,0,.4); color: #FFF; text-align: center; text-shadow: 0 1px rgba(0,0,0,.3); } .side-one { z-index: 400; background: #50c6db url(image.png); } .side-two { -webkit-transform: rotateY(-180deg); transform: rotateY(-180deg); background: #ef4e65 url(image.png); } .wrapper:hover { -webkit-transform: rotateY(-1turn); transform: rotateY(-1turn); }
3d-design-animation-หนึ่งตัวอย่าง

สามารถพบได้ใน Codepen

หากคุณยังใหม่กับการแปลงร่าง สิ่งนี้อาจดูน่าสนใจสำหรับคุณ: transform: rotate(1turn); หน่วยนี้เหมาะสำหรับการ์ดของเราเพราะหน่วย "เลี้ยว" มีลักษณะเหมือนวงกลมหนึ่งวง

ฉันยังใช้การค่อยๆ เปลี่ยนเพื่อสร้างวิธีการปั่นแบบกำหนดเอง สิ่งนี้สำเร็จได้ด้วย transition: all 1s ease-in; .

คุณสมบัติ 3D อื่นในตัวอย่างข้อมูล transform-style: preserve-3d; . การรวมสิ่งนี้จะช่วยให้องค์ประกอบ "แกว่ง" ในพื้นที่สามมิติแทนที่จะอยู่กับองค์ประกอบหลัก

วิธีสร้างข้อความด้วยเอฟเฟกต์ 3 มิติ

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

เอฟเฟกต์ข้อความ 3 มิติ

HTML ค่อนข้างง่าย:

 <div class="container"> <div class="text-wrapper"> <div class="text">New York City</div> </div> </div>

นี่คือ CSS พื้นฐาน:

 .container{ -webkit-perspective: 600; } .text { transform: rotate3d(2, 2, .5, 22deg)translate3d(100px, 0px, 0px); }

CSS แบบละเอียดและตัวอย่างเพิ่มเติมสามารถพบได้ใน Codepen

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