جاوااسکریپت | JavaScript
527 subscribers
704 photos
158 videos
4 files
566 links
کانال @IR_javascript حاوی اطلاعات مفید در حوزه برنامه نویس فرانت که بصورت روزانه بروز می‌شود.
در این کانال شما به:
[1] مطالب تازه
[2] تحلیل‌های عمیق
[3] نکات آموزشی
[4] چالش
[5] ابزار و راهنمایی‌های کاربردی
دسترسی خواهید داشت.

🆔@IR_javascript
Download Telegram
نوآوری‌های CSS — کنترل حداکثری با انتخابگر :nth-child() و دستور جدید OF S

با استفاده از شبه‌کلاس `:nth-child()` می‌توان عناصر موجود در DOM را بر اساس ترتیبشان انتخاب کرد. نحوۀ کلاسیک An+B به شما امکان می‌دهد انتخاب عناصر را با دقت بالا کنترل کنید.

برای نمونه:

* :nth-child(2) — انتخاب دومین فرزند.
* :nth-child(2n) — انتخاب تمام فرزندان زوج.
* :nth-child(2n+1) — انتخاب تمام فرزندان فرد.
و غیره...

اما حالا ویژگی جدیدی در سطح چهارم انتخابگرهای CSS معرفی شده است — یعنی سینتکس OF S. این قابلیت به شما اجازه می‌دهد ابتدا عناصر را بر اساس یک فیلتر مشخص (مثلاً کلاس یا نوع خاصی از عناصر) محدود کنید، و سپس از میان همان گروه، عناصر مورد نظر را بر اساس ترتیبشان انتخاب نمایید.

ساختار کلی:

:nth-child(An+B [of S])
:nth-last-child(An+B [of S])


در سطح چهارم انتخابگرهای CSS (Selectors Level 4) که در [W3C](https://www.w3.org/TR/selectors-4/) تعریف شده است، می‌توان به‌صورت اختیاری یک فهرست از انتخابگرها را در :nth-child() یا :nth-last-child() ارسال کرد.

---

### 📘 مثال

<div class="test-1">one</div>
<div class="test-2">two</div>
<div class="test-1">three</div>
<div class="test-2">four</div>


:nth-child(2 of .test-1, .test-2) {
outline: 0.3rem dashed lightblue;
}


---

### 🔍 چگونه کار می‌کند؟

تصور کنید شبه‌کلاس :nth-child با دستور of S مانند یک فیلتر هوشمند عمل می‌کند.
ابتدا مرورگر همهٔ عناصری را که با انتخابگرهای .test-1 و .test-2 مطابقت دارند پیدا می‌کند. سپس از میان آن فهرست فیلترشده، دومین عنصر را انتخاب می‌کند و سبک (style) مورد نظر را به آن اعمال می‌کند.

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

---

با این قابلیت، دامنۀ کارهایی که می‌توان تنها با CSS انجام داد روزبه‌روز گسترده‌تر می‌شود — بدون نیاز به جاوااسکریپت! 🎨


#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
چگونه بدون استفاده از <br> در CSS شکست خط ایجاد کنیم 🧐

یک ترفند جالب وجود دارد که با استفاده از نماد \A و سبک‌هایی مثل white-space: pre-wrap می‌توان شکست خط را در CSS ایجاد کرد. بیایید بررسی کنیم چگونه این کار انجام می‌شود!

📕 نماد `\A` چیست؟

در CSS، \A راهی برای وارد کردن شکست خط در ویژگی content است که معمولاً در پیش‌عنصرها (::before و ::after) استفاده می‌شود. به جای قرار دادن دستی <br>`، کافی است `\A را بنویسیم تا مرورگر بداند در این نقطه باید خط جدید شروع شود.

با این حال، برای کارکرد صحیح این روش، لازم است ویژگی white-space را اضافه کنیم، مثلاً با مقدار pre-wrap. این ویژگی به مرورگر می‌گوید: «شکست‌های خط را مانند تگ <pre> پردازش کن، ولی همچنین اجازه بده متن در صورت نیاز به خط بعد منتقل شود.»

مثال:

.text::before {
content: "خط اول\Aخط دوم"; /* \A شکست خط ایجاد می‌کند */
white-space: pre-wrap; /* \A را به عنوان شکست خط پردازش می‌کند */
}


اینجا \A در ویژگی content شکست خط ایجاد می‌کند و white-space: pre-wrap به مرورگر کمک می‌کند این شکست را به درستی نمایش دهد.

نتیجه: این روش یک راه عالی برای تمیز نگه داشتن کد و راحت‌تر کردن مدیریت متن است.


#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
👍1
مسدود کردن dev-tool
اگر امکانش رو دارید به این سایت [+لینک] بروید و با هر روشی dev-tools رو باز کنید

پکیجی برای غیرفعال‌سازی ابزارهای توسعه‌دهنده‌ی وب از طریق دکمه‌ی F12، کلیک راست و منوی مرورگر



🔗https://theajack.github.io/disable-devtool/
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
🥰1😁1
EyeDropper API: انتخاب رنگ‌ها مستقیم از روی صفحه 🤩

هر ساله APIهای بومی جدیدی برای مرورگرها معرفی می‌شوند و یکی از این ابزارهای جالب، EyeDropper API است.

EyeDropper API به توسعه‌دهندگان وب این امکان را می‌دهد که کاربران بتوانند با استفاده از ابزار قطره‌چکان (pipette) رنگ‌ها را مستقیماً از صفحه انتخاب کنند. پس از انتخاب، مقدار رنگ به صورت sRGBHex (مثل #ff5733) بازگردانده می‌شود.

---

### نمونه ساده استفاده:

if ("EyeDropper" in window) {
const eyeDropper = new EyeDropper();
eyeDropper.open()
.then(result => {
console.log("رنگ انتخاب‌شده:", result.sRGBHex);
document.body.style.backgroundColor = result.sRGBHex;
})
.catch(err => {
console.error("خطا:", err);
});
}


---

### نحوه عملکرد 🧐

1. فراخوانی متد open() روی شیء `EyeDropper`؛
2. باز شدن ابزار قطره‌چکان در مرورگر؛
3. انتخاب رنگ توسط کاربر؛
4. بازگرداندن رنگ انتخاب‌شده در فرمت `#RRGGBB`.

---

### مزایای API

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

---

### محدودیت پشتیبانی

این API در حال حاضر فقط در Chrome، Edge و Opera پشتیبانی می‌شود. در مرورگرهای Safari و Firefox هنوز قابل استفاده نیست.


#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👍1👎1
مرتب نگه داشتن head

با یک اسکریپت جالب برخورد کردم که امکان انجام یک حسابرسی بسیار سریع و اصلاح نسبتاً سریع ترتیب تگ‌ها درون <head> را فراهم می‌کند.

یک قطعه CSS از هری رابرتز وجود دارد که ترتیب نادرست تگ‌های سیستمی را برجسته می‌کند. این فایل ct.css نام دارد [+لینک]. همچنین یک ارائه درباره این قطعه وجود دارد. هری یک متخصص فوق‌العاده در زمینه عملکرد وب است و اسلایدهای او [+لینک] بسیار متقاعدکننده هستند.

اسکریپت capo.js تقریباً همان کار را انجام می‌دهد، با این تفاوت که نتایج حسابرسی را در کنسول نمایش می‌دهد و پیشنهاد می‌کند چگونه متا تگ‌ها، نشانه‌گذاری و سایر محتوای <head> را بهتر مرتب کنیم تا مهم‌ترین اطلاعات برای بارگذاری سریع صفحه در اولویت قرار گیرند و بقیه موارد بعداً بارگذاری شوند.


#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
ترتیب عناصر در <head>

چند وقت یک‌بار به <head> پروژه‌های خود سر می‌زنید و بررسی می‌کنید که چه اتفاقی در آنجا می‌افتد؟ بهتر است این کار را به‌صورت دوره‌ای انجام دهید، زیرا محتوای <head> و ترتیب عناصر می‌تواند تأثیر منفی بر عملکرد سایت داشته باشد.

ابتدا باید از صحت ساختار اطمینان حاصل کرد. درون <head> تنها برخی عناصر مشخص مجاز هستند:

* یک عنصر <title>
* یک عنصر <base>
* صفر یا بیشتر عناصر <link>
* صفر یا بیشتر عناصر <meta>
* صفر یا بیشتر عناصر <script>
* صفر یا بیشتر عناصر <style>
* صفر یا بیشتر عناصر <template>
* صفر یا بیشتر عناصر <noscript>

اگر هر عنصر دیگری در <head> مشاهده شود، پارسر فوراً <head> را می‌بندد و عناصر باقی‌مانده را به <body> منتقل می‌کند.

مثال:

<head>
<meta charset="utf-8">
<title>سایت من</title>
<img src="pixel.png">
<link
rel="preload"
href="custom-font.woff2"
as="font"
type="font/woff2"
>
<link
rel="stylesheet"
href="styles.css"
>
<script
src="script.js"
defer
></script>
</head>
<body>
<!-- ... -->
</body>


پارسر این کد را به شکل زیر بازسازی می‌کند:

<head>
<meta charset="utf-8">
<title>سایت من</title>
</head>
<body>
<img src="pixel.png">
<link
rel="preload"
href="custom-font.woff2"
as="font"
type="font/woff2"
>
<link
rel="stylesheet"
href="styles.css"
>
<script
src="script.js"
defer
></script>
<!-- ... -->
</body>


این موضوع پیامدهای مختلفی دارد، زیرا محل و اولویت عناصر در صف بارگذاری منابع، وضعیت مسدودسازی پارسر و عملکرد اسکریپت‌هایی که به <head> وابسته‌اند، تغییر می‌کند.

عناصر غیرمجاز در <head> معمولاً هنگام ادغام «پیکسل‌ها»، فریم‌های تحلیلی و دیگر افزونه‌های جانبی ظاهر می‌شوند و معمولاً شامل <img>`، <iframe> و <div>` هستند.

دستورالعمل‌های این افزونه‌ها اغلب پیشنهاد می‌کنند که کد مربوطه در ابتدای <body> قرار گیرد، اما گاهی همراه با <script> به <head> وارد می‌شوند. استفاده از ولیدیتور HTML می‌تواند چنین خطاهایی را شناسایی کند.

منبع دیگر مشکلات، ترتیب نادرست عناصر در <head> است. جابجایی ساده عناصر به ترتیب مناسب می‌تواند زمان بارگذاری را تا چند ثانیه کاهش دهد. در این زمینه، سخنرانی بسیار خوبی توسط هری رابرتز موجود است.

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

* ct.css — فایل استایلی که عناصر <head> را قابل مشاهده می‌کند و نقاط مشکل‌دار را برجسته می‌سازد.
* capo.js — قطعه کدی که محتوای <head> را تحلیل کرده و ترتیب فعلی و مرتب‌شده را در کنسول نمایش می‌دهد.

مدیران تگ نیز توجه ویژه‌ای می‌طلبند، زیرا از طریق آن‌ها اسکریپت‌های بازاریابی مختلف به‌طور غیرقابل کنترل وارد سایت شده و <head> را شلوغ می‌کنند.


#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
Quicklink

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

🔗https://getquick.link/
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
1
This media is not supported in your browser
VIEW IN TELEGRAM
و در گوشش، با زمزمه‌ای جانکاه صحبت کرد ... .
◾️سالروز شهادت حضرت فاطمه زهرا (ص)

#️⃣#event
👥@IR_javascript_group
🆔@IR_javascript
9
qrframe

یک ابزار تولید QR کد مبتنی بر کد است که به شما امکان می‌دهد QR کدها را به‌صورت برنامه‌نویسی شده ایجاد کنید.


🔗https://github.com/zhengkyl/qrframe
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
👍1
Intl.ListFormat — قالب‌بندی لیست

«می‌داند» چگونه عناصر را به‌درستی با ویرگول، حرف ربط و/یا، کوتاه‌سازی پیوندها و غیره ترکیب کند، بسته به زبان و سبک مورد استفاده. استفاده از آن بسیار ساده است، اما آشنایی با گزینه‌ها و «چالش‌های پنهان» باعث می‌شود نتیجه نهایی تمیزتر و حرفه‌ای‌تر باشد. 😁

✔️ آرایه‌ای از مقادیر را به رشته‌ای قابل خواندن برای انسان تبدیل می‌کند و قوانین زبان را رعایت می‌کند (مثال: سیب، موز و پرتقال)؛

✔️ امکان انتخاب نوع (conjunction / disjunction / unit) و سبک (long / short / narrow) را فراهم می‌کند؛

✔️ متدهای format() (برای خروجی رشته‌ای)، formatToParts() (برای دریافت بخش‌های ساختاریافته) و resolvedOptions() (برای مشاهده گزینه‌های اعمال‌شده واقعی) را ارائه می‌دهد.

const lf = new Intl.ListFormat('fa', { type: 'conjunction', style: 'long' });

lf.format(['سیب']);
// "سیب"

lf.format(['سیب', 'موز']);
// "سیب و موز"

lf.format(['سیب', 'موز', 'پرتقال']);
// "سیب، موز و پرتقال"


new Intl.ListFormat('fa', { type: 'disjunction' })
.format(['چای', 'قهوه', 'آب‌میوه']);
// => "چای، قهوه یا آب‌میوه"


new Intl.ListFormat('en', { style: 'short' })
.format(['A', 'B', 'C']);
// => "A, B & C" (در انگلیسی short ممکن است از '&' استفاده شود)


#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👍3
واقعیتی جالب: مغز انسان قادر نیست چیزی کاملاً نو از هیچ بیافریند؛ هر ایده‌ای در واقع ترکیبی از دانسته‌ها و تجربیاتی است که پیش‌تر در ذهن وجود داشته‌اند. در نتیجه، میزان خلاقیت ما به‌طور مستقیم به کیفیت محتوایی که مصرف می‌کنیم وابسته است. اگر ورودی ذهن شما فقط شامل میم‌ها و ویدیوهای کوتاه باشد، تبریک می‌گویم — تمام ایده‌هایتان هم بی‌ارزش خواهند بود (طبق برخی پژوهش‌ها، هرچند من منبعش را نمی‌دهم).
اما اگر خوراک ذهنی‌تان مثلاً کتاب‌ها و مقالات فنی باشد، مغز شما شروع می‌کند به تولید ایده‌هایی بیشتر و عمیق‌تر برای حل مسائل فنی در کد یا پروژه‌های واقعی.

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

مغز ما نمی‌تواند به‌طور هم‌زمان اطلاعات را هم دریافت کند و هم پردازش نماید. این موضوع شبیه فرایند تغذیه است: وقتی غذا می‌خورید، باید چهار تا پنج ساعت به بدن فرصت بدهید تا غذا هضم شود؛ اگر بی‌وقفه بخورید، نتیجه‌اش تهوع یا اسهال است.
در مورد مغز هم همین است — پس از خواندن یک مقاله‌ی فنی جالب، باید به مغز فرصت «هضم» اطلاعات را بدهید. برای این کار، نباید بلافاصله ذهن را با اطلاعات تازه پر کنید.

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

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

#️⃣#discussion
👥@IR_javascript_group
🆔@IR_javascript
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
نکته‌ی CSS: از ارقام جدولی (tabular numbers) برای نمایش تایمرها استفاده کنید

ویژگی font-variant-numeric مشخص می‌کند که اعداد چگونه نمایش داده شوند. با تنظیم مقدار آن روی tabular-nums، تمام اعداد با پهنای یکسان نمایش داده می‌شوند، که باعث می‌شود کاملاً منظم و در یک خط قرار بگیرند.


#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
🔥3👍2
شعاع حاشیه منفی

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

روش‌های مختلفی برای این کار وجود دارد، از جمله ترفندهایی با استفاده از عناصر ماسک دارای موقعیت مطلق. در کل، پیاده‌سازی چنین بلوک‌هایی کار ساده‌ای نیست. اما تیم HTML Academy راه‌حلی ارائه داده است — کتابخانه‌ای به نام nebo.css (https://github.com/htmlacademy/nebo.css
).

Nebo مخفف negative border radius است، عبارتی که اغلب برای توصیف چنین افکت‌هایی به کار می‌رود. این کتابخانه یک فایل CSS با بیش از صد خط کد است که چند کلاس و مجموعه‌ای از ویژگی‌های سفارشی برای تنظیم دقیق در اختیار شما قرار می‌دهد.

#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
👏1
افزونه‌ی Save All Resources یک ابزار برای مرورگر Google Chrome است که به شما اجازه می‌دهد تمام فایل‌های یک وب‌سایت را (تقریباً هر چیزی که مرورگر برای نمایش آن سایت دانلود می‌کند) ذخیره کنید.

به زبان ساده، وقتی شما وارد یک سایت می‌شوید، مرورگر فایل‌هایی مثل HTML، CSS، JavaScript، عکس‌ها، فونت‌ها و حتی داده‌های JSON را بارگذاری می‌کند. این افزونه همه‌ی آن منابع را یکجا جمع می‌کند و به شما امکان می‌دهد با یک کلیک آن‌ها را به‌صورت فشرده (ZIP) دانلود کنید.


#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
👍1
اپل سورس‌مپ‌های نسخه‌ی وب جدید App Store را مستقیماً در محیط پروداکشن منتشر کرد، و طبیعتاً این داده‌ها به بیرون درز کردند.

بدیهی است که مخزن اصلی اکنون حذف شده است. ([https://github.com/rxliuli/apps.apple.com](https://github.com/rxliuli/apps.apple.com)) اما البته من یک نسخه‌ی پشتیبان از آن دارم، و باید گفت تماشای آن واقعاً جالب است!

همچنین کلون‌های متعددی هم به‌موقع ایجاد شدند؛ برای مثال این مخزن: ([https://github.com/minhducdz99/apps.apple.com](https://github.com/minhducdz99/apps.apple.com)).

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

خب، در سورس‌کدها چه چیز جالبی وجود دارد؟

پیش از هر چیز، پروژه با Svelte ساخته شده است. غیرمنتظره بود؟ نه چندان. اپل معمولاً فریم‌ورک‌های غیرمرسوم را ترجیح می‌دهد . اپل در زمانی که همه از Angular و Backbone استفاده می‌کردند، با SproutCore آغاز کرد و سپس به سراغ Ember.js رفت. حداقل Apple Music با آن نوشته شده بود.

در مرحله‌ی دوم، نویسندگان پروژه بدون هیچ خجالتی در کد نظر (Comment) گذاشته‌اند.
در مرحله‌ی سوم، ساختار عجیب مخزن و این‌همه کامپوننت عظیم، تجربه‌ی غریبی بود. ولی خب، هر تیمی سبک خودش را دارد.

و در نهایت، به‌نظر می‌رسد آن‌ها فریم‌ورک اختصاصی خودشان را برای مدیریت وضعیت، مسیرها و درخواست‌ها دارند — فریم‌ورکی به نام Jet. هنوز زود است که درباره‌ی میزان کارایی آن قضاوت کنیم.




#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
3
This media is not supported in your browser
VIEW IN TELEGRAM
خب، ابزاری که به خلق چنین اثری کمک کرده، TypeGPU نام دارد. و کارش چیست؟

این ابزار کد TypeScript را به GLSL تبدیل می‌کند — بله، به همان زبان توصیف شیدرها! دقیق‌تر بگوییم، آن را به WGSL (WebGPU Shading Language) تبدیل می‌کند.

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

می‌توانید با یک مثال ساده شروع کنید، مثلاً این نمونه‌ی گرادیان: (https://docs.swmansion.com/TypeGPU/examples/#example=simple--gradient-tiles
تا کمی با مفهوم آن آشنا شوید.

🔗https://docs.swmansion.com/TypeGPU/examples/#example=rendering--jelly-slider
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
3
چطور می‌توان یک عنصر را وادار کرد تا عرض خود را پله‌پله تغییر دهد**؟

فرض کنید می‌خواهید یک صفحه‌ی شطرنجی داشته باشید که در هر شرایطی یکپارچه باقی بماند.

امروز چند روش برای رسیدن به این هدف داریم:

**۱. از آنا تودور:
([https://twitter.com/anatudor](https://twitter.com/anatudor))
نمونه در CodePen: [https://codepen.io/thebabydino/pen/zYbZpBq](https://codepen.io/thebabydino/pen/zYbZpBq)

در این روش از تابع mod() استفاده می‌شود:

width: calc(95vmin + -1 * mod(95vmin, 15px));


اما مشکل این‌جاست که مرورگر Chrome هنوز از تابع mod پشتیبانی نمی‌کند... ولی ناامید نشوید!
دو روش دیگر هم از تمانی عفیف (Temani Afif) معروف به CSS Challenges داریم: ([https://twitter.com/ChallengesCss](https://twitter.com/ChallengesCss))

۲. روش دوم:
در واقع، نتیجه‌ی تابع بالا همان گرد کردن (rounding) است. و خوشبختانه، چنین تابعی هم در CSS وجود دارد! مثلاً:

min-width: round(95vmin, 15px);


نمونه: [https://codepen.io/alinaki/pen/VwRMpPY](https://codepen.io/alinaki/pen/VwRMpPY)

این ویژگی پیش‌تر در Chrome کار نمی‌کرد — تا نسخه‌ی صد و بیست و پنجم.
چرا؟ چون تیم Chrome تصمیم گرفت اول مثلثات را اضافه کند و ریاضیات ساده را بعداً :)

۳. و در نهایت روش سوم:
طبیعتاً با CSS Grid هم می‌شود:
[https://codepen.io/t_afif/pen/KKEXwmR](https://codepen.io/t_afif/pen/KKEXwmR)

و راز کار در این خط است:

grid-template-columns: repeat(auto-fill, 15px);





#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
👍1