|
27-11-2005, 22:27
|
|
|
|
חבר מתאריך: 20.06.03
הודעות: 5,616
|
|
יולו וקבצי htc
שלום לכולם, והפעם בעקבות בקשה של יולו (שפנה אלי בפרטי - ואני מקווה שיסלח לי שאני
ככה חושף את מכתבו):
ציטוט:
במקור נכתב על ידי יולו
מה נשמע??
עברתי על האתר החדש שלך.
נתקלתי בקוד המקור בשורה הבאה:
קוד:
behavior: url("http://www.fat-fish.co.il/csshover.htc")
לא שמעתי על הדבר הזה, אתה יכול להסביר לי בקצרה על מה מדובר?
תודה מראש, יולו.
|
אז הסבר על קובץ זה (ויש אנשים יצירתיים שבודקים את הקוד שלי):
htc הם ראשי תיבות של HTML Components וניתן ללמוד עליהם עוד באתר MSDN
אלו קבצים הניקראים ע"י IE בלבד, כאשר דפדפנים אחרים לא מכירים בהם ולכן מתעלמים
מהם.
למה זה טוב?
IE לא מממש את האפשרות ב-CSS להשתמש ב-hover על כל סוג של אובייקט, ולכן
זה מאלץ אותנו לכתוב קוד Javascript כאשר אנו רוצים לעצב מקרים של מעבר עכבר
מעל אובייקט שאינו קישור.
קובץ htc הספציפי שאצלי באתר (אתם מוזמנים להורידו) מממש באמצעות Jscript
(ה-JS של מיקרוסופט) לדפדפני IE את האפשרות להצמיד לכל אובייקט/מחלקה את
פעולת ה-CSS שאנו כל רוצים hover.
אם תשימו לב, בקוד ה-CSS שלי יש פקודות hover על מחלקות שאינן קישורים, והן
עובדות בזכות זה.
ניתן לקרא על htc רבות ברשת, אך מאחר וזה מותאם ל-IE בלבד, זה לא כל כך נפוץ,
חוץ מבמקרה ספציפי זה - כשרוצים להתאים את IE לשאר הדפדפנים.
מצורף לנוחיותכם קישור לקובץ זה באתר שלי:
http://www.fat-fish.co.il/csshover.htc
הנה הקוד לסקירה של מי שמעוניין:
(וכמובן, למי שעוד לא הספיק, אתם מוזמנים להצטרף לתחרות ה-CSS אצלי באתר...)
קוד PHP:
<attach event="ondocumentready" handler="parseStylesheets" /> <script language="JScript">
var currentSheet, doc = window.document, activators = { onhover:{on:'onmouseover', off:'onmouseout'}, onactive:{on:'onmousedown', off:'onmouseup'} }
function parseStylesheets() { var sheets = doc.styleSheets, l = sheets.length; for(var i=0; i<l; i++) parseStylesheet(sheets[i]); } function parseStylesheet(sheet) { if(sheet.imports) { try { var imports = sheet.imports, l = imports.length; for(var i=0; i<l; i++) parseStylesheet(sheet.imports[i]); } catch(securityException){} }
try { var rules = (currentSheet = sheet).rules, l = rules.length; for(var j=0; j<l; j++) parseCSSRule(rules[j]); } catch(securityException){} }
function parseCSSRule(rule) { var select = rule.selectorText, style = rule.style.cssText; if(!(/(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active)/i).test(select) || !style) return; var pseudo = select.replace(/[^:]+:([a-z-]+).*/i, 'on$1'); var newSelect = select.replace(/(\.([a-z0-9_-]+):[a-z]+)|(:[a-z]+)/gi, '.$2' + pseudo); var className = (/\.([a-z0-9_-]*on(hover|active))/i).exec(newSelect)[1]; var affected = select.replace(/:hover.*$/, ''); var elements = getElementsBySelect(affected);
currentSheet.addRule(newSelect, style); for(var i=0; i<elements.length; i++) new HoverElement(elements[i], className, activators[pseudo]); }
function HoverElement(node, className, events) { if(!node.hovers) node.hovers = {}; if(node.hovers[className]) return; node.hovers[className] = true; node.attachEvent(events.on, function() { node.className += ' ' + className; }); node.attachEvent(events.off, function() { node.className = node.className.replace(new RegExp('\\s+'+className, 'g'),''); }); }
function getElementsBySelect(rule) { var parts, nodes = [doc]; parts = rule.split(' '); for(var i=0; i<parts.length; i++) { nodes = getSelectedNodes(parts[i], nodes); } return nodes; } function getSelectedNodes(select, elements) { var result, node, nodes = []; var classname = (/\.([a-z0-9_-]+)/i).exec(select); var identify = (/\#([a-z0-9_-]+)/i).exec(select); var tagName = select.replace(/(\.|\#|\:)[a-z0-9_-]+/i, ''); for(var i=0; i<elements.length; i++) { result = tagName? elements[i].all.tags(tagName):elements[i].all; for(var j=0; j<result.length; j++) { node = result[j]; if((identify && node.id != identify[1]) || (classname && !(new RegExp('\\b' + classname[1] + '\\b').exec(node.className)))) continue; nodes[nodes.length] = node; } } return nodes; } </script>
var currentSheet, doc = window.document, activators = { onhover:{on:'onmouseover', off:'onmouseout'}, onactive:{on:'onmousedown', off:'onmouseup'} } function parseStylesheets() { var sheets = doc.styleSheets, l = sheets.length; for(var i=0; i
|
|