
زمانی که وارد وبسایتی میشوید، دست کم یک صفحه برای برقراری ارتباط با صاحبان سایت مشاهده میکنید که به کمک فرم سازها اجرا شده است. در واقع فرم سازها پلی برای رساندن پیامی از سمت کاربر به صاحب وبسایت هستند که میتوانند در مورد موضوعات مختلفی باشند که دقیقا به نوع فعالیت سایت بستگی دارد. این فرم سازها چگونه ایجاد میشوند؟ در وردپرس، افزونههای متعددی برای ساخت انواع فرمها وجود دارد که میتوان بنا به نوع نیاز خود آنها را انتخاب کرد. فرم سازها در وردپرس در حالتهای ساده و پیچیده موجودند که برخی معروفتر از بقیه هستند. گاهی با نصب یک افزونه میتوانید انواع و اقسام فعالیتها را اجرا کنید.
در این مقاله میخواهیم درباره فرم سازهای وردپرس کمی صحبت کنیم و برخی از بهترین گزینهها را به شما معرفی کنیم. آیا موافقید؟
اگر وبسایت سادهای دارید که به نظرتان نیازی به استفاده از هیچ فرمسازی ندارد، سخت در اشتباهید! هر چقدر هم که سایت شما به ایجاد فرم ها و پل ارتباطی بینیاز باشد باز هم یک صفحه ارتباط با ما دارد که کاربران در صورت لزوم برایتان پیامی را ارسال کنند. پس هرگز فکر نکنید که در مورد استفاده از فرم سازها در وردپرس بینیاز هستید.
اما اگر میخواهید بدانید که فرمسازها چه کاربردهایی دارند، حتما به شما میگوییم. همانطور که گفتیم فرمسازها در هر نوعی که طراحی شوند وظیفه انتقال پیام را برعهده دارند. اما این نوع پیام متفاوت است:
همانطور که گزینههای بالا را بررسی میکنید، مشخص میشود که ما باید برای اهداف خود از فرم سازها در وردپرس یا هر نوع سیستم دیگری کمک بگیریم. حال سوالی که مطرح میشود اینجاست که چگونه بدانیم کدامیک از فرم سازها در وردپرس را برای فعالیتهای خود انتخاب کنیم؟ برای اینکه به شما در انتخاب کنیم چند نوع فرمساز را در نظر گرفته و برایتان معرفی میکنیم.
یکی از حرفهایترین فرم سازها در وردپرس، Gravity forms است که مطمئنا نام آن را شنیده یا با آن کار میکنید. جالب است بدانید این فرمساز تمامی امکانات را در خود داشته و به کمک آن میتوانید هر نوع فرمی را بسازید. فیلدهای مختلفی دارد که تنها نیاز به دستان توانمند شما جهت سفارشیسازی دارد. اگر بخواهیم دقیق درباره ویژگیهای آن صحبت کنیم میتوان گفت که این فرمساز امکان ایجاد:
را دارد.
یکی از مشکلاتی که برخی کاربران با وردپرس دارند، عدم امکان ساخت پروفایل کاربریست. گاهی وبسایت شما احتیاجی به پنل کاربری برای کاربران ندارد اما گاهی هم سایتی دارید که حتما باید چنین پنلی را ایجاد کند. پس تکلیف چیست؟ افزونه profile builder به شما امکان ساخت یک پنل کاربری حرفهای را میدهد. این افزونه دارای امکانات زیر است:
یکی دیگر از فرم سازها در وردپرس، Quform است که یک افزونه قدرتمند به حساب آمده و امکانات خوبی دارد. بهترین مزیت آن رابط کاربری استاندارد است. این فرمساز دارای امکانات زیر است:
افزونه Ultimate member مخصوص ساخت فرمهای عضویت در وردپرس است. این افزونه دارای قابلیتهای جالبی جهت ایجاد و ساخت فرمهای عضویت است که برخی از آنها عبارت است فرم ساز دراگ و دراپ و امکان ثبت نام و ورود از طریق شبکه های اجتماعی ، امکان ساخت شبکه اجتماعی ، دارای پروفایل کاربری و امکان ارسال پیام توسط کاربران به یکدیگر ، امکان ارسال پیام از طرف مدیر و امکان ارسال اطلاعیه به تمام کاربران سایت ، دارای کدکپچای گوگل برای جلوگیری از اسپم ها و امکان فالو و آنفالو کردن کاربران و امکانات بسیاری دیگر ….
افزونههای جانبی این افزونه عبارت است از:
اگر به دنبال تعامل بیشتر با کاربران خود هستید و میخواهید نظر آنها را جلب کنید، پیشنهاد میکنیم حتما از قدرت فرم سازها در وردپرس استفاده کنید. فقط کافیست کمی زمان بگذارید و فرمسازها را شناسایی کنید تا بتوانید برای هر منظوری با کمک فرم سازها میتوانید پل ارتباطی بین خود و کاربران بزنید. در این مقاله ۴ مورد از بهترین فرمسازها را برایتان معرفی کردیم که به کمک آنها تقریبا میتوانید هر نوع فرمی را طراحی کرده و در سایت خود قرار دهید.
منتظر نظرات و پیشنهادات سازنده شما هستیم.
منبع: ژاکت
نجوا پلتفرم ارسال اعلان (Push Notification) میباشد که با هدف تقویت ارتباط بین وبسایتها، اپلیکیشنها و کاربران آنها ایجاد شده است.
شما به عنوان صاحبان کسبوکارهای اینترنتی پس از یکپارچهسازی وبسایت و اپلیکیشن خود با نجوا، میتوانید کاربران سرویس خود را شناسایی کرده و آنها را جذب نمایید. با ارسال پوش نوتیفیکیشن در زمان مناسب، آنها را به وبسایت و اپلیکیشن خود بازگردانده و با ارسال نوتیفیکیشن شخصیسازی شده متناسب با علایق و ویژگیهای کابران، ضمن راضی نگهداشتن آنها، شبکه مخاطبان وفادار را گسترش دهید. به این ترتیب به عنوان کسبوکارهای مختلف در دنیای مجازی روابط بین خود و کاربرانتان را دائمی و باکیفیتتر کنید.

یک اعلان یا پوش نوتیفیکیشن پیغامی است که از وبسایت یا اپلیکیشن ارسال شده و بر روی کامپیوتر و موبایل مخاطب نمایش داده میشود. برای دریافت پوش نوتیفیکیشن، نیازی به باز بودن اپلیکیشن یا وبسایت فرستنده نمیباشد. این پیغام میتواند حاوی عکس، عنوان، توضیحات و لینک باشد که مخاطبان از طریق کلیک بر روی آن به لینک مورد نظر هدایت میشوند. نمونهای از یک پوش نوتیفیکیشن در زیر نمایش داده شده است:

چرا پوش نوتیفیکیشن وب برای سرویسهای اینترنتی ضروری است؟
| ویژگیها | ایمیل | پیام کوتاه | پوش نوتیفیکیشن |
| نرخ باز شدن | کم | زیاد | زیاد |
| طول پیام | طولانی | متوسط | کوتاه |
| زمان باز شدن | زیاد | سریع | خیلی سریع |
| تعامل کاربر | کم | متوسط | زیاد |
| رسیدن به هدف | کم | متوسط | زیاد |
| نرخ تبدیل | کم | متوسط | زیاد |
| نرخ جذب کاربر | کم | کم | زیاد |
| هزینه | متوسط | زیاد | کم |

صاحبان وبسایتهای وردپرسی میتوانند با نصب افزونه وردپرس در پنل وردپرس خود، از بیشتر امکانات موجود در پنل نجوا بهرهمند شوند. با وارد کردن توکن و API-KEY وبسایت خود در افزونه وردپرس، میتوانید پنل نجوای خود را به پنل وردپرس متصل نمایید.
به کمک افزونه وردپرسی نجوا میتوانید:
وقتی حرف از تبلیغات در سایتها به میان میآید، متاسفانه بخشی از ذهن ما انرژی منفی را دریافت میکند. تقصیر از ذهنیت ما نیست، زیرا بعضی از سایتها با روشهای اشتباهی تبلیغات راه انداختند و حال فکر میکنیم منظور از تبلیغات اینترنتی دقیقا همان کاریست که آنها میکنند. اما این چنین نیست؛ هر چیزی را اگر طبق قوانین درست انجام دهید نه تنها باعث رنجش و آزار کاربران نمیشود، بلکه برای آنها سودمند نیز هست. پس نتیجه این شد که به سراغ تبلیغات هوشمندانه برای سایت باشیم. اما چگونه؟ همراه ما باشید تا در این مقاله پیرامون این مسئله صحبت کنیم.
هر کاری که برای پیشرفت سایتمان میکنیم خوب است اما شاید به پای تبلیغات اینترنتی نرسد. در واقع میزان تاثیرگذاری تبلیغات در سایتها به گونهایست که هم میتواند یک منبع درآمد برای صاحب وبسایت باشد و هم میتواند تاثیر بسزایی بر روی سایت تبلیغ دهنده داشته باشد. پس در واقع میتوانیم بگوییم یک معامله دو سر سود است؛ به شرطی که از نوع تبلیغات هوشمندانه برای سایت باشد.

سوالی که همین ابتدا لازم است به آن پاسخ دهیم، این است که چرا اصلا باید تبلیغ کنیم؟ مگر شما نمیخواهید وبسایت شناخته شدهای باشید و محصول و خدمات خود را به کاربران معرفی کنید؟ چه روشهایی را برای این منظور در نظر گرفتهاید؟
حتما میگویید تمامی فاکتورهای سئو را رعایت میکنید. درست است! اما تبلیغات نیز یکی دیگر از عواملی است که تاثیر بسزایی بر فروش شما دارد. به شرط آنکه درست انجام شده و در سایتهای خوبی قرار گیرد. از این هم نباید غافل شوید که تبلیغات هوشمندانه برای سایت است که باعث افزایش درآمد کسب و کارتان میشود.
بسیاری از وبسایتهای معتبر این روش را همیشه برای خود در نظر دارند و هرزچندگاهی تبلیغات خود را بصورت رپورتاژ آگهی، تبلیغات بنری و… به سایر وبسایتهای معتبر میدهند تا کاربران جدیدی جمع کنند.
تبلیغات در وبسایتها نیز روشهای مختلفی دارد که انواع تبلیغات هوشمندانه برای سایت را با هم بررسی میکنیم.

معمولا تبلیغات بنری نوعی از تبلیغات بسیار رایج است که از گذشته تا کنون مورد استفاده قرار میگرفته. با توجه به اندازهای که سایتها برای تبلیغات بنری در نظر میگیرند، میتوانید بنر خود را طراحی کرده و در اختیارشان قرار دهید. گاهی این بنرها میتوانند به اندازه اسلایدر یک سایت طراحی شوند، گاهی در سایدبار قرار میگیرند و گاهی هم در بین نوشتهها.
این نوع از تبلیغات معمولا با عنوان رپورتاژ آگهی در برخی وبسایتها پذیرفته میشوند. یک متن خبری- تبلیغاتی را برای وبسایت مربوطه به همراه تصویر آماده کرده و تحویل میدهید. آنها نیز یک پست از سایت خود را به مطلب شما اختصاص میدهند. در رپورتاژها معمولا حق استفاده از دو الی سه لینک از صفحه وبسایت خود را دارید. و این خود یک موقعیت بزرگ برای شما به حساب میآید.
حتما با پنجرههای پاپ آپ آشنایی دارید. وارد برخی سایتها که میشویم به ناگاه پنجرههای تبلیغاتی برایمان باز میشوند که به آنها پاپ آپ می گویند. البته استفاده از آنها روش خاصی دارد تا کاربر را دچار خستگی و رنجش نکند. اینجاست که میگوییم باید تبلیغات هوشمندانه برای سایت داشته باشید.
این افزونه همانطور که از نامش پیداست تبلیغات هوشمندانه برای سایت را با کمک پاپ آپ به وجود میآورد. امکانات فوقالعادهای دارد که برخی از آنها عبارت است از:
ویدئو همیشه موثرترین روش ارائه مطلب به مخاطب است. معمولا سایتی مانند آپارات بهترین جایگاه برای قرارگیری ویدئو است. فرقی ندارد ویدئوی شما آموزشی باشد یا تبلیغاتی! به هر صورت میتوانید آن را همراه با اطلاعاتی در آپارات بارگذاری کنید. هر چقدر ویدئوی شما بهتر باشد، مسلما مخاطبان بیشتری جذب آن خواهند شد. این مورد نیز جزء تبلیغات هوشمندانه برای سایت به حساب میآید.
یک روش آشنا و همیشگی انجام ایمیل مارکتینگ یا بازاریابی ایمیلی است. این روش هرگز منسوخ نمیشود و همیشه جزء بهترین روشهای ممکن است که میتوان به کمک آن اطلاعات خوبی را به کاربران منتقل کرد به شرط آنکه تبلیغات هوشمندانه برای سایت را شامل شود.
با کمک این افزونه میتوان فرمهای عضویت در خبرنامه ایجاد کرد که با خبرنامه بلوم در ارتباط است. کاربر با پر کردن اطلاعات خود توسط این فرمها در خبرنامه شما عضو شده و در زمان ارسال ایمیل، امکان دریافت را پیدا میکند.
چنانچه میخواهید از طریق تبلیغات جواب درستی بگیرید باید تبلیغات هوشمندانه برای سایت پیدا کنید. به همین راحتی نمیتوان هوشمند بود و درست عمل کرد. پس دقت کنید، مطالعه کنید و ابزارهای درستی را انتخاب نمایید.
منبع: ژاکت
در بخش قبلی این مطلب با عنوان رسم گرافیک با جاوا اسکریپت در مورد برخی مباحث مقدماتی مرتبط با رسم گرافیکهای دو بعدی در جاوا اسکریپت صحبت کردیم. اینک بخش دوم آن را ارائه میکنیم. برای مطالعه بخش قبلی روی لینک زیر کلیک کنید:
تا به اینجا برخی از کاربردهای اولیه بوم 2 بعدی را معرفی کردیم، اما در عمل تا زمانی که بوم را بهروزرسانی یا انیمیت نکردهاید هنوز از قدرت کامل بوم استفاده نکردهاید. در نهایت بوم، تصاویر قابل اسکریپتنویسی عرضه میکند. اگر قصد ندارید چیزی را تغییر دهید، در این صورت شاید بهتر باشد از تصاویر استاتیک استفاده و در وقت خود نیز صرفهجویی کنید.
کار کردن با حلقهها در بوم تا حدی سرگرمکننده است، چون میتوانید دستورهای بوم را درست مانند همه کدهای جاوا اسکریپت درون یک حلقه for اجرا کنید. در ادامه یک مثال ارائه میکنیم.
یک کپی از فایل زیر روی سیستم خود تهیه کنید.
خط زیر را به انتهای جاوا اسکریپت اضافه کنید. این کد شامل یک متد جدید به نام ()translate است که نقطه مبدأ بوم را جابجا میکند:
ctx.translate(width/2, height/2);4
این امر موجب میشود که مبدأ (0, 0) به مرکز بوم جابجا شود و دیگر در گوشه چپ-بالا نباشد. این وضعیت در موقعیتهای زیادی مانند این مثال مفید است چون میخواهیم طراحی ما نسبت به مرکز بوم ترسیم شود.
سپس کد زیر را به انتهای جاوا اسکریپت اضافه کنید:
در کد فوق ما یک تابع ()degToRad پیادهسازی کردهایم که در مثال مثلث قبلی دیدیم. یک تابع ()a نیز وجود دارد که عددی تصادفی بین کرانهای بالا و پایین تعیینشده بازگشت میدهد، متغیرهای length و moveOffset و یک حلقه for خالی نیز وجود دارند.
ایده این است که چیزی روی بوم و درون حلقه for رسم کنیم و هر بار روی آن تکرار کنیم به طوری که بتوانیم چیز جالبی رسم کنیم. کد زیر را درون حلقه for اضافه کنید:
بدین ترتیب در هر تکرار حلقه کارهای زیر صورت میگیرند:
در نهایت مثال ما باید به شکل زیر درآمده باشد:
در این مرحله شما را تشویق میکنیم که با این مثال بیشتر کار کنید و تغییرات دلخواه خود را در آن ایجاد کنید. برای نمونه میتوانید:
نکته: کد کامل این مثال به صورت زیر است:
مثال حلقهای که در بخش قبل ساختیم جالب بود، اما شما به یک حلقه ثابت نیاز دارید که در همه اپلیکیشنهای جدی بوم مانند بازی یا بصریسازی آنی، به طور مکرر از آن استفاده کنید. اگر بوم را مانند یک فیلم تصور کنیم ما به یک نمایشگر نیاز داریم که در هر فریم بهروزرسانی شود تا نمای بهروز را نشان دهد. نرخ رفرش مناسب 60 فریم بر ثانیه است تا حرکتها به چشم انسان زیبا و روان باشند.
چند تابع جاوا اسکریپت وجود دارند که امکان اجرای مکرر تابعها را چندین بار در طی یک ثانیه فراهم میسازند، اما بهترین آنها برای منظور ما ()window.requestAnimationFrame است. این تابع یک پارامتر میگیرد که نام تابعی است که میخواهید در هر فریم اجرا شود. دفعه بعد که مرورگر آماده بهروزرسانی صفحه باشد، تابع شما فراخوانی میشود. اگر آن تابع بهروزرسانی جدیدی در انیمیشن شما رسم کند، در این صورت بار دیگر درست قبل از انتهای تابع فراخوانی میشود و حلقه انیمیشن همین طور تداوم مییابد. حلقه زمانی متوقف میشود که ()requestAnimationFrame را فراخوانی کنید و یا ()window.cancelAnimationFrame را پس از فراخوانی ()requestAnimationFrame اما قبل از فراخوانی فریم، اجرا کنید.
نکته: فراخوانی ()cancelAnimationFrame از کد اصلی در زمان پایان یافتن کارمان با انیمیشن، ایده خوبی است زیرا مطمئن میشویم که هیچ بهروزرسانی در انتظار اجرا شدن نیست.
مرورگر جزییات پیچیدهای مانند اجرای انیمیشن با سرعت یکنواخت و عدم هدر دادن منابع برای انیمیت چیزهایی که دیده نمیشوند را خود بر عهده میگیرد.
برای این که ببینید طرز کار آن چگونه است، مجدداً نگاهی سریع به مثال توپهای رقصان خود میاندازیم. کد حلقه که همه چیز را در حال حرکت حفظ میکند به صورت زیر است:
ما تابع ()loop را یک بار در انتهای کد برای آغاز چرخه اجرا میکنیم و نخستین فریم انیمیشن را رسم میکنیم. سپس تابع ()loop مسئولیت فراخوانی (requestAnimationFrame(loop را برای اجرای فریم بعدی انیمیشن به طور مکرر بر عهده میگیرد.
توجه کنید که هر فریم به صورت کامل بوم را پاک و همه چیز را از تو رسم میکند. در مورد هر توپی که وجود دارد ما آن را رسم میکنیم، موقعیتش را بهروزرسانی میکنیم و بررسی میکنیم که آیا با توپهای دیگر برخورد دارد یا نه. زمانی که یک گرافیک روی بوم رسم میکنید، هیچ راهی برای دستکاری منفرد گرافیک مانند کاری که روی عناصر DOM انجام میدهیم وجود ندارد. ما نمیتوانیم هیچ توپی را روی بوم جابجا کنیم، زیرا زمانی که رسم شد جزئی از بوم میشود و عنصر یا شیء منفردی نیست که بتوان با آن تعامل داشت. به جای آن میتوان بوم را پاک کرد و دوباره نو رسم کرد و این کار یا از طریق پاک کردن و رسم مجدد همه چیز و یا با داشتن کدی که دقیقاً میداند کدام بخشها باید پاک شوند و تنها آن نواحی مورد نیاز مجدداً روی بوم رسم شوند ممکن است.
بهینهسازی انیمیشن گرافیکها یک بحث کاملاً تخصصی برنامهنویسی است که تکنیکهای هوشمندانه زیادی دارد. با این حال بررسی این موارد خارج از حیطه این مقاله است.
به طور کلی فرایند انیمیشن بوم شامل گامهای زیر است:
نکته: ما در مثال خود به بررسی ()save و ()restore نپرداختیم، اما در مقالات بعدی این سری مطالب آموزشی به آن خواهیم پرداخت.
اینک نوبت به ایجاد یک انیمیشن ساده رسیده است. به این منظور یک کاراکتر از یک بازی جالب را انتخاب کردهایم که روی صفحه راه میرود. یک کپی از فایل زیر روی رایانه خود ایجاد کنید:

این تصویر شامل شش اسپریت است که کل توالی راه رفتن را میسازند و هر یک 102 پیکسل عرض و 148 پیکسل ارتفاع دارند. برای نمایش هر اسپریت به صورت واضح باید از ()drawImage استفاده کنید تا یک تصویر را از اسپریتشیت برش داده و تنها آن بخش را نمایش دهد. این شبیه کاری است که در مورد لوگوی فایرفاکس قبلاً انجام دادیم. مختصات X قطعه باید مضربی از 102 باشد و مختصات Y همواره 0 است. اندازه قطعه همواره 102 در 148 پیکسل است.
اینک یک تابع ()draw خالی در انتهای کد درج میکنیم که آماده کدنویسی است:
بقیه کد در این بخش درون draw() قرار میگیرد. ابتدا خط زیر را اضافه میکنیم که بوم را پاک میکند و آماده رسم هر فریم میشویم. توجه کنید که ما باید گوشه چپ-بالای مستطیل را به صورت -(width/2), -(height/2) تعیین کنیم زیرا مبدأ را قبلاً به صورت width/2, height/2 تعیین کردهایم.
سپس تصویر خود را با استفاده از drawImage رسم میکنیم. ما از نسخه 9 پارامتری آن استفاده میکنیم:
چنان که میبینید:
اینک مقدار sprite را پیش از هر بار رسم عوض میکنیم. بلوک کد زیر را در انتهای تابع ()draw وارد کنید:
ما کل بلوک را در بخش زیر وارد میکنیم:
همچنین از عملگر پیمانه (%) برای بررسی این نکته که مقدار posX میتواند دقیقاً و بدون باقیمانده بر 13 تقسیم شود استفاده میکنیم. اگر چنین باشد با افزایش شماره sprite به اسپریت بعدی میرویم. این کار عملاً به این معنی است که ما تنها sprite را هر 13 فریم یک بار روی صفحه بهروزرسانی میکنیم یا به عبارت دیگر نرخ رفرش ما 5 فریم بر ثانیه است. توجه کنید که ()requestAnimationFrame در صورت امکان با نرخ 60 فریم بر ثانیه فراخوانی میشود. ما عامدانه نرخ فریم را کندتر کردهایم زیرا تنها شش اسپریت داریم که میتوانیم نمایش دهیم و اگر در هر ثانیه 60 بار اسپریت را عوض کنیم، کاراکتر ما بسیار به سرعت راه میرود.
درون بلوک بیرونی از یک گزاره if…else استفاده میکنیم تا بررسی کنیم آیا مقدار sprite روی 5 قرار دارد یا نه. اگر آخرین اسپریت را نمایش دهیم sprite را روی 0 ریست میکنیم و در غیر این صورت آن را 1 واحد افزایش میدهیم.
سپس باید شیوه تغییر مقدار posX را در هر فریم بررسی کنیم. بلوک کد زیر را درست زیر کد قبلی اضافه کنید:
ما از یک گزاره if … else دیگر استفاده میکنیم تا ببینیم آیا مقدار posX بزرگتر از width/2 میشود یا نه. این بدان معنی است که کاراکتر ما از گوشه راست صفحه به بیرون میرود. اگر چنین باشد باید موقعیتی را محاسبه کنیم که کاراکتر را در سمت چپ، بخش چپ صفحه قرار میدهد و سپس posX را برابر با نزدیکترین ضریب 13 آن عدد قرار دهیم. این مقدار باید ضریبی از 13 باشد چون در غیر این صورت بلوک کد قبلی کار نمیکند، چون posX هرگز برابر با ضریب 13 نخواهد بود.
اگر کاراکتر انیمیشن هنوز از لبه صفحه بیرون نرفته است مقدار posX را به میزان 2 واحد افزایش میدهیم. بدین ترتیب در هر بار رسم، کمی به سمت راست حرکت میکند.
در نهایت باید حلقه انیمیشن را با فراخوانی requestAnimationFrame() در انتهای تابع draw() به اجرا درآوریم:
بدین ترتیب و در نهایت مثال ما باید چیزی مانند زیر باشد:
نکته: کد نهایی این مثال به صورت زیر است:
به عنوان آخرین مثال این نوشته، یک اپلیکیشن بسیار ساده برای رسم معرفی میکنیم تا شیوه ترکیب حلقه انیمیشن را ورودی کاربر را نمایش دهیم. ما مراحل ساخت این مثال را مورد بررسی قرار نمیدهیم و صرفاً به بررسی بخشهای جالبتر کد میپردازیم.
کد این مثال به صورت زیر است:
در ادامه این مثال را در حالت اجرایی مشاهده میکنید:
در ادامه به بررسی بخشهای جالبتر کد میپردازیم. قبل از هر چیز رد مختصات X و Y ماوس و این که کلید ماوس کلیک شده یا نه را با متغیرهای curX ،curY و pressed حفظ میکنیم. زمانی که ماوس حرکت میکند یک مجموعه تابع به صورت دستگیره رویداد onmousemove اجرا میکنیم که مقادیر فعلی X و Y را دریافت میکند. همچنین از دستگیرههای رویداد onmousedown و onmouseup برای تغییر مقدار pressed به true در زمانی که دکمه ماوس زده میشود استفاده میکنیم و زمانی که کلیدش رها شود آن را مجدداً به حالت false تعیین میکنیم.
زمانی که دکمه Clear canvas فشرده شود یک تابع ساده اجرا میکنیم که کل بوم را پاک میکند و به حالتی که قبلاً دیدیم درمیآید:
حلقه رسم کاملاً ساده است، اگر مقدار pressed به صورت true باشد، یک دایره رسم میکنیم که دارای استایل fill برابر با مقداری است که از انتخابگر رنگ به دست آمده است و شعاع نیز بر برابر با مقداری است که در ورودی range ارائه شده است.
نکته: انواع <input> به صورت range و color تقریباً به خوبی روی همه مرورگرها پشتیبانی میشوند و تنها استثنا نسخههای زیر 10 اینترنت اکسپلورر است. البته سافاری نیز هنوز از color پشتیبانی نمیکند. اگر مرورگر شما از این ورودیها پشتیبانی نمیکند به صورت فیلدهای متنی ساده fall back میشوند و میتوانید مقادیر موردنظر رنگ/شماره را خودتان وارد کنید.
اینک زمان آن رسیده است که بوم 2 بعدی را کنار بگذاریم و یک بررسی اجمالی در مورد بوم 3 بعدی داشته باشیم. محتوای بوم 3 بعدی با استفاده از WebGL API تعیین میشود که یک API کاملاً جدا از API بوم 2 بعدی است، گرچه هر دو روی عنصر <canvas> رندر میشوند.
WebGL بر مبنای زبان برنامهنویسی گرافیک OpenGL طراحی شده است و امکان ارتباط مستقیم با GPU رایانه را به دست میدهد. در این حالت، نوشتن WebGL خام به زبانهای سطح پایین مانند ++C نزدیکتر است تا جاوا اسکریپت و گرچه کاملاً پیچیده، اما بسیار قدرتمند است.
اغلب افراد کد گرافیکی 3 بعدی را به دلیل پیچیدگیاش با استفاده از یک کتابخانه جاوا اسکریپت شخص ثالث مانند Three.js، PlayCanvas یا Babylon.js انجام میدهند. اغلب آنها طرز کار مشابهی دارند و کارکردی برای ایجاد شکلهای ابتدایی و سفارشی، موقعیتیابی دوربینهای تماشا و ابزارهای نورپردازی، تبدیل سطوح به بافت و موارد دیگر ارائه میکنند. این کتابخانهها WebGL را برای شما مدیریت میکنند و امکان کار در سطوح بالاتر را فراهم میسازند.
استفاده از یکی از این ابزارها باعث میشود که API جدیدی را بیاموزید، ما بسیار سادهتر از کدنویسی WebGL خام است.
در ادامه به مثال سادهای از شیوه ایجاد یک چیز جدید در کتابخانه WebGL میپردازیم. ما کتابخانه Three.js را انتخاب میکنیم، چون یکی از محبوبترین کتابخانهها محسوب میشود. در این راهنما یک مکعب چرخان 3 بعدی که قبلاً در ابتدای مطلب دیدیم را ایجاد میکنیم.
در آغاز کار یک کپی از فایل زیر در یک پوشه روی سیستم خود ایجاد کنید و سپس تصویر metal003.png (+) را دانلود کرده در همان پوشه قرار دهید. این همان تصویری است که به عنوان بافت سطح برای مکعب استفاده میکنیم.
اینک three.js به صفحه الصاق یافته است و میتوانیم شروع به نوشتن کد جاوا اسکریپتی بکنیم که از آن در min.js استفاده میکند. کار خود را با ایجاد یک صحنه جدید آغاز میکنیم. کد زیر را به فایل main.js اضافه کنید:
سازنده ()Scene یک صحنه جدید ایجاد میکند که نماینده کل دنیای 3 بعدی است که میخواهیم نمایش دهیم.
سپس باید یک camera داشته باشیم تا بتوانیم صحنه خود را ببینیم. دوربین در فرهنگ اصلاحات طراحی 3 بعدی، نماینده موقعیت بیننده در دنیا است. برای ایجاد یک دوربین باید خطوط زیر را به صفحه اضافه کنید:
سازنده ()PerspectiveCamera چهار آرگومان میگیرد:
همچنین موقعیت دوربین را در مسافت 5 واحد از محور Z تعیین میکنیم که مانند CSS به سمت خارج از صفحه یعنی به سمت شما (بیننده) است.
عامل ضروری سوم رندر کننده است. این شیئی است که یک صحنه مفروض را چنان که توسط دوربین مفروض دیده میشود، رندر میکند. ما با استفاده از سازنده ()WebGLRenderer یک رندرکننده میسازیم، اما در حال حاضر از آن استفاده نمیکنیم. خطوط زیر را به کد قبلی اضافه کنید:
خط اول یک رندرکننده جدید میسازد، خط دوم اندازهای را تعیین میکند که رندرکننده با آن نمای دوربین را رسم خواهد کرد و خط سوم عنصر <canvas> ایجاد شده از سوی رندرکننده را به <body> سند الحاق میکند. اینک هر چیزی که رندرکننده رسم کند روی پنجره ما رسم میشود.
سپس میخواهیم مکعبی ایجاد کنیم که روی بوم نمایش پیدا کند. به این منظور بلوک کد زیر را به انتهای جاوا اسکریپت موجود اضافه کنید:
کارهای زیادی در این کد انجام مییابد که در ادامه آنها را توضیح میدهیم:
ابتدا یک متغیر سراسری cube ایجاد میکنیم تا بتوانیم از هر جایی در کد به مکعب خود دسترسی داشته باشیم.
سپس یک شیء جدید TextureLoader ایجاد میکنیم و ()load را نیز روی آن فراخوانی میکنیم. ()load در این مثال دو پارامتر میگیرد (گرچه میتواند موارد بیشتری بگیرد) که یکی بافتی است که میخواهیم بارگذاری شود (فایل PNG) و دیگری تابعی است که هنگام بارگذاری شدن بافت اجرا خواهد شد.
درون این تابع از مشخصههای شیء texture برای تعیین این که میخواهیم یک تکرار 2 در 2 از تصویر پیرامون همه اضلاع مکعب را بپوشاند استفاده میکنیم. سپس یک شیء BoxGeometry و یک شیء جدید MeshLambertMaterial میسازیم و آنها را کنار یکدیگر قرار میدهیم تا یک mesh برای مکعب ایجاد شود. یک شیء به طور معمول نیازمند یک هندسه (شکل کلی) و یک جنس (نوع سطح) است.
در نهایت مکعب خود را به صحنه اضافه میکنیم و سپس تابع ()draw را فرامیخوانیم تا شروع به انیمیشن کند.
پیش از آن که ()draw را تعریف کنیم باید چند نور به صحنه اضافه کنیم تا همه چیز روشنتر شود. بنابراین بلوک زیر را به صفحه اضافه میکنیم:
شیء AmbientLight نوعی از نور نرم است که کل صحنه را کمی روشن میکند مانند آفتاب که موجب روشنایی زمین میشود. در سوی دیگر شیء AmbientLight یک شعاع نور جهتدار است که بیشتر شبیه نور چراغ قوه است.
در نهایت تابع ()draw را به انتهای کد میافزاییم:
این کد کاملاً گویا است. در هر فریم، مکعب را کمی روی محورهای X و Y خود میچرخانیم و سپس صحنه را چنان که از سوی دوربین دیده میشود رندر میکنیم و در نهایت ()requestAnimationFrame را فرامیخوانیم تا رسم فریم بعدی را زمانبندی کند.
در ادامه میتوانید وضعیت نهایی مثالی که ساختیم را ملاحظه کنید:
نکته: کد کامل مثال فوق به صورت زیر است. اگر هر نوع خطایی داشتید میتوانید کد خودتان را با مثال زیر تطبیق دهید:
بدین ترتیب اینک با مطالعه این مطلب نسبتاً بلند ایده مفیدی از مبانی برنامهنویسی گرافیکی با استفاده از Canvas و WebGL کسب کردهاید و میدانید که چه کارهایی میتوانید با API انجام دهید. همچنین ایده مناسبی از این که برای کسب اطلاعات بیشتر باید چه کار بکنید دارید.
اگر این مطلب برای شما مفید
منبع: فرادرس
در این مقاله با شیوه استفاده از CSS روی فرمهای HTML برای زیباتر ساختن آنها آشنا میشویم. البته این کار ممکن است کمی پیچیده باشد. ویجتهای فرم به دلایل تاریخی و فنی به خوبی با CSS همکاری نمیکنند. به دلیل همین دشواریها، توسعهدهندگان زیادی تلاش میکنند که ویجتهای HTML خاص خود را بسازند و روی ظاهر و حس آنها کنترل کاملی داشته باشند. با این حال، طراحان وب با استفاده از بسیاری از مرورگرهای مدرن کنترل هر چه بیشتری روی طراحی عناصر فرم پیدا کردهاند. برای مطالعه بخش قبلی این سری مطالب آموزشی روی لینک زیر کلیک کنید:
در روزهای آغازین ظهور وب یعنی حدود سالهای 1995، کنترلهای فرم بر حسب خصوصیتهای HTML 2 به این زبان اضافه شدند. به دلیل پیچیدگی ویجتهای فرم، پیادهسازیکنندگان تصمیم گرفتند که برای مدیریت و رندر آنها روی سیستم عامل تکیه داشته باشند.
چند سال بعدتر که CSS خلق شد بر حسب ضرورت فنی از ویجتهای بومی برای پیادهسازی کنترلهای فرم به دلیل الزام به استایلبندی استفاده شد. در روزهای آغازین CSS استایلبندی کنترلها یک اولویت محسوب نمیشد.
از آنجا که کاربران به ظاهر بصری پلتفرمهای متناظرشان خو کرده بودند، ارائهدهندگان مرورگر تمایل چندانی به فراهم ساختن قابلیت استایلبندی کنترلها نداشتند. تا به امروز این وضعیت همچنان یک مشکل جدی برای بازسازی همه کنترلها جهت ایجاد قابلیت استایلبندی محسوب میشود.
حتی امروزه نیز هیچ مرورگر منفردی به صورت کامل CSS2.1 را پیادهسازی نکرده است. با این حال در طی زمان، ارائهدهندگان مرورگرها پشتیبانی خود از CSS را برای عناصرشان بهبود بخشیدند و گرچه CSS در این زمینه شهرت بدی کسب کرده است، اما امروزه میتوان از آن برای استایلبندی فرمهای HTML استفاده کرد.
در حال حاضر همچنان برخی دشواریها در زمان استفاده از CSS روی فرمها بر جا مانده است. این مشکلات را میتوان به سه دسته عمده تقسیم کرد:
برخی عناصر میتوانند بدون هیچ مشکل و یا مشکلات جزئی روی همه پلتفرمها استایلبندی شوند. این موارد شامل عناصر ساختاری زیر هستند:
این لیست همچنین شامل همه ویجتهای فیلد متنی (چه تکخطی و چه چندخطی) و دکمهها نیز میشود.
برخی عناصر به ندرت میتوانند استایلبندی شوند و ممکن است نیازمند برخی ترفندهای پیچیده باشند و حتی در مواردی ممکن است لازم باشد از دانش پیشرفته CSS3 برخوردار باشید.
این لیست شامل عنصر <legend> است، اما این عنصر نمیتواند روی همه پلتفرمها به درستی موقعیتیابی شود. «کادرهای انتخاب» (Checkboxes) و دکمههای رادیویی نیز نمیتوانند مستقیماً استایلبندی شوند گرچه به لطف CSS3 میتوان راهحلهایی یافت. محتوای placeholder به هیچ روش استانداردی قابل استایلبندی نیست، با این حال همه مرورگرهایی که آن را پیادهسازی میکنند، شِبهعنصر CSS مناسبی را برای آن پیادهسازی کردهاند یا شِبهکلاسی دارند که امکان استایلبندی آن را فراهم میسازد.
ما در مقالات آتی مجله فرادرس، روش مدیریت همه این حالتها را با جزییات بیشتر توضیح خواهیم داد.
برخی عناصر نمیتوانند با استفاده از CSS استایلبندی شوند. این موارد شامل همه ویجتهای پیشرفته اینترفیس کاربر مانند کنترلهای range ،color یا date و همه ویجتهای بازشدنی شامل عناصر <select> ،<option> ،<optgroup> و <datalist> میشود. ویجت file picker نیز به طور کلی نمیتواند استایلبندی شود. عناصر جدید <progress> و <meter> نیز در همین دسته جای میگیرند.
مشکل اصلی همه این ویجتها از این واقعیت ناشی میشود که ساختار بسیار پیچیدهای دارند و CSS در حال حاضر به قدر کافی برای استایلبندی همه بخشهای ظریف این ویجتها گویا نیست. اگر میخواهید این ویجتها را سفارشیسازی کنید، باید از جاوا اسکریپت برای ساختن یک درخت DOM جهت استایلبندی آنها استفاده کنید. این وضعیت در مقاله زیر مورد بررسی قرار گرفته است:
برای استایلبندی عناصری که استایلبندی آنها آسان است، یعنی در بخش فوق آنها را در دسته خوبها قرار داریم عموماً مشکل خاصی وجود نخواهد داشت چون آنها شبیه هر عنصر HTML دیگری رفتار میکنند. با این حال استایلشیت خاص هر مرورگر میتواند اندکی ناسازگار باشد و از این رو چند ترفند وجود دارد که میتواند به استایلبندی سادهتر آنها کمک کند.
کادرهای جستجو تنها نوعی از فیلدهای متنی هستند که ممکن است استایلبندیشان کمی دشوار باشد. در مرورگرهای مبتنی بر WebKit (کروم، سافاری و غیره) باید آن را با مشخصه webkit-appearance- دستکاری بکنید.

چنان که در تصویر فوق از فیلد جستجو روی مرورگر کروم مشخص است، دو فیلد دارای حاشیه هستند. فیلد اول بدون استفاده از مشخصه -webkit-appearance رندر شده است در حالی که دومی با استفاده از مشخصه webkit-appearance:none رندر شده است. تفاوت کاملاً مشخص است.
فونت CSS و قابلیتهای متن میتوانند به سهولت روی هر نوع ویجتی استفاده شوند. حتی میتوان از font-face@ به همراه ویجتهای فرم استفاده کرد. با این حال رفتار مرورگرها غالباً ناسازگار است. برخی ویجتها به صورت پیشفرض از font-family و font-size از والدینشان ارثبری نمیکنند. مرورگرهای زیادی به جای آن از ظاهر پیشفرض سیستم استفاده میکنند. برای این که فرم شما از نظر ظاهری با باقی محتوا سازگار باشد، میتوانید قاعده زیر را به استایلشیت اضافه کنید:
تصویر زیر تفاوت را نشان میدهد. در تصویر سمت چپ رندرینگ پیشفرض عنصر در فایرفاکس روی Mac OS X با استایل فونت پیشفرض پلتفرم مشاهده میشود. در سمت راست همان عناصر با اعمال قواعد هماهنگسازی استایل دیده میشوند.

بحثهای زیادی بر سر این مسئله در جریان است که آیا بهتر است فرمها با استایلهای پیشفرض سیستم نمایش پیدا کنند یا دارای استایل های سفارشی باشند که برای تطبیق با محتوا سفارشیسازی شدهاند. این تصمیمگیری بر عهده شما به عنوان طراح وبسایت یا وب اپلیکیشن است.
همه فیلدهای متنی دارای پشتیبانی کاملی برای همه مشخصههای مرتبط با مدل باکس CSS شامل width ،height، padding ،margin و border هستند. با این حال مانند بخش قبل مرورگرها در زمان نمایش این ویجتها عموماً به استایلهای پیشفرض سیستم تکیه دارند. این بر عهده شما است که تعریف کنید دوست دارید آنها چگونه با محتوای دیگر بخشهای وبسایت هماهنگ شوند. اگر میخواهید ظاهر و حس بومی ویجتها را حفظ کنید یا در صورتی که بخواهید اندازه سازگاری برایشان تعیین کنید، با کمی دشواری مواجه خواهید شد.
دلیل این مسئله آن است که هر ویجت قواعد خاص خود را برای border ،padding و margin دارد. بنابراین اگر میخواهید اندازه یکسانی به چند ویجت مختلف بدهید، باید از مشخصه box-sizing استفاده کنید:

در تصویر فوق، سمت چپ بدون box-sizing ساخته شده است، در حالی که ستون راست از این مشخصه با مقدار border-box استفاده میکند. توجه کنید که بدین ترتیب میتوانیم مطمئن شویم که همه عناصر علیرغم قواعد پیشفرض هر نوع ویجت، فضای یکسانی اشغال کردهاند.
موقعیتیابی ویجتهای فرم عموماً یک مشکل محسوب نمیشود، با این حال، دو عنصر وجود دارند که باید توجه خاصی به آنها داشت و شامل legend و textarea میشوند که در ادامه هر یک را به صورت جداگانه توضیح میدهیم.
عنصر <legend> استایلبندی آسانی دارد و تنها مشکل در موقعیتیابی است. عنصر <legend> در هر مرورگر در بالای حاشیه فوقانی والد <fieldset> خود جای میگیرد. مطلقاً هیچ راهی برای تغییر دادن آن و قرار گرفتنش در داخل HTML و دوری از حاشیه فوقانی وجود ندارد. با این حال میتوانید آن را به صورت مطلق یا نسبی با استفاده از مشخصه position موقعیتیابی کنید. در غیر این صورت بخشی از حاشیه fieldset خواهد بود.
از آنجا که عنصر <legend> برای مقاصد دسترسیپذیری بسیار مهم است، از سوی فناوریهای حمایتی به عنوان بخشی از برچسب هر عنصر فرم درون fieldset قرائت میشود. در اغلب موارد با یک عنوان جفت شده و سپس به روشی دسترسپذیر پنهان میشود. به مثال زیر توجه کنید:
به صورت پیشفرض همه مرورگرها عنصر <textarea> را یک بلوک درونخطی در نظر میگیرند که در راستای خط تختانی متن تراز میشود. این وضعیت به ندرت مطلوب است. برای تغییر دادن inline-block به block بهتر است به آسانی از مشخصه display استفاده کنیم. اما اگر بخواهید از inline استفاده کنید، تغییر دادن تراز عمودی کار دشواری نخواهد بود:
در این بخش نگاهی به یک مثال دقیق از شیوه استایلبندی یک فرم HTML خواهیم داشت. بدین ترتیب بسیاری از این ایدهها روشنتر میشوند. ما قصد داریم این فرم تماس «کارتپستالی» را بسازیم.

اگر میخواهید با ما در ساخت این مثال به صورت عملی همراه باشید، ابتدا یک کپی از فایل زیر روی سیستم خود ایجاد کنید و سپس از دستورالعملهای ارائه شده پیروی نمایید.
کد HTML این مثال چندان پیچیده نیست و صرفاً چند ID و عنوان از یک صفحه معمولی HTML بیشتر دارد:
کد فوق را در بدنه HTML اضافه میکنیم.
این بخش همان جایی است که بخش جذاب ماجرا آغاز میشود. پیش از آن که شروع به کدنویسی بکنیم، به سه فایل دیگر نیاز داریم:
پیش از آغاز فونتها به مقدار پردازش بیشتر نیاز دارد:
اکنون نوبت بررسی CSS مثال رسیده است. همه بلوکهای کد نمایش یافته درون عنصر <style> را یکی پس از دیگری اضافه کنید.
ابتدا زمینه را با تعریف کردن قواعد @font-face آماده میکنیم. همه موارد مقدماتی روی عنصر <body> element و عنصر <form> آماده هستند:
اکنون میتوانیم موقعیت عناصر خود را که شامل عنوان و همه عناصر فرم است تعیین کنیم:
این همان جایی است که شروع به کار روی خود عناصر فرم میکنیم. ابتدا باید مطمئن شویم که عناصر <label> دارای فونت مناسبی هستند:
فیلدهای متنی نیازمند نوعی قواعد مشترک هستند. به بیان ساده ما borders و backgrounds را حذف میکنیم و padding و margin آنها را بازتعریف میکنیم:
زمانی که یکی از این فیلدها فوکوس بگیرند، آنها را به رنگ خاکستری روشن و با پسزمینه شفاف هایلایت میکنیم. توجه کنید که افزودن مشخصه outline برای حذف هایلایت فوکوس پیشفرض اضافه شده روی برخی مرورگرها ضروری است:
توجه داشته باشید که فیلدهای متنی کامل شدهاند و باید نمایش فیلدهای متنی تکخطی و چندخطی را تنظیم کنیم، چون معمولاً هنگام استفاده از حالت پیشفرض یکسان به نظر نمیرسند.
فیلد متنی تکخطی برای مشاهده مناسب در اینترنت اکسپلورر به دستکاری بیشتری نیاز دارد. اینترنت اکسپلورر ارتفاع فیلدها را بر مبنای ارتفاع طبیعی فونت (که رفتار همه مرورگرهای دیگر است) تعریف نمیکند. برای اصلاح این مشکل باید مانند زیر یک ارتفاع صریح به فیلد اختصاص دهیم
عناصر <textarea> به صورت پیشفرض به عنوان یک عنصر بلوکی رندر میشوند. دو نکته مهم در اینجا به مشخصههای resize و overflow مربوط است. از آنجا که طراحی دارای اندازه ثابت است، باید از مشخصه resize برای جلوگیری از تغییر دادن اندازه فیلدهای متنی چندخطی از سوی کاربران استفاده کنیم. مشخصه overflow برای این که فیلد روی مرورگرهای مختلف به روش منسجمتری رندر شود مورد استفاده قرار میگیرد. برخی مرورگرها به صورت پیشفرض دارای مقدار auto هستند، در حالی که برخی دیگر دارای مقدار پیشفرض scroll هستند. در این حالت بهتر است هر بار که از auto استفاده میکنیم کاملاً مطمئن باشیم:
عنصر <button> با CSS کاملاً سازگار است و میتوان هر کار موردنظر را روی آن حتی با استفاده از pseudo-elements اجرا کرد:
نکته: اگر مثال شما آن چنان که انتظار دارید، کار نمیکند، بهتر است کد خودتان را با کد زیر تطبیق دهید تا ریشه مشکل را پیدا کنید:
چنان که در این مطلب مشاهده کردیم، تا زمانی که میخواهیم فرمها را صرفاً با فیلدهای متنی و دکمهها بسازیم، استایلبندی آنها با استفاده از CSS کار آسانی است. در قسمت بعدی این سری مقالات آموزشی در مورد روش مدیریت آن دسته از ویجتهای فرم صحبت خواهیم کرد که در دستههای «بد» یا «زشت» این مقاله قرار گرفتند.
اگر این مطلب برای شما م
منبع: فرادرس