در این قسمت روش جایگزین کردن متد css جیکوئری را با کدهای خالص جاوا اسکریپتی بررسی میکنیم.
کار با Inline Styles <h1>News</h1>
<div>Welcome to our site!</div>
<h2>World</h2>
<h3>Title 1</h3>
<div>description 1.</div>
<h2>Science</h2>
<h3>Title 2</h3>
<div>description 2.</div>
در این مثال میخواهیم با استفاده از جاوا اسکریپت، المانهای h2 و h3 را یافته و سپس h2ها را آبی و h3ها را سبز کنیم:
var headings = document.querySelectorAll('h2, h3');
for (var i = 0; i < headings.length; i++) {
if (headings[i].tagName === 'H2') {
headings[i].style.color = 'blue';
}
else {
headings[i].style.color = 'green';
}
}
برای تغییر inline style المانها، از خاصیت style آنها استفاده میشود که در نهایت این شیوهنامههای جدید توسط ویژگی style به همان المان اضافه میشوند:
<h2 style="color: blue">….</h2>
<h3 style="color: green">….</h3>
خاصیت style جزو استاندارد DOM Level 2 است که در سال 2000 تصویب شدهاست (از زمان IE 8.0 به بعد در دسترس است). باید دقت داشت که از این روش بیشتر در کتابخانههای جاوا اسکریپتی برای شرایطی خاص، جهت تغییر پویای رابط کاربری استفاده میشود و هر تغییری که در اینجا اعمال شود، مقادیر قبلی موجود را بازنویسی میکند.
همچنین اگر بخواهیم به یک المان چندین شیوهنامه را انتساب دهیم، روش کار به صورت زیر است:
<h2>World</h2>
...
<h2>Science</h2>
<script>
var headings = document.querySelectorAll('h2');
for (var i = 0; i < headings.length; i++) {
headings[i].style.color = 'blue';
headings[i].style.fontWeight = 'bold';
}
</script>
پس از یافتن المانهای مدنظر، تنها کافی است نام شیوهنامهی مدنظر را به خاصیت style اضافه و مقدار دهی کنیم. در اینجا نام شیوهنامهای که «کبابی» باشد، مانند font-weight، به صورت camel case مانند fontWeight درج خواهد شد؛ هرچند از همان نام اصلی نیز میتوان به صورت زیر استفاده کرد:
headings[i].style['font-weight'] = 'bold';
روش دیگری نیز برای انجام این تغییرات چندتایی وجود دارد:
var headings = document.querySelectorAll('h2');
for (var i = 0; i < headings.length; i++) {
headings[i].style.cssText = 'color: blue; font-weight: bold';
}
خاصیت style یک المان، از نوع اینترفیس CSSStyleDeclaration است که دارای خاصیت استاندارد cssText نیز میباشد. توسط این خاصیت میتوان چندین شیوهنامه را به صورت یکجا به عنصری انتساب داد و یا تمام آنها را خواند.
کار با Style Sheets
Inline styles تنها روش کار با شیوهنامهها نیست. روش صحیح و قابل مدیریت کار با شیوهنامهها استفاده از فایلهای style sheets است. برای مثال تغییرات قبل را میتوان در فایلی به نام styles.css و با محتوای زیر ایجاد کرد:
h2 { color: blue; }
h3 { color: green; }
و سپس آنرا به صفحه متصل نمود:
<link href="styles.css" rel="style sheet">
و یا حتی میتوان این شیوه نامه را به صورت inline نیز به ابتدای صفحه اضافه نمود:
<style>
h2 { color: blue; }
h3 { color: green; }
</style>
اما ممکن است در برنامه بخواهیم امکان تغییر پویای قالب را به کاربران بدهیم. در یک چنین حالتی اعمال این نوع شیوهنامهها توسط جاوا اسکریپت مفهوم پیدا میکند:
var sheet = document.styleSheets[0];
sheet.insertRule('h2 { font-style: italic; }', sheet.cssRules.length - 1);
اولین سطر، اولین تگ style اضافه شده به صفحه را یافته (این style میتواند inline و یا لینک شدهی توسط یک فایل باشد) و سپس شیوه نامهی جدیدی را توسط متد insertRule، در انتهای آن به صورت پویا درج میکند.
مخفی کردن و نمایش دادن المانها در صفحه
جیکوئری به همراه متدهای hide و show است که کار مخفی کردن و یا نمایش دادن مجدد یک المانرا انجام میدهند:
// hide an element
$element.hide();
// show it again
$element.show();
در کل روشهای زیادی برای مخفی کردن یک المان وجود دارند. برای مثال میتوان opacity آنرا به صفر تنظیم کرد و یا position آنرا به absolute و سپس آنرا در مختصاتی خارج از صفحه قرار داد. اما عموما خاصیت display را به none تنظیم میکنند. همچنین در استاندارد W3C HTML5، خاصیت جدید hidden از نوع boolean نیز به المانها اضافه شدهاند که دقیقا برای همینمنظور بکار میرود. مزیت مهم این خاصیت نه فقط استاندارد بودن آن، بلکه بالابردن دسترسی پذیری المانهای صفحه توسط برنامههای «screen reader» مخصوص معلولین است. بنابراین با استفاده از جاوا اسکریپت خالص برای مخفی کردن یک المان میتوان نوشت:
element.setAttribute('hidden', '');
این روش 25 بار سریعتر از متد hide جیکوئری است! از این جهت که jQuery در پشت صحنه مدام متد window.getComputedStyle را برای موارد خاص و بحرانی کار با شیوهنامهها فراخوانی میکند (در تمام متدهایی که با CSS کار میکنند) و این متد تاثیر منفی بر روی کارآیی برنامه دارد.
و چون خاصیت hidden از نوع Boolean است، ذکر آن در یک المان یعنی تنظیم آن به true و حذف آن، یعنی تنظیم آن به false یا نمایش مجدد المان در اینجا:
element.removeAttribute('hidden');
اندازهگیری تاثیر شیوهنامهها بر روی طول و عرض المانها
CSS Box Model یک چنین تعریفی را دارد:
زمانیکه از متدهای ()width و ()height جیکوئری بر روی المانی استفاده میشود، صرفا طول و عرض قسمت «content» را دریافت خواهید کرد.
برای این منظور در جاوا اسکریپت خالص این خواص در اختیار ما است:
<style>
.box {
padding: 10px;
margin: 5px;
border: 3px solid;
display: inline-block;
}
</style>
<span class="box">a box</span>
روش اندازه گیری Content + Padding توسط جاوا اسکریپت خالص:
// returns 38
var clientHeight = document.querySelector('.box').clientHeight;
// returns 55
var clientWidth = document.querySelector('.box').clientWidth;
این خواص هرچند اخیرا به استانداردهای CSS به صورت رسمی اضافه شدهاند، اما از زمان IE 6.0 پشتیبانی میشدهاند و با متدهای ()innerWidth و ()innerHeight جیکوئری قابل مقایسه هستند.
روش اندازه گیری Content + Padding + Border توسط جاوا اسکریپت خالص:
// returns 44
var offsetHeight = document.querySelector('.box').offsetHeight;
// returns 61
var offsetWidth = document.querySelector('.box').offsetWidth;
این خواص از زمان IE 8.0 پشتیبانی میشدهاند.