SnappySnippet
ในที่สุดฉันก็พบว่าบางครั้งในการสร้างเครื่องมือนี้ คุณสามารถติดตั้งSnappySnippetจาก Github ช่วยให้สามารถแยก HTML + CSS ได้ง่ายจากโหนด DOM ที่ระบุ (ตรวจสอบล่าสุด) นอกจากนี้คุณสามารถส่งรหัสของคุณไปยัง CodePen หรือ JSFiddle ได้โดยตรง สนุก!
คุณสมบัติอื่น ๆ
- ล้าง HTML (ลบแอตทริบิวต์ที่ไม่จำเป็นแก้ไขการเยื้อง)
- เพิ่มประสิทธิภาพ CSS เพื่อให้สามารถอ่านได้
- กำหนดค่าได้อย่างสมบูรณ์ (ตัวกรองทั้งหมดสามารถปิดได้)
- ทำงานร่วมกับ
::before
และ::after
องค์ประกอบหลอก
- ขอบคุณดี UI เพื่อเงินทุนและจอ UIโครงการ
รหัส
SnappySnippet เปิดแหล่งที่มาและคุณสามารถหาโค้ดบน GitHub
การดำเนินงาน
เนื่องจากฉันได้เรียนรู้มากมายในขณะที่ทำสิ่งนี้ฉันตัดสินใจที่จะแบ่งปันปัญหาบางอย่างที่ฉันพบและวิธีแก้ปัญหาของพวกเขาให้กับใครบางคนอาจจะรู้สึกว่ามันน่าสนใจ
ความพยายามครั้งแรก - getMatchedCSSRules ()
ตอนแรกฉันพยายามเรียกค้นกฎ CSS ดั้งเดิม (มาจากไฟล์ CSS บนเว็บไซต์) ค่อนข้างน่าอัศจรรย์นี่เป็นเรื่องง่ายมากขอบคุณwindow.getMatchedCSSRules()
อย่างไรก็ตามมันไม่ได้ผลดี ปัญหาคือเราได้รับเพียงส่วนหนึ่งของตัวเลือก HTML และ CSS ที่จับคู่ในบริบทของเอกสารทั้งหมดซึ่งไม่ได้จับคู่อีกต่อไปในบริบทของตัวอย่าง HTML เนื่องจากการแยกและแก้ไขตัวเลือกไม่ได้เป็นความคิดที่ดีฉันจึงล้มเลิกความพยายามนี้
ความพยายามครั้งที่สอง - getComputedStyle ()
จากนั้นผมได้เริ่มต้นจากสิ่งที่ @CollectiveCognition ปัญหา getComputedStyle()
- อย่างไรก็ตามฉันต้องการแยก CSS ฟอร์ม HTML ออกจากกันจริงๆ
ปัญหา 1 - แยก CSS จาก HTML
การแก้ปัญหาที่นี่ไม่ได้สวยงามมาก แต่ค่อนข้างตรงไปตรงมา ฉันได้กำหนด ID ให้กับโหนดทั้งหมดในทรีย่อยที่เลือกและใช้ ID นั้นเพื่อสร้างกฎ CSS ที่เหมาะสม
ปัญหา 2 - ลบคุณสมบัติที่มีค่าเริ่มต้น
การกำหนด ID ให้กับโหนดทำงานได้เป็นอย่างดีอย่างไรก็ตามฉันพบว่ากฎ CSS ของฉันแต่ละอันมีคุณสมบัติ ~ 300 รายการทำให้ CSS ทั้งหมดไม่สามารถอ่านได้
ปรากฎว่าgetComputedStyle()
ส่งคืนคุณสมบัติและค่า CSS ที่เป็นไปได้ทั้งหมดที่คำนวณสำหรับองค์ประกอบที่กำหนด บางอันว่างเปล่าบางอันมีค่าเริ่มต้นของเบราว์เซอร์ ในการลบค่าเริ่มต้นฉันต้องรับพวกเขาจากเบราว์เซอร์ก่อน (และแต่ละแท็กมีค่าเริ่มต้นแตกต่างกัน) <iframe>
การแก้ปัญหาคือการเปรียบเทียบรูปแบบขององค์ประกอบที่มาจากเว็บไซต์ที่มีองค์ประกอบเดียวกันแทรกเข้าไปในที่ว่างเปล่า เหตุผลในที่นี้คือไม่มีสไตล์ชีทในเปล่า<iframe>
ดังนั้นองค์ประกอบแต่ละรายการที่ฉันต่อท้ายจะมีสไตล์เบราว์เซอร์เริ่มต้นเท่านั้น วิธีนี้ฉันสามารถกำจัดคุณสมบัติส่วนใหญ่ที่ไม่สำคัญออกไปได้
ปัญหาที่ 3 - การรักษาคุณสมบัติชวเลขเท่านั้น
สิ่งต่อไปที่ผมได้เห็นก็คือว่ามีคุณสมบัติเทียบเท่าชวเลขถูกพิมพ์ออกมาโดยไม่จำเป็น (เช่นมีborder: solid black 1px
แล้วborder-color: black;
, border-width: 1px
ITD.)
เพื่อแก้ปัญหานี้ฉันเพิ่งสร้างรายการคุณสมบัติที่มีการจดชวเลขและเทียบเท่าและกรองออกจากผลลัพธ์
ปัญหาที่ 4 - ลบคุณสมบัตินำหน้า
จำนวนของคุณสมบัติในแต่ละกฎที่ได้รับอย่างมีนัยสำคัญลดลงหลังจากการดำเนินการก่อนหน้านี้ แต่ฉันพบว่าฉันงัวมีจำนวนมากของ-webkit-
คุณสมบัติที่มีคำนำหน้าว่าฉันไม่เคยได้ยินเสียงของ ( -webkit-app-region
? -webkit-text-emphasis-position
?)
ผมสงสัยว่าถ้าฉันควรเก็บใด ๆ ของคุณสมบัติเหล่านี้เพราะบางส่วนของพวกเขาดูเหมือนมีประโยชน์ ( -webkit-transform-origin
, -webkit-perspective-origin
ฯลฯ ) ฉันไม่ได้คิดวิธีการตรวจสอบนี้ แต่เนื่องจากฉันรู้ว่าส่วนใหญ่คุณสมบัติเหล่านี้เป็นเพียงขยะฉันตัดสินใจที่จะลบพวกเขาทั้งหมด
ปัญหาที่ 5 - การรวมกฎ CSS เดียวกัน
ปัญหาต่อไปที่ฉันเห็นคือกฎ CSS เดียวกันซ้ำแล้วซ้ำอีก (เช่นสำหรับแต่ละ<li>
ตัวที่มีสไตล์เดียวกันแน่นอนมีกฎเดียวกันในเอาต์พุต CSS ที่สร้างขึ้น)
นี่เป็นเพียงเรื่องของการเปรียบเทียบกฎกับแต่ละอื่น ๆ และรวมสิ่งเหล่านี้ที่มีคุณสมบัติและค่าเดียวกัน เป็นผลให้แทนผมได้#LI_1{...}, #LI_2{...}
#LI_1, #LI_2 {...}
ปัญหาที่ 6 - การล้างและแก้ไขการเยื้องของ HTML
เนื่องจากฉันมีความสุขกับผลลัพธ์ฉันจึงย้ายไปที่ HTML ดูเหมือนเป็นระเบียบส่วนใหญ่เป็นเพราะouterHTML
คุณสมบัติทำให้มันจัดรูปแบบตรงตามที่มันถูกส่งกลับจากเซิร์ฟเวอร์
โค้ด HTML สิ่งเดียวที่นำมาจากouterHTML
ความต้องการคือการฟอร์แมตโค้ดแบบง่าย เนื่องจากเป็นสิ่งที่มีอยู่ใน IDE ทุกตัวฉันจึงมั่นใจว่ามีไลบรารี JavaScript ที่ทำสิ่งนั้นได้อย่างแน่นอน และปรากฎว่าฉันถูกขวา (jQuery ทำความสะอาด) ยิ่งกว่านั้นฉันได้รับการลบคุณลักษณะที่ไม่จำเป็นออกเป็นพิเศษ ( style
และdata-ng-repeat
อื่น ๆ )
ปัญหาที่ 7 - ตัวกรองการแบ่ง CSS
เนื่องจากมีโอกาสที่ในบางสถานการณ์ที่ตัวกรองที่กล่าวถึงข้างต้นอาจทำลาย CSS ในตัวอย่างข้อมูลฉันได้กำหนดให้ทั้งหมดเป็นตัวเลือก คุณสามารถปิดการใช้งานได้จากเมนูการตั้งค่า