ประกบ DNA ของ HTML ด้วย CSS Attribute Selectors

เผยแพร่แล้ว: 2022-03-10
สรุปด่วน ↬ ตัวเลือกแอตทริบิวต์นั้นวิเศษมาก พวกเขาสามารถช่วยคุณให้พ้นจากปัญหาที่เหนียวแน่น ช่วยคุณหลีกเลี่ยงการเพิ่มชั้นเรียน และชี้ให้เห็นปัญหาในโค้ดของคุณ แต่อย่ากังวล แม้ว่าตัวเลือกแอตทริบิวต์จะซับซ้อนและมีประสิทธิภาพ แต่ก็เรียนรู้ได้ง่ายและใช้งานง่าย ในบทความนี้ เราจะพูดถึงวิธีการใช้งานและให้แนวคิดเกี่ยวกับวิธีการใช้งาน

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

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

ในระดับพื้นฐานที่สุด คุณใส่แอตทริบิวต์ HTML ในวงเล็บเหลี่ยมและเรียกมันว่าตัวเลือกแอตทริบิวต์ดังนี้:

 [href] { color: chartreuse; }

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

หมายเหตุ : สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการจับคู่แบบกรงที่มีความเฉพาะเจาะจงของ CSS คุณสามารถอ่าน "CSS Specificity: สิ่งที่คุณควรรู้" หรือถ้าคุณชอบ Star Wars: "CSS Specificity Wars"

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

เพิ่มเติมหลังกระโดด! อ่านต่อด้านล่าง↓

การเลือกคุณสมบัติ

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

 div[title]

แต่คุณยังสามารถเลือกลูกของ div ที่มีชื่อโดยทำดังต่อไปนี้:

 div [title]

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

คุณจะได้รับรายละเอียดมากขึ้นในการเลือกแอตทริบิวต์รวมถึงค่าของแอตทริบิวต์

 div[title="dna"]

ด้านบนจะเลือก div ทั้งหมดที่มีชื่อ "dna" ที่แน่นอน ชื่อของ “dna is awesome” หรือ “dnamutation” จะไม่ถูกเลือก แม้ว่าจะมีอัลกอริธึมของตัวเลือกที่จัดการแต่ละกรณีเหล่านั้น (และอื่นๆ) เราจะไปถึงที่นั่นในไม่ช้า

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

หากคุณต้องการเลือก “dna” จากรายการที่คั่นด้วยช่องว่าง เช่น “my beautiful dna” หรือ “mutating dna is fun!” คุณสามารถเพิ่มตัวหนอนหรือ "ตัวหยัก" ตามที่ฉันชอบเรียกมันว่าข้างหน้าเครื่องหมายเท่ากับ

 div[title~="dna"]

คุณสามารถเลือกชื่อเช่น “dontblamemeblamemydna” หรือ “his-stupidity-is-from-upbringing-not-dna” จากนั้นคุณสามารถใช้เครื่องหมายดอลลาร์ $ เพื่อให้ตรงกับส่วนท้ายของชื่อ

 [title$="dna"]

เพื่อให้ตรงกับด้านหน้าของค่าแอตทริบิวต์ เช่น ชื่อของ "dnamutants" หรือ "dna-splicing-for-all" ให้ใช้เครื่องหมายคาเร็ต

 [title^="dna"]

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

 [title|="gene"]

สุดท้าย มีโอเปอเรเตอร์แอตทริบิวต์การค้นหาแบบเต็มที่จะจับคู่สตริงย่อยใดๆ

 [title*="dna"]

แต่จงใช้อย่างชาญฉลาดเพราะด้านบนจะจับคู่กับ "I-like-my-dna-like-my-meat-rare" เช่นเดียวกับ "edna", "การลักพาตัว" และ "ตัวตุ่น" (สิ่งที่ Edna ไม่ควรทำจริงๆ )

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

แต่คุณจำเป็นต้องค้นหาแท็ a ที่มีชื่อและมีคลาสที่ลงท้ายด้วย "ยีน" หรือไม่? โดยใช้วิธีดังนี้:

 a[title][class$="genes"]

ไม่เพียงแต่คุณสามารถเลือกแอตทริบิวต์ขององค์ประกอบ HTML เท่านั้น คุณยังสามารถพิมพ์ยีนที่กลายพันธุ์โดยใช้ "วิทยาศาสตร์" หลอก (หมายถึงองค์ประกอบเทียมและการประกาศเนื้อหา)

 <span class="joke" title="Gene Editing!">What's the first thing a biotech journalist does after finishing the first draft of an article?</span>
 .joke:hover:after { content: "Answer:" attr(title); display: block; }

รหัสด้านบนจะแสดงคำตอบของมุขตลกที่เลวร้ายที่สุดเรื่องหนึ่งที่เคยเขียนไว้บนโฮเวอร์ (ใช่ ฉันเขียนมันเอง และใช่ การเรียกมันว่า "เรื่องตลก" คือการเป็นคนใจกว้าง)

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

 [title*="DNA" i]

ดังนั้นจึงจับคู่ "dna", "DNA", "dnA" และรูปแบบอื่นๆ

ข้อเสียเพียงอย่างเดียวของสิ่งนี้คือ i ใช้งานได้ใน Firefox, Chrome, Safari, Opera และเบราว์เซอร์มือถือเพียงเล็กน้อย

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

การใช้งานทั่วไป

สไตล์ตามประเภทอินพุต

คุณสามารถจัดรูปแบบการป้อนข้อมูลได้แตกต่างกัน เช่น อีเมลกับโทรศัพท์

 input[type="email"] { color: papayawhip; } input[type="tel"] { color: thistle; }

แสดงลิงค์โทรศัพท์

คุณสามารถซ่อนหมายเลขโทรศัพท์ในบางขนาดและแสดงลิงก์โทรศัพท์แทนเพื่อให้โทรได้ง่ายขึ้นบนโทรศัพท์

 span.phone { display: none; } a[href^="tel"] { display: block; }

ลิงค์ภายในกับลิงค์ภายนอก ปลอดภัยกับไม่ปลอดภัย

คุณสามารถจัดการลิงก์ภายในและภายนอกได้แตกต่างกัน และจัดรูปแบบลิงก์ที่ปลอดภัยให้แตกต่างจากลิงก์ที่ไม่ปลอดภัย

 a[href^="http"]{ color: bisque; } a:not([href^="http"]) { color: darksalmon; } a[href^="https://"]:after { content: url(unlock-icon.svg); } a[href^="https://"]:after { content: url(lock-icon.svg); }

ดาวน์โหลดไอคอน

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

 a[download]:after { content: url(download-arrow.svg); }

คุณยังสามารถสื่อสารประเภทไฟล์ด้วยไอคอนต่างๆ เช่น PDF กับ DOCX กับ ODF เป็นต้น

 a[href$="pdf"]:after { content: url(pdf-icon.svg); } a[href$="docx"]:after { content: url(docx-icon.svg); } a[href$="odf"]:after { content: url(open-office-icon.svg); }

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

 a[download][href$="pdf"]:after { content: url(pdf-icon.svg); }

แทนที่หรือใช้รหัสที่ล้าสมัย/เลิกใช้ใหม่อีกครั้ง

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

 <div bgcolor="#000000" color="#FFFFFF">Old, holey genes</div> div[bgcolor="#000000"] { /*override*/ background-color: #222222 !important; } div[color="#FFFFFF"] { /*reapply*/ color: #FFFFFF; }

แทนที่สไตล์อินไลน์เฉพาะ

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

หมายเหตุ : วิธีนี้จะได้ผลดีที่สุดหากคุณทราบคุณสมบัติและค่าที่แน่นอนที่คุณต้องการแทนที่ และหากคุณต้องการให้แทนที่ไม่ว่าจะปรากฏอยู่ที่ใด

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

 <divTeenage Mutant Ninja Myrtle</div> div[style*="margin: 8px"] { margin: 1em !important; }

หมายเหตุ : แนวทางนี้ควรใช้ด้วยความระมัดระวังอย่างยิ่ง ราวกับว่าคุณจำเป็นต้องแทนที่รูปแบบนี้ คุณจะตกอยู่ใน !important สงครามที่สำคัญ และลูกแมวจะตาย

กำลังแสดงประเภทไฟล์

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

 <input type="file" accept="pdf,doc,docx"> [accept]:after { content: "Acceptable file types: " attr(accept); }

เมนูหีบเพลง HTML

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

 <details> <summary>List of Genes</summary> Roddenberry Hackman Wilder Kelly Luen Yang Simmons </details>
 details[open] { background-color: hotpink; }

พิมพ์ลิงค์

การแสดง URL ในรูปแบบการพิมพ์ทำให้ฉันเข้าใจตัวเลือกแอตทริบิวต์ คุณควรรู้วิธีสร้างมันขึ้นมาเองตอนนี้ คุณเพียงแค่เลือกแท็กทั้งหมด a มี href เพิ่มองค์ประกอบหลอก และพิมพ์โดยใช้ attr() และ content

 a[href]:after { content: " (" attr(href) ") "; }

เคล็ดลับเครื่องมือที่กำหนดเอง

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

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

 [title] { position: relative; display: block; } [title]:hover:after { content: attr(title); color: hotpink; background-color: slateblue; display: block; padding: .225em .35em; position: absolute; right: -5px; bottom: -5px; }

AccessKeys

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

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

 a[accesskey]:focus:after { content: " AccessKey: " attr(accesskey); }

การวินิจฉัย

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

เสียงที่ไม่มีการควบคุม

ฉันไม่ได้ใช้แท็ก audio บ่อยเกินไป แต่เมื่อฉันใช้มัน ฉันมักจะลืมใส่แอตทริบิวต์ controls ผลลัพธ์: ไม่มีอะไรปรากฏ หากคุณกำลังทำงานใน Firefox รหัสนี้สามารถช่วยให้คุณสงสัยว่าคุณมีองค์ประกอบเสียงซ่อนอยู่หรือหากไวยากรณ์หรือปัญหาอื่น ๆ ทำให้ไม่ปรากฏ (ใช้งานได้เฉพาะใน Firefox)

 audio:not([controls]) { width: 100px; height: 20px; background-color: chartreuse; display: block; }

ไม่มีข้อความแสดงแทน

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

หมายเหตุ : ฉันใช้ outline แทน border เพราะเส้นขอบสามารถเพิ่มความกว้างขององค์ประกอบและทำให้เค้าโครงเลอะเทอะได้ outline ไม่ได้เพิ่มความกว้าง

 img:not([alt]) { /* no alt attribute */ outline: 2em solid chartreuse; } img[alt=""] { /* alt attribute is blank */ outline: 2em solid cadetblue; }

ไฟล์ Javascript แบบอะซิงโครนัส

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

 script[src]:not([async]) { display: block; width: 100%; height: 1em; background-color: red; } script:after { content: attr(src); }

องค์ประกอบเหตุการณ์ Javascript

คุณยังสามารถเน้นองค์ประกอบที่มีแอตทริบิวต์เหตุการณ์ JavaScript เพื่อจัดองค์ประกอบใหม่ในไฟล์ JavaScript ของคุณ ฉันได้เน้นที่แอตทริบิวต์ OnMouseOver ที่นี่ แต่ใช้ได้กับแอตทริบิวต์เหตุการณ์ JavaScript ใดๆ

 [OnMouseOver] { color: burlywood; } [OnMouseOver]:after { content: "JS: " attr(OnMouseOver); }

ไอเทมที่ซ่อนอยู่

หากคุณต้องการดูว่าองค์ประกอบที่ซ่อนอยู่หรืออินพุตที่ซ่อนอยู่ของคุณอยู่ที่ไหน คุณสามารถแสดงด้วย:

 [hidden], [type="hidden"] { display: block; }

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

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

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