دیگر به initial-scale نیازی ندارید
احتمالاً در جایی از کدهای رابط کاربریتان، عبارت
اما نکته اینجاست که میتوانید
پس میتوانیم چند بایت از حجم کد را هم صرفهجویی کنیم.
🔗https://quirksmode.org/quirksblog/2026/0902-initial.html
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript`
احتمالاً در جایی از کدهای رابط کاربریتان، عبارت
<meta name="viewport" content="width=device-width,initial-scale=1"> وجود دارد. تقریباً همه این مورد را دارند؛ چون Emmet آن را بهصورت خودکار اضافه میکند و قالبهای مختلف Bootstrap هم همین کار را انجام میدهند.اما نکته اینجاست که میتوانید
initial-scale را حذف کنید. این ویژگی در گذشته لازم بود تا چرخاندن صفحه در آیفون رفتاری مشابه سایر گوشیهای هوشمند داشته باشد. اما اپل مدتهاست این ناسازگاری را برطرف کرده است.پس میتوانیم چند بایت از حجم کد را هم صرفهجویی کنیم.
🔗https://quirksmode.org/quirksblog/2026/0902-initial.html
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript`
quirksmode.org
initial-scale no longer needed
Fifteen years ago I helped popularise the meta viewport width=device-width,initial-scale=1. Today I found out the second bit is no longer necessary. A retrospective.
👍3
TanStack کتابخانهٔ Hotkeys را منتشر کرده است؛ کتابخانهای برای مدیریت میانبرهای صفحهکلید.
بله، مدتهاست کتابخانههایی مثل
اما در TanStack Hotkeys همهٔ این قابلیتها از ابتدا بهعنوان بخشی از یک سیستم فرمان واحد در نظر گرفته شدهاند.
اسکوپ ها, توالی کلیدها، تشخیص نگهداشتن کلید، رویداد
تقریباً همهٔ این قابلیتها را میشد پیش از این، هرکدام در جایی پیدا کرد. سؤال این است که برای اینکه همهٔ این امکانات را یکجا داشته باشید، چند کتابخانه و چه مقدار کد اختصاصی باید در اطراف یک
آه، بله؛ طبیعتاً Framework-agnostic هم هست.
فعلاً در مرحلهٔ Alpha است، اما بد نیست مستنداتش را بخوانید؛ دستکم برای اینکه ببینید مدیریت میانبرهای صفحهکلید در عمل چه تعداد جزئیات و ظرافت دارد.
🔗https://tanstack.com/hotkeys/latest
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript`
بله، مدتهاست کتابخانههایی مثل
react-hotkeys-hook، hotkeys-js و Mousetrap وجود دارند و بعضی از آنها قابلیتهایی مثل scope، ref، sequence و ضبط ماکرو را هم ارائه میکنند.اما در TanStack Hotkeys همهٔ این قابلیتها از ابتدا بهعنوان بخشی از یک سیستم فرمان واحد در نظر گرفته شدهاند.
اسکوپ ها, توالی کلیدها، تشخیص نگهداشتن کلید، رویداد
keyup، تغییر مجدد میانبرها (rebinding)، مدیریت تداخل میانبرها، استفاده از Mod برای پشتیبانی از Ctrl/Cmd، نمایش ترکیب کلیدها متناسب با پلتفرم، کار با عناصر قابل ویرایش و حتی DevTools.تقریباً همهٔ این قابلیتها را میشد پیش از این، هرکدام در جایی پیدا کرد. سؤال این است که برای اینکه همهٔ این امکانات را یکجا داشته باشید، چند کتابخانه و چه مقدار کد اختصاصی باید در اطراف یک
keydown ساده جمع میکردید.آه، بله؛ طبیعتاً Framework-agnostic هم هست.
فعلاً در مرحلهٔ Alpha است، اما بد نیست مستنداتش را بخوانید؛ دستکم برای اینکه ببینید مدیریت میانبرهای صفحهکلید در عمل چه تعداد جزئیات و ظرافت دارد.
🔗https://tanstack.com/hotkeys/latest
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript`
TanStack
TanStack Hotkeys
A type-safe, cross-platform hotkey library with sequence detection, key state tracking, hotkey recording, and framework adapters for React and more.
👍2
🤩 tinyjs: ساخت برنامههای دسکتاپ جاوااسکریپتی با حجمی کمتر از ده مگابایت
با استفاده از این ابزار یک برنامه ساختم و واقعاً تحت تأثیر قرار گرفتم. در اختیار شما یک بکاند مبتنی بر txiki.js با دسترسی کامل به سیستم، از جمله FFI (برنامه میتواند به قابلیتهای سطح پایین سیستمعامل هم دسترسی داشته باشد)، قرار میگیرد؛ در کنار آن، رندرینگ WebView بهصورت بومی و نسخههای بسیار کمحجم برای macOS، Linux و Windows ارائه میشود. حتی فرایند امضای دیجیتال و نوتاریز کردن (مثلاً وقتی یک برنامه برای macOS میسازی، اپل قبل از توزیع عمومی آن میتواند برنامه را بررسی کند تا مشخص شود حاوی بدافزار یا موارد مخرب شناختهشده نیست. اگر تأیید شود، اپل آن را Notarize میکند.) نسخه نهایی برنامه نیز بهسادگی انجام میشود.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
با استفاده از این ابزار یک برنامه ساختم و واقعاً تحت تأثیر قرار گرفتم. در اختیار شما یک بکاند مبتنی بر txiki.js با دسترسی کامل به سیستم، از جمله FFI (برنامه میتواند به قابلیتهای سطح پایین سیستمعامل هم دسترسی داشته باشد)، قرار میگیرد؛ در کنار آن، رندرینگ WebView بهصورت بومی و نسخههای بسیار کمحجم برای macOS، Linux و Windows ارائه میشود. حتی فرایند امضای دیجیتال و نوتاریز کردن (مثلاً وقتی یک برنامه برای macOS میسازی، اپل قبل از توزیع عمومی آن میتواند برنامه را بررسی کند تا مشخص شود حاوی بدافزار یا موارد مخرب شناختهشده نیست. اگر تأیید شود، اپل آن را Notarize میکند.) نسخه نهایی برنامه نیز بهسادگی انجام میشود.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
❤2
پیشنمایش تصاویر
در برخی وبسایتها که لازم است تصاویر با کیفیت بالا نمایش داده شوند، برای بهبود تجربه کاربری از تصاویر جایگزین کمکیفیت استفاده میشود. این تصاویر تا زمانی که نسخه اصلی در حال بارگذاری است، دیدی کلی از برخی جزئیات و رنگهای تصویر اصلی به کاربر میدهند.
این تکنیک با نام LQIP یا Low Quality Image Placeholder نیز شناخته میشود و روشهای مختلفی برای پیادهسازی آن وجود دارد؛ حتی با استفاده از CSS. بااینحال، روش رایجتر این است که یک تصویر از پیش آمادهشده را بهصورت پسزمینه و در قالب Data URL مبتنی بر Base64 در صفحه قرار دهیم.
در نتیجه، کاربر بلافاصله یک تصویر محوشده میبیند که نمایی کلی از تصویر اصلی ارائه میدهد؛ در همین زمان، نسخه باکیفیت تصویر در پسزمینه در حال بارگذاری است. پس از بارگذاری نسخه اصلی، محتوای
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
در برخی وبسایتها که لازم است تصاویر با کیفیت بالا نمایش داده شوند، برای بهبود تجربه کاربری از تصاویر جایگزین کمکیفیت استفاده میشود. این تصاویر تا زمانی که نسخه اصلی در حال بارگذاری است، دیدی کلی از برخی جزئیات و رنگهای تصویر اصلی به کاربر میدهند.
این تکنیک با نام LQIP یا Low Quality Image Placeholder نیز شناخته میشود و روشهای مختلفی برای پیادهسازی آن وجود دارد؛ حتی با استفاده از CSS. بااینحال، روش رایجتر این است که یک تصویر از پیش آمادهشده را بهصورت پسزمینه و در قالب Data URL مبتنی بر Base64 در صفحه قرار دهیم.
<img
src="high-quality.webp"
style="background-image: url(
data:image/png;base64,...
)"
width="..."
height="..."
alt="..."
>
<img> یک عنصر جایگزینشونده (replaced element) است. هنگام بارگذاری تصویری که در src مشخص شده، این عنصر عملاً مانند یک محفظه معمولی است که میتوان برای آن در CSS پسزمینه تعیین کرد. تصویر کوچک و محوشده نیز بهصورت Base64 در HTML قرار میگیرد تا برای نمایش آن نیازی به یک درخواست شبکه جداگانه نباشد.در نتیجه، کاربر بلافاصله یک تصویر محوشده میبیند که نمایی کلی از تصویر اصلی ارائه میدهد؛ در همین زمان، نسخه باکیفیت تصویر در پسزمینه در حال بارگذاری است. پس از بارگذاری نسخه اصلی، محتوای
<img> با آن جایگزین میشود و پسزمینه دیگر کاربردی نخواهد داشت.#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
❤2
This media is not supported in your browser
VIEW IN TELEGRAM
یکی پیدا بشه جلوی این دیوانگی رو بگیره! 😄
یک کتابخانه دیگه برای هایلایت سینتکس — twinkleplop. باز هم رکوردهای سرعت و حجم شکسته شده! باز هم API بهتر و بهینهتر شده.
🔗https://twinkleplop.pngwn.at/
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
یک کتابخانه دیگه برای هایلایت سینتکس — twinkleplop. باز هم رکوردهای سرعت و حجم شکسته شده! باز هم API بهتر و بهینهتر شده.
🔗https://twinkleplop.pngwn.at/
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
نکتهای درباره CSS
تابع
این تابع بسته به اینکه کدامیک، یعنی رنگ سیاه یا سفید، کنتراست بیشتری با پسزمینه ایجاد کند، یکی از این دو رنگ را برمیگرداند.
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
تابع
contrast-color() به مرورگر اجازه میدهد رنگ متن مناسب برای دکمه را بهصورت خودکار انتخاب کند..button {
--bg: hsl(55 88% 52%);
background: var(--bg);
color: contrast-color(var(--bg));
}این تابع بسته به اینکه کدامیک، یعنی رنگ سیاه یا سفید، کنتراست بیشتری با پسزمینه ایجاد کند، یکی از این دو رنگ را برمیگرداند.
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
❤2👍1
Node.js بیستوشش ممیز ده — پشتیبانی بومی از
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
throttle و debounce#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
This media is not supported in your browser
VIEW IN TELEGRAM
استفاده از border-radius به این شکل:
وقتی یک عنصر کل صفحه را اشغال میکند، گرد کردن گوشهها به طور خودکار حذف میشود.
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
border-radius: calc(sign(100lvw - 100%) * 40px).
وقتی یک عنصر کل صفحه را اشغال میکند، گرد کردن گوشهها به طور خودکار حذف میشود.
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
❤3
Chrome ۱۵۴ — تغییر اندازهٔ تطبیقی
از این به بعد
مگر نه اینکه سازندگان ویجتها و افزونهها سالها منتظر چنین قابلیتی بودند؟ 😆
دیگر نیازی نیست برای این کار از
https://bram.us/2026/09/23/responsive-iframes/
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
iframeاز این به بعد
<iframe> میتواند اندازهٔ خودش را متناسب با ابعاد سندی که داخل آن نمایش داده میشود، تغییر دهد.مگر نه اینکه سازندگان ویجتها و افزونهها سالها منتظر چنین قابلیتی بودند؟ 😆
دیگر نیازی نیست برای این کار از
postMessage({resize}) استفاده شود.https://bram.us/2026/09/23/responsive-iframes/
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
دنبال یک کامپوننت برای نمایش ساعت شهرهای مختلف جهان بودم که به این اسلایدر World Clock از Jon Kantner برخوردم.
سادگی، تعامل روان و طراحی بصری جذاب آن باعث شده کامپوننتی بسیار دلنشین و قابلفهم باشد؛ طوری که تقریباً در همان نگاه اول میتوان نحوهٔ کار با آن را متوجه شد.
قطعاً منبع الهام خیلی خوبی است. :)
https://codepen.io/jkantner/pen/pvjNNVz
#️⃣#code
👥@IR_javascript_group
🆔@IR_javascript
سادگی، تعامل روان و طراحی بصری جذاب آن باعث شده کامپوننتی بسیار دلنشین و قابلفهم باشد؛ طوری که تقریباً در همان نگاه اول میتوان نحوهٔ کار با آن را متوجه شد.
قطعاً منبع الهام خیلی خوبی است. :)
https://codepen.io/jkantner/pen/pvjNNVz
#️⃣#code
👥@IR_javascript_group
🆔@IR_javascript
This media is not supported in your browser
VIEW IN TELEGRAM
برش متن برای یک خط
وقتی میخواهیم متن فقط در یک خط نمایش داده شود، میتوانیم ویژگی
برای برش متن میتوان از ویژگیهای زیر استفاده کرد:
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
وقتی میخواهیم متن فقط در یک خط نمایش داده شود، میتوانیم ویژگی
white-space را روی مقدار nowrap تنظیم کنیم. اگر متن طولانی باشد و عرض کانتینر، مثلاً، سیصد پیکسل باشد، متن همچنان در یک خط باقی میماند، اما از محدودهٔ کانتینر خارج میشود.برای برش متن میتوان از ویژگیهای زیر استفاده کرد:
.truncated-text {
width: 300px;
overflow: hidden; /* هر چیزی را که از محدودهٔ کانتینر خارج شود، مخفی میکند */
text-overflow: ellipsis; /* متن مخفیشده را با سهنقطه جایگزین میکند */
white-space: nowrap; /* متن را در یک خط نگه میدارد */
}#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
HTML یک وظیفهٔ دیگر را هم از JavaScript گرفت
ویژگیهای
قبلاً برای باز کردن یک پنجرهٔ گفتوگو باید از
حالا میتوان این کار را به شکل زیر انجام داد:
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
ویژگیهای
command و commandfor از دسامبر سال دو هزار و بیستوپنج وارد Baseline شدهاند.قبلاً برای باز کردن یک پنجرهٔ گفتوگو باید از
addEventListener + showModal() استفاده میکردیم.حالا میتوان این کار را به شکل زیر انجام داد:
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
🔐 از localStorage به HttpOnly Cookie؛ معماری احراز هویت در SPA چطور عوض میشود
بیشتر SPAها JWT را در localStorage نگه میدارند و در هر درخواست به هدر Authorization اضافه میکنند. ساده است، ولی این روش دیگر «بهترین روش» نیست.
مشکل کجاست؟
هر کد JavaScript که در صفحه اجرا شود، از جمله کدی که از طریق XSS تزریق شده، میتواند با
راهحل: HttpOnly Cookie
سرور نشست را میسازد و با
📎 ترجمه کامل این مقاله در بخش نظرات موجود است.
🔗https://habr.com/ru/companies/gnivc/articles/1082540/
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
بیشتر SPAها JWT را در localStorage نگه میدارند و در هر درخواست به هدر Authorization اضافه میکنند. ساده است، ولی این روش دیگر «بهترین روش» نیست.
مشکل کجاست؟
هر کد JavaScript که در صفحه اجرا شود، از جمله کدی که از طریق XSS تزریق شده، میتواند با
localStorage.getItem() توکن را بردارد و به سرور خودش بفرستد. علاوه بر این، فرانتاند مجبور است ذخیره، تمدید و ارسال توکن را هم خودش مدیریت کند، در حالی که مرورگر برای این کار سازوکار داخلی دارد.راهحل: HttpOnly Cookie
سرور نشست را میسازد و با
Set-Cookie به مرورگر میدهد. مرورگر خودش کوکی را نگه میدارد و با هر درخواست مناسب میفرستد و JavaScript اصلاً به آن دسترسی ندارد. نکته مهم این است که HttpOnly جلوی خود XSS را نمیگیرد، فقط اجازه نمیدهد اعتبارنامه خوانده و به بیرون منتقل شود.📎 ترجمه کامل این مقاله در بخش نظرات موجود است.
🔗https://habr.com/ru/companies/gnivc/articles/1082540/
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
❤1👍1
This media is not supported in your browser
VIEW IN TELEGRAM
این پکیج با دستور
قابلیتهای بسیار متنوعی به آن اضافه شده است: بردارها، ماتریسها و کواترنیونها، هندسهٔ دوبعدی و سهبعدی، ریکست و فرستوم، مثلثبندی و Quickhull، توابع Easing و Spring، اعداد تصادفی Seedشده، چندین نوع Noise، رنگها و سینماتیک معکوس.
رابط برنامهنویسی کاربردی (API) با تمرکز بر کارایی طراحی شده است. توابع نتیجه را در
علاوه بر این، همهچیز به نقاط ورود جداگانه تقسیم شده و بهدرستی Tree-shaking میشود.
بنابراین میتوان از
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
npm i math نصب میشودقابلیتهای بسیار متنوعی به آن اضافه شده است: بردارها، ماتریسها و کواترنیونها، هندسهٔ دوبعدی و سهبعدی، ریکست و فرستوم، مثلثبندی و Quickhull، توابع Easing و Spring، اعداد تصادفی Seedشده، چندین نوع Noise، رنگها و سینماتیک معکوس.
رابط برنامهنویسی کاربردی (API) با تمرکز بر کارایی طراحی شده است. توابع نتیجه را در
out که از قبل به آنها داده شده مینویسند و در هر فراخوانی شیء جدیدی ایجاد نمیکنند؛ دادهها نیز بهصورت آرایههای معمولی باقی میمانند و قالب آرگومانها و مقادیر بازگشتی یکدست است.علاوه بر این، همهچیز به نقاط ورود جداگانه تقسیم شده و بهدرستی Tree-shaking میشود.
بنابراین میتوان از
math در کنار WebGL، WebGPU، Wasm یا حتی رندرر اختصاصی استفاده کرد؛ خود کتابخانه هم یک دنیای شیءمحور دیگر را به پروژه تحمیل نمیکند.#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
This media is not supported in your browser
VIEW IN TELEGRAM
در macOS، بعد از کلیک روی یک گزینهٔ منو، منو بلافاصله ناپدید نمیشود. ابتدا گزینهٔ انتخابشده برای لحظهای کوتاه چشمک میزند: هایلایت آن محو میشود، دوباره برمیگردد و بعد منو بسته میشود.
به این ترتیب، سیستم فرصت پیدا میکند نشان دهد که دقیقاً کدام گزینه اجرا شده است. در وب، منو معمولاً همان لحظهٔ کلیک بسته میشود و چنین بازخوردی وجود ندارد.
در CSS، پیادهسازی این افکت ساده است:
یعنی گزینهٔ انتخابشده چشمک میزند و منو نیز همان صد و پنجاه میلیثانیه صبر میکند و بعد مخفی میشود.
حتی یک نمونهٔ CodePen هم برایش ساختهام:
https://codepen.io/editor/alinaki/pen/01a0f12b-8d69-7192-90d7-b8b7562ef482
بدون JavaScript هم میتوان این رفتار را با
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
به این ترتیب، سیستم فرصت پیدا میکند نشان دهد که دقیقاً کدام گزینه اجرا شده است. در وب، منو معمولاً همان لحظهٔ کلیک بسته میشود و چنین بازخوردی وجود ندارد.
در CSS، پیادهسازی این افکت ساده است:
.menu-item:target {
animation: blink 150ms linear;
}
.menu:has(.menu-item:target) {
animation: close 150ms step-end forwards;
}یعنی گزینهٔ انتخابشده چشمک میزند و منو نیز همان صد و پنجاه میلیثانیه صبر میکند و بعد مخفی میشود.
حتی یک نمونهٔ CodePen هم برایش ساختهام:
https://codepen.io/editor/alinaki/pen/01a0f12b-8d69-7192-90d7-b8b7562ef482
بدون JavaScript هم میتوان این رفتار را با
:target و :has() پیاده کرد؛ گزینهٔ انتخابشده در URL fragment نگه داشته میشود. برای یک نمونهٔ نمایشی کاملاً مناسب است،#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
👍2