Category: طراحی سایت

دلایل ایجاد یک وب سایت دارای CRM برای تجارت شما-مجله سر و صدا

خلاصه سریع

ادغام CRM با وب سایت تجاری شما مزایای بی شماری دارد. در این مقاله ، زارا کوپر توضیح می دهد که این مزایا چیست و چرا وب سایت ها باید با پلت فرم CRM ادغام شوند.

امروزه اکثر مشاغل برای حضور آنلاین خود به وب سایت های بروشور ساده تکیه می کنند. اینها معمولاً وب سایتهای ثابت هستند که دارای چند صفحه هستند و اطلاعات اصلی در مورد تجارت و جزئیات محصولات و خدمات ارائه شده را ارائه می دهند. اگرچه توسعه آنها نسبت به سایتی که تجربه کاربری پیشرفته تری را ارائه می دهد نسبتاً ارزان و پیچیده تر است ، اما یک کسب و کار می تواند فرصت های زیادی را برای تعامل بهتر با مشتریان خود و فروش نزدیک از دست بدهد.

با بیشتر شدن مشاغل آنلاین و ایجاد وب سایت های بروشور ، سازمانهای زیرک باید با ارائه تجربیات روان ، خاطره انگیز و شخصی کاربران در سایت های خود از رقبای خود متمایز شوند. برای تبدیل علاقه احتمالی به محصولات و خدمات خود به فروش واقعی ، یک تجارت نیاز به تقویت روابط دارد با مشتریان خود در و خارج از سایت خود. با ادغام CRM ها با وب سایت های شرکت ، یک کسب و کار می تواند تجربیات مشتریان خود را در سایت خود ارتقا دهد و فرایندهای داخلی آنها را مدرن کند.

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

CRM ها عموماً با گروه بندی مشتریان در لیست ها و خطوط فروش که می توانند برای کمپین های هدفمند مورد استفاده قرار گیرند ، به سازمان کمک می کنند. معمولاً یک CRM دارای (یا بعداً می تواند ادغام شود) a است CMS (جحامی متسلیم سystem). CMS می تواند یک وب سایت ایجاد کند و به تیم های غیر فنی اجازه می دهد صفحات و محتوا را ایجاد و مدیریت کنند. با این حال ، CMS ها به تنهایی در ردیابی نحوه تعامل بازدیدکنندگان با سایت محدود هستند.

چرا وب سایت ها باید با پلت فرم CRM ادغام شوند؟

با ادغام CRM و CMS ، یک وب سایت می تواند تجربیات بازدیدکنندگان را از طریق شخصی سازی ، اتوماسیون بازاریابی ، پشتیبانی بهتر از مشتریان و ساده سازی فرایندهای تجاری داخلی افزایش دهد. در این مقاله ، خواهید آموخت که چگونه CRM ها تجربه ها را نه تنها برای مشتریان بلکه در بین تیم های داخلی شرکت بهبود می بخشند. خواهید دید که چگونه CRM می تواند ارائه دهد بینش عمیق تری در مورد رفتار مشتری در سایت خود و خارج از آن ، و نحوه استفاده از این اطلاعات برای افزایش فروش. در نهایت ، شما خواهید آموخت که چگونه CRM فرآیندهای کاری و گردش کاری مهم ، اما پر کار را به صورت خودکار و خلاصه می کند.

برای نشان دادن بهتر آنچه CRM و CMS می توانند با هم انجام دهند ، مثالهای این مقاله به آنها اشاره می کند پلتفرم HubSpot برای هر دو عملکردبه CRM و CMS HubSpot تقریباً تمام ویژگی های ذکر شده در بالا را ارائه می دهند و به همین دلیل ، یک مدل برتر هستند. اگرچه فقط ویژگی های اصلی CRM و CMS در اینجا پوشش داده می شود ، مهم است که توجه داشته باشید که پلت فرم HubSpot طیف گسترده ای از ویژگی ها را برای بازاریابی ، فروش و پشتیبانی ارائه می دهد.

1. تجربه دیجیتالی یکپارچه و افزایش تلاش های بازاریابی

وقتی مشتری از سایتی دیدن می کند ، معمولاً به دنبال خرید یا کسب اطلاعات است. آنها ممکن است چندین صفحه را در سایت شما مرور کنند قبل از اینکه به دنبال آنچه می گردند برسند. آنها محصولات و خدمات خاصی را مرور می کنند. آنها ممکن است یک فرم درخواست تماس با نماینده فروش را پر کنند ، که ممکن است یک یا دو روز طول بکشد. آنها ممکن است آنچه را که بدنبال آن هستند پیدا نکنند و به کمک بیشتری نیاز داشته باشند.

اگر مشتری در هنگام حضور در سایت شما نتواند کمک فوری یا نسبتاً سریعی دریافت کند ، ممکن است خریدی انجام ندهد.

اگر پشتیبانی مشتری برای کمک به آنها در رسیدگی به مشکلات سایت یا نمایندگان فروش برای راهنمایی آنها برای تکمیل خرید وجود نداشته باشد ، این فرصت از دست رفته است. آن دسته از مشتریان در حال سقوط هستند.

CRM می تواند با ارائه کمک در زمان نیاز به تجربه کاربر ، آن را افزایش دهد. آیا چیزی در سایت برای آنها کار نمی کند؟ آنها می توانند پنجره چت را راه اندازی کرده و بلافاصله با یک نماینده پشتیبانی تماس بگیرند. آیا آنها نیاز به مشورت با نماینده فروش دارند که می تواند بر اساس نیازهای منحصر به فرد خود توصیه هایی ارائه دهد؟ مشکلی نیست. آنها فقط باید اطلاعات تماس خود را در یک فرم بگذارند. این اطلاعات توسط CRM جمع آوری می شود ، مخاطبی ایجاد می شود و نماینده فروش تعیین می شود. نماینده بلافاصله مطلع می شود ، تمام فعالیت های مشتری را مشاهده می کند و بلافاصله از طریق CRM با آنها ارتباط برقرار می کند.

با CRM ، مشتریانی که به دنبال اطلاعات هستند می توانند تقریباً فوراً کمک بگیرید و از حمایتی که دریافت می کنند متناسب با سابقه خود برخوردار شوند. CRM همچنین می تواند اقدامات مبتنی بر فعالیت مشتری مانند دریافت کد تخفیف تبلیغاتی در ایمیل بازاریابی پس از گفتگو با نماینده را به صورت خودکار انجام دهد.

فرض کنید ، برای مثال ، یک بازدید کننده از سایت مارک موتور می خواهد خودرو بخرد. مشتری می خواهد دریابد که چه خودروهایی برای آنها انتخاب خوبی خواهد بود. این وب سایت بر اساس CMS HubSpot ساخته شده است و بومی با ابزار CRM HubSpot ادغام شده است. آنها می بینند که گزینه چت با نماینده فروش در دسترس است.

وقتی روی آن کلیک می کنند ، اطلاعات تماس را ارائه می دهند و بلافاصله با یک نماینده گپ می زنند. نماینده می تواند توصیه هایی را ارائه دهید بر اساس اطلاعاتی که مشتری می دهد. مخاطبی در CRM برای مشتری ایجاد می شود. نماینده می تواند یادداشت ها را به مخاطب اضافه کند. نماینده می تواند ببیند مشتری از چه صفحات دیگری بازدید کرده است. پس از اتمام جلسه چت ، نماینده می تواند بر اساس مکالمه ای که انجام داده و آنچه مشتری در سایت مشاهده کرده است اطلاعات بیشتری در مورد وسایل نقلیه مورد علاقه خود ارسال کند.

همه اینها از طریق CRM انجام می شود. مشتری با داشتن تجربه ای جذاب و بدست آوردن اطلاعات مورد نیاز ، سایت را ترک می کند. سپس تیم بازاریابی و بازاریابی می توانند ارتباط خود را با مشتری از طریق CRM تا زمان خرید ادامه دهند.

2. شخصی سازی پیشرفته

بدون CRM ، صاحبان وب سایت ها تمایل دارند اطلاعات اساسی در مورد نحوه استفاده مشتریان از سایت های خود را به صورت جداگانه از دست بدهند. اطلاعات و تجربه ای که آنها در سایت خود ارائه می دهند عمومی است و معمولاً برای همه مناسب است. همه مشتریان با وجود نیازها و علایق متفاوت در تجارت ، اطلاعات و رفتار یکسانی را دریافت می کنند. اگر نیاز خاص مشتری توسط سایت برآورده نشود ، ممکن است به سایت رقیبی که جذاب تر و مفیدتر است مراجعه کند. از دست دادن مشتریان و فروش برای تجارت بد است.

CRM ها مشخصات کامل را برای هر مشتری حفظ می کنند. آنها شامل ترجیحات مشتری ، سابقه ، فعالیتها ، اطلاعات تماس و سایر اطلاعات است. می توانید از آن برای تجربه هر مشتری را شخصی کنید در وب سایت شما برای برآوردن بهتر نیازهای آنها. این می تواند شامل تغییر پویا پیام ها و محتوای یک وب سایت بر اساس نیازهای یک مخاطب خاص ، و همچنین طیف وسیعی از موارد دیگر باشد. بازاریابان می توانند ترجیحات مشتری را در محتوای بازاریابی جای دهند. فروشندگان می توانند فعالیت مشتریان را در سایت بررسی کرده و زمینه های خود را مطابق با آن تنظیم کنند. برخی از دسترسی های شخصی نیز می تواند به صورت خودکار انجام شود. بر اساس کارهایی که مشتریان در یک سایت انجام می دهند ، آنها می توانند جریانهای مشروط مشروط و توالی پشت صحنه را پشت سر بگذارند و اطلاعات مفیدی را در مورد آنچه که دنبال می کنند دریافت کنند.

به عنوان مثال ، یک مشتری از یک سایت اشتراک مجله که از HubSpot CMS استفاده می کند ، بازدید می کند. از آنجا که CRM می داند که آنها در صنعت نرم افزار بر اساس فرمی که در بازدید قبلی پر کرده اند کار می کنند ، پیام های موجود در سایت به طور پویا متناسب با علایق آنها است. قبل از ادامه مرور ، اولویت زبان خود را بر فرانسوی قرار می دهند. به عنوان بخشی از یک گردش کار خودکار، مشتری به فهرست نامه های نسخه فرانسوی خبرنامه اضافه می شود. علاوه بر این ، هنگامی که آنها از طریق پشتیبانی به دنبال کمک هستند ، به طور خودکار به زبان فرانسوی به آنها ارائه می شود. وقتی بازاریابی تبلیغات ایجاد می کند ، نسخه فرانسوی تبلیغات به مشتری ارائه می شود.

3. صفحات سایت پویا بر اساس داده های CRM ایجاد می شوند

تصور کنید بسیاری از صفحات مشابه را برای نمایه های کاربر ، شعب شرکت یا هر برنامه دیگری ایجاد کنید که در آن طرح بندی صفحات یکسان است ، اما داده ها متفاوت است. انجام این کار به صورت دستی می تواند هم برای توسعه دهندگان و هم برای بازاریابان وقت گیر و خسته کننده باشد. اما با یکپارچه سازی CMS و CRM ، می توان روند را تا حد زیادی ساده کرد. توسعه دهندگان می توانند ایجاد یک قالب برای ساختار کلی صفحه، سپس می توان داده ها را از CRM بیرون آورد تا همه صفحات مورد نیاز به صورت پویا تولید شوند. کاربران غیر فنی می توانند با افزودن سوابق اضافی به CRM صفحات اضافی ایجاد کنند.

به عنوان مثال ، یک شرکت املاک دارای لیست املاک زیادی در یک منطقه است. این شرکت دارای وب سایتی است که بر اساس CMS HubSpot ساخته شده است و آنها برای هر ملکی که می فروشند سوابق خود را در CRM ایجاد می کنند. با این کار ، شرکت می تواند داده های فهرست را وارد کرده و صفحات جداگانه ای برای هر ویژگی ایجاد کند. آنها این کار را با انتخاب یک الگو یا ساختن یک الگوی سفارشی ، انتخاب داده هایی که باید از CRM با آنها پر شود ، تولید صفحات ، پیش نمایش آنها و زمانبندی زمان پخش آنها انجام می دهند. با استفاده از این داده ها و CRM ، ایجاد صفحات جداگانه برای هر فهرست می تواند بسیار راحت باشد.

4. گردش کار بین توسعه دهندگان و بازاریابان ساده می شود

همانطور که در نکته قبل اشاره شد ، بازاریابان برای ایجاد وب سایت و سایر دارایی های دیجیتالی به توسعه دهندگان تکیه می کنند. اگر بازاریابی کمپینی را اجرا می کند ، ممکن است به توسعه دهندگان نیاز داشته باشد تا صفحات بیشتری برای آن ایجاد کنند. این امر معمولاً شامل موارد زیادی می شود ، زیرا آنها قبل از شروع کمپین برنامه ریزی ، ساخت ، آزمایش و پیش نمایش سایت و دارایی ها را انجام می دهند. زمان و تلاش قابل توجهی صرف ایجاد آنها می شود. گاهی اوقات توسعه دهندگان مجبورند صفحات جداگانه را کدگذاری کنند و در صورت نیاز به چندین صفحه ، کار می تواند روی هم انباشته شود.

سیستم های مدیریت محتوا ابزارهایی را برای ساده سازی تولید صفحات وب ارائه می دهند. بازاریابان نیازی به تکیه بر توسعه دهندگان ندارند. در صورت نیاز به تغییر در سایتی ، بازاریابان می توانند با استفاده از آن این کار را انجام دهند ابزارهای طراحی کشیدن و رها کردن کاربر پسندبه این امر توسعه دهندگان را در انجام کارهای پیچیده تر توسعه آزاد می گذارد. این سیستم ها همچنین می توانند ابزارهای توسعه دهنده مانند ردیاب ها و هشدارهای اشکال ، سازندگان تم ، پشتیبانی CLI و موارد دیگر را برای سهولت توسعه ارائه دهند.

یک واحد بازاریابی برای یک برند لباس در حال برنامه ریزی چندین کمپین همزمان است. وب سایت آنها با پلت فرم HubSpot ادغام می شود. آنها به برخی از صفحات وب ایجاد شده برای هر یک از کمپین ها نیاز دارند. آنها می توانند به جای صحبت با توسعه دهندگان ، وارد CRM شوند ، قالب های صفحه را با استفاده از طراحان کشیدن و رها کردن ایجاد کنند ، داده های مورد استفاده در قالب ها را انتخاب کرده ، پیش نمایش آنها را مشخص کرده و زمان پخش زنده را تعیین کنند. آنها توسعه دهندگان را درگیر نکردند. این امر توسعه دهندگان را برای انجام سایر کارهای مهم تجاری آزاد می کند و در وقت و تلاش همه صرفه جویی می کند.

نتیجه

غفلت از ارائه وب سایت تجاری به مشتریان شما نه تنها برای فروش شما مضر است بلکه می تواند به بهره وری و عملکرد تیم شما آسیب برساند. وقتی به مشتریان تجربه ای عمومی در سایت شما داده می شود ، آنها با آن درگیر نمی شوند. جستجوی اطلاعات و کمک در مورد محصولات و خدمات شما ناامید کننده خواهد بود.

بدون اطلاعات کافی و ابزارهای مناسب در مورد مشتریان ، بخش های فروش و بازاریابی کار سخت تری را انجام می دهند.

نارضایتی ، کاهش بهره وری و رکود کارکنان ممکن است رخ دهد. بدون CRM ، کارهای تکراری و دستی را باید با زحمت یک به یک انجام داد. این نوع کار زمان و تلاش ارزشمندی را از تیم های پشتیبانی ، بازاریابی ، فروش و مهندسی می گیرد.

ادغام CRM با وب سایت تجاری شما مزایای بی شماری دارد. برای اولین بار ، می توانید مشخصات جامعی از مشتریان خود ایجاد کنید و از آن برای شخصی سازی و بهبود تجربیات آنها در سایت خود استفاده کنید. شما بخشهای مختلفی را در شرکت خود مجهز می کنید ابزارهایی برای سازماندهی و خودکارسازی کار و بهبود کاراییبه CRM ها هم برای مشتریان و هم برای افرادی که در شرکت به آنها خدمات ارائه می دهند تجربیات بسیار خوبی ایجاد می کنند. مهمتر از همه ، این امر به یک تجارت اجازه می دهد تا روابط قوی تری را با مشتریان خود تقویت و توسعه دهد.

اگر علاقمند به کسب اطلاعات بیشتر در مورد CMS و CRM در این مقاله هستید ، همیشه خوش آمدید از وب سایت HubSpot دیدن کنیدبه

سرمقاله ویرایش(vf ، او)

Read More

کاهش نیاز به عناصر شبه-مجله سر و صدا

خلاصه سریع

سالهاست که عناصر شبه وفادارانه به توسعه دهندگان اصلی در اجرای طرح های خلاقانه کمک کرده اند. در حالی که آنها هنوز جایگاه مهمی دارند ، اکنون می توانیم به دلیل ویژگی های CSS جدیدتر ، عناصر شبه را در برخی سناریوها پشت سر بگذاریم.

بر اساس مشخصات W3C، “یک عنصر شبه نشان دهنده عنصری است که مستقیماً در درخت سند وجود ندارد”. آنها از نسخه 1 مشخصات CSS ، زمانی که وجود داشته اند ، وجود داشته اند ::first-letter و ::first-line معرفی شدند. محبوب ::before و ::after عناصر شبه در نسخه 2 اضافه شدند-اینها محتوایی را نشان می دهند که به طور کلی در سند منبع وجود ندارد. آنها می توانند به عنوان دو عنصر اضافی در نظر گرفته شوند که می توانید عنصر اصلی آنها را “چسبیده” کنید. وقتی توسعه دهندگان اصلی “عناصر شبه” را می شنوند ، به این فکر می کنیم ::before و ::after بیشتر اوقات ، زیرا ما از آنها به روشهای مختلف برای افزودن تزئینات به عناصر خود استفاده می کنیم.

عناصر شبه اضافی فراتر از اینها وجود دارد. آنها در مشخصات در سه دسته ذکر شده اند: تایپوگرافی، برجسته، و پیرو درختبه

جالب اینجاست که پس از سالها توسعه وب ، هیچ وقت متوجه نشدم که از آن استفاده می کنم ::first-line، اما بسیار مرتب است و به خوبی به تغییر اندازه پنجره پاسخ می دهد! آن را بررسی کنید.

قلم را ببینید [`::first-line`](https://codepen.io/smashingmag/pen/gORgXxN) توسط مارسلبه

قلم را ببینید ::first-line توسط مارسلبه

::selection عنصر شبه دیگری است که بسیاری به آن دسترسی دارند. هنگامی که یک کاربر متن را برجسته می کند ، رنگ هایلایت رنگی است که شما مشخص کرده اید.

قلم را ببینید [`::selection`](https://codepen.io/smashingmag/pen/rNwjYGz) توسط مارسلبه

قلم را ببینید ::selection توسط مارسلبه

اشاره کوتاه

عناصر شبه در نسخه های 1 و 2 مشخصات CSS از یک کولون استفاده می کردند ، اما از دو کولون در نسخه 3 استفاده کرده اند. این امر آنها را از کلاس های شبه متمایز می کند ، که حالت یک عنصر را توصیف می کند. شبه کلاس ها از یک روده بزرگ استفاده می کنند.

  • از دو کولون برای عناصر شبه استفاده کنید (به عنوان مثال ::before، ::after، ::marker)
  • برای شبه کلاسها از یک کولون استفاده کنید (به عنوان مثال :hover، :focus)

عناصر شبه همیشه مورد نیاز نیست

عناصر شبه هنوز جایی دارند. این مقاله “هرگز از عناصر شبه استفاده نکنید” بلکه “ما دیگر مجبور نیستیم از عناصر شبه زیاد استفاده کنیم”. ما می توانیم تعدادی از عناصر رابط کاربری محبوب را بدون نیاز به عناصر شبه سبک دهیم. با اتکاء کمتر به عناصر شبه ، می توانیم CSS کمتری بنویسیم ، عناصر تو در تو را حذف کنیم ، مسائل مربوط به چیدمان را نادیده بگیریم و موقعیت یابی را فراموش کنیم.

بیشتر بعد از پرش! ادامه مطلب را در زیر ادامه دهید

نگاهی دوباره به تکنیک های مورد اعتماد با ویژگی های جدید CSS بیندازید

سالها ما صبورانه منتظر بودیم تا مرورگرها سریعتر از فناوری CSS استفاده کنند. نقطه عطفی برای بسیاری از توسعه دهندگان اصلی زمانی رخ داد که برخی از بازیگران اصلی اعلام کردند پشتیبانی از Internet Explorer (IE11) را متوقف می کنند:

  • همه برنامه های وب Microsoft 365 پشتیبانی از IE11 را متوقف کردند 21 آگوست 2021به
  • Google Workspace (جیمیل، تقویم، راندن، و غیره) پشتیبانی IE11 را متوقف کرد 15 مارس 2021به

این به بسیاری از ما این امکان را داده است که فناوری های جدیدتر CSS را آزادتر کشف کنیم: CSS Grid ، clamp()، background-blend-mode، و بیشتربه وضعیت پشتیبانی اموال CSS عالی است. و با مرورگرهای قابل به روز رسانی ، پشتیبانی سرعت می گیرد.

مثالها را بیاورید!

دکمه های زاویه دار

بسیاری از توسعه دهندگان مقدم با استفاده از آن آشنا هستند ::before و ::after عناصر شبه و قوانین CSS برای ایجاد اشکال. ابزارهای ژنراتور زیادی برای این منظور اختصاص داده شده است – این یکی است که من نشانک گذاری کرده ام. این ابزارها در انتخاب شکل (اغلب مثلث) شما را راهنمایی می کنند و قوانین CSS مناسب را به شما می دهند.

دکمه های زاویه باید بتوانند بسته بندی کلمات را مدیریت کنند.

این ابزارها هنگام ایجاد دکمه های زاویه دار نجات دهنده هستند. برای دکمه های زاویه دار ، دیگر لازم نیست.

مقایسه قطعات بلوک ساختمان برای دکمه های زاویه دار با عناصر شبه در مقابل بدون عناصر شبه

دکمه های زاویه دار با عناصر شبه می توانند به عناصر HTML بیشتری نیاز داشته باشند. (پیش نمایش بزرگ)

نسخه شبه عنصر

بسیاری از شما که این مطلب را می خوانید به یک نسخه عنصر شبه عادت کرده اید:

  • ما برای تطبیق زاویه خود از یک عنصر پیچشی نسبتاً موقعیتی با روکش راست بزرگ استفاده می کنیم <button>؛
  • بسیاری از ما ، دانش آموزان تکنیک درهای کشویی، عادت کرده اند که عنصری را در لانه قرار دهند تا رنگ پس زمینه دکمه را به خود بگیرند.
  • سرانجام ، ما کاملاً یک عنصر شبه با قوانین حاشیه ای آن را در خود قرار می دهیم <button>درست پر کردن فضای خالی – ما استفاده می کنیم ::before برای این.

گذشته از این مراحل ، سبکهای شناور ما باید عنصر تو در تو و عنصر شبه را در نظر بگیرند. این ممکن است برای شما قابل کنترل به نظر برسد ، اما هرچه طرح های دکمه ما پیچیده تر شوند ، سبک های شناور سربار بیشتری داریم. همچنین ، در این نسخه ، دکمه هایی با کلمه پیچیده شده به سادگی خراب می شوند.

قلم را ببینید [Button angle with pseudo-element](https://codepen.io/smashingmag/pen/xxrgPpj) توسط مارسلبه

قلم را ببینید زاویه دکمه با عنصر شبه توسط مارسلبه

بدون نسخه عنصر شبه

این کار بدون یک عنصر شبه بسیار ساده تر است.

  • ما از یک عنصر بسته بندی – ما استفاده می کنیم <button>به
  • ما برای رسیدن به clip-path خاصیتی است که فقط قسمت های دکمه مورد نظر خود را با استفاده از آن نشان دهیم calc() همراه با یک ویژگی CSS سفارشی برای اندازه زاویه ما – این مجموعه از نقاط مربوط به بالا سمت چپ ، بالا سمت راست ، وسط راست ، پایین سمت راست و پایین چپ است: polygon(0% 0%, calc(100% - var(--angle-width)) 0%, 100% 50%, calc(100% - var(--angle-width)) 100%, 0% 100%)

در مثال CodePen ، شما کد را تغییر می دهید --angle-width ویژگی سفارشی از 2rem مقدار دیگری را مشاهده کنید تا زاویه دکمه ما مطابق آن تنظیم شود.

سبکهای شناور ما فقط باید یک عنصر – دکمه ما را در نظر بگیرند. همچنین ، دکمه های با پیچیدن کلمات به شکلی جذاب تر عمل می کنند.

قلم را ببینید [Button angle with NO pseudo-element](https://codepen.io/smashingmag/pen/PojWOQY) توسط مارسلبه

قلم را ببینید زاویه دکمه بدون عنصر شبه توسط مارسلبه

سبک های دکمه زاویه دار بیشتر در ویترین

دو دکمه زاویه اضافی با زوایای پیچیده تر.

codepen ویترین نهایی دارای نمونه های دکمه زاویه اضافی است. (پیش نمایش بزرگ)

بازدید از ویترین نهایی برای مشاهده این سبک های دیگر دکمه که بدون عناصر شبه ساده تر شده است. به طور خاص ، نسخه عنصر شبه دکمه آبی رنگ بسیار وحشیانه است. حجم کلی کار به لطف بسیار کاهش می یابد clip-pathبه

دستمال مرطوب دکمه ای

جلوه پاک کردن یک سبک دکمه محبوب است. من دستمال های چپ به راست و بالا به پایین را قرار داده ام.

گاهی اوقات ، یک اثر پاک کردن مورد نظر است.

نسخه شبه عنصر

این را می توان با استفاده از transitioning یک عنصر شبه transformبه

  • ما کاملاً موقعیت a ::before شبه عنصر و به آن a transform: scaleX(0) بنابراین قابل مشاهده نیست
  • ما همچنین باید صراحتاً آن را تعیین کنیم transform-origin: 0 0 برای اطمینان از اینکه دستمال مرطوب به جای مرکز وارد می شود (transform-origin به طور پیش فرض به مرکز)
  • راه اندازی کردیم transitions بر روی transform برای برخی از انیمیشن های جاز روان روشن/خاموش شناور.
  • از آنجا که عنصر شبه ما کاملاً موقعیت دارد ، برای نگه داشتن متن دکمه به یک عنصر تو در تو نیاز داریم ، position: relative در این عنصر تو در تو زمینه جدیدی برای ایجاد انباشته ایجاد می کند تا متن ما در بالای عنصر شبه پاک کننده ما باقی بماند.
  • در حالت شناور ، می توانیم عنصر شبه خود و transition آن scaleX در حال حاضر بودن 1 (transform: scaleX(1))به

قلم را ببینید [Button wipe with pseudo-element](https://codepen.io/smashingmag/pen/KKqayGW) توسط مارسلبه

قلم را ببینید پاک کردن دکمه با شبه عنصر توسط مارسلبه

بدون نسخه عنصر شبه

اگر مجبور نیستیم چرا نگران عناصر تو در تو ، موقعیت عناصر شبه ، چیدمان زمینه ها و قوانین گسترده شناور هستیم؟

ما می توانیم به دست آوریم linear-gradient() و background-size این را محکم کنم

  • مال خود را می دهیم <button> آ background-color برای حالت پیش فرض خود ، در حالی که همچنین تنظیم a linear-gradient از طریق background-image – اما background-size خواهد بود 0، بنابراین ما به طور پیش فرض چیزی نمی بینیم.
  • در حالت شناور ، ما انتقال را انجام می دهیم background-size به 100% 100% که به ما اثر پاک کردن می دهد!

یاد آوردن، linear-gradient() استفاده می کند background-image اموال و background-image جایگزین می شود background-color، بنابراین این چیزی است که بر شناور اولویت دارد.

خودشه. نیازی به عنصر تو در تو نیست پاک کننده عمودی می خواهید؟ فقط تغییر دهید linear-gradient جهت و background-size ارزش های. من آنها را از طریق ویژگی های سفارشی CSS تغییر داده ام.

قلم را ببینید [Button wipe with NO pseudo-element](https://codepen.io/smashingmag/pen/MWoJOVo) توسط مارسلبه

قلم را ببینید پاک کردن دکمه با NO عنصر شبه توسط مارسلبه

کاشی با روکش رنگ صفحه نمایش

کاشی ها اغلب حاوی تصویر پس زمینه ، پوشش رنگی و محتوای متنی هستند.

این یک الگوی رایج است که در آن یک رنگ نیمه شفاف کاشی/کارت را می پوشاند. کاشی نمونه ما همچنین دارای تصویر پس زمینه است. در این الگو غالباً مهم است که نسبت ابعاد مجموعه ای را حفظ کنیم تا در صورت ظاهر شدن بیش از یک کاشی در مجموعه ، کاشی ها یکدست به نظر برسند.

نسخه شبه

برخی از موارد مشابه با نسخه عنصر شبه ما به کار می رود:

  • ما از نسبت ابعاد “ترفند بالشتک”، مقدار 60٪ بالاترین سطح (نسبت 5: 3) را برای کاشی ما تعیین می کنیم.
  • ما باید عنصر شبه روکش رنگ صفحه خود را قرار دهیم و 100٪ به آن بدهیم width و height برای پر کردن کاشی-ما این عنصر شبه را روی نشانگر هدف قرار می دهیم تا آن را تغییر دهیم background-colorبه
  • به دلیل موقعیت مطلق شبه عنصر ، ما باید از یک عنصر تو در تو برای محتوای متن خود استفاده کنیم ، همچنین به آن می دهیم position: absolute تا ظاهر شود در بالا رنگ صفحه نمایش ما به ترتیب روی هم قرار می گیرد و برای اطمینان از ظاهر شدن آن در جایی که باید در کاشی ظاهر می شود.

قلم را ببینید [Tile screen color overlay with pseudo-element](https://codepen.io/smashingmag/pen/YzQNEOM) توسط مارسلبه

قلم را ببینید پوشش رنگ صفحه کاشی با عنصر شبه توسط مارسلبه

بدون نسخه عنصر شبه

به لطف نرم افزار می تواند بسیار ساده تر باشد نسبت ابعاد و background-blend-mode خواص

توجه داشته باشید: aspect-ratio در Safari 14.x کار نمی کند ، اما در نسخه 15 کار می کند.

گفته می شود ، تا زمان نگارش این مقاله ، caniuse آن را لیست می کند با 70++ پشتیبانی جهانی

  • “کلاهبرداری” جایگزین می شود aspect-ratio: 400/240 (ما می توانیم از هر مقدار مبتنی بر 5: 3 در اینجا استفاده کنیم).
  • ما از هر دو استفاده می کنیم background-image و background-color خواص در ارتباط با background-blend-mode – به سادگی تغییر دهید background-color عنصر کاشی ما در شناور.
Background-blend-mode

background-blend-mode مخلوط a background-color با یک عنصر background-imageبه هر کاربر فتوشاپی که این مطلب را بخواند پیدا می کند background-blend-mode یادآور حالت های ترکیبی فتوشاپ است. برخلاف mix-blend-mode، background-blend-mode زمینه چیدمان جدید ایجاد نمی کند! پس نه z-index جهنم!

CSS اکنون جلوه های مشابه Photoshop را ارائه می دهد.

قلم را ببینید [Tile screen color overlay with NO pseudo-element](https://codepen.io/smashingmag/pen/mdwRqjN) توسط مارسلبه

قلم را ببینید روکش صفحه کاشی رنگی بدون عنصر شبه توسط مارسلبه

نتیجه

توسعه Front-end هیجان انگیز و سریع است. با ویژگی های جدیدتر CSS ، می توانیم گرد و غبار را از تکنیک های قدیمی خود پاک کنیم و ظاهر دیگری به آنها بدهیم. انجام این کار به تقویت کد کاهش یافته و ساده کمک می کند. عناصر شبه مفید هستند ، اما ما نیازی به دستیابی به آنها نداریم.

سرمقاله ویرایش(vf ، yk ، he)

Read More

قدرت طراحی قلم و کاغذ – مجله سر و صدا

خلاصه سریع

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

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

طراحی با دست می تواند برای کسانی که تمایل هنری ندارند ناآشنا و ناراحت کننده باشد ، اما انعطاف پذیری طرح های دستی همراه با تخیل ما به این معنی است که می توانیم ایده های بیشتری را کار کنید و سریعتر جهت طراحی بهتری را شکل دهید اگر می توانستیم با یک راه حل مشخص تر و مبتنی بر رایانه شروع کنیم.

مسلماً گاهی اوقات خودم با آن دست و پنجه نرم می کنم. در حالی که دوران کودکی خود را با یک کتاب طرح همیشه در دستم گذراندم و در رشته هنر از دانشگاه فارغ التحصیل شدم ، هنگامی که کار طراحی وب را شروع کردم ، کتاب طرح کاغذ به طور مختصر فراموش شد. سالها طول کشید تا مفاهیم غیر الهام بخش درگیر شود و احساس کنم که قبل از اینکه بفهمم تولید ایده از طریق طرح های فیزیکی سریع چقدر قدرتمند است ، محدودیت های خود را پیش نمی برم.

این فرایند حتی اگر ما چیزی را طراحی نمی کنیم توصیه می شود بزرگ یا به عنوان یک طراح. هر کس گاهی اوقات باید “طراح” باشد. از ایجاد یک صفحه اصلی سریع شخصی ، یک صفحه فرود برای یک پروژه منبع باز جدید ، یا ایجاد اسلایدهای زیبا برای ارائه بعدی آنها.

یک تکه کاغذ و یک قلم بگیرید و بیایید کار را شروع کنیم!

چرا برای شروع با کاغذ

همانطور که ما همیشه روی رایانه هستیم (و فکر می کنم امروزه اکثر ما هستیم) ، گاهی اوقات حتی به ذهن ما نمی رسد که کنار برویم و سعی کنیم چیزی را خارج از صفحه طراحی کنیم.

طراحی کاغذ می تواند شبیه چیزی باشد که صرفاً با هنرهای تجسمی یا طراحی گرافیکی مرتبط است (به عنوان مثال ، طراح لوگو افسانه ای Saul Bass به دلیل حمایت از نقاشی مشهور است) ، اما حتی اولین ایده ها برای رابط های کامپیوتری با کاغذ شروع شد. سوزان کاره ، طراح نمادهای رابط کاربری گرافیکی مکینتاش ، از کاغذ گراف برای طراحی ایده های اولیه خود برای هنر نمادین پیکسل اولیه استفاده کردبه

قدرت طراحی طرح کاغذ ، زودگذر بودن طرح و نحوه احساس آنها نسبت به هر چیزی است که ما به سرعت در رایانه به سرعت ایجاد می کنیم “واقعی” نیست. شروع به جابجایی کلمات و دکمه ها در صفحه کامپیوتر کنید ، و این وسوسه کننده است که در یک جهت خاص قرار بگیرید و هرگز مسیرهای متناوب را کاوش نکنید. طرح های کاغذی تخیل ما را مجبور می کند تا شکاف ها را پر کند – خیلی سریعتر از آنچه که ما آن جزئیات را به شبیه سازی رایانه اضافه کنیم.

طرح کاغذی

(پیش نمایش بزرگ)

مدل آزمایشگاهی، ماکت

طرح های کاغذی در مقابل یک ماکت سریع. توجه داشته باشید که ماکت به طور طبیعی بیشتر شبیه یک راه حل تمام شده است و وسوسه انگیز است که تمام حاشیه ها ، لبه ها و حاشیه ها را دقیق کنید – چیزی که تا بعد نباید نگران آن باشیم. کاغذ به ما اجازه می دهد این جزئیات را نادیده بگیریم. (به PDF مراجعه کنید)

ما می خواهیم هنگام کار بر روی یک طرح جدید ، ایده های مختلف زیادی را امتحان کنیم. در حالی که چند ایده اولیه ممکن است به اندازه کافی خوب باشد ، ایده پنجم ، هفتم یا دهم ما ممکن است حتی بهتر باشدبه کار سریع و شل به ما کمک می کند تا بسیاری از ایده ها را به سرعت پشت سر بگذاریم. ایده ها سریعتر جریان می یابند ، و ممکن است خودمان را با آنچه در صفحه بدون محدودیت کار می کنیم شگفت زده کنیم.

اگر هنوز با ابزارهای طراحی مانند Photoshop ، Sketch یا Figma آشنا نیستید ، فقط شروع به کار و یادگیری راه خود در مورد یک ابزار می تواند بسیار طاقت فرسا باشد. به جای اینکه ایده های زیادی را کار کنیم ، در نهایت وقت خود را صرف فهمیدن این می کنیم که کدام دکمه چه کاری را انجام می دهد.

و ابزارهای سیم کشی مانند بالسامیق؟ آنها ایده هایی شبیه به طرح ارائه می دهند – خطوط پیچیده ، جعبه های ناقص – اما آنها همچنان ما را در جهت کار بر روی یک ایده واحد و درهم شکستن آن تا زمانی که ایده آل مختلف نیست ، پیشنهاد می کنند. شروع با قلم و کاغذ سریعتر استبه ابزارهای Wireframing می توانند گام بعدی این فرآیند باشند (و نه اولین).

مدل های “طرح دار” همچنین در بیان نوع بازخوردی که هنگام ارائه به داوران به دنبال آن هستیم ، کار بهتری انجام می دهند. طرحی که بیش از حد پیکسل کامل است اغلب باعث می شود در مورد جزئیات بی ربط انتخاب کنید ، اما یک طرح خشن منجر به مکالمات سطح بالاتر در مورد چیدمان می شود.

بیشتر بعد از پرش! ادامه مطلب را در زیر ادامه دهید

برای خودتان تکرار کنید: شل ، سریع ، لازم نیست کامل باشد

همه ما آن طرح های “طراحی” را دیدیم که زیبا و دقیق به نظر می رسند. اینها معیارهایی نیستند که بتوانید خود را با آنها مقایسه کنید. آنها را نادیده بگیر. طرح های ما باید سریع و بدون جزئیات زیاد باشد.

طرح

این طرح دارای جزئیات بسیار بیشتری است ، اما نیازی به افزودن آن در اوایل نیست. (پیش نمایش بزرگ)

بلکه ما از خطوط و جعبه های واقعاً سریع استفاده می کنیم و طرح های خود را کوچک و سریع نگه می داریم.

عناصر اساسی یک طرح ساده سریع. من دوست دارم از خطوط فشرده برای عنوان ، مستقیم برای محتوا ، جعبه هایی با “x” از طریق آن برای تصاویر و سایه دار برای دکمه ها استفاده کنم. با خیال راحت سبک من را کپی کنید یا زبان محلی خود را بسازید!

ما می توانیم از این طرح های کوچک برای آزمایش چندین نسخه از طرح بندی صفحه اصلی استفاده کنیم:

چندین نسخه از طرح بندی صفحه اصلی.

چندین نسخه از طرح بندی صفحه اصلی. (پیش نمایش بزرگ)

طرح بندی تقریباً برای هر نوع کار طراحی مفید است: خبرنامه ها ، لوگوها ، ارائه ها ، ابزارک ها – هر چیزی که در آن کار می کنید به سرعت به ایده های بصری زیادی فکر کنید. به عنوان مثال ، چند ایده برای جلد کتاب الکترونیکی را بررسی کنیم؟

ایده های طرح جلد کتاب

در اینجا ، ما باید از مناطق سایه دار برای کمک به ما در طرح بندی جلد کتاب استفاده کنیم ، اما طرح ها هنوز سریع و شل هستند. (پیش نمایش بزرگ)

یک راه خوب برای شروع تمرین این نوع طراحی ، گرفتن یک وب سایت موجود و مهندسی معکوس طرح است. این کار نه تنها به شما در انجام کار راحت تر کمک می کند ، بلکه به الگوهای مختلف طراحی نیز حس می کنید.

تکنیک طراحی.

صفحه اصلی کتاب

نسخه طرح بندی در مقایسه با صفحه اصلی کتاب من. یک راه خوب برای تمرین مهارت های ترسیم و آموزش مغز برای تشخیص عناصر طرح خود به عنوان اشیاء وب سایت. (پیش نمایش بزرگ)

از هر روشی که استفاده می کنید ، صفحه خود را پر از ایده کنید! حتی اگر ایده ای را که واقعاً شما را هیجان زده می کند و می خواهید با آن پیش بروید ، متوقف نکنید. وقتی صفحه ای را پر می کنید ، به صفحه بعدی بروید. ایده های جایگزین را کاوش کنید در صورت پیدا کردن چیزی که بیشتر دوستش دارید

هنگامی که گزینه های زیادی در اختیار دارید ، استراحت کنید تا به ذهن خود استراحت دهید ، سپس دوباره بیایید و موارد مورد علاقه خود را دور بزنید ، اصلاح کنید ، و شاید سپس به ساختن یک ماکت بپردازید. از آنجا که می دانید بسیاری از ایده های دیگر را امتحان کرده اید و آنها را کنار گذاشته اید ، اعتماد بیشتری در جهت انتخابی خود خواهید داشت.

از الهام برای کمک به طرح و ایده پردازی خود استفاده کنید

طرح ها باید با الهام همراه باشند ، بنابراین آن رایانه را بیرون بیاورید! با تحقیق در طرح های دیگر به فرآیند طراحی خود کمک کنید و به دنبال جزئیاتی باشید که فکر می کنید به تنهایی کار می کند.

اگر مطمئن نیستید از کجا شروع کنید ، به دنبال الهام باشید در زمینه های مرتبط با آنچه که روی آن کار می کنید. برای یک صفحه اصلی شخصی ، شروع به مشاهده صفحات اصلی همتایان در صنعت خود بسیار عالی است. اگر گیر کرده اید یا الهام بیشتری می خواهید ، این منابع را بررسی کنید:

  • دریبل زدن، که به ویژه برای تحقیق در مورد ایده های طراحی برای عناصر ، مانند فرم ورود ، خوب است.
  • SiteInspire، برای دیدن روندهای فعلی در طراحی مدرن.
  • کتاب زمین، برای الهام از طراحی صفحه فرود.
  • کرم تجارت، برای الهام بخش طراحی وب سایت تجارت الکترونیک.
  • پترنس، برای الهام از طراحی برنامه تلفن همراه.

طرح ها و نمونه های نویسنده

الهام بخش (از دریبل زدن) طرح های من ، و سپس ماکت من. می بینید که چگونه از طرح و تایپوگرافی الهام گرفته ام ، اما هر جزئیات جداگانه متفاوت است. ایجاد الگوهای خود با الهام از ترسیم شده به شما کمک می کند تا از کپی کردن سایر طرح ها به صورت کلمه اجتناب کنید. (پیش نمایش بزرگ) (PDF را ببینید)

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

همانطور که عناصر و ایده هایی را پیدا می کنید که می خواهید به خاطر بسپارید ، آنها را ترسیم کنید! به افزودن ایده ها به برگه طرح خود ادامه دهید و صفحه خود را با تمام ایده های بالقوه خود پر کنید. به یاد داشته باشید ، برای شروع بر روی گزینه ها و ایده های مختلف کار کنید و سپس ایده های مورد علاقه خود را محدود کنید.

تمرین را به خاطر بسپارید!

هر مهارت جدیدی در چند بار اول ناخوشایند خواهد بود. طبیعی است. اجازه ندهید باعث دلسردی شما شود. هرچه بیشتر ترسیم خود را تمرین کرده و از این مهارت هنگام طراحی استفاده کنید ، احساس طبیعی تری خواهید داشت.

برای پروژه طراحی بعدی خود ، آن صفحه کلید را کنار بگذارید و اجازه دهید تخیل و خلاقیت شما با طرح های قلم و کاغذ شروع شود.

اجازه دهید آنچه را که پوشش داده ایم مرور کنیم:

  • طرح های کاغذی سریع ترین راه برای کشف گزینه های طراحی است.
    ما می توانیم با فاصله گرفتن از ماوس کارهای بسیار بیشتری را در زمان کمتر انجام دهیم.
  • هنگام طراحی برای افزایش تولید ایده ، از الهام استفاده کنید.
    با یک صفحه خالی شروع نکنید ؛ با نگاهی به کارهای طراحی که می خواهید از آنها الگوبرداری کنید ایده های خود را به جریان بیندازید.
  • طرح های بیشتری بسازید و بیشتر از آنچه فکر می کنید باید ایده ها را امتحان کنید.
    گاهی اوقات ایده پنجم ممکن است جهت خوبی به نظر برسد ، اما در ادامه خواهید دید که ایده بعدی حتی بهتر است.
  • تمرین کامل می کند.
    هرچه ترسیم بیشتر انجام دهید ، سریعتر انجام می شود ، احساس راحت تری خواهید داشت و بهتر خواهید شد.

منابع الهام دیگری دارید؟ طرح های شما چگونه هستند؟ خوشحال می شوم در نظرات از شما بشنوم!

خواندن بیشتر مجله سر و صدا

سرمقاله ویرایش(fb، vf، yk، he)

Read More

سرمقاله عالی – مجله سر و صدا

خلاصه سریع

آنها می گویند محتوا پادشاه است و آنها درست می گویند. وب امکانات ناگفته ای را برای قصه گویان باز کرده است – البته به شرط اینکه داستان درست باشد. در اینجا برخی از نمونه های مورد علاقه ما از پیشرفت محتوای تحریریه در حوزه دیجیتال آورده شده است.

بسیاری از بحث های طراحی وب مربوط به آنچه در حال انجام است است دور و بر محتوا. سرعت صفحه ، سیستم های طراحی ، بهینه سازی موتور جستجو ، چارچوب ها ، دسترسی – لیست همچنان ادامه دارد. این به ما می دهد در مجله سر و صدا چیزهای زیادی برای نوشتن وجود دارد ، که بسیار عالی است ، اگرچه ارزش یادآوری این نکته را دارد که همه اینها در خدمت چیست.

در سومین نسخه از طراحی وب سایت ما به خوبی انجام شده است ، ما در قلب تپنده بسیاری از وب سایت ها به کار رفته ایم: محتوا. به طور خاص ، محتوای تحریریه. وب به قصه گوها مجموعه ای باورنکردنی از ابزارها برای کار داده است ، و من به عنوان یک روزنامه نگار نیمه ماهر خودم ، یک قاشق خوب را دوست دارم.

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

رویترز به سوایپ متمایل شد

که در این مقاله درباره نژادپرستی سیستمیک در ایالات متحده است، رویترز محتویات مربوط به کشیدن را شکل می دهد و داستان را به قطعات کوچک تقسیم می کند. خواندن بسیار هدفمندتر از آن چیزی است که در رویکرد پیمایش سنتی وجود دارد. مثل ورق زدن یک کتاب است. در تلفن همراه ، شما به معنای واقعی کلمه به بخش بعدی ضربه می زنید. این باعث گزارش سریع و فوری می شود – و این چیزی نیست که از تجسم داده های عالی در نمایش چیزی بگوئیم.

اخبار رایتر درباره نژادپرستی سیستمیک سیاه و سفید

(پیش نمایش بزرگ)

ما در جهان اول موبایل زندگی می کنیم. ارزشمند بودن در این مورد فایده ای ندارد. بله ، نشریات مجله کلاس خاصی در مورد آنها دارند. بله ، نمای رومیزی بوم بزرگتری را برای کار با شما در اختیار شما قرار می دهد. واقعیت این است که اکثر مردم آنچه را که در تلفن همراه منتشر می کنید مشاهده می کنند ، بنابراین به آن توجه کنید. برای رویکرد مشابه ، این “داستانهای ضربه ای” توسط مجله نیویورک تایمز و ورودی نیز عالی هستند برای علاقه مندان به مطالعه بیشتر در مورد سرمقاله تلفن همراه ، داستان توسط طراح روزنامه افسانه ای ماریو گارسیا به شدت توصیه می شود.

بیشتر بعد از پرش! ادامه مطلب را در زیر ادامه دهید

نیویورک تایمز بیش از آنکه بگوید نمایش می دهد

با وجود همه چیزهای وحشتناکی که همه گیری کووید -19 ایجاد کرده است ، حداقل به گزارش های نفس گیر خوبی منجر شده است. این تعاملی نیویورک تایمز قطعه نحوه عملکرد ماسک های صورت را با رساندن خوانندگان به سطح ذرات توضیح می دهد. می توانید ببینید که فیبرها چگونه ذرات را جذب می کنند و چرا ماسک های مختلف دارای سطوح مختلفی از اثربخشی هستند. هر احمقی می تواند درک موضوعات پیچیده را دشوار کند ، اما درک آنها را آسان می کند؟ این یک نوع هنری است که مخصوص خودش است.

قطعه ای در زمان نیویورک درباره ماسک ها

(پیش نمایش بزرگ)

عناصر زیادی در اینجا بازی می کنند. گرافیک ، رنگ ، انیمیشن – حتی اگر در قایق شما شناور باشید ، تجربه واقعیت افزوده وجود دارد. آنچه به همین سادگی می توانست یک موضوع خشک و گرفتگی باشد زنده می شود. و مهمتر از همه ، این اطلاعات حیاتی است. مواردی به این دلیل است گابریل گیانوردولی بود به عنوان بهترین طراح جهان انتخاب شد در جوایز انجمن طراحی خبری 2020. درهم شکستن

واشنگتن پست گسترش نمایی را تجسم می کند

این همه گیری همچنین تجسم داده ها را به صفحات اول نشریات در سراسر جهان مجبور کرده است. این مقاله در مورد گسترش نمایی است از مارس 2020 (این را به خاطر دارید؟) کار خارق العاده ای در تجسم این که چگونه و چرا برخی ویروس ها به سرعت به مشکلات بزرگ واقعی تبدیل می شوند ، انجام می دهد. از شبیه سازی تمام عیار تا نمودارهای جرقه ای خطی کوچک، این سرمقاله است که از تنظیمات دیجیتالی خود نهایت استفاده را می برد.

مقاله واشنگتن پست درباره کووید

(پیش نمایش بزرگ)

آنچه من به خصوص در مورد این یکی دوست دارم این است که هرگز احساس رایگان نمی کند. هر تصویری داستان را بهبود می بخشد ، تا جایی که تقریباً متاسف هستید برای کسی که مجبور است مفاهیم یکسانی را فقط با کلمات توضیح دهد. در دسترس بودن بیش از دوازده زبان با کلیک یک دکمه ، یک لمس فوق العاده دیگر است – یادآوری اینکه وب در واقع بدون مرز است. فقط می توانم تصور کنم که این مقاله به چند نفر در سراسر جهان کمک کرده است.

در اینجا پروژه مارشال روزنامه نگاری سختی درباره سیستم عدالت کیفری ایالات متحده با ظرافت و زیبایی تلخ کتاب داستان کودکان ارائه می دهد. که در “Zo”، نوشتن خلاق ، تصویرسازی چشمگیر ، روایت افسون کننده و یک داستان مهم ترکیب شده است. این سرمقاله چند رسانه ای در جریان است.

پروژه مارشال

(پیش نمایش بزرگ)

آنها می گویند آهنگ ها می توانند چندین شکل داشته باشند. همین امر در مورد محتوای تحریریه آنلاین نیز صادق است. آنچه در بالا می بینید از آن الهام گرفته شده است مقاله علمی 96 صفحه ایبه که بتواند به عنوان یک مجموعه متحرک آنلاین مخاطبان جدیدی پیدا کند ، سپس باشد نامزد نه یک بلکه دو جایزه امی، گواهی بر قدرت دگرگون کننده اینترنت است.

رمان گرافیکی تعاملی SBS تازگی ندارد

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

داستان SBS قایق

(پیش نمایش بزرگ)

دنباله باز شدن صفحه شما را به سمت راست می کشاند ، کلمات آن هنگام خواندن با امواج کج می شوند و به هم می ریزند ، با صدای رعد و برق و باران حواس شما را تا لبه پر می کند. با پایان یافتن داستان ، مت هویینتصویرهایش مانند خاطرات به حرکت در می آیند. این یک تجربه فوق العاده زنده است ، در نوع خود و همچنین زیبا روشی هوشمندانه برای رساندن ادبیات به نسل های جوانبه

میمون های پودینگ در اطراف

ای کاش به موقع با نسخه صوتی این مجموعه سایت های الهام بخش روبرو می شدم. مهم نیست ، الان اینجاست در یک ویترین واقعاً عالی از سرمقاله دیجیتال ، The Pudding قضیه میمون بی نهایت را نه آنطور که از طریق موسیقی زنده توضیح می دهد. نمی دانید قضیه میمون چیست؟ خب، منتظر چه هستی، صفحه بی نهایت بهتر از من توضیح می دهدبه من منتظر می مانم.

قضیه میمون پودینگ

(پیش نمایش بزرگ)

با استفاده از مثال های تعاملی چهار یادداشت ، مقاله خواننده را درگیر می کند در حالی که درک آن را نیز ساده می کند. به عنوان آخرین لمس لذت بخش ، صفحه به خودی خود یک آزمایش زنده و مداوم است که به طور تصادفی در آهنگ های پیچیده ای کار می کند. شما می توانید انتظار داشته باشید که در حدود 19 سال آینده “ارتش هفت ملت” به دست آید. یکی می پرسد آیا میمونی که به مدت طولانی روی صفحه کلید تایپ می کند می تواند یک چارچوب جاوا اسکریپت کامل ایجاد کند؟ امید بهار جاودانه دارد

A List Apart: یک کلاس جداگانه

با وجود همه بحث های مربوط به تجسم داده ها ، موسیقی ، واقعیت افزوده و سایر ابزارهای عجیب و غریب ، برای بدست آوردن حق اساسی حرف های زیادی برای گفتن وجود دارد. لازم نیست صفحات وب معادل Vegas Strip باشند تا چشم نواز باشند. لیست جدا نشان می دهد که بهتر از اکثر رویکرد آن به محتوا همیشه جایی در قلب من خواهد داشت. عنوان ، تصویر ، کپی ، لینک های آبی. زیبا.

A List Apart

(پیش نمایش بزرگ)

چیزی که اکنون متوجه شده ام مدتها قبل به طرز نگران کننده ای بود ، در مورد دو شاخه طراحی وب “وحشیانه” نوشتم. مهمترین نکته ای که گفتم این بود که یک رویکرد بلند و بیهوده است ، دیگری کاملاً کاربردی است. A List Apart زیبایی دومی را که درست انجام شده نشان می دهد. مجموعه ابزارهای چند رسانه ای یک دارایی فوق العاده است ، اما حتی در حال حاضر مواقعی وجود دارد که فقط کلمات کار می کنند.

تفکر خلاقانه در مورد محتوا

خوب یا بد ، وب کاملاً مملو از محتوا است. بسیاری از آن عالی است ، بسیاری از آن نیست. بسیاری از صحبت های پیرامون آن دارای سرعت سرد و محاسبه کننده ای است که انتظار می رود زودتر از صنعتگران در مورد خطوط مونتاژ صحبت کنند. مثالهایی که در بالا به اشتراک گذاشته شد ، امیدوارم بتوانند در برابر خواسته برای برآوردن چیزها مقاومت کنند ، اما بیایید واقعی باشیم: اکثر وب سایتها منابع لازم را ندارند ، به عنوان مثال ، واشنگتن پستبه

با این حال ، راه هایی برای خلاقانه در مورد محتوا در همه سطوح ، از وبلاگ های شخصی گرفته تا نشریات جهانی وجود دارد. در اینجا تعداد کمی از آنها هستند:

  • روش پیش فرض خود را زیر سوال ببرید.
    ما موجوداتی عادی هستیم ، از جمله نحوه بیان داستان هایمان. زود وقت بگذارید و عقب بروید و بپرسید ، چگونه می توانم این کار را متفاوت انجام دهم؟ شاید یک مقاله نویسی عاقلانه تر از یک مقاله باشد. شاید یک نقشه حرارتی بهتر از یک میز باشد. البته تخصص مهم است ، اما اجازه ندهید که شما را نسبت به روشهای دیگر و اغلب مکمل انجام کارها کور کند.
  • از منابع رایگان استفاده کنید.
    یکی از بهترین هدایای اینترنت این است که چقدر چیزهای رایگان شگفت انگیز وجود دارد. مانند ، عملاً رایگان ، عمدا. از عکاسی گرفته تا طراحی گرافیکی تا ابزارهای تجسم داده تا نرم افزار ویرایش صدا ، منابعی که برای تغییر محتوای خود نیاز دارید تنها با یک کلیک فاصله دارند. برچسب freebies ما مکان خوبی برای شروع است.
  • چندین شکل به محتوا بدهید.
    همانطور که پروژه مارشال با “The Zo” به خوبی نشان داد ، داستانها وقتی شکلهای متفاوتی می گیرند می توانند مخاطبان جدیدی پیدا کنند. مقاله ای نوشت؟ عالی ، چرا نسخه صوتی ضبط نمی شود؟ گزارش داده محور تهیه کرده اید؟ بسیار جالب است ، اگرچه اگر شروع به اتصال این اعداد به D3 کردید ، به همان اندازه خوب است؟ فقط یک راه برای پیدا کردن.
  • آزمایش کنید
    نمونه هایی که در اینجا ذکر می شود ، کرم محصول است ، اما شایان ذکر است که از تلاش برای ایده های جدید و پذیرفتن شکست های گاه و بیگاه که به همراه دارد ، مقدار زیادی می توان به دست آورد. تکرار کلید فرایند خلاقیت است. اگر چیزی را امتحان کردید و نتیجه ای نداشت ، مهم نیست. این تنها راه رسیدن به چه چیزی است میکند کار

هیچ رویکردی برای همه محتوا وجود ندارد ، اما احترام به داستان ضروری است. فناوری های وب مکمل هستند ، رویداد اصلی نیستند. اجازه ندهید آنها دمی باشند که سگ را تکان می دهد. بهترین نتایج زمانی حاصل می شود که داستان با نحوه روایت آن هماهنگ باشد. این همان نوع محتوایی است که سالها با مردم می ماند.

سرمقاله ویرایش(vf ، yk ، he)

Read More

استفاده از SWR React Hooks with Next.js ‘Streaten Static Regeneration (ISR) – Smashing Magazine

خلاصه سریع

هنگامی که با مسیرهای ISR و Next.js API مرتبط می شود ، می توان از SWR برای ایجاد یک تجربه کاربری پاسخگو استفاده کرد. در این مقاله ، سام پودر توضیح می دهد که SWR چیست ، کجا باید از آن استفاده کرد (و کجا نه) و چگونه می توان با استفاده از بازسازی استاتیک افزایشی وب سایت ایجاد کرد.

اگر تا به حال از افزايش استاتيك احياي مجدد (ISR) با Next.js استفاده كرده ايد ، ممكن است متوجه شده ايد كه داده هاي قديمي را به كاربر ارسال مي كنيد. این زمانی رخ می دهد که شما صفحه را در سرور مجدداً اعتبارسنجی کنید. برای برخی از وب سایت ها این کار می کند ، اما برای برخی دیگر (مانند دفترچه راهنمای هک کلاب، سایتی که توسط lachlanjc که من به حفظ آن کمک می کنم) ، کاربر انتظار دارد که داده ها به روز نگه داشته شوند.

اولین راه حلی که ممکن است به ذهن شما خطور کند این است که صفحات را به سادگی از طرف سرور ارائه دهید و اطمینان حاصل کنید که سرویس گیرنده همیشه به روزترین داده ها را ارسال می کند. با این حال ، برداشتن تکه های بزرگ داده قبل از ارائه می تواند بار اولیه صفحه را کند کند. راه حلی که در Scrapbook استفاده می شد ، استفاده از کتابخانه SWR قلاب های React to بود با ذخیره داده های سمت سرویس گیرنده ، صفحه ذخیره شده را از سرور به روز کنیدبه این رویکرد تضمین می کند که کاربران هنوز هم تجربه خوبی دارند ، سایت سریع است و داده ها به روز هستند.

با SWR آشنا شوید

SWR یک کتابخانه React Hooks است که توسط Vercel ساخته شده است ، این نام از این اصطلاح گرفته شده است stale-while-revalidateبه همانطور که از نامش پیداست ، در حالی که به روزترین داده ها از طریق SWR در سمت سرویس گیرنده دریافت می شود ، داده های قدیمی و قدیمی به سرویس گیرنده ارائه می شود. SWR فقط یکبار اطلاعات را اعتبارسنجی نمی کند ، با این حال ، می توانید SWR را طوری پیکربندی کنید که داده ها در یک بازه زمانی مجدداً اعتبار یابند ، هنگامی که زبانه تمرکز خود را دوباره بازیابی کرد ، هنگامی که یک سرویس گیرنده مجدداً به اینترنت یا برنامه ای متصل می شود.

هنگامی که با مسیرهای API ISR و Next.js جفت می شود ، می توان از SWR برای ایجاد a استفاده کرد تجربه کاربر پاسخگوبه ابتدا کلاینت در صفحه ذخیره شده استاتیک ایجاد شده (ایجاد شده با getStaticProps()) ، در پس زمینه سرور نیز فرایند اعتبارسنجی مجدد آن صفحه را آغاز می کند (ادامه مطلب را اینجا بخوانید). این فرایند برای مشتری سریع به نظر می رسد و اکنون می توانند مجموعه داده ها را ببینند ، با این حال ممکن است به روز نباشد. پس از بارگیری صفحه ، درخواست واکشی به یک مسیر API Next.js از برنامه شما ارسال می شود که همان داده هایی را که با آن ایجاد شده است برمی گرداند getStaticProps()به هنگامی که این درخواست تکمیل شد (با فرض موفقیت آمیز بودن) ، SWR صفحه را با این داده های جدید به روز می کند.

بیایید اکنون به Scrapbook و این چگونه به حل مشکل داشتن داده های قدیمی در صفحه کمک کردبه نکته واضح این است که در حال حاضر ، مشتری نسخه به روز شده را دریافت می کند. اما نکته جالب تر ، تأثیر بر سرعت طرف ما است. وقتی سرعت را از طریق فانوس دریایی اندازه گیری می کنیم ، شاخص سرعت را بدست می آوریم 1.5 ثانیه برای نوع ISR + SWR سایت و 5.8 ثانیه برای نوع ارائه سمت سرور (به علاوه هشدار در مورد زمان پاسخگویی اولیه سرور). این تضاد کاملی بین این دو است (و هنگام بارگذاری صفحات نیز قابل توجه بود). اما یک معامله نیز وجود دارد ، در صفحه ارائه شده در سمت سرور ، کاربر بعد از چند ثانیه و با ورود داده های جدید ، طرح بندی سایت را تغییر نداد. در حالی که من معتقدم که Scrapbook این به روز رسانی را به خوبی اداره می کند ، این نکته مهمی است که طراحی تجربه کاربری شما

بیشتر بعد از پرش! ادامه مطلب را در زیر ادامه دهید

محل استفاده از SWR (و کجا عدم استفاده)

SWR را می توان در مکان های مختلف قرار داد ، در اینجا چند دسته سایت وجود دارد که SWR مناسب آنها خواهد بود:

  • سایت هایی با داده های زنده که نیاز به به روز رسانی سریع دارند.
    نمونه هایی از این قبیل سایت ها می توانند سایت های نمره ورزشی و ردیابی پرواز باشند. هنگام ایجاد این سایت ها ، باید از گزینه revalidate on interval با تنظیم فاصله کم (یک تا پنج ثانیه) استفاده کنید.
  • سایت هایی با سبک فید به روز رسانی یا پست هایی که در زمان واقعی به روز می شوند.
    مثال کلاسیک آن سایتهای خبری هستند که دارای وبلاگهای زنده از رویدادها مانند انتخابات هستند. مثال دیگر می تواند دفترچه یاد شده نیز باشد. در این مورد ، احتمالاً می خواهید از گزینه revalidate on interval استفاده کنید اما با تنظیم فاصله بیشتر (سی تا شصت ثانیه) برای صرفه جویی در مصرف داده و جلوگیری از تماس های غیر ضروری API.
  • سایت هایی با به روزرسانی داده های غیرفعال تر ، که افراد آنها را در پس زمینه بسیار باز نگه می دارند.
    نمونه هایی از این سایت ها می توانند صفحات آب و هوا یا صفحات شماره مورد COVID-19 در دهه 2020 باشند. این صفحات به دفعات به روز نمی شوند و بنابراین نیازی به اعتبارسنجی مداوم دو مثال قبلی ندارند. با این حال ، همچنان تجربه کاربر را برای به روز رسانی داده ها افزایش می دهد. در این موارد ، توصیه می کنم تاریخ را مجدداً اعتبار دهید زمانی که برگه مجدداً تمرکز می کند و هنگامی که مشتری به اینترنت وصل می شود ، این بدان معناست که اگر فردی با نگرانی به شیر آب بازگردد به این امید که فقط موارد کوچکی در مورد موارد افزایش یافته است. آن اطلاعات را سریع دریافت کنید
  • سایت هایی با داده های کوچک که کاربران می توانند با آنها ارتباط برقرار کنند.
    دکمه اشتراک Youtube را در نظر بگیرید ، وقتی روی اشتراک کلیک می کنید می خواهید تعداد آنها تغییر کند و احساس می کنید که تغییر کرده اید. در این موارد ، می توانید داده ها را با استفاده از SWR به صورت برنامه نویسی اعتبار مجدد کنید تا تعداد جدید را دریافت کرده و مقدار نمایش داده شده را به روز کنید.

نکته ای که باید به آن توجه داشت این است که همه اینها را می توان با ISR یا بدون ISR اعمال کرد.

البته مکان هایی وجود دارد که شما نمی خواهید از SWR استفاده کنید یا از SWR بدون ISR استفاده کنید. اگر داده های شما تغییر نکند یا به ندرت تغییر کند ، SWR کاربرد چندانی ندارد و در عوض می تواند درخواست های شبکه شما را مسدود کرده و از داده های کاربر تلفن همراه استفاده کند. SWR می تواند با صفحاتی که احتیاج به احراز هویت دارند کار کند ، با این حال شما می خواهید در این موارد از Server Side Rendering استفاده کنید و نه بازسازی استاتیک افزایشی.

استفاده از SWR با Next.js و بازسازی افزایشی استاتیک

اکنون ما تئوری این استراتژی را بررسی کرده ایم ، بیایید بررسی کنیم که چگونه آن را در عمل به کار می بریم. برای این منظور ما می خواهیم یک وب سایت بسازیم که نشان می دهد چند تاکسی با استفاده از سنگاپور (جایی که من زندگی می کنم!) در دسترس است این API ارائه شده توسط دولت

ساختار پروژه

پروژه ما با داشتن سه فایل کار خواهد کرد:

  • lib/helpers.js
  • pages/index.js (فایل پیش نمای ما)
  • pages/api/index.js (فایل API ما)

فایل راهنمای ما یک تابع را صادر می کند (getTaxiData) که داده ها را از API خارجی دریافت می کند و سپس آنها را در قالب مناسب برای استفاده ما باز می گرداند. فایل API ما آن تابع را وارد می کند و خروجی پیش فرض خود را به یک تابع handler تنظیم می کند getTaxiData و سپس آن را برگردانید ، این به معنی ارسال درخواست GET به /api داده های ما را برمی گرداند

ما برای SWR به این قابلیت نیاز داریم که داده های سمت مشتری را انجام دهد. در نهایت ، در فایل frontend ما وارد می کنیم getTaxiData و از آن در getStaticProps، داده های آن به تابع صادرات پیش فرض فایل frontend ما منتقل می شود که صفحه React ما را نشان می دهد. ما همه این کارها را برای جلوگیری از تکرار کد و اطمینان از ثبات در داده های خود انجام می دهیم. چه حوصله ای ، بیایید برنامه نویسی را شروع کنیم.

پرونده یاوران

ما با ایجاد the شروع می کنیم getTaxiData عملکرد در lib/helpers.js:

export async function getTaxiData(){
    let data = await fetch("https://api.data.gov.sg/v1/transport/taxi-availability").then(r => r.json())
    return {taxis: data.features.properties[0].taxi_count, updatedAt: data.features.properties[0].timestamp}
}

فایل API

سپس تابع handler را ایجاد می کنیم api/index.js و همچنین وارد کردن getTaxiData عملکرد:

import { getTaxiData } from '../../lib/helpers'
export default async function handler(req, res){
    res.status(200).json(await getTaxiData())
}

در اینجا هیچ چیز منحصر به SWR یا ISR وجود ندارد ، به جز ساختار پروژه فوق. این چیزها از الان شروع می شود index.js!

فایل Front-End

اولین کاری که می خواهیم انجام دهیم این است که کار خود را ایجاد کنیم getStaticProps عملکرد! این تابع ما را وارد می کند getTaxiData از آن استفاده کنید و سپس داده ها را با پیکربندی اضافی بازگردانید.

export async function getStaticProps(){
    const { getTaxiData } = require("../lib/helpers")
    return { props: (await getTaxiData()), revalidate: 1 }
}

من می خواهم روی کلید اعتبار مجدد در شیء برگشتی ما تمرکز کنم. این کلید عملا بازسازی استاتیک را افزایش می دهد. به میزبان شما می گوید که هر ثانیه بازسازی صفحه استاتیک یک گزینه در دسترس است ، این گزینه پس از مراجعه مشتری به صفحه شما در پس زمینه فعال می شود. شما می توانید در مورد بازسازی استاتیک افزایشی (ISR) اینجا بیشتر بخوانید.

اکنون زمان استفاده از SWR است! اجازه دهید ابتدا آن را وارد کنیم:

import  useSWR from 'swr'

ما در تابع React-rendering خود از SWR استفاده می کنیم ، بنابراین اجازه دهید آن تابع را ایجاد کنیم:

export default function App(props){
}

ما وسایل مورد نیاز را از طرف دریافت می کنیم getStaticPropsبه اکنون آماده راه اندازی SWR هستیم:

const fetcher = (...args) => fetch(...args).then(res => res.json())
const { data } = useSWR("/api", fetcher, {initialData: props, refreshInterval: 30000})

بیایید این را تجزیه کنیم. در ابتدا ، fetcher را تعریف می کنیم. این مورد توسط SWR به عنوان یک استدلال لازم است تا بداند چگونه داده های شما را واکشی کند با توجه به اینکه چارچوب های مختلف و غیره می توانند تنظیمات متفاوتی داشته باشند. در این مورد ، من از تابع ارائه شده در صفحه اسناد SWR استفاده می کنم. سپس ما به useSWR hook ، با سه آرگومان: مسیر واکشی داده ها ، تابع fetcher و سپس شیء options.

در آن options شیء ، ما دو مورد را مشخص کرده ایم:

  • داده های اولیه
  • فاصله زمانی که SWR باید داده ها را مجدداً اعتبار سنجی کند

گزینه داده اولیه جایی است که ما داده های دریافت شده را از آن ارائه می دهیم getStaticProps که اطمینان حاصل می کند که داده ها از ابتدا قابل مشاهده هستند. در نهایت ، ما از تخریب شی برای استخراج داده ها از قلاب استفاده می کنیم.

برای تکمیل ، این داده ها را با JSX بسیار اساسی ارائه می دهیم:

return <div>As of {data.updatedAt}, there are {data.taxis} taxis available in Singapore!</div>

و ، ما آن را انجام داده ایم! در آنجا ما یک نمونه بسیار ساده از استفاده از SWR با بازسازی استاتیک افزایشی داریم. (منبع مثال ما در دسترس است اینجا.)

اگر تا به حال با ISR به داده های کهنه برخورد کرده اید ، می دانید با چه کسی تماس بگیرید: SWR.

خواندن بیشتر در SmashingMag

سرمقاله سر و صدا(vf ، yk ، he)

Read More

کارگاه های آنلاین جدید Smashing در Front-End & UX-مجله سر و صدا

خلاصه سریع

وضعیت HTML Email ، Vue.js و Next.js چگونه است؟ آیا می خواهید با CSS مدرن ارتقا پیدا کنید؟ الگوهای طراحی رابط کاربری جدید و هوشمندی که می توانیم استفاده کنیم چیست؟ بیایید آن را مشخص کنیم. با ما کارگاه های آنلاین کاملا جدید در قسمت جلویی و طراحی حالا با کارگاه های آموزشی رایگان برای آزمایش آبها

شما ممکن است آن را از قبل بدانید ، اما شاید هنوز نه: ما مرتباً می دویم کارگاه های آنلاین دوستانه دور و بر جلو و طراحیبه ما چند کارگاه داریم که به زودی برگزار می شود ، و ما فکر کردیم که می دانید ، ممکن است شما نیز بخواهید به آن بپیوندید. همه جلسات کارگاهها به صورت تفکیک شده است بخش های 2.5 ساعت در طول روز ، بنابراین همیشه وقت دارید تا س questionsالات خود را مطرح کنید ، صفحه نمایش خود را به اشتراک بگذارید و بازخورد فوری دریافت کنید.

یک گربه دوست داشتنی Smashing به عنوان کاپیتان ، در اقیانوس قایقرانی می کند.
ملاقات سر و صدا کارگاه های آنلاین: جلسات زنده و تعاملی در frontend و UX.

بحث های زنده و تمرینات تعاملی در قلب هر کارگاه قرار دارد ، با کار گروهی ، تکالیف ، بررسی و تعامل زنده با مردم سراسر جهان. به علاوه ، شما همه را دریافت می کنید ضبط های ویدئویی در همه جلسات ، بنابراین می توانید در هر زمان ، روی صندلی راحت خود در محیط کار ، دوباره تماشا کنید.

کارگاه های زنده آینده (سپتامبر تا نوامبر 2021)

کارگاه ها چگونه هستند؟

تجربه می کنید؟ بزرگنمایی خستگی همچنین؟ به هر حال ، چه کسی واقعاً می خواهد زمان بیشتری را جلوی صفحه نمایش خود بگذارد؟ دقیقاً به همین دلیل است که ما تجربه کارگاه آنلاین را از ابتدا طراحی کرده ایم و زمان لازم برای در نظر گرفتن تمام مطالب ، درک آن و زمان کافی برای پرسیدن را در نظر گرفته ایم. فقط سوالات درست

گروهی از گربه های دوستانه ، البته در مورد frontend و UX به صورت آنلاین بحث می کنند.
که در کارگاه های ما، همه فقط یک مستطیل کمی تار روی صفحه هستند. همه برابر هستند و از آنها دعوت می شود تا شرکت کنند.

کارگاه های آنلاین ما برگزار می شود زنده و دهانه چند روز در طول هفته آنها به جلسات 2.5 ساعته تقسیم می شوند و در هر جلسه همیشه زمان کافی برای طرح سوالات شما یا صرف یک فنجان چای وجود دارد. ما در محتوا عجله نمی کنیم ، بلکه سعی می کنیم محیطی دوستانه ، دوستانه و فراگیر ایجاد کنیم تا همه بتوانند زمان اندیشیدن ، بحث و دریافت بازخورد را داشته باشند.

چیزهای زیادی از کارگاه Smashing انتظار می رود ، اما مهمترین آنها تمرکز بر روی است نمونه های کاربردی و تکنیک ها کارگاه ها گفتگو نیستند ؛ آن ها هستند در ارتباط بودن، با گفتگوهای زنده با شرکت کنندگان ، گاهی اوقات با چالش ها ، تکالیف خانه و کار تیمی.

البته ، همه مواد کارگاه را دریافت می کنید و ضبط های ویدئویی همچنین ، اگر جلسه ای را از دست دادید ، می توانید همان روز آن را دوباره تماشا کنید.

یک شرکت کننده خوشحال در کارگاه
با ما ملاقات کنید کارگاه های آموزشی دوستانه frontend و UXبه مهارت های خود را بصورت آنلاین تقویت کنید و از متخصصان یاد بگیرید – به صورت زنده.

TL ؛ DR

  • گستره کارگاه ها چند روز، تقسیم شدن جلسات 2.5 ساعتبه
  • زمان کافی برای پرسش و پاسخ زنده هر روز.
  • ده ها تن از نمونه های کاربردی و تکنیک ها
  • تمام مواد و ضبط های کارگاه را دریافت خواهید کرد.
  • همه کارگاه ها بر روی frontend و UX متمرکز شده اند.
  • بسته کارگاهی تهیه کنید و 250 دلار صرفه جویی کنید خارج از قیمت

متشکرم!

ما امیدواریم که بینش از کارگاه ها به شما در ارتقاء مهارت ها و کیفیت کار کمک می کند. یک مخلص متشکرم برای مهربانی ، حمایت مداوم و سخاوت شما – برای بودن درهم شکستن، اکنون و همیشه مفتخریم که از شما استقبال می کنیم.

سرمقاله ویرایش(او ، vf)

Read More

اجزای مرکب در واکنش – مجله سر و صدا

خلاصه سریع

جزء ترکیبی یکی از الگوهای پیشرفته React است که از روش جالبی برای برقراری ارتباط بین اجزای UI و به اشتراک گذاشتن حالت ضمنی با استفاده از رابطه صریح والدین و فرزندان استفاده می کند.

اجزای ترکیبی به توسعه دهندگان کمک می کند تا API های رسا و منعطف تری بسازند تا حالت و منطق را در اجزا به اشتراک بگذارند. این آموزش توضیح می دهد که چگونه می توان با استفاده از Context API و React برای ساخت اجزا با استفاده از این الگوی پیشرفته ، به این مهم دست یافت.

توجه داشته باشید: برای اینکه بتوانید این کار را ادامه دهید ، باید به درک اولیه از React و نحوه عملکرد API Context نیاز داشته باشید.

اجزای ترکیبی چیست؟

می توان گفت که اجزای ترکیبی الگویی هستند که حالت و رفتار گروهی از اجزا را در بر می گیرد ، اما همچنان کنترل رندر بخش های متغیر آن را به کاربر خارجی باز می گرداند.

با توجه به تعریف بالا ، به کلمات کلیدی توجه کنید: دولت و رفتار – اخلاقبه این به ما کمک می کند تا درک کنیم که م componentلفه مرکب با حالت (یعنی نحوه رفتار حالت در یک کامپوننت که توسط یک کاربر خارجی که مادر والد است محصور شده است) رفتار می کند.

هدف از اجزای ترکیبی این است که یک API رسا و انعطاف پذیر برای ارتباط بین اجزای والدین و فرزند ارائه دهیم.

مثل آن فکر کنید <select> و <option> برچسب ها در HTML:

<select>
  <option value="volvo">Volvo</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>

این select برچسب با هم کار می کند option تگ که برای منوی کشویی برای انتخاب موارد در HTML استفاده می شود. اینجا <select> وضعیت UI و سپس the را مدیریت می کند <option> عناصر در مورد چگونگی پیکربندی شده است <select> باید کار کند. اجزای ترکیبی در React برای ساختن یک جزء UI اعلان کننده استفاده می شود که به جلوگیری از حفاری تکیه گاه کمک می کند.

سوراخکاری در حال عبور از لوازم جانبی متعدد برای اجزای کودک است. این همچنین چیزی است که آنها “بوی کد” می نامند. بدترین قسمت دریل حفاری این است که وقتی اجزای والد دوباره رندر می کنند ، اجزای کودک نیز رندر مجدد می دهند و باعث ایجاد اثر دومینو بر روی قطعه می شوند. یک راه حل خوب استفاده از React Context API است که بعداً به آن خواهیم پرداخت.

بیشتر بعد از پرش! ادامه مطلب را در زیر ادامه دهید

استفاده از اجزای مرکب در React

این بخش بسته هایی را که می توانیم در برنامه خود استفاده کنیم و الگوی اجزای ترکیبی اجزای ساختمان را در React استفاده می کند ، توضیح می دهد. این مثال a است Menu جزء از @reach بسته UI.

import {
  Menu,
  MenuList,
  MenuButton,
  MenuItem,
  MenuItems,
  MenuPopover,
  MenuLink,
} from "@reach/menu-button";
import "@reach/menu-button/styles.css";

در اینجا راهی وجود دارد که می توانید از آن استفاده کنید Menu جزء:

function Example() {
  return (
    <Menu>
      <MenuButton>Actions</MenuButton>
      <MenuList>
        <MenuItem>Download</MenuItem>
        <MenuLink to="view">View</MenuLink>
      </MenuList>
    </Menu>
  );
}

کد مثال بالا یکی از اجزای اجزای مرکب است که در آن می بینید که Menu، MenuButton،MenuList، MenuItem و MenuLink همه از آنجا وارد شده اند @reach/menu-buttonبه برخلاف صادرات یک جزء واحد ، ReachUI یک جزء اصلی را صادر می کند Menu همراه اجزای فرزندان خود که عبارتند از MenuButton، MenuList، MenuItem و MenuLinkبه

چه زمانی باید از اجزای مرکب استفاده کنید؟

به عنوان یک توسعه دهنده React ، باید از اجزای ترکیبی استفاده کنید:

  • حل مسائل مربوط به ساخت اجزای قابل استفاده مجدد ؛
  • توسعه اجزای بسیار منسجم با حداقل اتصال.
  • راههای بهتری برای به اشتراک گذاشتن منطق بین اجزاء.

مزایا و معایب اجزای مرکب

یک جزء ترکیبی یک الگوی عالی React است که به جعبه ابزار توسعه دهندگان React خود اضافه کنید. در این بخش ، من مزایا و معایب استفاده از اجزای ترکیبی و آنچه را که از ساختن اجزا با استفاده از این الگوی توسعه آموخته ام ، بیان می کنم.

طرفداران

  • جدایی نگرانی
    داشتن تمام منطق حالت رابط کاربری در م componentلفه والد و برقراری ارتباط داخلی با تمام اجزای کودک ، تقسیم مسئولیت را به وضوح انجام می دهد.

  • پیچیدگی کاهش یافته است
    برخلاف حفاری برای انتقال خواص به اجزای خاص آنها ، وسایل کودک با استفاده از الگوی اجزای ترکیبی به اجزای فرزند مربوطه خود می روند.

منفی

یکی از مهمترین معایب اجزای ساختمان در React با الگوی اجزای ترکیبی تنها این است direct children از جزء والدین به props دسترسی خواهد داشت ، به این معنی که ما نمی توانیم هیچ یک از این اجزا را در یک جزء دیگر بپیچیم.

export default function FlyoutMenu() {
  return (
    <FlyOut>
      {/* This breaks */}
      <div>
        <FlyOut.Toggle />
        <FlyOut.List>
          <FlyOut.Item>Edit</FlyOut.Item>
          <FlyOut.Item>Delete</FlyOut.Item>
        </FlyOut.List>
      </div>
    </FlyOut>
  );
}

راه حلی برای این مسئله استفاده از الگوی اجزای ترکیبی انعطاف پذیر برای اشتراک گذاری ضمنی حالت با استفاده از است React.createContext API

API زمینه امکان عبور حالت React از طریق اجزای تو در تو را هنگام ساخت با استفاده از الگوی اجزای ترکیبی اجزای ساختمان در React فراهم می کند. این امر ممکن است زیرا context راهی برای انتقال داده ها به درخت کامپوننت بدون نیاز به ارسال دستی در هر سطح فراهم می کند. استفاده از Context API انعطاف پذیری زیادی را برای کاربر نهایی فراهم می کند.

حفظ اجزای مرکب در واکنش

اجزای ترکیبی روش انعطاف پذیرتری برای به اشتراک گذاری حالت در برنامه های React ارائه می دهند ، بنابراین استفاده از اجزای ترکیبی در برنامه های React شما نگهداری و اشکال زدایی برنامه های شما را آسان تر می کند.

ساخت نسخه ی نمایشی

در این مقاله ، ما قصد داریم یک جزء آکاردئونی در React با استفاده از الگوی اجزای ترکیبی بسازیم. م componentلفه ای که قرار است در این آموزش ایجاد کنیم ، a است جزء آکاردئونی سفارشی انعطاف پذیر است و با استفاده از Context API حالت کامپوننت را به اشتراک می گذارد.

بیا بریم!

اول از همه ، بیایید با استفاده از موارد زیر یک برنامه React ایجاد کنیم:

npx create-react-app accordionComponent
cd accordionComponent
npm start

یا

yarn create react-app accordionComponent
cd accordionComponent
yarn start

دستورات بالا یک برنامه React ایجاد می کند ، فهرست را به پروژه React تغییر می دهد و سرور توسعه را راه اندازی می کند.

توجه داشته باشید: در این آموزش ، ما از آن استفاده خواهیم کرد styled-components برای کمک به سبک سازی اجزای ما

برای نصب از دستور زیر استفاده کنید styled-components:

yarn add styled-components

یا

npm install --save styled-components

در src پوشه ، یک پوشه جدید به نام ایجاد کنید اجزاءبه این جایی است که همه اجزای ما زندگی می کنند. درون اجزاء پوشه ، دو فایل جدید ایجاد کنید: accordion.js و accordion.styles.jsبه

این accordion.styles.js فایل شامل یک ظاهر طراحی شده برای Accordion جزء (یک ظاهر طراحی شده ما با استفاده از styled-components)

import styled from "styled-components";

export const Container = styled.div`
  display: flex;
  border-bottom: 8px solid #222;
`;

در بالا نمونه ای از اجزای یک ظاهر طراحی شده با استفاده از css-in-js نام کتابخانه styled-componentsبه

درون accordion.styles.js فایل ، سبک های باقی مانده را اضافه کنید:

export const Frame = styled.div`
  margin-bottom: 40px;
`;
export const Inner = styled.div`
  display: flex;
  padding: 70px 45px;
  flex-direction: column;
  max-width: 815px;
  margin: auto;
`;
export const Title = styled.h1`
  font-size: 40px;
  line-height: 1.1;
  margin-top: 0;
  margin-bottom: 8px;
  color: black;
  text-align: center;
`;
export const Item = styled.div`
  color: white;
  margin: auto;
  margin-bottom: 10px;
  max-width: 728px;
  width: 100%;
  &:first-of-type {
    margin-top: 3em;
  }
  &:last-of-type {
    margin-bottom: 0;
  }
`;
export const Header = styled.div`
  display: flex;
  flex-direction: space-between;
  cursor: pointer;
  margin-bottom: 1px;
  font-size: 26px;
  font-weight: normal;
  background: #303030;
  padding: 0.8em 1.2em 0.8em 1.2em;
  user-select: none;
  align-items: center;
  img {
    filter: brightness(0) invert(1);
    width: 24px;
    user-select: none;
    @media (max-width: 600px) {
      width: 16px;
    }
  }
`;
export const Body = styled.div`
  font-size: 26px;
  font-weight: normal;
  line-height: normal;
  background: #303030;
  white-space: pre-wrap;
  user-select: none;
  overflow: hidden;
  &.closed {
    max-height: 0;
    overflow: hidden;
    transition: max-height 0.25ms cubic-bezier(0.5, 0, 0.1, 1);
  }
  &.open {
    max-height: 0px;
    transition: max-height 0.25ms cubic-bezier(0.5, 0, 0.1, 1);
  }
  span {
    display: block;
    padding: 0.8em 2.2em 0.8em 1.2em;
  }
`;

بیایید شروع به ساختن جزء آکاردئونی خود کنیم. در accordion.js فایل ، اجازه دهید کد زیر را اضافه کنیم:

import React, { useState, useContext, createContext } from "react";
import {
  Container,
  Inner,
  Item,
  Body,
  Frame,
  Title,
  Header
} from "./accordion.styles";

در بالا ، ما در حال وارد کردن useState، useContext و createContext قلاب هایی که به ما کمک می کند تا اجزای آکاردئون خود را با استفاده از اجزای ترکیبی بسازیم.

این مستندات را واکنش نشان دهید توضیح می دهد که context کمک می کند تا راهی برای انتقال داده ها از طریق درخت کامپوننت بدون نیاز به ارسال دستی در هر سطح فراهم شود.

با نگاهی به آنچه که قبلاً در دستگاه خود وارد کرده ایم accordion.js فایل ، متوجه خواهید شد که ما نیز سبک های خود را به عنوان اجزای وارد کرده ایم که به ما کمک می کند اجزای خود را سریعتر بسازیم.

ما پیش می رویم و زمینه خود را برای جزء ایجاد می کنیم که داده ها را با اجزای مورد نیاز به اشتراک می گذارد:

const ToggleContext = createContext();
export default function Accordion({ children, ...restProps }) {
  return (
    <Container {...restProps}>
      <Inner>{children}</Inner>
    </Container>
  );
}

این Container و Inner اجزای قطعه کد بالا از ما هستند ./accordion.styles.js فایلی که در آن با استفاده از styled-components (از css-in-js کتابخانه) این Container جزء کل را در خود جای داده است Accordion ما با استفاده از اجزای مرکب می سازیم.

در اینجا ما یک شیء زمینه با استفاده از createContext() متد ، بنابراین هنگامی که React م componentلفه ای را که به این شیء مشترک می شود ارائه می دهد ، مقدار زمینه فعلی را از نزدیک ترین ارائه دهنده منطبق در بالای آن در درخت می خواند.

سپس ما در حال ایجاد اجزای اصلی خود هستیم که آکاردئون است. طول می کشد children و هر کدام restPropsبه این جزء والدین ما است که اجزای آکاردئون کودکان را در خود جای داده است.

بیایید اجزای دیگر کودکان را در داخل ایجاد کنیم accordion.js فایل:

Accordion.Title = function AccordionTitle({ children, ...restProps }) {
  return <Title {...restProps}>{children}</Title>;
};
Accordion.Frame = function AccordionFrame({ children, ...restProps }) {
  return <Frame {...restProps}>{children}</Frame>;
};

توجه کنید . بعد از مولفه آکاردئون والدین ؛ این برای اتصال جزء فرزند به جزء والدین آن استفاده می شود.

بیا ادامه بدهیم. حالا موارد زیر را به accordion.js فایل:

Accordion.Item = function AccordionItem({ children, ...restProps }) {
  const [toggleShow, setToggleShow] = useState(true);
  return (
    <ToggleContext.Provider value={{ toggleShow, setToggleShow }}>
      <Item {...restProps}>{children}</Item>
    </ToggleContext.Provider>
  );
};
Accordion.ItemHeader = function AccordionHeader({ children, ...restProps }) {
  const { isShown, toggleIsShown } = useContext(ToggleContext);
  return (
    <Header onClick={() => toggleIsShown(!isShown)} {...restProps}>
      {children}
    </Header>
  );
};
Accordion.Body = function AccordionHeader({ children, ...restProps }) {
  const { isShown } = useContext(ToggleContext);
  return (
    <Body className={isShown ? "open" : "close"}>
      <span>{children}</span>
    </Body>
  );
};

بنابراین در اینجا ما در حال ایجاد یک Body، Header و Item جزء که همه فرزندان جزء والدین هستند Accordionبه این جایی است که ممکن است شروع به مشکل کند. همچنین ، توجه داشته باشید که هر جزء کودک ایجاد شده در اینجا نیز a دریافت می کند children حمایت و restpropsبه

از Item جزء فرزند ، ما حالت خود را با استفاده از useState قلاب کنید و آن را درست تنظیم کنید سپس همچنین به یاد داشته باشید که ما ایجاد کردیم ToggleContext در سطح بالا از accordion.js پرونده ای که یک Context Object، و هنگامی که React م componentلفه ای را ارائه می دهد که به این شیء Context مشترک می شود ، مقدار زمینه فعلی را از نزدیکترین ارائه دهنده منطبق در بالای آن در درخت می خواند.

هر شیء Context دارای a است Provider کامپوننت React که به اجزای مصرفی اجازه می دهد در تغییرات زمینه مشترک شوند.

این provider جزء می پذیرد a value prop به اجزای مصرفی که از فرزندان این ارائه دهنده هستند منتقل می شود ، و در اینجا ما مقدار حالت فعلی را که toggleShow و روش تعیین مقدار حالت فعلی setToggleShowبه آنها مقداري هستند كه تعيين مي كند كه چگونه شيء زمينه ما بدون سوراخ كردن پروپوزال حالت را در اطراف جزء ما به اشتراک مي گذارد.

سپس در ما header جزء کودک از Accordion، ما مقادیر شیء زمینه را تخریب می کنیم ، سپس وضعیت فعلی آن را تغییر می دهیم toggleShow روی کلیک بنابراین آنچه ما سعی می کنیم انجام دهیم این است که وقتی هدر روی آن کلیک می شود ، آکاردئون خود را پنهان یا نشان دهیم.

در ما Accordion.Body جزء ، ما همچنین تخریب می کنیم toggleShow که وضعیت فعلی کامپوننت است ، سپس به مقدار آن بستگی دارد toggleShow، می توانیم بدن را پنهان کنیم یا محتویات آن را نشان دهیم Accordion.Body جزء.

بنابراین این همه برای ماست accordion.js فایل.

اکنون اینجاست که می بینیم چگونه همه چیزهایی را که در مورد آن یاد گرفته ایم چگونه می بینیم Context و Compound components با هم بیا اما قبل از آن ، اجازه دهید یک فایل جدید به نام ایجاد کنیم data.json و محتوای زیر را در آن بچسبانید:

[
  {
    "id": 1,
    "header": "What is Netflix?",
    "body": "Netflix is a streaming service that offers a wide variety of award-winning TV programs, films, anime, documentaries and more – on thousands of internet-connected devices.nnYou can watch as much as you want, whenever you want, without a single advert – all for one low monthly price. There’s always something new to discover, and new TV programs and films are added every week!"
  },
  {
    "id": 2,
    "header": "How much does Netflix cost?",
    "body": "Watch Netflix on your smartphone, tablet, smart TV, laptop or streaming device, all for one low fixed monthly fee. Plans start from £5.99 a month. No extra costs or contracts."
  },
  {
    "id": 3,
    "header": "Where can I watch?",
    "body": "Watch anywhere, anytime, on an unlimited number of devices. Sign in with your Netflix account to watch instantly on the web at netflix.com from your personal computer or on any internet-connected device that offers the Netflix app, including smart TVs, smartphones, tablets, streaming media players and game consoles.nnYou can also download your favorite programs with the iOS, Android, or Windows 10 app. Use downloads to watch while you’re on the go and without an internet connection. Take Netflix with you anywhere."
  },
  {
    "id": 4,
    "header": "How do I cancel?",
    "body": "Netflix is flexible. There are no annoying contracts and no commitments. You can easily cancel your account online with two clicks. There are no cancellation fees – start or stop your account at any time."
  },
  {
    "id": 5,
    "header": "What can I watch on Netflix?",
    "body": "Netflix has an extensive library of feature films, documentaries, TV programs, anime, award-winning Netflix originals, and more. Watch as much as you want, any time you want."
  }
]

این داده هایی است که ما برای آزمایش اجزای آکاردئون خود با آنها کار خواهیم کرد.

پس بیایید ادامه دهیم. ما تقریباً به پایان رسیده ایم و معتقدم شما از پیروی از این مقاله چیزهای زیادی آموخته اید.

در این بخش ، ما قصد داریم هر آنچه را که روی آن کار کرده ایم و در مورد اجزای ترکیبی یاد گرفته ایم گردآوری کنیم تا بتوانیم از آن در برنامه خود استفاده کنیم. App.js فایل برای استفاده از Array.map عملکرد برای نمایش داده هایی که قبلاً در صفحه وب داریم. همچنین توجه داشته باشید که از حالت در داخل استفاده نشده است App.js؛ تنها کاری که ما انجام دادیم این بود که داده ها را به اجزای خاص منتقل می کردیم و Context API از هر چیز دیگری مراقبت می کرد.

اکنون به قسمت پایانی می پردازیم. در شما App.js، موارد زیر را انجام دهید:

import React from "react";
import Accordion from "./components/Accordion";
import faqData from "./data";
export default function App() {
  return (
    <Accordion>
      <Accordion.Title>Frequently Asked Questions</Accordion.Title>
      <Accordion.Frame>
        {faqData.map((item) => (
          <Accordion.Item key={item.id}>
            <Accordion.Header>{item.header}</Accordion.Header>
            <Accordion.Body>{item.body}</Accordion.Body>
          </Accordion.Item>
        ))}
      </Accordion.Frame>
    </Accordion>
  );
}

در شما App.js فایل ، ما Component Component Accordion خود را از مسیر فایل وارد کردیم ، سپس داده های ساختگی خود را وارد کردیم ، از طریق داده های ساختگی نقشه برداری کردیم تا موارد جداگانه را در پرونده داده خود بدست آوریم ، سپس آنها را مطابق با جزء مربوطه نمایش دادیم ، همچنین شما توجه داشته باشید که تنها کاری که باید انجام دهیم این بود که بچه ها را به جزء مربوطه منتقل کنیم ، API Context مراقبت می کند تا اطمینان حاصل شود که به جزء مناسب می رسد و هیچ گونه حفره ای وجود ندارد.

این محصول نهایی ما باید به این شکل باشد:

نمای نهایی اجزای آکاردئون ما

نمای نهایی اجزای آکاردئون ما. (پیش نمایش بزرگ)

جایگزین برای اجزای ترکیبی

جایگزینی برای استفاده از اجزای ترکیبی استفاده از API Render Props خواهد بود. عبارت رندر پروپ in React به تکنیکی برای به اشتراک گذاشتن کد بین اجزای React با استفاده از prop که مقدار آن یک تابع است ، اشاره می کند. یک کامپوننت با یک render prop یک تابع را می گیرد که یک عنصر React را برمی گرداند و به جای پیاده سازی منطق رندر خود ، آن را فراخوانی می کند.

وقتی اجزاء را داخل یکدیگر قرار می دهید ، انتقال داده ها از یک جزء به یک جزء کودک که به داده نیاز دارد ممکن است منجر به حفاری شود. این مزیت استفاده از Context برای به اشتراک گذاری داده ها بین اجزا نسبت به روش render prop است.

نتیجه

در این مقاله ، با یکی از الگوهای پیشرفته React که الگوی اجزای مرکب است ، آشنا شدیم. این یک روش عالی برای ساختن اجزای قابل استفاده مجدد در React با استفاده از الگوی اجزای ترکیبی برای ساختن جزء شما ، انعطاف پذیری زیادی در کامپوننت شما ارائه می دهد. هنوز می توانید استفاده از آن را انتخاب کنید رندر پروپ اگر انعطاف پذیری چیزی نیست که اجزای شما در حال حاضر نیاز دارند.

اجزای ترکیبی بیشتر در ساختمان مفید هستند سیستم های طراحیبه ما همچنین فرایند به اشتراک گذاری حالت در اجزای سازنده با استفاده از Context API را طی کردیم.

  • کد این آموزش را می توانید در Codesandboxبه
سرمقاله ویرایش(ks ، vf ، yk ، il)

Read More

ایجاد یک جزء نمودار گانت تعاملی با Vanilla.js – مجله سر و صدا

خلاصه سریع

با نمودار گانت ، می توانید برنامه ها را مجسم کنید و وظایف را تعیین کنید. در این مقاله ، ما نمودار گانت را به عنوان یک جزء وب قابل استفاده مجدد کدگذاری می کنیم. ما بر معماری جزء ، ارائه تقویم با CSS Grid و مدیریت وضعیت کارهای قابل کشیدن با JavaScript Proxy Objects تمرکز می کنیم.

اگر با داده های زمان در برنامه خود کار می کنید ، تجسم گرافیکی به عنوان تقویم یا نمودار گانت اغلب بسیار مفید است. در نگاه اول ، توسعه جزء نمودار خود بسیار پیچیده به نظر می رسد. بنابراین ، در این مقاله ، من پایه ای برای a ایجاد می کنم جزء نمودار گانت ظاهر و عملکرد آن را می توانید برای هر مورد استفاده سفارشی کنید.

اینها هستند ویژگی های اصلی نمودار گانت که می خواهم پیاده سازی کنم:

  • کاربر می تواند بین دو نمای انتخاب کند: سال/ماه یا ماه/روز.
  • کاربر می تواند افق برنامه ریزی را با انتخاب تاریخ شروع و تاریخ پایان تعریف کند.
  • نمودار لیستی از مشاغل را ارائه می دهد که می توان آنها را با کشیدن و رها کردن جابجا کرد. تغییرات در وضعیت اجسام منعکس می شود.
  • در زیر می توانید نمودار گانت حاصل را در هر دو نمای مشاهده کنید. در نسخه ماهانه ، من سه شغل را به عنوان مثال گنجانده ام.

نمودار گانت با نمای ماه

نمودار گانت با نمای ماه (پیش نمایش بزرگ)

نمودار گانت با نمای روز

نمودار گانت با نمای روز. (پیش نمایش بزرگ)

در زیر می توانید نمودار گانت حاصل را در هر دو نمای مشاهده کنید. در نسخه ماهانه ، من سه شغل را به عنوان مثال گنجانده ام.

نمونه فایلها و دستورالعملهای اجرای کد

می توانید پیدا کنید قطعات کامل کد این مقاله در فایلهای زیر:

از آنجا که کد شامل ماژول های جاوا اسکریپت است ، فقط می توانید مثال را از یک اجرا کنید سرور HTTP و نه از سیستم فایل محلی. برای آزمایش روی رایانه محلی خود ، ماژول را توصیه می کنم سرور زنده، که می توانید از طریق npm نصب کنید.

متناوبا ، می توانید مثال را مستقیماً در مرورگر خود امتحان کنید بدون نصب

بیشتر بعد از پرش! ادامه مطلب را در زیر ادامه دهید

ساختار اساسی کامپوننت وب

تصمیم گرفتم نمودار گانت را به عنوان یک جزء وب پیاده سازی کنم. این به ما اجازه می دهد تا a ایجاد کنیم عنصر HTML سفارشی، در مورد من <gantt-chart></gantt-chart>، که به راحتی می توانیم در هر نقطه از صفحه HTML از آن استفاده مجدد کنیم.

می توانید برخی از اطلاعات اولیه در مورد توسعه اجزای وب را در MDN Web Docsبه فهرست زیر ساختار اجزا را نشان می دهد. از مثال “شمارنده” از الهام گرفته شده است Alligator.ioبه

جزء a را تعریف می کند قالب حاوی کد HTML مورد نیاز برای نمایش نمودار گانت. برای اطلاع از مشخصات کامل CSS ، لطفاً به فایل های نمونه مراجعه کنید. فیلدهای انتخاب خاص برای سال ، ماه یا تاریخ را هنوز نمی توان در اینجا تعریف کرد ، زیرا به سطح انتخاب شده نمای بستگی دارد.

عناصر انتخاب توسط یکی از دو مورد پیش بینی شده است کلاس های ارائه دهنده بجای. همین امر در مورد تبدیل نمودار واقعی Gantt به عنصر با شناسه نیز صدق می کند gantt-container، که توسط کلاس ارائه کننده مسئول نیز اداره می شود.

کلاس VanillaGanttChart اکنون رفتار عنصر HTML جدید ما را توضیح می دهد. در سازنده ، ابتدا الگوی خشن خود را به عنوان تعریف می کنیم سایه DOM از عنصر

کامپوننت باید با آن مقداردهی اولیه شود دو آرایه، jobs، و resourcesبه این jobs آرایه شامل وظایفی است که در نمودار به عنوان نوارهای سبز متحرک نمایش داده می شود. این resources آرایه ردیف های جداگانه را در نمودار مشخص می کند که وظایف را می توان در آن تعیین کرد. به عنوان مثال ، در تصاویر بالا ، 4 منبع با برچسب داریم وظیفه 1 به وظیفه 4به بنابراین منابع می توانند وظایف فردی ، بلکه افراد ، وسایل نقلیه و سایر منابع فیزیکی را نشان دهند ، که امکان استفاده از موارد مختلف را می دهد.

در حال حاضر ، YearMonthRenderer به عنوان استفاده می شود ارائه دهنده پیش فرضبه به محض اینکه کاربر سطح متفاوتی را انتخاب کرد ، رندر در آن تغییر می کند changeLevel روش: ابتدا ، عناصر DOM و شنوندگان خاص ارائه دهنده از Shadow DOM با استفاده از clear روش ارائه دهنده قدیمی سپس ارائه دهنده جدید با مشاغل و منابع موجود راه اندازی می شود و رندرینگ شروع می شود.

import {YearMonthRenderer} from './YearMonthRenderer.js';
import {DateTimeRenderer} from './DateTimeRenderer.js';

const template = document.createElement('template');

template.innerHTML = 
 `<style> … </style>

  <div id="gantt-settings">

    <select name="select-level" id="select-level">
      <option value="year-month">Month / Day</option>
      <option value="day">Day / Time</option>
    </select>

    <fieldset id="select-from">
      <legend>From</legend>
    </fieldset>

    <fieldset id="select-to">
      <legend>To</legend>
    </fieldset>
  </div>

  <div id="gantt-container">
  </div>`;

export default class VanillaGanttChart extends HTMLElement {

    constructor() {
      super();
      this.attachShadow({ mode: 'open' });
      this.shadowRoot.appendChild(template.content.cloneNode(true));
      this.levelSelect = this.shadowRoot.querySelector('#select-level');
    }
 
    _resources = [];
    _jobs = [];
    _renderer;

    set resources(list){…}
    get resources(){…}
    set jobs(list){…}
    get jobs(){…}
    get level() {…}
    set level(newValue) {…} 
    get renderer(){…}
    set renderer(r){…}

    connectedCallback() {
      this.changeLevel = this.changeLevel.bind(this);

      this.levelSelect.addEventListener('change', this.changeLevel);
      this.level = "year-month";   

      this.renderer = new YearMonthRenderer(this.shadowRoot);
      this.renderer.dateFrom = new Date(2021,5,1);
      this.renderer.dateTo = new Date(2021,5,24);
      this.renderer.render();
    }

    disconnectedCallback() {  
      if(this.levelSelect)
        this.levelSelect.removeEventListener('change', this.changeLevel);
      if(this.renderer)
        this.renderer.clear();
    }

    changeLevel(){
      if(this.renderer)
        this.renderer.clear();

      var r;   

      if(this.level == "year-month"){
        r = new YearMonthRenderer(this.shadowRoot);    
      }else{
        r = new DateTimeRenderer(this.shadowRoot);
      }

      r.dateFrom = new Date(2021,5,1);
      r.dateTo = new Date(2021,5,24);
      r.resources = this.resources;
      r.jobs = this.jobs;
      r.render();
      this.renderer = r;
    }
  }
 
  window.customElements.define('gantt-chart', VanillaGanttChart);

قبل از اینکه عمیق تر به فرایند رندرینگ بپردازیم ، می خواهم یک نمای کلی از ارتباطات بین اسکریپت های مختلف را به شما ارائه دهم:

  • index.html صفحه وب شما است که می توانید از برچسب در آن استفاده کنید <gantt-chart></gantt-chart>
  • index.js یک اسکریپت است که در آن شما نمونه اجزای وب را که با نمودار Gantt استفاده شده در index.html همراه است ، با مشاغل و منابع مناسب (البته می توانید از چندین نمودار Gantt و در نتیجه چندین نمونه از جزء وب نیز استفاده کنید)
  • جزء VanillaGanttChart نمایندگان را به دو کلاس ارائه کننده ارائه می دهد YearMonthRenderer و DateTimeRendererبه

معماری اجزای مثال نمودار گانت ما

معماری اجزای مثال نمودار گانت ما. (پیش نمایش بزرگ)

ارائه نمودار Gantt با JavaScript و CSS Grid

در ادامه ، ما در مورد فرایند ارائه با استفاده از YearMonthRenderer به عنوان مثال. لطفاً توجه داشته باشید که من از یک اصطلاح استفاده کرده ام عملکرد سازنده به جای class کلید واژه برای تعریف کلاس این به من امکان می دهد بین اموال عمومی تمایز قائل شوم (this.render و this.clear) و متغیرهای خصوصی (تعریف شده با var)

ارائه نمودار به چند مرحله فرعی تقسیم می شود:

  1. initSettings
    ارائه کنترل هایی که برای تعریف افق برنامه ریزی استفاده می شوند.
  2. initGantt
    ارائه نمودار گانت ، اساساً در چهار مرحله:
    • initFirstRow (1 ردیف با نام ماه می کشد)
    • initSecondRow (1 ردیف با روزهای ماه رسم می کند)
    • initGanttRows (برای هر منبع 1 ردیف با سلول های شبکه برای هر روز از ماه ترسیم می کند)
    • initJobs (مشاغل قابل کشیدن را در نمودار قرار می دهد)
export function YearMonthRenderer(root){

    var shadowRoot = root;
    var names = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];    
 
    this.resources=[];
    this.jobs = [];
 
    this.dateFrom = new Date();
    this.dateTo = new Date();

    //select elements
    var monthSelectFrom;
    var yearSelectFrom;
    var monthSelectTo;
    var yearSelectTo;

    var getYearFrom = function() {…}
    var setYearFrom = function(newValue) {…}

    var getYearTo = function() {…}
    var setYearTo = function(newValue) {…}

    var getMonthFrom = function() {…}
    var setMonthFrom = function(newValue) {…}

    var getMonthTo = function() {…}
    var setMonthTo = function(newValue) {…}  

    this.render = function(){
      this.clear();
      initSettings();
      initGantt();
    }

    //remove select elements and listeners, clear gantt-container 
    this.clear = function(){…}

    //add HTML code for the settings area (select elements) to the shadow root, initialize associated DOM elements and assign them to the properties monthSelectFrom, monthSelectTo etc., initialize listeners for the select elements
    var initSettings = function(){…}

    //add HTML code for the gantt chart area to the shadow root, position draggable jobs in the chart
    var initGantt = function(){…}

    //used by initGantt: draw time axis of the chart, month names
    var initFirstRow = function(){…}

    //used by initGantt: draw time axis of the chart, days of month
    var initSecondRow = function(){…}

    //used by initGantt: draw the remaining grid of the chart
    var initGanttRows = function(){…}.bind(this);

    //used by initGantt: position draggable jobs in the chart cells
    var initJobs = function(){…}.bind(this);    

   //drop event listener for jobs
   var onJobDrop = function(ev){…}.bind(this);

   //helper functions, see example files
   ...
}

ارائه شبکه

من برای ترسیم ناحیه نمودار CSS Grid را توصیه می کنم زیرا ایجاد آن را بسیار آسان می کند طرح بندی چند ستونی که به طور پویا با اندازه صفحه سازگار می شوند.

در مرحله اول ، ما باید تعیین کنیم تعداد ستون ها از شبکه در انجام این کار ، ما به اولین ردیف نمودار که (در مورد YearMonthRenderer) نشان دهنده ماههای فردی است.

در نتیجه ، ما نیاز داریم:

  • یک ستون برای نام منابع ، به عنوان مثال با عرض ثابت 100 پیکسل.
  • یک ستون برای هر ماه ، با همان اندازه و با استفاده از فضای کامل موجود.

این را می توان با تنظیمات به دست آورد 100px repeat(${n_months}, 1fr) برای ملک gridTemplateColumns از ظرف نمودار

این قسمت اولیه این است initGantt روش:

var container = shadowRoot.querySelector("#gantt-container");
container.innerHTML = "";

var first_month = new Date(getYearFrom(), getMonthFrom(), 1);
var last_month = new Date(getYearTo(), getMonthTo(), 1);
 
//monthDiff is defined as a helper function at the end of the file
var n_months =  monthDiff(first_month, last_month)+1;
 
container.style.gridTemplateColumns = `100px repeat(${n_months},1fr)`;

در تصویر زیر می توانید نمودار دو ماهه را با n_months=2:

نمودار برای 2 ماه ، تنظیم شده با n_months=2به (پیش نمایش بزرگ)

بعد از اینکه ستون های بیرونی را تعریف کردیم ، می توانیم شروع کنیم پر کردن شبکهبه اجازه دهید با مثال از تصویر بالا بمانیم. در ردیف اول ، 3 را وارد می کنم divs با کلاسها gantt-row-resource و gantt-row-periodبه می توانید آنها را در قطعه زیر از بازرس DOM پیدا کنید.

در ردیف دوم ، از همان سه استفاده می کنم divs برای حفظ تراز عمودی. با این حال ، ماه divعناصر کودک را برای روزهای جداگانه ماه دریافت کنید.

<div id="gantt-container"
  style="grid-template-columns: 100px repeat(2, 1fr);">
  <div class="gantt-row-resource"></div>
  <div class="gantt-row-period">Jun 2021</div>
  <div class="gantt-row-period">Jul 2021</div>
  <div class="gantt-row-resource"></div>
  <div class="gantt-row-period">
    <div class="gantt-row-period">1</div>
    <div class="gantt-row-period">2</div>
    <div class="gantt-row-period">3</div>
    <div class="gantt-row-period">4</div>
    <div class="gantt-row-period">5</div>
    <div class="gantt-row-period">6</div>
    <div class="gantt-row-period">7</div>
    <div class="gantt-row-period">8</div>
    <div class="gantt-row-period">9</div>
    <div class="gantt-row-period">10</div>
  ...
  </div>
  ...
</div>

برای اینکه عناصر کودک نیز به صورت افقی چیده شوند ، ما به تنظیم نیاز داریم display: grid برای کلاس gantt-row-periodبه علاوه بر این ، ما دقیقاً نمی دانیم چند ستون برای ماه های جداگانه مورد نیاز است (28 ، 30 یا 31). بنابراین ، من از تنظیمات استفاده می کنم grid-auto-columnsبه با ارزش minmax(20px, 1fr); من می توانم اطمینان حاصل کنم که حداقل عرض 20 پیکسل حفظ می شود و در غیر این صورت از فضای موجود به طور کامل استفاده می شود:

#gantt-container {
  display: grid;
}

.gantt-row-resource {
  background-color: whitesmoke;
  color: rgba(0, 0, 0, 0.726);
  border: 1px solid rgb(133, 129, 129);
  text-align: center;
}

.gantt-row-period {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: minmax(20px, 1fr);
  background-color: whitesmoke;
  color: rgba(0, 0, 0, 0.726);
  border: 1px solid rgb(133, 129, 129);
  text-align: center;
}

سطرهای باقیمانده مطابق با ردیف دوم ایجاد می شوند ، اما به صورت زیر سلول های خالیبه

در اینجا کد جاوا اسکریپت برای ایجاد تک تک سلول های ردیف اول آمده است. روش ها initSecondRow و initGanttRows ساختار مشابهی دارند

var initFirstRow = function(){

  if(checkElements()){
        var container = shadowRoot.querySelector("#gantt-container");

        var first_month = new Date(getYearFrom(), getMonthFrom(), 1);
        var last_month = new Date(getYearTo(), getMonthTo(), 1);
 
        var resource = document.createElement("div");
        resource.className = "gantt-row-resource";
        container.appendChild(resource);   
 
        var month = new Date(first_month);

        for(month; month <= last_month; month.setMonth(month.getMonth()+1)){    
          var period = document.createElement("div");
          period.className = "gantt-row-period";
          period.innerHTML = names[month.getMonth()] + " " + month.getFullYear();
          container.appendChild(period);
        }
  }
}

رندر کردن مشاغل

حالا هر کدام job باید در نمودار در موقعیت صحیحبه برای این منظور از ویژگی های داده HTML استفاده می کنم: هر سلول شبکه در ناحیه اصلی نمودار با دو ویژگی مرتبط است data-resource و data-date نشان دادن موقعیت در محور افقی و عمودی نمودار (عملکرد را ببینید initGanttRows در پرونده ها YearMonthRenderer.js و DateTimeRenderer.js)

به عنوان مثال ، اجازه دهید به چهار سلول اولیه در ردیف اول نمودار (ما هنوز از همان مثال بالا استفاده می کنیم):

تمرکز بر چهار سلول شبکه اول در ردیف اول نمودار. (پیش نمایش بزرگ)

در بازرس DOM می توانید مقادیر ویژگی های داده ای را که من به سلول های جداگانه اختصاص داده ام مشاهده کنید:

مقادیر ویژگیهای داده اختصاص داده شده است. (پیش نمایش بزرگ)

حالا ببینیم این برای تابع به چه معناست initJobsبه با کمک تابع querySelector، در حال حاضر یافتن سلول شبکه ای که کار باید در آن قرار گیرد بسیار آسان است.

چالش بعدی تعیین عرض صحیح برای a است job عنصر بسته به نمای انتخاب شده ، هر سلول شبکه نشان دهنده a است واحد یک روز (مرحله month/day) یا یک ساعت (سطح day/time) از آنجا که هر شغل عنصر فرزند سلول است ، job مدت زمان 1 واحد (روز یا ساعت) به عرض عرض مربوط می شود 1*100%، مدت زمان 2 واحد مربوط به عرض است 2*100%، و غیره این امکان استفاده از CSS را فراهم می کند calc عملکرد به به صورت پویا عرض a را تنظیم کنید job عنصر، همانطور که در لیست زیر نشان داده شده است.

var initJobs = function(){

    this.jobs.forEach(job => {

        var date_string = formatDate(job.start);

        var ganttElement = shadowRoot.querySelector(`div[data-resource="${job.resource}"][data-date="${date_string}"]`);

        if(ganttElement){

          var jobElement = document.createElement("div");
          jobElement.className="job";
          jobElement.id = job.id;

          //helper function dayDiff - get difference between start and end in days
          var d = dayDiff(job.start, job.end);           
          
          //d --> number of grid cells covered by job + sum of borderWidths
          jobElement.style.width = "calc("+(d*100)+"% + "+ d+"px)";
          jobElement.draggable = "true";

          jobElement.ondragstart = function(ev){
              //the id is used to identify the job when it is dropped
              ev.dataTransfer.setData("job", ev.target.id); 
          };

          ganttElement.appendChild(jobElement);
        }
    });
  }.bind(this);

به منظور ایجاد یک job قابل کشیدن، سه مرحله لازم است:

  • ویژگی را تنظیم کنید draggable از عنصر شغل به true (فهرست بالا را ببینید).
  • برای رویداد یک کنترل کننده رویداد تعریف کنید ondragstart عنصر شغل (فهرست بالا را ببینید).
  • برای رویداد یک کنترل کننده رویداد تعریف کنید ondrop برای سلول های شبکه نمودار گانت ، که اهداف احتمالی افت عنصر کار هستند (به تابع مراجعه کنید initGanttRows در پرونده YearMonthRenderer.js)

کنترل کننده رویداد برای رویداد ondrop به شرح زیر تعریف می شود:

var onJobDrop = function(ev){
 
      // basic null checks
      if (checkElements()) {
 
        ev.preventDefault(); 
 
        // drop target = grid cell, where the job is about to be dropped
        var gantt_item = ev.target;
        
        // prevent that a job is appended to another job and not to a grid cell
        if (ev.target.classList.contains("job")) {
          gantt_item = ev.target.parentNode;
        }
        
        // identify the dragged job
        var data = ev.dataTransfer.getData("job");               
        var jobElement = shadowRoot.getElementById(data);  
        
        // drop the job
        gantt_item.appendChild(jobElement);
 
        // update the properties of the job object
        var job = this.jobs.find(j => j.id == data );
 
        var start = new Date(gantt_item.getAttribute("data-date"));
        var end = new Date(start);
        end.setDate(start.getDate()+dayDiff(job.start, job.end));
 
        job.start = start;
        job.end = end;
        job.resource = gantt_item.getAttribute("data-resource");
      }
    }.bind(this);

تمام تغییرات داده های کار ایجاد شده توسط کشیدن و رها کردن در لیست نشان داده می شود jobs از جزء نمودار گانت.

ادغام اجزای نمودار گانت در برنامه شما

می توانید از برچسب استفاده کنید <gantt-chart></gantt-chart> در هر کجا در فایل های HTML برنامه شما (در مورد من در فایل) index.html) تحت شرایط زیر:

  • فیلمنامه VanillaGanttChart.js باید به عنوان یک ماژول ادغام شود تا برچسب به درستی تفسیر شود.
  • شما به یک اسکریپت جداگانه نیاز دارید که نمودار گانت با آن مقداردهی اولیه شود jobs و resources (در مورد من پرونده index.js)
<!DOCTYPE html>
<html>
 <head>
   <meta charset="UTF-8"/>
   <title>Gantt chart - Vanilla JS</title>
   <script type="module" src="https://smashingmagazine.com/2021/08/interactive-gantt-chart-component-vanilla-javascript/VanillaGanttChart.js"></script>   
 </head>
    
 <body>
 
  <gantt-chart id="g1"></gantt-chart> 
 
  <script type="module" src="index.js"></script>
 </body> 
</html>

به عنوان مثال ، در مورد من پرونده index.js به شکل زیر به نظر می رسد:

import VanillaGanttChart from "./VanillaGanttChart.js";
 
var chart = document.querySelector("#g1");
 
chart.jobs = [
    {id: "j1", start: new Date("2021/6/1"), end: new Date("2021/6/4"), resource: 1},
    {id: "j2", start: new Date("2021/6/4"), end: new Date("2021/6/13"), resource: 2},
    {id: "j3", start: new Date("2021/6/13"), end: new Date("2021/6/21"), resource: 3},
];
 
chart.resources = [{id:1, name: "Task 1"}, {id:2, name: "Task 2"}, {id:3, name: "Task 3"}, {id:4, name: "Task 4"}];

با این حال ، هنوز یک الزام باز است: هنگامی که کاربر با کشیدن مشاغل در نمودار Gantt تغییراتی را ایجاد می کند ، تغییرات مربوطه در ارزش ویژگی های مشاغل باید در لیست منعکس شود. خارج از جزء

ما می توانیم با استفاده از اشیاء پروکسی جاوا اسکریپت: هر یک job در a قرار دارد شیء پروکسی، که ما به اصطلاح ارائه می دهیم اعتبارسنجبه به محض تغییر ویژگی شی (عملکرد) فعال می شود set اعتبارسنج) یا بازیابی (تابع get اعتبارسنج) در تابع مجموعه اعتبار سنج ، می توانیم کدی را که هر زمان زمان شروع یا منبع کار تغییر می کند ، اجرا می کنیم.

فهرست زیر نسخه دیگری از فایل را نشان می دهد index.jsبه اکنون لیستی از اشیاء پروکسی به جزء کارهای اصلی به جزء نمودار گانت اختصاص داده شده است. در اعتبارسنج set من از یک خروجی کنسول ساده استفاده می کنم تا نشان دهم که در مورد تغییر ویژگی به من اطلاع داده شده است.

import VanillaGanttChart from "./VanillaGanttChart.js";
 
var chart = document.querySelector("#g1");
 
var jobs = [
    {id: "j1", start: new Date("2021/6/1"), end: new Date("2021/6/4"), resource: 1},
    {id: "j2", start: new Date("2021/6/4"), end: new Date("2021/6/13"), resource: 2},
    {id: "j3", start: new Date("2021/6/13"), end: new Date("2021/6/21"), resource: 3},
];
var p_jobs = [];
 
chart.resources = [{id:1, name: "Task 1"}, {id:2, name: "Task 2"}, {id:3, name: "Task 3"}, {id:4, name: "Task 4"}];
 
jobs.forEach(job => {
 
    var validator = {
        set: function(obj, prop, value) {
 
          console.log("Job " + obj.id + ": " + prop + " was changed to " + value);
          console.log();
 
          obj[prop] = value;
          return true;
        },
 
        get: function(obj, prop){
 
            return obj[prop];
        }
    };
 
    var p_job = new Proxy(job, validator);
    p_jobs.push(p_job);
});
 
chart.jobs = p_jobs;

چشم انداز

نمودار گانت نمونه ای است که نشان می دهد چگونه می توانید از فناوری های Web Components ، CSS Grid و JavaScript Proxy برای توسعه عنصر سفارشی HTML با رابط گرافیکی تا حدودی پیچیده تر. از توسعه بیشتر پروژه و/یا استفاده از آن در پروژه های خود همراه با سایر چارچوب های جاوا اسکریپت استقبال می کنید.

مجدداً می توانید همه فایل های نمونه و دستورالعمل ها را در بالای مقاله بیابید.

سرمقاله سر و صدا(vf ، yk ، he)

Read More

آیکون های منبع باز رایگان-مجله سر و صدا

خلاصه سریع

بودجه پروژه شما محدود است؟ ما برخی از نمادهای فوق العاده و رایگان را جمع آوری کرده ایم که اخیراً کشف کرده ایم و قطعاً به طراحی شما تأثیر نهایی می بخشد. ما همچنین به تازگی افزونه های Figma ، ژنراتورهای SVG ، اجزای قابل دسترسی در قسمت جلو و صفحات دیگ بخار جلو را پوشش داده ایم-شاید آنها را نیز مفید بدانید.

باور نکردنی است که مردم از سراسر جهان تمام تلاش خود را انجام دهند عشق و ساعتهای زیاد به چیزی که سپس به صورت رایگان منتشر می کنند ، تا همه از آن استفاده کنند. آنها به پروژه هایی با بودجه محدود کمک می کنند ، بدون اینکه در عوض چیزی بخواهند – و البته ، آنها هرگز از الهام بخشیدن دست نمی کشند.

در این پست ، ما برخی از این فوق العاده ها را جشن می گیریم رایگان که اخیراً با آن روبرو شدیم همه اینها آیکون ها ، تصاویر ، آواتارها و انیمیشن های رایگان مجوزهای کمی متفاوت دارند (بنابراین لطفاً آنها را بررسی کنید) ، اما استفاده از آنها در کارهای خصوصی و تجاری رایگان است. اما البته ، اعتبار همیشه بسیار قدردانی می شود.

اگر به چیزهای بیشتری مانند این علاقه دارید ، لطفاً به خبرنامه ایمیل دوست داشتنی ما نگاهی بیندازید تا بتوانید نکاتی مانند این را مستقیماً در صندوق ورودی خود دریافت کنید.

نمادهای پرچم منبع باز

نمادها یک راه فوق العاده برای کمک به انتقال معنا و افزودن شخصیت به یک طرح هستند. مجموعه ای از نمادها که در پروژه های تجارت الکترونیک بسیار مفید است ، بسیار مفید است کوله پشتیبه شامل بیش از 250 آیکون پرچم منبع باز – از آندورا به زیمبابوه

نمادهای پرچم

کوله پشتی دارای بیش از 250 آیکون پرچم منبع باز (پیش نمایش بزرگ)

نمادهای Flagpack برای اندازه های کوچک بهینه شده اند که آنها را برای همه نیازهای UI شما مناسب می کند. با آنها می آیند چندین سبک از پیش تعریف شده در صورت تمایل می توانید ظاهر مورد نظر خود را سفارشی کنید. دو نسخه در دسترس است: طراحان می توانند از Flagpack در Figma و Sketch استفاده کنند ، توسعه دهندگان می توانند آن را مستقیماً در پروژه کد خود نصب کنند (React ، Vue و Svelte پشتیبانی می شوند). خوب!

آواتارهای خسته کننده و تصاویر پوچ

آیا برای پروژه خود به آواتارهای مبتنی بر SVG نیاز دارید؟ آواتارهای خسته کننده شما را تحت پوشش قرار داده است اما اجازه ندهید نام شما را فریب دهد: آواتارها چیزی جز خسته کننده نیستند.

کتابخانه کوچک React تولید می کند آواتارهای سفارشی ، مبتنی بر SVG ، گرد از هر نام کاربری و پالت رنگ. شش سبک مختلف در دسترس است ، الگوهای انتزاعی درست مانند شکلک های دوستانه. شما می توانید یک پالت رنگی تصادفی انتخاب کنید یا خود را از ابتدا ایجاد کنید تا آواتارها را به طرح خود بسازید. جزئیات کوچک دوستانه

تصاویر بی معنی

این تصاویر بی معنی مجموعه موظف است به هر پروژه یک پیچ و تاب سرگرم کننده بدهد. (پیش نمایش بزرگ)

یکی دیگر از منابع فوق العاده با نامی که ممکن است شما را برای یک لحظه گیج کند ، عبارتند از: تصاویر بی معنی که دیانا والانو ایجاد کرد. مجموعه ای از تصاویر او ترکیب پوچی و a حس عمیق کودکانه و ساده لوحانه است که هر کاربر را در سفری منحصر به فرد از طریق تخیل خود سوق دهد. جشن زیبایی از ناقصی که گاهی در این دوران دیجیتالی از دست می دهیم ، پوچی که ، خوب ، منطقی است.

نمادهای سلامت منبع باز

وقتی مردم از سراسر جهان دیدگاه یکسانی دارند و در یک هدف مشترک با هم کار می کنند ، اتفاقات بزرگی می تواند رخ دهد. مواردی مانند نمادهای سلامتی پروژه این پروژه یک تلاش داوطلبانه برای ایجاد “کالای جهانی” برای پروژه های بهداشتی در سراسر جهان است. شامل بیش از 870 نماد در دامنه عمومی که می تواند بصورت رایگان در هر نوع پروژه ای مورد استفاده قرار گیرد.

نمادهای سلامتی

نمادهای سلامتی شامل 870 نماد با هر چیزی که یک پروژه مرتبط با سلامت می تواند درخواست کند. (پیش نمایش بزرگ)

گروه های خونی ، اعضای بدن و اندام ها ، تشخیص ، داروها ، وسایل پزشکی ، وسایل نقلیه و افراد – مجموعه شامل مجموعه می باشد همه چیز مربوط به سلامتی احتمالاً می توانید درخواست کنید هر نماد در سه سبک مختلف (طرح بندی شده ، پر شده ، منفی) ارائه می شود و در قالب های SVG و PNG در دسترس است. همچنین یک افزونه Figma وجود دارد که به راحتی می توانید نمادها را پیدا کرده و در طراحی خود قرار دهید.

نمادهای علوم زندگی منبع باز

واکسن ها ، ویروس ها ، ژنتیک ، فیزیولوژی ، بیوانفورماتیک. اینها تنها برخی از موضوعاتی است که جذاب است بیونیکون ها مجموعه ای که سیمون دور جلد ایجاد کرد. در کل ، پیدا خواهید کرد 1700 تصویر منبع علوم باز منبع باز در مجموعه – البته به راحتی قابل جستجو و فیلتر است.

بیونیکون ها

بیونیکون ها کتابخانه ای از تصاویر علمی برای زیست شناسی و شیمی است. (پیش نمایش بزرگ)

این سایت از دو حالت پشتیبانی می کند: می توانید نمادها را به صورت SVG در کلیپ بورد کپی کرده و مستقیماً در Illustrator جایگذاری کنید تا رنگ ها تغییر کرده یا قسمت ها حذف شوند. از طرف دیگر ، می توانید SVG را بارگیری کنید تا از آن در وب ، نرم افزارهای گرافیکی و حتی محصولات Microsoft Office استفاده کنید. یک مجموعه ای مانند دائرclالمعارف – اگر آنچه را که در آنجا جستجو می کنید پیدا نکنید ، احتمالاً هیچ جا آن را پیدا نخواهید کرد.

نمادها و CSS با موضوع آب و هوا

222 نماد با موضوع آب و هوا، کامل با 28 مرحله ماه ، مقیاس نیروی باد بوفورت و هشدارهای باد دریایی – این چیزی است که شما به صورت رایگان دریافت خواهید کرد نمادهای آب و هوا مجموعه ای که اریک گلز ایجاد کرده است.

نمادهای آب و هوا

تکمیل شده برای همه آب و هوا تنظیم شده استبه (پیش نمایش بزرگ)

می توانید آیکون ها را مستقیماً از سایت در برنامه طراحی دلخواه خود کپی و جایگذاری کنید. CSS سبک سازی را آسان می کند و آیکون ها را سفارشی کنید درست مانند کاری که با متن انجام می دهید ، بنابراین با خیال راحت رنگ آنها را تغییر دهید ، سایه اضافه کنید یا مقیاس بگذارید ، بچرخانید یا آنها را بچرخانید تا آیکون ها به زیبایی در طرح شما جا بیفتند. به هر حال ، در صورت نیاز به کلاسهای API آب و هوایی محبوب نیز پشتیبانی می شود.

بیشتر بعد از پرش! ادامه مطلب را در زیر بخوانید

نمادهای تابستانی و گردشگری

کباب کردن ، سفر به ساحل ، گشت و گذار در یک شهر جدید – تابستان زمان ایجاد خاطرات است. برای آوردن برخی از احساس تابستان در پروژه های خود ، ممکن است بخواهید نگاهی به پروژه بیندازید زمان تابستان و گردشگری مجموعه نمادهایی که افراد در Design Zone برای بارگیری رایگان ارائه می دهند. هر مجموعه شامل 20 نماد بردار (در نسخه های رنگی و خطی) است و در قالب های AI ، EPS و PNG ارائه می شود. می توانید از نمادها برای پروژه های شخصی و تجاری استفاده کنید. تابستان شاد!

نمادهای گردشگری

نمادهای گردشگری برای رفع برخی از احساسات تعطیلات (پیش نمایش بزرگ)

تصاویر مسطح با شخصیت

دیگر وب سایت های تجاری خسته کننده نیست! این تصاویر تخت مجموعه ای که Getillustrations.com ارائه می دهد مجبور است شخصیتی به پروژه شما اضافه کند. ویژگی دارد ترکیبات رایگان برای مشاغل ، فروشگاه های آنلاین و بازاریابی. شخصیت ها در ژست ها و صحنه های مختلف ، رنگارنگ ، آرام و دوستانه.

تصاویر تخت

این تصاویر تخت مجموعه پر از شخصیت است (پیش نمایش بزرگ)

این سایت دارای مجموعه های رایگان دائماً در حال تغییر است (پیوند مورد نیاز است) ، و همچنین نسخه های تجاری دارای بردارهای قابل تنظیم برای Figma ، Sketch ، Ai ، SVG ، AdobeXD و Iconjar هستند. احساس خوب تضمین شده است!

دنیایی از نمادهای منبع باز

آنچه که به عنوان یک پروژه ترم توسط دانشجویان طراحی و ارتباطات آغاز شد ، به یک کتابخانه ایموجی و نماد منبع باز تبدیل شده است: OpenMojiبه تقریبا 4000 آیکون با دقت طراحی شده است و برای پروژه مورد بررسی قرار گرفت ، از UX و ایموجی های با مضمون فناوری گرفته تا حیوانات ، طبیعت ، غذا ، افراد ، فعالیتها ، مکانها و موارد دیگر. نمادها در قالب های رنگی و همچنین طرح بندی شده در قالب های SVG و PNG در دسترس هستند.

اپنموجی

4000 نماد دوستانه را تشکیل می دهند OpenMojiبه (پیش نمایش بزرگ)

گرادیانهای مش دست ساز

شیب های زیبا؟ بله لطفا! اگر وقت ندارید آنها را خودتان بسازید یا به دنبال الهام تازه ای هستید ، الهام از ژن ماریوشنکو مجموعه ای از شیب های مش با دست مطمئناً شما را تحت پوشش قرار داده است

گرادیان های مش

100 زیبا ، شیب های مش ساخته شده با دست، بنابراین لازم نیست خودتان آنها را ایجاد کنید. (پیش نمایش بزرگ)

ژن از آنچه در اینترنت پیدا کرد ناراضی بود ، ایجاد کرد 100 شیب این باعث می شود سایت شما بدون صدای بلند برجسته شود. گرادیان ها را می توان به صورت JPEG به صورت رایگان بارگیری کرد. CSS و SVG بعداً اضافه می شوند. لذت بردن!

Peeps را باز کنید

584،688 ترکیب ممکن. این تعداد شخصیت های مختلفی است که می توانید با کتابخانه تصویرسازی پابلو استنلی ایجاد کنید Peeps را باز کنیدبه

Peeps را باز کنید

تصاویر شخصیتی که چیزی غیر از معمولی ندارند – این است Peeps را باز کنیدبه (پیش نمایش بزرگ)

Open Peeps به شما امکان می دهد تا عناصر بردار مختلف را برای ایجاد ترکیب کرده و مطابقت دهید شخصیت های متنوع: لباس و مدل مو را ترکیب کنید ، احساسات را با حالات چهره تغییر دهید ، صحنه را با حالت های مختلف تنظیم کنید – امکانات بی پایان است. و اگر عجله دارید ، پابلو چند Peeps آماده بارگیری را نیز آماده کرد که می توانید بلافاصله از آنها استفاده کنید. یک راه عالی برای افزودن جلوه ای دست ساز به طرح شما.

تصاویر وکتور رایگان

گاوی ربوده شده توسط بیگانگان ، یک بستنی مخروطی افتاده با چهره ای غمگین ، هیولای لوخنس از آب بیرون می آید. اینها برخی از انیمیشن های حالت خطا سرگرم کننده هستند که افراد Pixel True Studios در مجموعه خود برای بارگیری رایگان ارائه می دهند. تصاویر و تصاویر متحرکبه

تصاویر وکتور رایگان

این 500+ تصویر و انیمیشن در این مجموعه به صورت هفتگی به روز می شود. (پیش نمایش بزرگ)

جدا از انیمیشن های حالت خطا ، مجموعه شامل بیش از 500 تصویر ، نماد و انیمیشن برای به تصویر کشیدن همه چیز که یک پروژه وب می تواند به آن نیاز داشته باشد: پس زمینه ، ایموجی ، آواتار و موارد دیگر. تصاویر در SVG ، PNG ، AI ، Sketch و Figma موجود است ، انیمیشن ها با Lottie ساخته شده اند. یک راه عالی برای افزودن یک ظاهر سرگرم کننده و دوستانه به یک طرح.

متشکرم!

یک تشکر بزرگ از ذهن های خلاق که این رایگان ها را طراحی کرده اند-و البته از همه کسانی که به یک معنا به جامعه باز می گردند. وب بدون شما یکسان نخواهد بود ️

Read More

کارگاه های جدید Smashing در Front-End & Design-مجله Smashing

خلاصه سریع

چگونه می توانیم یک سیستم طراحی موفق و ضد گلوله بسازیم و ایجاد کنیم؟ وضعیت ایمیل ایمیل چگونه است؟ و الگوهای جدید طراحی هوشمند رابط کاربری که می توانیم استفاده کنیم چیست؟ بیایید دریابیم. با ما کارگاه های آنلاین کاملا جدید در جلو و طراحی-برای کمک به همه ما برای تقویت مهارت های آنلاین.

شاید شما آن را از قبل می دانید ، اما شاید هنوز نه: ما مرتباً می دویم کارگاه های آنلاین دوستانه دور و بر جلو و طراحیبه ما چند کارگاه داریم که به زودی برگزار می شود ، و ما فکر کردیم که می دانید ، ممکن است شما نیز بخواهید به آن بپیوندید. تمام جلسات کارگاه ها به صورت تفکیک شده است بخش های 2.5 ساعت در طول روز ، بنابراین همیشه وقت دارید تا س questionsالات خود را مطرح کنید ، صفحه نمایش خود را به اشتراک بگذارید و بازخورد فوری دریافت کنید.

یک گربه دوست داشتنی Smashing به عنوان کاپیتان ، که در اقیانوس قایقرانی می کند.
ملاقات سر و صدا کارگاه های آنلاین: جلسات زنده و تعاملی در frontend و UX.

بحث های زنده و تمرینات تعاملی در قلب هر کارگاه قرار دارد ، با کار گروهی ، تکالیف ، بررسی و تعامل زنده با مردم سراسر جهان. به علاوه ، شما همه را دریافت می کنید ضبط های ویدئویی در تمام جلسات ، بنابراین می توانید در هر زمان ، روی صندلی راحت خود در محیط کار ، دوباره تماشا کنید.

کارگاه های زنده آینده (اوت – اکتبر 2021)

کارگاه ها چگونه هستند؟

تجربه می کنید؟ بزرگنمایی خستگی همچنین؟ به هر حال ، چه کسی واقعاً می خواهد زمان بیشتری را جلوی صفحه نمایش خود بگذارد؟ دقیقاً به همین دلیل است که ما تجربه کارگاه آنلاین را از ابتدا طراحی کرده ایم و زمان لازم برای در نظر گرفتن تمام مطالب ، درک آن و زمان کافی برای پرسیدن را در نظر گرفته ایم. فقط سوالات درست

گروهی از گربه های دوستانه ، البته در مورد frontend و UX به صورت آنلاین بحث می کنند.
که در کارگاه های ما، همه فقط یک مستطیل کمی تار روی صفحه هستند. همه برابر هستند و از آنها دعوت می شود تا شرکت کنند.

کارگاه های آنلاین ما برگزار می شود زنده و دهانه چند روز در طول هفته آنها به جلسات 2.5 ساعته تقسیم می شوند و در هر جلسه همیشه زمان کافی برای طرح سوالات شما یا صرف یک فنجان چای وجود دارد. ما در محتوا عجله نمی کنیم ، بلکه در عوض سعی می کنیم محیطی خوشامد ، دوستانه و فراگیر ایجاد کنیم تا همه بتوانند زمان اندیشیدن ، بحث و دریافت بازخورد را داشته باشند.

چیزهای زیادی از کارگاه Smashing قابل انتظار است ، اما مهمترین آنها تمرکز بر روی است نمونه های کاربردی و تکنیک ها کارگاهها گفتگو نیستند ؛ آن ها هستند در ارتباط بودن، با گفتگوهای زنده با شرکت کنندگان ، گاهی اوقات با چالش ها ، تکالیف خانه و کار تیمی.

البته ، همه مواد کارگاه را دریافت می کنید و ضبط های ویدئویی همچنین ، اگر جلسه ای را از دست دادید ، می توانید همان روز آن را دوباره تماشا کنید.

یک شرکت کننده خوشحال در کارگاه
با ما ملاقات کنید کارگاه های آموزشی دوستانه و UXبه مهارت های خود را بصورت آنلاین تقویت کنید و از متخصصان یاد بگیرید – به صورت زنده.

TL ؛ DR

  • گستره کارگاه ها چند روز، تقسیم شدن جلسات 2.5 ساعتبه
  • زمان کافی برای پرسش و پاسخ زنده هر روز.
  • ده ها تن از نمونه های کاربردی و تکنیک ها
  • تمام مواد و ضبط های کارگاه را دریافت خواهید کرد.
  • همه کارگاه ها بر روی frontend و UX متمرکز شده اند.
  • یک بسته کارگاهی تهیه کنید و 250 دلار صرفه جویی کنید خارج از قیمت

متشکرم!

ما امیدواریم که بینش از کارگاه ها به شما در ارتقای مهارت ها و کیفیت کار کمک می کند. یک مخلص متشکرم برای حمایت ، مهربانی و سخاوت شما – برای بودن درهم شکستن، اکنون و همیشه مفتخریم که از شما استقبال می کنیم.

سرمقاله سر و صدا(او ، vf)

Read More