ב 3 Yui גלריה: RaphaelJS מאט טיילור של מודול
27 ספטמבר 2010 בשעה 01:05 על ידי מתיו טיילור | ב פיתוח , Yui 3 גלריה | 9 תגובות
מאט טיילור ( @ rhyolight , בבלוג ) עובד ב-Yahoo! מסגרת פנימית JavaScript בדפדפן בצד. הוא נהנה לעבוד עם גרפיקה, והוא עבד עם שרטוטים ואנימציות לפני השימוש Java2d ספריות. לפני שעבר לעמק הסיליקון לעבוד יאהו, עבד מאט באזור סנט לואיס כקבלן התוכנה. הוא גם עבד באופן נרחב עם גרובי ו בגביעי טכנולוגיות SpringSource. הוא היה המתכנת הראשי המקורי YUI2 מבוסס GrailsUI תוסף במסגרת האינטרנט בגביעי.
RaphaelJS היא ספריית JavaScript עוצמה המנהלת SVG שרטוטים ואנימציות. היא מאפשרת לך ליצור בקלות בדים SVG ו לצייר צורות בסיסיות ושבילים בקלות רבה, גם קיבוץ אותן קבוצות ויישום שינויים לאחד או וקטורים רבים. ניתן לצייר צורות, מניפולציות בתמונות, ואת הנפש הכל. RaphaelJS מספק נחמד API כדי ליצור ולשנות אלמנטים SVG בקלות.
בעוד ספריה מרשימה, אבל מצאתי שאני יכול להוסיף כמה תכונות חשובות אלמנטים של הספרייה RaphaelJS עם YUI3. התחלתי את המאמצים הללו עם החדש מודול RaphaelJS גלריה .
טוען RaphaelJS עצלן ותוספות
התכונה הראשונה היא טעינה עצלנית של הספרייה לא רק RaphaelJS, אבל כל RaphaelJS תוספים ייתכן שיהיה עליך. מודול גלריה RaphaelJS רק לטעון את הקבצים הללו, כאשר אתה מצהיר תשתמש אותם בתוך ארגז חול Yui. לדוגמה:
Yui ({הגלריה: "גלריה-2010.09.22-20-15 '}). השימוש (" גלריה רפאל ", הפונקציה (Y) { Y.Raphael (). להשתמש (פונקציה (רפאל) { / / להשתמש רפאל כאן בדיוק כמו שהיית עושה מחוץ Yui var נייר = רפאל ("myPaper ', 500, 500); }); });
אם אתה משתמש ב-plugins RaphaelJS, ציין דרכם במערך ולשלוח כי הפרמטר הראשון Y.Raphael () להשתמש () function.:
Yui ({הגלריה: "גלריה-2010.09.22-20-15 '}). השימוש (" גלריה רפאל ", (Y) פונקציה {myPlugins var = [' plugins / raphael.awesomePlugin.js", "תוספים / רפאל . wickedPlugin.js '],. Y.Raphael () שימוש (myPlugins, הפונקציה (רפאל) {/ / להשתמש רפאל כאן בדיוק כמו שהיית עושה מחוץ נייר var Yui = רפאל ("myPaper', 500, 500): / / "נייר" יהיה כל פונקציות חדשות שנוספו על ידי תוספים שלך עכשיו});}); הספרייה RaphaelJS נטען תחילה, ואחר כך כל התוספים שצוינו נטענים לפני הפונקציה התקשרות שלך מבוצע במטרה רפאל כפרמטר בלבד.
אישית אירועים
לאחר יצירת מרחב הציור במטרה רפאל, אז אתה יכול מיד להגיע אל הציור. כשאתה מתקשר שיטות כמו rect , circle , ואת path על מרחב הציור, תקבל בחזרה אובייקטים המייצגים וקטורים SVG. בדרך כלל, תהיה לך גישה לגורמים המתאימים של DOM דרך node רכוש. לדוגמה:
var נייר = רפאל ("myPaper ', 500, 500); var מרובע = paper.rect (0, 0, 100, 100);
זה יוצר אובייקט וקטור מלבני על הקואורדינטות [0,0] עם רוחב וגובה של 100 פיקסלים. יש לך גישה לאלמנט DOM הבסיסית (שהיא SVG rect אלמנט) כך:
var rectNode = square.node; rectNode.onclick = function () { alert ("מזל טוב, אתה לוחץ על ריבוע!"); };
אם אתה משתמש Yui נלהב, אתה בטח רוצה משהו יותר מזה. מה עם מובנה Y.Node גם כן? בדיוק כמו node נכס מתייחס HTMLElement מאחורי האובייקט SVG, $node נכס מתייחס Y.Node מעטפת עבור רכיב זה. אז אתה יכול לעשות דברים כאלה:
מרובע. $ node.on ("במעבר עכבר", function () { alert ("מזל טוב, אתה יכול להזיז עכבר!"); });
בוא ננסה משהו מורכב יותר עכשיו. האינטראקציה עם וקטור אחד צריך להיות מסוגל לגרום וקטורים נמשך אחרות לעדכן את סגנונם, נכון? מה דעתך ליצור כמה שורות שכל לעבד הצבעים שלהם תלויים בו העכבר נמצא על מעגל בדף:
var נייר = רפאל ("rcanvas ', 600, 800); . circ var = paper.circle (350, 200, 100) attr ({למלא: "ורוד", שבץ מוחי: "שחור"}); / / לדחוף חבורה של מלבנים למערך var i = 0; מלבנים = []; עבור (; i <10: אני + +) { rectangles.push (paper.rect (0, 40 * i, 200, 20) attr ({למלא: "אדום", שבץ: "צהובה"}.)); } / / לולאה באמצעות מלבנים, והוסיף ספציפיים mousemove מטפלים מעגל לכל אחת Y.Array.each (מלבנים, תפקוד (rect, מדד) { var i = אינדקס + 1; circ. $ node.on ("mousemove", פונקציה (EVT) { / / צבע המילוי הוא דינמי, תלוי במיקום של מלבן זה / / במערך כמו גם את המיקום של העכבר var = אם circ.attrs.cx - circ.attrs.r, RT = 2 * circ.attrs.r + אם, x = evt.clientX - אם, למעלה = circ.attrs.cy - circ.attrs.r, BTM = 2 * circ.attrs.r + למעלה, y = evt.clientY - למעלה; אדום = (((128 * x) / (2 * circ.attrs.r)) -1) * i / 6, ירוק = 256 - ((((128 * x) / (2 * circ.attrs.r)) -1) * i / 6), כחול = (((128 * y) / (2 * circ.attrs.r)) -1) * i / 6; rect.attr ("מלא", "RGB (" אדום + + ',' + ירוק + ',' כחול + + ')'); }); });
דוגמה זו פועלת כאן , אבל כפי שאתה יכול לראות את התמונות הבאות, את הצבע של כל עמודה תלוי מיקום העכבר על העיגול, כמו גם סדר הבר.
תלוי איפה את סמן העכבר נמצא על המעגל, לשנות את הצבעים בר בנפרד.
אז אתה יכול לראות את זה $node הוא קיצור דרך שימושי, אבל שום דבר מרהיב. זה באמת יהיה נפלא אם כל אובייקט SVG אתה יוצר עם RaphaelJS יכול לפטר אירועים מותאמים אישית . שתאפשר אלמנטים נפרדים שלך ציור לירות אירועים מותאמים אישית, וכל דבר בדף יכול להקשיב ולהגיב. זה יכול להיות שימושי במובנים רבים. בתור התחלה, הוא מספק אינטראקציות בין עשירים הציורים שלך. אינטראקציות משתמשים עם וקטור אפשר עכשיו הודעה על וקטורים אחרים של אינטראקציה על פי דרישה. זה אומר שאתה יכול לירות programatically אירועים מן הציורים שלך כאשר תנאים מסוימים הם נפגשו. לא זו בלבד שהדבר מאפשר את הציורים שלך להודיע וקטורים אחרים, אבל שום דבר בדף יכול להקשיב פנימה
var נייר = רפאל ("rcanvas ', 600, 800); . circ var = paper.circle (350, 200, 100) attr ({למלא: "ורוד", שבץ מוחי: "שחור"}); / / מה שהופך מערכים של מלבנים ומעגלים var i = 0, מלבנים = [], עיגולים = []; עבור (; i <10: אני + +) { rectangles.push (paper.rect (0, 40 * אני, אני 40 *, 20) attr ({למלא: "אדום", שבץ: "צהובה"}.)); circles.push (paper.circle (0,0,20) להסתיר ().); } Y.Array.each (מלבנים, תפקוד (rect, מדד) { var i = אינדקס + 1; circ. $ node.on ("mousemove", פונקציה (EVT) { var = אם circ.attrs.cx - circ.attrs.r, RT = 2 * circ.attrs.r + אם, x = evt.clientX - אם, למעלה = circ.attrs.cy - circ.attrs.r, BTM = 2 * circ.attrs.r + למעלה, y = evt.clientY - למעלה; newWidth = (((256 * x) / (2 * circ.attrs.r)) -1) * i / 6, אדום = (((128 * x) / (2 * circ.attrs.r)) -1) * i / 6, ירוק = 256 - ((((128 * x) / (2 * circ.attrs.r)) -1) * i / 6), כחול = (((128 * y) / (2 * circ.attrs.r)) -1) * i / 6; / / הזמן הזה, לא רק לשנות את הצבע, אלא גם את רוחב המלבן rect.attr ({ רוחב: newWidth, למלא: "RGB (" אדום + + ',' + ירוק + ',' כחול + + ")" }); / / אש אירוע מותאם אישית להודיע כי רוחב המלבן השתנה rect.fire ('רוחב, השתנה ", {רוחב: newWidth, מקור: rect, כדי: ראשי}); }); / / כל מלבן מקבל המאזין כי יורה על ברוחב שונה rect.on ('רוחב, השתנה ", פונקציה (EVT) { var attrs = evt.source.attrs; / / קבל את המעגל המתאים להעביר אותו בקצה הימני של המלבן חוגים [evt.order]. attr ({ CX: attrs.x + attrs.width, סי: attrs.y, למלא: "cornflowerblue" .}) הצג (); }); });
תסתכל למשל זה פועל כאן . אתה יכול גם לראות תמונה מתחת מעגלים נמשכים על הקצוות הימניים של מלבנים. זו התרחשות בתגובה לירי האירוע מותאם אישית לכל מלבן של הפרט, שנתפס על ידי המטפל אשר מעביר את המעגל למיקום ביחס התכונות הנוכחיות של המלבן.
זה פותח כמה possiblities מעניינים עבור RaphaelJS בתוך YUI3. למשל, מה אם נוכל ליצור קבוצה של צורות וקטוריות עם הקבוצה עצמה להיות ישות כי יורה אירועי לעולם החיצון? מבחינה פנימית, כל ציור וקטור יכול לתקשר עם מיכל שלו באמצעות אירועים מותאמים אישית, ו מיכל היה לקבל החלטות על מה הנתונים שהוא יורה אל העולם החיצון. זה פותח את הרעיון של כמוס לחלוטין, שולטת אינטראקטיביות SVG.
תקציר
עם עליית של HTML5 טכנולוגיות הלוויין שלה, יש אפשרויות רבות כל כך, למעט פלאש עבור אינטראקציות עשירות. באופן אידיאלי, כל האלמנטים טסה על הדף צריך להיות נגיש באופן מלא ואחיד. זה פותח possiblities נפלאים לנו ליצור נגישות, פקדי אינטרנט רגילים מבלי להזדקק פלאש. SVG היא אופציה מפתה כי כל וקטור נמשכים בדף מגובה על ידי הצומת DOM שאנחנו יכולים לשנות עם Yui בדיוק כמו כל הצומת DOM אחר. זה מה מאפשר מודול גלריה RaphaelJS כדי להגדיל את כל האובייקטים SVG נוצר על ידי RaphaelJS, וזה המפתח אינטראקציה עשירה עם אלה elments ממקום אחר בדף.
לשתף ולהרחיב: הפוך עם del.icio.us | Digg אותו! | reddit!
9 תגובות
מצטערים, טופס התגובה סגורה בשלב זה.

כל הזכויות שמורות © 2006-2012 Yahoo! Inc כל הזכויות שמורות. מדיניות פרטיות - תנאים והגבלות
מופעל על ידי וורדפרס על יאהו! אירוח אתרים .


אם אתה מסתכל על הפנימיים של רפאל, קצת יותר משליש של עסקאות עם קוד VML עם כמות פחות או יותר אותו הדבר עבור SVG. האם יש סיכוי לקבל טוען מותנה של Yui לעבוד כאן או האם יש רישוי / כמות המחסומים מאמץ להגיע רפאל עצמו לפצל את ואירוח? (לטובת צד משולבת טוען למעשה עובד)
תגובה על ידי קרל G - 27 ספטמבר 2010 #
שני דברים:
1) רפאל הוא מעטפת עבור SVG * ו * VML ורק כולל דברים שפועלים בשניהם. כאשר אתה מעודד הרחבות, לא מזהיר פולק, כי פעמים רבות זה ייכשל ב-IE. אם לא אכפת להם, בסדר, אבל אתה צריך להזהיר אותם.
2) אתה מזמין אנשים לעולם של כאב להמליץ גישה הצומת.. מספר פעולות (המשתנה עם כל מהדורה ובין SVG / VML) לגרום הצומת כדי ליצור מחדש, כך מטפלים האירוע שלכם Y.Node שלך יאבדו או מתייחס לאובייקט שנמחק. . לבסוף את תוכן הצומת שונים על הפלטפורמה הוא לא רק צומת אחת - במיוחד כאשר אתה מחשיב את הטקסט, שבו אתה מקבל לפחות אובייקט אחד לכל תו - ופעמים רבות, אירוע מטפלים עכבר לעורר רק דיו, כאשר משתמשים לצפות את התא להיות פעיל.
תגובה מאת קליפורד הית' - 27 ספטמבר 2010 #
Writeup הגדול הדגמות,
מאחר שאתה Y! "אה פריצה משם על רפאל אולי אתה יודע כמה פרטים על האחרונה ב גרפים / תרשימים המאמצים עבור Yui?
אולי משהו שנבנה על גבי רפאל?
אני אוהד של רפאל, אבל הספרייה תרשימים שלהם משאיר קצת כדי להיות הרצוי, כמו גם כמה דוגמאות תרשים גלם שנוצרו מחוץ o-box רפאל הם בדרך יותר פונקציונלי / אינטראקטיבי
אשמח לראות כמה Y! JS קסם מפוזרת בתחום זה
תגובה על ידי נייט - 27 ספטמבר 2010 #
תודה על המשוב.
@ קארל: אם אני מבין נכון, הרעיון שלך לעבוד, הייתי צריך לשבור את הקובץ raphael.js לחלקים עבור SVG ו VML. אני לא מתכנן לגעת ספריית RaphaelJS בכלל, כך טוען כנראה להישאר כפי שהוא.
@ קליפורד: (1) זו נקודה טובה שמישהו העלה על רשימת התפוצה Raphaeljs גם כן. אני לא מודאג במיוחד מודול גלריות של עובד ב-IE, אבל זה מותרות. זה עדיין צריך לבדוק ב-IE (אם כי אני חושב שזה יעבוד בסדר). אני הולך להיות מפעיל בדיקות ב-IE עבור מודול זה בשבוע הבא, אז אני יודע בוודאות. בינתיים, אני אשים את האזהרה בדף מודול. (2) תודה ראש בראש. זה גורם לי לתהות אם אני יכול להצביע על פעולות הגורמות בלוטות כדי ליצור מחדש ולהבטיח את המאפיין החדש $ הצומת עטוף Y.Node. אני אהיה צולל עמוק הרבה יותר RaphaelJS בקרוב מאוד, אז אני יהיה לעקוב אחרי זה ואני מקווה להיות מסוגל לשחזר את הנכס צומת Yui על המבצע הצומת מחץ לכל דבר.
@ נייט: אני יודע כמה פרטים, אבל אני אתן את הקבוצה Yui להתמודד העסק שלהם שם. ;). אני, לעומת זאת, מעניין מאוד ומרסס קסם JS Yui ב מגרש המשחקים החדש גרפיקה HTML5.
תגובה על ידי מתיו טיילור - 27 ספטמבר 2010 #
האם אתה יודע אם זה טכניקה או שיטה דומה יעבוד עם אלמנט ה-HTML 5 בד. אם אני שם בד HTML 5 בדף אינטרנט עם מלבן בו, אפשר לשמוע את אירועי עכבר על מלבן בד.
אם הדף HTML5 שלי מכיל את הדברים הבאים.
טקסט זה מוצג אם הדפדפן שלך לא תומך בד HTML5.
למשל var = document.getElementById ("דוגמה");
var בהקשר = example.getContext ('2 'ד);
context.fillStyle = "RGB (255,0,0)";
context.fillRect (30, 30, 50, 50);
אשר לקחתי מאתר זה:
http://en.wikipedia.org/wiki/Canvas_element
האם ניתן לאסוף את אירועי עכבר על צורות שונות על בד באמצעות Yui. האם אפשר לשים משהו כמו עטיפה Y.Node על מלבן בד דומה למה שאתה עושה עם אלמנטים RaphaelJS.
תודה
תגובה על ידי ג 'ון - 28 ספטמבר 2010 #
אתה עושה את ההערה:
"
אם כל אובייקט SVG אתה יוצר עם RaphaelJS יכול לפטר אירועים מותאמים אישית.
"
לסקור במהירות את מערכת שלמה של אירועים שהוכנו בקלות עם רפאל ...
http://www.irunmywebsite.com/raphael/additionalhelp.php?q=usingelementevents
באפשרותך להקצות אותם לאובייקטים רפאל ...
תגובה מאת צ'רלס - 28 ספטמבר 2010 #
@ ג 'ון: ציור על בד תג הוא תרגיל שונה בהרבה מאשר עם רפאל SVG (VML). וקטורים יש מדינה, ניתן להעביר, אנימציה, ו אינטראקציה עם. ציור על בד, הוא יותר כמו ציור מפת סיביות. ברגע שאתה מצייר משהו, הוא תקוע שם כחלק מהרקע בד, ואני לא בטוח איך בדיוק העבודה אינטראקציות משתמש.
תגובה על ידי מתיו טיילור - 28 ספטמבר 2010 #
@ צ 'ארלס: כן! היכולת לגשת אל הצומת SVG נחמד עבור אותם סוגי אינטראקציות משתמשים, והדגמות שלי משתמשת אלה לא מעט. סוג של אירועים מותאמים אישית שאני מדבר עליהם הם אירועים מחוץ לתחום של אירועים רגילים DOM.
על הדוגמה האחרונה שלי לעיל, ניתן לראות כי כל מלבן יורה
width-changedהאירוע בכל פעם שהם ישתנו. אירועים אלה יכולים להיתפס על ידי כל דבר בדף שנרשמת לאירוע זה. כך כל מעגל הוא להיות עברה במקום הנכון כמו מלבנים ישתנו.כמובן, הזרז של כל זה היא
mousemoveאירוע זה מתרחש על מעגל גדול, אשר הם סוג של אירוע אני חושב שאתה מתכוון. אנא תקן אותי אם התגעגעתי משהו.תגובה על ידי מתיו טיילור - 28 ספטמבר 2010 #
@ ג 'ון,
זה אפשרי, אבל מבולגן. אתה צריך לשמור על הרשומה (חשיש IE) של נקודות עניין, ולאחר מכן יש מאזינים המחוברים אלמנט בד. כאשר תגיע לאירוע, אתה צריך לקחת coords XY של אותו ולהשוות ל חשיש שלך של נקודות עניין, ואז ככל הנראה לירות אירוע מותאמת אישית.
עשיתי את זה עם YUI2, יצירת תרשים מכ"ם זה מאפשר לך ללחוץ על נקודות נתונים על גבי הגרף כדי לקבל מידע, ולהוסיף נתונים על ידי לחיצה על tickmarks על הצירים. עם excanvas זה עובד על אינטרנט אקספלורר, גם כן, יש את היתרון של להיות לי תמונה (אם כי אינטרנט אקספלורר הוא איטי יותר).
עם זאת, כל זה עם נקודות, ומספר מצומצם למדי של נקודות על זה, אז לבדוק אם העכבר מעניין אי שם לא יותר מדי עבודה. אבל עם אזורים אני חושד שזה יקבל יקר מדי, ואתה בטח רוצה לחשוב על דרך של ממש לשמוע "mousein" (כלומר מעבר לקו) ולא במעבר עכבר. אפילו עם נקודות, אתה צריך לעשות קצת סריקה, כמו הנקודות פיקסלים ומשתמשים מצפים ללחוץ פיקסל המדויק לא עושה עבור אינטראקציה עם המשתמש קל!
אתה יכול לעשות "אנימציות", סוג של, אבל זה כרוך בשרטוט בד בכל פעם, אז הם מעברים יותר אנימציות. יצרתי RenderStack פשוט דברים שאני מכיר לא ישתנה (צירים למשל) כך אני ממלא את שיחות בד ציור ולאחר מכן לירות מחסנית, כך שאני לא צריך לעשות את המתמטיקה בכל פעם. אבל אני לא בטוח עד כמה זה באמת עושה את ההבדל, זה עדיין איטי ב-IE ומהיר בכל דבר אחר!
מאט
תגובה על ידי מאט פארקר - 29 ספטמבר 2010 #