ฟังก์ชันตรีโกณมิติ CSS มาแล้ว! ถ้าคุณใช้ Firefox และ Safari เวอร์ชันล่าสุด นั่นคือ การมีพลังทางคณิตศาสตร์แบบนี้ใน CSS ทำให้เกิดความเป็นไปได้มากมาย ในบทช่วยสอนนี้ ฉันคิดว่าเราจะจุ่มเท้าลงไปในน้ำเพื่อทำความเข้าใจกับฟังก์ชันใหม่สองสามอย่าง: sin()
และ cos()
.
มีฟังก์ชันตรีโกณมิติอื่น ๆ ในไปป์ไลน์ — รวมถึง tan()
- เหตุใดจึงมุ่งเน้นไปที่ sin()
และ cos()
? พวกมันเหมาะกับแนวคิดที่ผมคิดไว้ นั่นคือการวางข้อความตามขอบของวงกลม ซึ่งได้รับการกล่าวถึงที่นี่ใน CSS-Tricks เมื่อ Chris แบ่งปันแนวทางที่ใช้ Sass mixin. นั่นมันเมื่อหกปีก่อน งั้นเรามารักษาขอบเลือดออกกันเถอะ
นี่คือสิ่งที่ฉันมีในใจ อีกครั้ง รองรับเฉพาะใน Firefox และ Safari ในขณะนี้:
ดังนั้น จึงไม่เหมือนกับคำที่สร้างรูปทรงกลม แต่เรากำลังวางอักขระข้อความตามวงกลมเพื่อสร้างหน้าปัดนาฬิกา ต่อไปนี้คือมาร์กอัปบางส่วนที่เราสามารถใช้เพื่อเริ่มต้นสิ่งต่างๆ ได้:
<div class="clock"> <div class="clock-face"> <time datetime="12:00">12</time> <time datetime="1:00">1</time> <time datetime="2:00">2</time> <time datetime="3:00">3</time> <time datetime="4:00">4</time> <time datetime="5:00">5</time> <time datetime="6:00">6</time> <time datetime="7:00">7</time> <time datetime="8:00">8</time> <time datetime="9:00">9</time> <time datetime="10:00">10</time> <time datetime="11:00">11</time> </div>
</div>
ต่อไป ต่อไปนี้เป็นสไตล์พื้นฐานบางอย่างสำหรับ .clock-face
คอนเทนเนอร์. ฉันตัดสินใจที่จะใช้ <time>
แท็กด้วย datetime
คุณลักษณะ
.clock { --_ow: clamp(5rem, 60vw, 40rem); --_w: 88cqi; aspect-ratio: 1; background-color: tomato; border-radius: 50%; container-type: inline; display: grid; height: var(--_ow); place-content: center; position: relative; width var(--_ow);
}
ฉันตกแต่งสิ่งต่าง ๆ เล็กน้อย แต่เพื่อให้ได้รูปร่างพื้นฐานและสีพื้นหลังเพื่อช่วยให้เราเห็นสิ่งที่เรากำลังทำอยู่ สังเกตว่าเราบันทึก width
ค่าใน ตัวแปร CSS. เราจะใช้มันในภายหลัง ยังไม่มีอะไรให้ดูมากนัก:
ดูเหมือนการทดลองศิลปะสมัยใหม่บางอย่างใช่ไหม? มาแนะนำตัวแปรใหม่ --_r
เพื่อจัดเก็บวงกลม รัศมีซึ่งเท่ากับครึ่งหนึ่งของความกว้างของวงกลม ด้วยวิธีนี้หากความกว้าง (--_w
) การเปลี่ยนแปลง ค่ารัศมี (--_r
) จะอัปเดตด้วย — ขอบคุณฟังก์ชันคณิตศาสตร์ CSS อื่น calc()
:
.clock { --_w: 300px; --_r: calc(var(--_w) / 2); /* rest of styles */
}
ตอนนี้บิตของคณิตศาสตร์ วงกลมคือ 360 องศา เรามี 12 ป้ายกำกับบนนาฬิกาของเรา ดังนั้นต้องการวางตัวเลขทุกๆ 30 องศา (360 / 12
). ในดินแดนคณิตศาสตร์ วงกลมเริ่มต้นที่ 3 นาฬิกา ดังนั้นเที่ยงจริง ลบ 90 องศา จากนั้นซึ่งเท่ากับ 270 องศา (360 - 90
).
ลองเพิ่มตัวแปรอื่น --_d
ที่เราสามารถใช้ตั้งค่า ระดับ ค่าของแต่ละตัวเลขบนหน้าปัดนาฬิกา เราจะเพิ่มค่าขึ้น 30 องศาเพื่อทำให้วงกลมของเราสมบูรณ์:
.clock time:nth-child(1) { --_d: 270deg; }
.clock time:nth-child(2) { --_d: 300deg; }
.clock time:nth-child(3) { --_d: 330deg; }
.clock time:nth-child(4) { --_d: 0deg; }
.clock time:nth-child(5) { --_d: 30deg; }
.clock time:nth-child(6) { --_d: 60deg; }
.clock time:nth-child(7) { --_d: 90deg; }
.clock time:nth-child(8) { --_d: 120deg; }
.clock time:nth-child(9) { --_d: 150deg; }
.clock time:nth-child(10) { --_d: 180deg; }
.clock time:nth-child(11) { --_d: 210deg; }
.clock time:nth-child(12) { --_d: 240deg; }
ตกลง ตอนนี้เป็นเวลาที่จะทำให้มือของเราสกปรกด้วย sin()
และ cos()
ฟังก์ชั่น! สิ่งที่เราต้องการทำคือใช้มันเพื่อรับพิกัด X และ Y สำหรับแต่ละตัวเลข เพื่อให้เราวางมันไว้รอบๆ หน้าปัดนาฬิกาได้อย่างเหมาะสม
สูตรสำหรับพิกัด X คือ radius + (radius * cos(degree))
. ลองเสียบเข้ากับใหม่ของเรา --_x
ตัวแปร:
--_x: calc(var(--_r) + (var(--_r) * cos(var(--_d))));
สูตรสำหรับพิกัด Y คือ radius + (radius * sin(degree))
. เรามีสิ่งที่เราต้องคำนวณคือ:
--_y: calc(var(--_r) + (var(--_r) * sin(var(--_d))));
มีการดูแลทำความสะอาดบางอย่างที่เราต้องทำเพื่อตั้งค่าตัวเลข ดังนั้นเรามาจัดรูปแบบพื้นฐานให้พวกมันเพื่อให้แน่ใจว่าพวกมันอยู่ในตำแหน่งที่ถูกต้องและอยู่ในพิกัดของเรา:
.clock-face time { --_x: calc(var(--_r) + (var(--_r) * cos(var(--_d)))); --_y: calc(var(--_r) + (var(--_r) * sin(var(--_d)))); --_sz: 12cqi; display: grid; height: var(--_sz); left: var(--_x); place-content: center; position: absolute; top: var(--_y); width: var(--_sz);
}
แจ้งให้ทราบ --_sz
ซึ่งเราจะใช้สำหรับ width
และ height
ของตัวเลขในชั่วพริบตา มาดูกันว่าเรามีอะไรบ้าง
มันดูเหมือนนาฬิกามากกว่าแน่นอน! ดูว่ามุมซ้ายบนของแต่ละตัวเลขวางในตำแหน่งที่ถูกต้องรอบวงกลมได้อย่างไร? เราจำเป็นต้อง "ย่อ" รัศมีเมื่อคำนวณตำแหน่งของตัวเลขแต่ละตัว เราสามารถ หัก ขนาดของตัวเลข (--_sz
) จากขนาดของวงกลม (--_w
) ก่อนที่เราจะคำนวณรัศมี:
--_r: calc((var(--_w) - var(--_sz)) / 2);
ดีกว่ามาก! มาเปลี่ยนสีเพื่อให้ดูหรูหรายิ่งขึ้น:
เราสามารถหยุดที่นี่! เราบรรลุเป้าหมายในการวางข้อความรอบวงกลมแล้วใช่ไหม แต่นาฬิกาที่ไม่มีแขนแสดงชั่วโมง นาที และวินาทีคืออะไร?
ลองใช้แอนิเมชั่น CSS เดียวเพื่อสิ่งนั้น ขั้นแรก ให้เพิ่มองค์ประกอบอีกสามรายการในมาร์กอัปของเรา
<div class="clock"> <!-- after <time>-tags --> <span class="arm seconds"></span> <span class="arm minutes"></span> <span class="arm hours"></span> <span class="arm center"></span>
</div>
จากนั้นมาร์กอัปทั่วไปสำหรับแขนทั้งสาม อีกครั้ง ส่วนใหญ่เป็นเพียงให้แน่ใจว่าแขนอยู่ในตำแหน่งที่ถูกต้องและวางไว้ตามนั้น:
.arm { background-color: var(--_abg); border-radius: calc(var(--_aw) * 2); display: block; height: var(--_ah); left: calc((var(--_w) - var(--_aw)) / 2); position: absolute; top: calc((var(--_w) / 2) - var(--_ah)); transform: rotate(0deg); transform-origin: bottom; width: var(--_aw);
}
เราจะใช้ไฟล์ ภาพเคลื่อนไหวเดียวกัน สำหรับแขนทั้งสาม:
@keyframes turn { to { transform: rotate(1turn); }
}
ข้อแตกต่างเพียงอย่างเดียวคือเวลาที่แขนแต่ละข้างใช้ในการหมุนเต็มที่ สำหรับ แขนชั่วโมงมันต้องใช้ ชั่วโมง 12 เพื่อให้เลี้ยวได้เต็มที่ เดอะ animation-duration
คุณสมบัติยอมรับค่าในหน่วยมิลลิวินาทีและวินาทีเท่านั้น ติดกับวินาทีซึ่งก็คือ 43,200 วินาที (60 seconds * 60 minutes * 12 hours
).
animation: turn 43200s infinite;
มันต้องใช้เวลา 1 ชั่วโมง สำหรับ แขนนาที เพื่อให้เลี้ยวได้เต็มที่ แต่เราต้องการให้สิ่งนี้เป็น แอนิเมชั่นหลายขั้นตอน ดังนั้นการเคลื่อนไหวระหว่างแขนจึงเซมากกว่าเป็นเส้นตรง เราต้องการ 60 ก้าว หนึ่งก้าวต่อนาที:
animation: turn 3600s steps(60, end) infinite;
พื้นที่ แขนวินาที is เกือบจะเหมือน เป็นแขนนาที แต่ระยะเวลาคือ 60 วินาทีแทนที่จะเป็น 60 นาที:
animation: turn 60s steps(60, end) infinite;
มาอัปเดตคุณสมบัติที่เราสร้างในรูปแบบทั่วไป:
.seconds { --_abg: hsl(0, 5%, 40%); --_ah: 145px; --_aw: 2px; animation: turn 60s steps(60, end) infinite;
}
.minutes { --_abg: #333; --_ah: 145px; --_aw: 6px; animation: turn 3600s steps(60, end) infinite;
}
.hours { --_abg: #333; --_ah: 110px; --_aw: 6px; animation: turn 43200s linear infinite;
}
ถ้าเราต้องการเริ่ม ณ เวลาปัจจุบันล่ะ? เราต้องการ JavaScript เล็กน้อย:
const time = new Date();
const hour = -3600 * (time.getHours() % 12);
const mins = -60 * time.getMinutes();
app.style.setProperty('--_dm', `${mins}s`);
app.style.setProperty('--_dh', `${(hour+mins)}s`);
ฉันได้เพิ่ม id="app"
ไปที่หน้าปัดนาฬิกาและตั้งค่าคุณสมบัติที่กำหนดเองใหม่สองรายการซึ่งตั้งค่าลบ animation-delay
เหมือนที่ Mate Marschalko ทำ เมื่อเขาแชร์นาฬิกาที่ใช้ CSS เท่านั้น. getHours()
วิธีการของ JavaScipt Date
วัตถุกำลังใช้รูปแบบ 24 ชั่วโมง ดังนั้นเราจึงใช้ remainder
ผู้ประกอบการ เพื่อแปลงเป็นรูปแบบ 12 ชั่วโมง
ใน CSS เราต้องเพิ่ม animation-delay
เช่นกัน:
.minutes { animation-delay: var(--_dm, 0s); /* other styles */
} .hours { animation-delay: var(--_dh, 0s); /* other styles */
}
อีกสิ่งหนึ่ง การใช้ CSS @supports
และพร็อพเพอร์ตี้ที่เราสร้างไว้แล้ว เราสามารถจัดเตรียมทางเลือกสำรองให้กับเบราว์เซอร์ที่ไม่สนับสนุน sin()
และ cos()
. (ขอบคุณ Temani Afif!):
@supports not (left: calc(1px * cos(45deg))) {
time {
left: 50% !important;
top: 50% !important;
transform: translate(-50%,-50%) rotate(var(--_d)) translate(var(--_r)) rotate(calc(-1*var(--_d)))
}
}
และ voila! นาฬิกาของเราเสร็จแล้ว! นี่คือการสาธิตครั้งสุดท้ายอีกครั้ง อีกครั้ง รองรับเฉพาะใน Firefox และ Safari ในขณะนี้
เราจะทำอะไรได้อีก?
แค่ทำนู่นทำนี่ แต่เราสามารถเปลี่ยนนาฬิกาของเราให้เป็นแกลเลอรีรูปภาพแบบวงกลมได้อย่างรวดเร็วด้วยการแทนที่ <time>
แท็กกับ <img>
จากนั้นอัปเดตความกว้าง (--_w
) และรัศมี (--_r
) ค่า:
มาลองกันอีกครั้ง ฉันได้กล่าวไว้ก่อนหน้านี้ว่านาฬิกาดูเหมือนการทดลองศิลปะสมัยใหม่อย่างไร เราสามารถพึ่งพาสิ่งนั้นและสร้างรูปแบบที่ฉันเห็นบนโปสเตอร์ (ซึ่งฉันไม่ได้ซื้อ) ในหอศิลป์เมื่อวันก่อน เมื่อฉันจำได้ว่ามันถูกเรียกว่า "ดวงจันทร์" และประกอบด้วยจุดมากมายรวมกันเป็นวงกลม
ครั้งนี้เราจะใช้รายการแบบไม่เรียงลำดับ เนื่องจากแวดวงไม่เป็นไปตามลำดับเฉพาะ เราจะไม่ใส่รายการทั้งหมดลงในมาร์กอัปด้วยซ้ำ แทนที่จะใส่ JavaScript และเพิ่มการควบคุมบางอย่างที่เราสามารถใช้เพื่อจัดการกับผลลัพธ์สุดท้าย
ส่วนควบคุมคืออินพุตช่วง (<input type="range">)
ซึ่งเราจะห่อด้วย <form>
และฟังสำหรับ input
เหตุการณ์
<form id="controls"> <fieldset> <label>Number of rings <input type="range" min="2" max="12" value="10" id="rings" /> </label> <label>Dots per ring <input type="range" min="5" max="12" value="7" id="dots" /> </label> <label>Spread <input type="range" min="10" max="40" value="40" id="spread" /> </label> </fieldset>
</form>
เราจะเรียกใช้วิธีนี้กับ "อินพุต" ซึ่งจะสร้างกลุ่มของ <li>
องค์ประกอบที่มีระดับ (--_d
) ตัวแปรที่เราใช้ก่อนหน้านี้ใช้กับแต่ละตัวแปร เรายังสามารถปรับเปลี่ยนตัวแปรรัศมีของเรา (--_r
)
ฉันยังต้องการให้จุดเป็นสีต่างๆ งั้นเรามาสุ่มกัน (ไม่ใช่. อย่างสมบูรณ์ สุ่ม) ค่าสี HSL สำหรับแต่ละรายการและจัดเก็บเป็นตัวแปร CSS ใหม่ --_bgc
:
const update = () => { let s = ""; for (let i = 1; i <= rings.valueAsNumber; i++) { const r = spread.valueAsNumber * i; const theta = coords(dots.valueAsNumber * i); for (let j = 0; j < theta.length; j++) { s += `<li style="--_d:${theta[j]};--_r:${r}px;--_bgc:hsl(${random( 50, 25 )},${random(90, 50)}%,${random(90, 60)}%)"></li>`; } } app.innerHTML = s;
}
พื้นที่ random()
วิธีการเลือกค่าภายในช่วงของตัวเลขที่กำหนด:
const random = (max, min = 0, f = true) => f ? Math.floor(Math.random() * (max - min) + min) : Math.random() * max;
และนั่นแหล่ะ เราใช้ JavaScript เพื่อเรนเดอร์มาร์กอัป แต่ทันทีที่เรนเดอร์แล้ว เราก็ไม่ต้องการมันอีก เดอะ sin()
และ cos()
ฟังก์ชันต่างๆ ช่วยให้เราวางตำแหน่งจุดทั้งหมดให้ถูกจุด
ความคิดสุดท้าย
การวางสิ่งต่าง ๆ รอบวงกลมเป็นตัวอย่างพื้นฐานที่แสดงให้เห็นถึงพลังของฟังก์ชันตรีโกณมิติ เช่น sin()
และ cos()
. แต่มัน จริงๆ เยี่ยมมากที่เราได้รับฟีเจอร์ CSS สมัยใหม่ที่ให้โซลูชันใหม่ๆ สำหรับวิธีแก้ไขปัญหาแบบเก่า ฉันแน่ใจว่าเราจะได้เห็นกรณีการใช้งานที่น่าสนใจ ซับซ้อน และสร้างสรรค์มากขึ้น โดยเฉพาะอย่างยิ่งเมื่อมีการรองรับเบราว์เซอร์ใน Chrome และ Edge
- เนื้อหาที่ขับเคลื่อนด้วย SEO และการเผยแพร่ประชาสัมพันธ์ รับการขยายวันนี้
- เพลโตบล็อคเชน Web3 Metaverse ข่าวกรอง ขยายความรู้. เข้าถึงได้ที่นี่.
- ที่มา: https://css-tricks.com/creating-a-clock-with-the-new-css-sin-and-cos-trigonometry-functions/
- :เป็น
- $ ขึ้น
- 1
- 10
- 11
- 7
- 8
- 9
- 98
- a
- แน่นอน
- อย่างแน่นอน
- ยอมรับ
- คล่องแคล่ว
- ตาม
- จริง
- หลังจาก
- กับ
- ทั้งหมด
- แล้ว
- และ
- ภาพเคลื่อนไหว
- อื่น
- app
- ประยุกต์
- เข้าใกล้
- เป็น
- ARM
- รอบ
- ศิลปะ
- AS
- At
- พื้นหลัง
- ขั้นพื้นฐาน
- BE
- ก่อน
- ระหว่าง
- บิต
- ตกเลือด
- Bleeding Edge
- ปิดกั้น
- ด้านล่าง
- เบราว์เซอร์
- เบราว์เซอร์
- พวง
- ซื้อ
- by
- คำนวณ
- การคํานวณ
- ที่เรียกว่า
- CAN
- กรณี
- ศูนย์
- เปลี่ยนแปลง
- การเปลี่ยนแปลง
- อักขระ
- Chrome
- วงกลม
- วงกลม
- นาฬิกา
- สี
- ร่วมกัน
- สมบูรณ์
- ซับซ้อน
- ภาชนะ
- การควบคุม
- แปลง
- เย็น
- ประสานงาน
- มุม
- ได้
- คู่
- ปกคลุม
- สร้าง
- ที่สร้างขึ้น
- การสร้าง
- ความคิดสร้างสรรค์
- CSS
- ภาพเคลื่อนไหว css
- ปัจจุบัน
- ประเพณี
- คุณสมบัติที่กำหนดเอง
- มืด
- วัน
- ตัดสินใจ
- กำหนด
- อย่างแน่นอน
- องศา
- ทดลอง
- สาธิต
- DID
- ความแตกต่าง
- ต่าง
- จุ่ม
- แสดง
- การทำ
- Dont
- แต่ละ
- ก่อน
- ขอบ
- องค์ประกอบ
- โดยเฉพาะอย่างยิ่ง
- อีเธอร์ (ETH)
- แม้
- เหตุการณ์
- ทุกๆ
- เผง
- ตัวอย่าง
- การทดลอง
- ใบหน้า
- ไกล
- คุณสมบัติ
- สองสาม
- ที่เต็มไป
- สุดท้าย
- Firefox
- ชื่อจริง
- โฟกัส
- ปฏิบัติตาม
- สำหรับ
- ฟอร์ม
- รูป
- ที่เกิดขึ้น
- สูตร
- ราคาเริ่มต้นที่
- เต็ม
- ฟังก์ชัน
- ฟังก์ชั่น
- รูปภาพ
- ได้รับ
- ได้รับ
- ให้
- เป้าหมาย
- ไป
- สีเทา
- ตะแกรง
- ครึ่ง
- มือ
- เกิดขึ้น
- มี
- มี
- ความสูง
- ช่วย
- โปรดคลิกที่นี่เพื่ออ่านรายละเอียดเพิ่มเติม
- ชั่วโมง
- สรุป ความน่าเชื่อถือของ Olymp Trade?
- HTML
- HTTPS
- i
- ความคิด
- ภาพ
- in
- รวมทั้ง
- เป็นรายบุคคล
- อินพุต
- แทน
- น่าสนใจ
- แนะนำ
- IT
- รายการ
- ITS
- JavaScript
- เตะ
- ชนิด
- ป้ายกำกับ
- ใหญ่
- ล่าสุด
- ความยาว
- กดไลก์
- รายการ
- น้อย
- ดู
- มอง
- LOOKS
- ทำ
- คณิตศาสตร์
- คณิตศาสตร์
- แม็กซ์
- กล่าวถึง
- วิธี
- ใจ
- นาที
- นาที
- ทันสมัย
- ขณะ
- ข้อมูลเพิ่มเติม
- มากที่สุด
- การเคลื่อนไหว
- Mozilla
- จำเป็นต้อง
- ใหม่
- โซลูชั่นใหม่
- จำนวน
- ตัวเลข
- วัตถุ
- of
- เก่า
- on
- ONE
- เปิด
- ใบสั่ง
- อื่นๆ
- ในสิ่งที่สนใจ
- แบบแผน
- สมบูรณ์
- คัดสรร
- ท่อ
- สถานที่
- การวาง
- เพลโต
- เพลโตดาต้าอินเทลลิเจนซ์
- เพลโตดาต้า
- ปลั๊ก
- ตำแหน่ง
- ตำแหน่ง
- ตำแหน่ง
- ความเป็นไปได้
- อำนาจ
- อำนาจ
- สวย
- อย่างถูกต้อง
- คุณสมบัติ
- คุณสมบัติ
- ให้
- ใส่
- อย่างรวดเร็ว
- สุ่ม
- สุ่ม
- พิสัย
- ค่อนข้าง
- REST
- ผล
- แหวน
- วิ่ง
- s
- Safari
- Sass
- ลด
- วินาที
- ชุด
- รูปร่าง
- ที่ใช้ร่วมกัน
- โชว์
- ตั้งแต่
- เดียว
- หก
- ขนาด
- มีขนาดเล็กกว่า
- So
- จนถึงตอนนี้
- โซลูชัน
- บาง
- ในไม่ช้า
- ระยะ
- กระจาย
- เริ่มต้น
- ขั้นตอน
- ติด
- หยุด
- จัดเก็บ
- สไตล์
- สนับสนุน
- ที่สนับสนุน
- TAG
- เอา
- ใช้เวลา
- ที่
- พื้นที่
- พวกเขา
- theta
- สิ่ง
- สิ่ง
- คิดว่า
- สาม
- เวลา
- ไปยัง
- ด้านบน
- แปลง
- การรักษา
- จริง
- กลับ
- เกี่ยวกับการสอน
- บันทึก
- การปรับปรุง
- us
- ใช้
- ความคุ้มค่า
- ความคุ้มค่า
- ต่างๆ
- น้ำดื่ม
- ทาง..
- ดี
- อะไร
- ที่
- ขาว
- จะ
- กับ
- ภายใน
- ไม่มี
- คำ
- ห่อ
- X
- ปี
- ลมทะเล