نگاه اول به attr() مدرن

استاد چیدمان
مقدمه
ممکن است استفاده کرده باشید attr() قبل از دریافت محتوای متنی برای یک شبه عنصر، در CSS عمل کنید.
p data-title="This text is before the title">Hello Worldp>
.title:before {
content: attr(data-title);
}
نتیجه به شرح زیر است:
در اینجا هیچ چیز جدید یا ابتکاری وجود ندارد، برای برخی موارد مفید است.
با این حال، وقتی می خواهیم از یک مقدار غیر متنی استفاده کنیم، این کار نمی کند. در HTML زیر اضافه کردم data-color ویژگی از p عنصر
p data-color="red">CSS is awesomep>
و سپس از ویژگی در CSS استفاده می کند.
.title:before {
color: attr(data-color);
}
این کار نمی کند زیرا attr() تابع فقط از مقادیر متنی پشتیبانی می کند.
attr() مدرن
attr()
در دسترس بودن محدود
پشتیبانی در کروم: بله.
پشتیبانی شده در Edge: بله.
پشتیبانی در فایرفاکس: بله.
پشتیبانی شده در سافاری: خیر.
در دسترس بودن محدود
پشتیبانی در کروم: بله.
پشتیبانی شده در Edge: بله.
پشتیبانی در فایرفاکس: بله.
پشتیبانی شده در سافاری: خیر.
این ویژگی اساسی نیست زیرا در برخی از مرورگرهای پرکاربرد کار نمی کند.
attr() از وضعیت پلتفرم وب
حالا میتونیم استفاده کنیم attr() و نوع مقداری را که می خواهیم استفاده کنیم را تعریف کنیم.

برای مثال، در این مورد باید مقدار رنگ را بدست آوریم.
p data-color="red">CSS is awesomep>
.title:before {
color: attr(data-color type());
}
بر اساس MDN، نوع داده جدید می تواند مقادیر مختلفی داشته باشد:
را
type()تابع a می گیردبه عنوان آرگومان آن، که مشخص می کند مقدار را در چه نوع داده ای تجزیه کنیم. رامی تواند باشد،،،،،،،،،،،،، یا ترکیبی از آنها.
این به ما انعطافپذیری جدیدی میدهد که قبلاً نداشتیم. کجا ممکن است مفید باشد؟ این چیزی است که در این مقاله بررسی خواهم کرد.
تشخیص ویژگی
ما می توانیم پشتیبانی مدرن attr() را با CSS بررسی کنیم @supports. در اینجا یک مثال است:
@supports (x: attr(x type(*))) {
}
اگر از Sass استفاده می کنید، موارد فوق تجزیه نمی شوند. من از آن فرار کردم تا کار کند .scss فایل ها:
@supports (#{"x: attr(x type(*))"}) {
}
موارد استفاده مدرن attr()
شماره ستون ها را تنظیم کنید
هنگام استفاده از یک شبکه CSS، میتوانیم شماره ستونها را به هر فرزند شبکه اختصاص دهیم.
در این مثال من تعریف کردم data-col-start و data-col-end روی یک عنصر شبکه برای تنظیم شروع و پایان ستون.
در CSS می توانم اعداد را به این صورت استخراج کنم:
.layout {
> * {
grid-column-start: attr(data-col-start type(), 2);
grid-column-end: attr(data-col-end type(), 3);
}
}
اگر خصیصه تنظیم نشده باشد، به حالت اولیه برمی گردد 2 و 3 همانطور که مشخص کردم با نسخه ی نمایشی زیر بازی کنید و ببینید چگونه کار می کند:
div data-col-start="1" data-col-end="-1">
img src="desk.jpg" alt="" />
div>
Lorem ipsum dolor، sit amet consectetur adipisicing elit. Quam deleniti officia or nolla vero cumqu.
Veritatis، tempore itaecusumus alias voluptate illum cupiditate eius incidunt et laudantium؟
اگر صفات تنظیم نشده باشند، grid-column-start و grid-column-end به طور پیش فرض مقادیر بازگشتی تنظیم خواهند شد.
دمو زیر را بررسی کنید:
div data-col-start="1" data-col-end="-1">
img src="desk.jpg" alt="" />
div>
Lorem ipsum dolor، sit amet consectetur adipisicing elit. Quam deleniti officia or nolla vero cumqu.
Veritatis، tempore itaecusumus alias voluptate illum cupiditate eius incidunt et laudantium؟
به ردیف های فیلد متنی دسترسی پیدا کنید
می توانیم استفاده کنیم rows ویژگی و ضرب آن در یک عدد آستانه.
textarea {
min-height: calc(attr(rows type()) * 50px);
}
دمو زیر را بررسی کنید:
textarea rows="3">textarea>
توضیح کوتاهی از ایده محصول خود بنویسید:
انیمیشن را کم کنید
یکی دیگر از کاربردهای عالی attr() تاخیر انیمیشن است. از آنجایی که attr() با پسر، ما می توانیم از آن به نفع خود استفاده کنیم.
در HTML زیر لیستی از عناصر داریم. هر مورد دارای یک data-delay ویژگی می توانیم آن را بگیریم و در CSS استفاده کنیم.
div class="itemsWrapper">
div class="item" data-delay="0.3s">div>
div class="item" data-delay="0.6s">div>
div class="item" data-delay="0.9s">div>
div class="item" data-delay="1.2s">div>
div>
برای استفاده از مقدار باید ویژگی را فراخوانی کرده و سپس نوع آن را تعریف کنیم. اگر تعریف نشده باشد، به تاخیر پیشفرض برمیگردد 0.5s.
CSS زیر را ببینید:
.item {
animation-delay: attr(data-delay type(
در اینجا یک نسخه نمایشی تعاملی است که نحوه عملکرد آن را نشان می دهد:
div class="itemsWrapper">
div class="item" data-delay="0.3s">div>
div class="item" data-delay="0.6s">div>
div class="item" data-delay="0.9s">div>
div class="item" data-delay="1.2s">div>
div>
سایه رنگ
با داشتن یک عدد منحصر به فرد برای هر عنصر html، می توانیم از آن برای تغییر روشنایی رنگ با توجه به شاخص آن استفاده کنیم.
در این مثال من استفاده می کنم data-index ویژگی برای دریافت مقدار برای سهولت در هنگام استفاده از رنگ های نسبی CSS.
.item {
background-color: oklch(
from #ab4ef8 calc(l + calc(attr(data-index type()) / 20)) c h
);
}
دمو زیر را بررسی کنید:
div class="itemsWrapper">
div class="item" data-index="1">div>
div class="item" data-index="2">div>
div class="item" data-index="3">div>
div class="item" data-index="4">div>
div class="item" data-index="5">div>
div class="item" data-index="6">div>
div class="item" data-index="7">div>
div>
در یک یادداشت مرتبط، ما اکنون یک شاخص خواهر و برادر در حال توسعه داریم! اوقات هیجان انگیز
شکاف در شبکه
من استفاده کردم attr() برای تعیین ارزش grid-gap. نکته خوب در اینجا این است که می توانیم چندین گزینه برای مقدار تعریف کنیم. در این مورد من انواع را تعریف کردم یا .
.layout {
gap: attr(data-gap type( | ));
}
مقادیر طول را در دمو زیر تغییر دهید:
div class="layout" data-gap="1rem">div>
مناطق الگوی شبکه
یکی از ویژگی های قدرتمند شبکه CSS استفاده از فیلدهای نام گرید است. فکر کردم چرا سعی نکنیم ناحیه قالب شبکه را با ویژگی های داده تعریف کنیم؟
من در ابتدا موارد زیر را امتحان کردم:
div
class="layout"
data-areas="'featured item-1' 'featured item-2' 'item-3 item-4'"
>div>
اگرچه کار نکرد. من فکر می کنم CSS نامعتبر است (لطفاً اگر اشتباه می کنم اصلاح کنید). برای اینکه کار کند، باید هر ردیف را به صورت جداگانه تعریف کنم:
div
class="layout"
data-row-1="featured item-1"
data-row-2="featured item-2"
data-row-3="item-3 item-4"
>div>
سپس از این در CSS به این صورت استفاده کردم. توجه کنید که من تعریف نکرده ام type همانطور که به طور پیش فرض است .
.layout {
grid-template-areas:
attr(data-row-1)
attr(data-row-2)
attr(data-row-3);
}
در اینجا یک نسخه نمایشی است که آن را در عمل نشان می دهد:
ارائه شده است
نقطه 1
نقطه 2
نکته 3
نقطه 4
div class="layout"
data-row-1="featured item-1"
data-row-2="featured item-2"
data-row-3="item-3 item-4">
div>
تصاویر پس زمینه
نمونه ای از جایی که می توانیم استفاده کنیم attr() با تصاویر پس زمینه است. معمولاً وقتی یک پسزمینه پویا داریم که از طریق جاوا اسکریپت تنظیم میشود، تمایل به تنظیم داریم background-image روی هر عنصر یا از یک متغیر CSS استفاده کنید.
ما می توانیم یک ویژگی تنظیم کنیم و از آن در CSS استفاده کنیم. نتیجه مشابه استفاده از متغیر CSS درون خطی را می دهد، اما برای من تمیزتر به نظر می رسد.
div style="--bg: linear-gradient(45deg, #9c3ce7,#3d53cc)">div>
div data-bg="linear-gradient(45deg, #9c3ce7,#3d53cc)">div>
در CSS می توانیم از آن به صورت زیر استفاده کنیم:
.element {
background: attr(data-image type()) no-repeat;
}
div data-bg="linear-gradient(45deg, #9c3ce7, #3d53cc)">div>
نوار پیشرفت
در این دمو می خواستم ببینم چطور attr() زمانی که در یک متغیر CSS استفاده شود کار خواهد کرد. تعریف کردم data-color و data-progress از ظرف اصلی
div class="bar" data-color="#a548e3" data-progress="55">
div class="bar__current">div>
div>
سپس در CSS I:
- یک متغیر پیشرفت را برای دریافت مقدار بدون واحد تعریف می کند.
- یک متغیر رنگ برای ذخیره رنگ تعریف می کند. من
.bar {
--progress: attr(data-progress type());
--color: attr(data-color type());
background-color: oklch(from var(--color) calc(l + 0.35) c h);
}
.bar__current {
width: calc(var(--progress) * 1%);
background-color: oklch(from var(--color) l c h);
}
کار می کند! در اینجا یک نسخه نمایشی است:
div class="bar" data-color="#a548e3" data-progress="55">div>
div class="bar" data-color="#afe348" data-progress="75">div>
div class="bar" data-color="#e38148" data-progress="40">div>
اگر این را با رویکرد استفاده از متغیر CSS درون خطی مقایسه کنیم، خواندن/اسکن آن به سرعت دشوارتر خواهد شد.
div class="bar" style="--color: #a548e3; --progress: 55">div>
div class="bar" data-color="#a548e3" data-progress="55">div>
یک فریمورک مینی CSS؟
زمانی که شروع به تحقیق کردم یک ایده در ذهنم بود attr() و خوشحالم که این فقط من نیستم.
چه می شد اگر می توانستیم استفاده کنیم attr() آیا مینی فریمورک CSS یا کلاس های کمکی برای استفاده در سیستم داشته باشید؟ در قطعه بعدی که اضافه کردم px به معنی پد در طرفین افقی.
div px="1rem">div>
در CSS فقط یک بار باید این را تعریف کنم:
[px] {
padding-inline: attr(mx type());
}
و در صورت نیاز می توانم از آن برای بسیاری از عناصر استفاده کنم:
div px="1rem">div>
div px="10px">div>
div px="0">div>
من یک بار CSS را تعریف کردم و بارها از ویژگی help استفاده کردم. عالی نیست؟ من این را بیشتر بردم و چند ویژگی دیگر ایجاد کردم:
کمی مطالب اینجاست
کمی مطالب اینجاست
div
max-w="500px"
px="1rem"
py="1rem"
bg-color="#fff"
color="#222">
div>
div
max-w="300px"
px="2rem"
py="2rem"
bg-color="var(--brand-1)"
color="#fff">
div>
ویژگی چند ارزشی مفید است
وقتی این مقاله را منتشر کردم، متوجه شدم که نمی توانیم از کلمات کلیدی مانند استفاده کنیم auto. معلوم شد که انجام این کار با تایپ امکان پذیر است . به لطف تمانی عفیف، فهمیدم که امکان پذیر است.
ای کاش راهی برای داشتن یک نوع کلمه کلیدی وجود داشت. به عنوان مثال، اگر من یک ویژگی داشته باشم که می تواند مقدار طول یا an باشد auto، باید چندین مقدار را مجاز کنم.
[mx] {
margin-inline: attr(mx type( | ));
}
div mx="auto">div>
یا می توانیم از مقدار طول استفاده کنیم:
div mx="2rem">div>
همچنین میتوانیم از انتخابگر جهانی استفاده کنیم تا هر مقداری را بپذیرد.
[mx] {
margin-inline: attr(mx type(*));
}
ایده دیگر این است که اجازه دهید یا نوع طول یا auto کلمه کلیدی با تشکر از برامز و دنی وینتر
برای ارائه این
[mx] {
margin-inline: attr(mx type( | auto));
}
چرا از attr() مدرن به جای CSS درون خطی استفاده کنیم؟
با استفاده از جاوا اسکریپت
هنگام استفاده data-* برای یک نام مشخصه می توانیم با استفاده از آن به آن دسترسی پیدا کنیم dataset. اگر صفتی داشته باشیم data-color، می توانیم کارهای زیر را انجام دهیم:
element.dataset.color = "blue";
جداسازی مراقبت
وقتی از attr() مدرن استفاده میکنیم، میتوانیم محتوا را از سبک جدا کنیم و در نتیجه اسکن HTML را آسانتر کنیم.
div class="bar" style="--color: #a548e3; --progress: 55">div>
div class="bar" data-color="#a548e3" data-progress="55">div>
تداخل های CSS را کاهش می دهد
وقتی از ویژگیهای داده استفاده میکنید، نمیتوانید CSS را خراب کنید. ما می توانیم روشی شبیه API برای استایل دادن به صفحات خود داشته باشیم. در یک سیستم طراحی، استفاده از attr() می تواند مانع از بازنویسی تصادفی سبک ها توسط توسعه دهندگان شود و CSS را قابل پیش بینی تر می کند.
ضربه مغزی
attr() مدرن روشی قدرتمند برای نوشتن CSS بر اساس ویژگی های داده در اختیار ما قرار می دهد. از زمان نوشتن این مقاله، فقط کروم است، و امیدوارم مرورگرهای بیشتری به زودی دنبال شوند.



