القاعدة ‎@media

من موسوعة حسوب
< CSS

القاعدة ‎@media في CSS يمكن أن تستعمل لتطبيق الأنماط بناءً على شروط معيّنة (تسمى media queries)، التي تختبر نوع الجهاز، وخصائصه، وبيئة التشغيل.

لاحظ أنَّ بالإمكان وضع القاعدة ‎@media داخل قواعد At-rules الأخرى، مثل القاعدة ‎@supports.

@media screen and (min-width: 900px) {
  article {
    padding: 1rem 3rem;
  }
}

@supports (display: flex) {
  @media screen and (min-width: 900px) {
    article {
      display: flex;
    }
  }
}

يمكن تطبيق استعلامات الوسائط (media queries) على قواعد ‎@media بالإضافة إلى العنصر <link> في HTML الذي يؤدي إلى جعل صفحة الأنماط كلها تابعة لتحقيق ذاك الشرط.

<link rel="stylesheet" media="screen and (min-width: 900px)" href="widescreen-styles.css">

أمثلة

@media print {
  body { font-size: 10pt; }
}

@media screen {
  body { font-size: 13px; }
}

@media screen, print {
  body { line-height: 1.2; }
}

@media only screen 
  and (min-device-width: 320px) 
  and (max-device-width: 480px)
  and (resolution: 150dpi) {
    body { line-height: 1.4; }
}

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي (أنواع الوسائط all و print و screen) 1.0 1.0 6.0 9.2 1.3
ميزات الوسائط 1.0 1.0 9.0 9.2 1.3
ميزة الوسائط resolution 29.0 3.5 ؟ مدعومة ؟

البنية العامة

القاعدة ‎@media تتألف من استعلام أو أكثر عن الوسائط (media queries)، التي يتألف كلٌ منها من نوع وسائط (media type) اختياري، وأي عدد من تعابير ميزات الوسائط (media feature)، يمكن جمع استعلامات الوسائط باستخدام المعاملات المنطقية (logical operators)، وهي غير حساسة لحالة الأحرف.

ستُطبَّق الأنماط المرتبطة باستعلامات الوسائط إذا كانت قيمة الاستعلام هي true، أي أنَّ نوع الوسائط يماثل نوع الجهاز الذي يُعرَض المستند عليه، وكانت نتيجة جميع ميزات الوسائط هي true؛ لاحظ أنَّ الاستعلامات التي فيها أنواع غير معروفة من الوسائط ستكون قيمتها false دومًا.

ملاحظة: صفحات الأنماط المرتبطة مع استعلامات عن الوسائط المُضافة عبر العنصر <link> ستُنزَّل حتى لو كانت نتيجة الاستعلام false، لكن محتوياتها لن تُطبَّق إلا إذا أصبحت نتيجة الاستعلام true.

أنواع الوسائط

أنواع الوسائط تصف التصنيف العام للجهاز؛ وما لم تستعمل المعاملَين المنطقيَين not أو only، فسيكون نوع الوسائط اختياريًا، وقيمته الافتراضية هي all.

all

صفحة الأنماط مناسبة لكل الأجهزة.

print

الغرض من هذا النوع هو تطبيق الأنماط على المحتوى المطبوع أو الظاهر على الشاشة في نافذة معاينة الطباعة.

screen

الغرض من هذا النوع هو شاشات الحاسوب الملونة.

speech

الغرض من هذا النوع هو برمجيات تحويل النص إلى كلام.

ملاحظة: عرَّفَت مواصفة CSS 2.1 و Media Queries 3 عدِّة أنواع وسائط أخرى (وهي tty و tv و projection و handheld و braille و embossed و aural) لكنها أصبحت مهملةً في مواصفة Media Queries 4 ولا يجب استخدامها؛ لاحظ أنَّ النوع aural قد حلّ محلهُ النوع speech.

ميزات الوسائط

ميزات الوسائط هي اختبارات لخصائص المتصفح أو جهاز العرض أو البيئة، واستخدامها اختياريٌ، ويجب أن يحاط كل تعبير يختبر ميزة من ميزات الوسائط بأقواس.

ملاحظة: هنالك بعض الميزات التي أُهمِلَت في مواصفة Media Queries Level 4، وهي device-width و device-height و device-aspect-ratio.

width

يمكن أن تستخدم ميزة width لتطبيق الأنماط اعتمادًا على عرض إطار العرض (viewport).

تُحدَّد الميزة width كقيمة طولية <length> تُمثِّل عرض إطار العرض، وهذه الميزة يمكن استخدامها كمجال، مما يعني أنَّ بالإمكان استخدام min-width و max-width لتحديد أدنى عرض وأقصى عرض على التوالي وبالترتيب.

<div>Watch this element as you resize your viewport's width.</div>

شيفرة CSS:

/* تحديد العرض */
@media (width: 360px) {
  div {
    color: red;
  }
}

/* أدنى عرض */
@media (min-width: 35rem) {
  div {
    background: yellow;
  }
}

/* أقصى عرض */
@media (max-width: 50rem) {
  div {
    border: 2px solid blue;
  }
}

height

يمكن أن تستخدم ميزة height لتطبيق الأنماط اعتمادًا على ارتفاع إطار العرض (viewport).

تُحدَّد الميزة height كقيمة طولية <length> تُمثِّل ارتفاع إطار العرض، وهذه الميزة يمكن استخدامها كمجال، مما يعني أنَّ بالإمكان استخدام min-height و max-height لتحديد أدنى ارتفاع وأقصى ارتفاع على التوالي وبالترتيب.

<div>Watch this element as you resize your viewport's height.</div>

شيفرة CSS:

/* تحديد الارتفاع */
@media (height: 360px) {
  div {
    color: red;
  }
}

/* أدنى ارتفاع */
@media (min-height: 25rem) {
  div {
    background: yellow;
  }
}

/* أقصى ارتفاع */
@media (max-height: 40rem) {
  div {
    border: 2px solid blue;
  }
}

aspect-ratio

يمكن أن تستخدم ميزة aspect-ratio لتطبيق الأنماط اعتمادًا على نسبة أبعاد (aspect ratio) إطار العرض (viewport).

تُحدَّد الميزة aspect-ratio كنسبة <radio> تُمثِّل نسبة العرض-إلى-الارتفاع لإطار العرض، وهذه الميزة يمكن استخدامها كمجال، مما يعني أنَّ بالإمكان استخدام min-aspect-ratio و max-aspect-ratio لتحديد أدنى نسبة أبعاد وأقصى نسبة أبعاد على التوالي وبالترتيب.

<div>Watch this element as you resize your viewport's width and height.</div>

شيفرة CSS:

/* تحديد نسبة الأبعاد */
@media (aspect-ratio: 1/1) {
  div {
    color: red;
  }
}

/* أدنى نسبة أبعاد */
@media (min-aspect-ratio: 8/5) {
  div {
    background: yellow;
  }
}

/* أقصى نسبة أبعاد */
@media (max-aspect-ratio: 2/1) {
  div {
    border: 2px solid blue;
  }
}

orientation

يمكن أن تستخدم ميزة aspect-ratio لتطبيق الأنماط اعتمادًا على اتجاه إطار العرض (viewport).

ملاحظة: هذه الميزة لا علاقة لها باتجاه الجهاز، إذ إنَّ فتح لوحة المفاتيح في أغلبية الأجهزة بالوضع الرأسي (portrait) سيؤدي إلى جعل عرض إطار العرض أكبر من ارتفاعه مما يؤدي إلى جعل المتصفح يستعمل أنماط landscape بدلًا من portrait.

تقبل الميزة orientation كلمةً محجوزةً من الكلمتين الآتيتين:

  • portrait: إطار العرض في الوضع الرأسي، أي أنَّ ارتفاعه أكبر أو يساوي عرضه.
  • landscape: إطار العرض في الوضع الأفقي، أي أنَّ عرضه أكبر من ارتفاعه.

سنستخدم تخطيط flex في المثال الآتي:

<div>Box 1</div>
<div>Box 2</div>
<div>Box 3</div>

شيفرة CSS:

body {
  display: flex;
}

div {
  background: yellow;
}

@media screen and (orientation: landscape) {
  body {
    flex-direction: row;
  }
}

@media screen and (orientation: portrait) {
  body {
    flex-direction: column;
  }
}

resolution

يمكن أن تستخدم ميزة resolution لتطبيق الأنماط اعتمادًا على كثافة البكسلات في شاشة العرض.

تُحدَّد الميزة resolution كقيمة <resolution> تُمثِّل كثافة البكسلات في الشاشة، وهذه الميزة يمكن استخدامها كمجال، مما يعني أنَّ بالإمكان استخدام min-resolution و max-resolution لتحديد أدنى وأقصى كثافة للشاشة على التوالي وبالترتيب.

<p>This is a test of your device's pixel density.</p>

شيفرة CSS:

/* تحديد كثافة الشاشة */
@media (resolution: 150dpi) {
  p {
    color: red;
  }
}

/* أدنى كثافة */
@media (min-resolution: 72dpi) {
  p {
    font-size: 1.5em;
  }
}

/* أقصى كثافة */
@media (max-resolution: 300dpi) {
  p {
    background: yellow;
  }
}

scan

يمكن أن تستخدم ميزة scan لتطبيق الأنماط بناءً على عملية المسح (scanning process) المستخدمة من جهاز العرض، لاحظ أنَّ كلمة «مسح» (scanning) في هذا السياق لا علاقة لها بالماسح الضوئي الذي يحوِّل المستندات المطبوعة إلى رقمية، وإنما تصف العملية التي تُعرَض فيها الصورة على شاشة التلفاز أو الحاسوب.

تقبل الميزة scan كلمةً محجوزةً من الكلمتين الآتيتين:

  • interlace: المسح المتداخل، أي أنَّ جهاز العرض سيعرض الأسطر الفردية والزوجية بالتبادل، وبعض أجهزة التلفاز تستعمل المسح المتداخل.
  • progressive: المسح التدريجي، أي أنَّ جهاز العرض سيعرض الأسطر بالترتيب، وجميع شاشات الحاسوب تستخدم المسح التدريجي.

لاحظ كيف سيتغير نوع الخط في المثال الآتي اعتمادًا على طريقة المسح المستخدمة من جهاز العرض:

<p>If your screen uses interlaced rendering, this text should
   be in a sans-serif font. If your screen uses progressive
   scanning, you should see a serif font.</p>

شيفرة CSS:

p {
  font-family: cursive;
}

@media (scan: interlace) {
  p {
    font-family: sans-serif;
  }
}

@media (scan: progressive) {
  p {
    font-family: serif;
  }
}

grid

يمكن أن تستخدم ميزة grid لتطبيق الأنماط اعتمادًا على إذا كان جهاز العرض يستعمل شاشة نقطية (bitmap) أو على شكل شبكة (grid، مثل الطرفيات terminals، أو أجهزة بريل braille).

تُحدَّد الخاصية grid باستخدام 0 (جهاز العرض على شكل شبكة) أو 1 (جهاز العرض نقطي).

<p class="unknown">I don't know if you're using a grid device. :-(</p>
<p class="bitmap">You are using a bitmap device.</p>
<p class="grid">You are using a grid device!</p>

شيفرة CSS:

:not(.unknown) {
  color: lightgray;
}

@media (grid: 0) {
  .unknown {
    color: lightgray;
  }

  .bitmap {
    color: red;
  }
}

@media (grid: 1) {
  .unknown {
    color: lightgray;
  }

  .grid {
    color: red;
  }
}

update

يمكن أن تستخدم ميزة update لتطبيق الأنماط اعتمادًا على سرعة تعديل جهاز العرض لمظهر المحتويات.

تقبل الميزة update كلمةً محجوزةً من الكلمات الآتية:

  • none: لا يمكن تغيير التخطيط بعد عرضه، مثل المستندات المطبوعة على الورق.
  • slow: يمكن تغيير تخطيط الصفحة ديناميكيًا اعتمادًا على قواعد CSS، لكن جهاز العرض لن يكون قادرًا على عرض التغييرات بسرعة كافية لكي تكون الحركة سلسلةً، مثل قارئات الكتب أو الأجهزة ذات القدرات المحدودة جدًا.
  • fast: يمكن تغيير تخطيط الصفحة ديناميكيًا اعتمادًا على قواعد CSS، وسيكون جهاز العرض قادرًا على عرض التغييرات بسرعة، مثل الحركات أو الانتقالات، كما في شاشات الحواسيب.

مثال عن استخدام الخاصية animation لتحريك النص إن كان الجهاز سريعًا:

<p>If this text animates for you, you are using a fast-updating device.</p>

شيفرة CSS:

@keyframes jiggle {
  from {
    transform: translateY(0);
  }

  to {
    transform: translateY(25px);
  }
}

@media (update: fast) {
  p {
    animation: 1s jiggle linear alternate infinite;
  }
}

overflow-block

يمكن أن تستخدم ميزة overflow-block لتطبيق الأنماط اعتمادًا على طريقة تعامل جهاز العرض مع المحتوى الذي يزيد عن الصندوق الكتلي على المحور الطولي.

تقبل الميزة overflow-block كلمةً محجوزةً من الكلمات الآتية:

  • none: المحتوى الذي يزيد عن الصندوق الكتلي لن يُعرَض.
  • scroll: يمكن عرض المحتوى الزائد بالتمرير إليه.
  • optional-paged: يمكن عرض المحتوى بالتمرير إليه، لكن يمكن وضع فاصل يدوي للصفحة لجعل المحتوى يتنقل إلى الصفحة الآتية.
  • paged: سيُقسَم المحتوى إلى صفحات منفصلة.

مثال:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ac turpis eleifend, fringilla velit ac, aliquam tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc velit erat, tempus id rutrum sed, dapibus ut urna. Integer vehicula nibh a justo imperdiet rutrum. Nam faucibus pretium orci imperdiet sollicitudin. Nunc id facilisis dui. Proin elementum et massa et feugiat. Integer rutrum ullamcorper eleifend. Proin sit amet tincidunt risus. Sed nec augue congue eros accumsan tincidunt sed eget ex.</p>

شيفرة CSS:

@media (overflow-block: scroll) {
  p {
    color: red;
  }
}

overflow-inline

يمكن أن تستخدم ميزة overflow-inline لتطبيق الأنماط اعتمادًا على طريقة تعامل جهاز العرض مع المحتوى الذي يزيد عن الصندوق الكتلي على المحور السطري (inline).

تقبل الميزة overflow-inline كلمةً محجوزةً من الكلمات الآتية:

  • none: المحتوى الذي يزيد عن الصندوق الكتلي لن يُعرَض.
  • scroll: يمكن عرض المحتوى الزائد بالتمرير إليه.

مثال:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ac turpis eleifend, fringilla velit ac, aliquam tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc velit erat, tempus id rutrum sed, dapibus ut urna. Integer vehicula nibh a justo imperdiet rutrum. Nam faucibus pretium orci imperdiet sollicitudin. Nunc id facilisis dui. Proin elementum et massa et feugiat. Integer rutrum ullamcorper eleifend. Proin sit amet tincidunt risus. Sed nec augue congue eros accumsan tincidunt sed eget ex.</p>

شيفرة CSS:

@media (overflow-inline: scroll) {
  p {
    color: red;
  }
}

color

يمكن أن تستخدم ميزة color لتطبيق الأنماط اعتمادًا على عدد البتات في كل مكوِّن من مكونات اللون (الأحمر والأخضر والأزرق) في جهاز العرض.

تُحدَّد الميزة color كعدد صحيح <integer> يُمثِّل عدد البتات في كل مكوِّن من مكونات اللون (الأحمر والأخضر والأزرق) في جهاز العرض، وهذه الميزة يمكن استخدامها كمجال، مما يعني أنَّ بالإمكان استخدام min-color و max-color لتحديد أدنى وأقصى قيمة على التوالي وبالترتيب.

ملاحظة: إذا كان عدد المكونات اللونية تُمثَّل بعدد مختلف من البتات، فستستخدم أدنى قيمة، فمثلًا لو كان جهاز العرض يخصص 5 بتات لقناة اللون الأزرق والأحمر و 6 بتات للون الأخضر، فسيُعدّ جهاز العرض على أنَّه يستخدم 5 بتات لكل مكوِّن لوني.

<p>How many bits does your device support for color components?</p>

شيفرة CSS:

p {
  color: #000;
}

/* أي جاهز ملوّن */
@media (color) {
  p {
    color: #ff0000;
  }
}

/* أي جهاز ملوّن له على الأقل 8 بتات في كل قناة لونية */
@media (min-color: 8) {
  p {
    color: #35bd19;
  }
}

pointer

يمكن أن تستخدم ميزة pointer لتطبيق الأنماط اعتمادًا على دقة مؤشر جهاز الإدخال الرئيسي الذي يستعمله المستخدم.

تقبل الميزة pointer كلمةً محجوزةً من الكلمات الآتية:

  • none: آلية الإدخال الأساسية لا تتضمن جهاز تأشير.
  • coarse: آلية الإدخال الأساسية تتضمن جهاز تأشير ذا دقةٍ محدودة.
  • fine: آلية الإدخال الأساسية تتضمن جهاز تأشير له دقة عالية.

مثال عن صندوق تأشير تتغير أبعاده ولونه اعتمادًا على دقة آلية الإدخال الأساسية (جرِّب هذا المثال عن شاشة حاسوب، وعلى هاتف ذكي):

<input id="test" type="checkbox">
<label for="test">Look at me!</label>

شيفرة CSS:

input[type="checkbox"]:checked {
  background: gray;
}

@media (pointer: fine) {
  input[type="checkbox"] {
    -moz-appearance: none;
    -webkit-appearance: none;
    appearance: none;
    width: 15px;
    height: 15px;
    border: 1px solid blue;
  }
}

@media (pointer: coarse) {
  input[type="checkbox"] {
    -moz-appearance: none;
    -webkit-appearance: none;
    appearance: none;
    width: 30px;
    height: 30px;
    border: 2px solid red;
  }
}

hover

يمكن أن تستخدم ميزة hover لتطبيق الأنماط اعتمادًا على إمكانية مؤشر جهاز الإدخال الرئيسي الذي يستعمله المستخدم على المرور فوق العناصر.

تقبل الميزة hover كلمةً محجوزةً من الكلمات الآتية:

  • none: آلية الإدخال الأساسية لا تسمح بالمرور فوق العناصر بالكليّة أو كان سلوك المرور فوق العناصر غير متناسق (فمثلًا بعض متصفحات الهواتف الذكية تحاكي تأثير المرور فوق العناصر عندما يلمسه المستخدم فترةً مطولةً)، أو لم تكن هنالك آلية إدخال أساسية في الجهاز.
  • hover: آلية الإدخال الأساسية تسمح بالمرور فوق العناصر بشكل متناسق.

مثال عن ذلك:

<a href="#">Try hovering over me!</a>

شيفرة CSS:

@media (hover: hover) {
  a:hover {
    background: yellow;
  }
}

any-pointer

يمكن أن تستخدم ميزة any-pointer لتطبيق الأنماط اعتمادًا على دقة مؤشر أي جهاز إدخال يمكن أن يستعمله المستخدم.

تقبل الميزة any-pointer كلمةً محجوزةً من الكلمات الآتية:

  • none: لا يوجد جهاز تأشير.
  • coarse: هنالك جهاز تأشير (واحد على الأقل) ذو دقةٍ محدودة.
  • fine: هنالك جهاز تأشير (واحد على الأقل) له دقة عالية.

لاحظ أنَّ بالإمكان مطابقة أكثر من قيمة وذلك إذا كان هنالك أكثر من جهاز تأشير له خصائص مختلفة.

<input id="test" type="checkbox">
<label for="test">Look at me!</label>

شيفرة CSS:

input[type="checkbox"]:checked {
  background: gray;
}

@media (any-pointer: fine) {
  input[type="checkbox"] {
    -moz-appearance: none;
    -webkit-appearance: none;
    appearance: none;
    width: 15px;
    height: 15px;
    border: 1px solid blue;
  }
}

@media (any-pointer: coarse) {
  input[type="checkbox"] {
    -moz-appearance: none;
    -webkit-appearance: none;
    appearance: none;
    width: 30px;
    height: 30px;
    border: 2px solid red;
  }
}

any-hover

يمكن أن تستخدم ميزة any-hover لتطبيق الأنماط اعتمادًا على إمكانية مؤشر أي جهاز إدخال يمكن أن يستعمله المستخدم على المرور فوق العناصر.

تقبل الميزة any-hover  كلمةً محجوزةً من الكلمات الآتية:

  • none: لا توجد أيّة آلية إدخال تسمح بالمرور فوق العناصر بشكل متناسق.
  • hover: توجد آلية إدخال واحدة على الأقل تسمح بالمرور فوق العناصر بشكل متناسق.

مثال عن ذلك:

<a href="#">Try hovering over me!</a>

شيفرة CSS:

@media (any-hover: hover) {
  a:hover {
    background: yellow;
  }
}

المعاملات المنطقية

يمكن أن تستعمل المعاملات المنطقية not و and و only لإنشاء استعلام معقد، ويمكن أيضًا دمج عدِّة استعلامات عن الوسائط في قاعدة واحدة بفصلها بفاصلة.

and

يُستخدَم المُعامِل and لدمج ميزتين من ميزات الوسائط في استعلام واحد، ويجب أن يكون ناتج كلا الميزتين true لكي تكون نتيجة الطلبية true، ويُستعمَل هذا المعامل أيضًا لدمج ميزات الوسائط مع أنواع الوسائط.

not

يُستخدَم المعامل not لعكس نتيجة الاستعلام، أي سيُعيد true إذا كانت نتيجة الاستعلام false، والعكس صحيح، وإذا استخدم على قائمة مفصولة بفواصل، فسيعكس قيمة الطلبية التي طُبِّق عليها فقط، وإذا استخدمتَ المعامل not فيجب أن تُحدِّد نوع الوسائط.

لاحظ أنَّ الكلمة المحجوزة not لا يمكن أن تستخدم لعكس نتيجة اختبار إحدى الميزات، وإنما كامل استعلام الوسائط.

only

يفيد المعامل only في تطبيق الأنماط إذا تحقق كامل الاستعلام، وهو مفيد لمنع المتصفحات القديمة من تطبيق الأنماط، وإذا استخدم المعامل only فيجب تحديد نوع الوسائط.

القوائم المفصولة بفواصل

ستُعامَل الاستعلامات التي يُفصَل بينها بفاصلة بمعزل عن البقية، فلو كانت نتيجة إحدى الاستعلامات true فسيكون كامل الاستعلام true، أي أنَّ القوائم المفصولة بفواصل تشبه المعامل or.

البنية الرسمية

@media <media-query-list> {
  <group-rule-body>
}

حيث:

<media-query-list> = <media-query>#

حيث:

<media-query> = <media-condition> | [ not | only ]? <media-type> [ and <media-condition-without-or> ]?

حيث:

<media-condition> = <media-not> | <media-and> | <media-or> | <media-in-parens>
<media-type> = <ident>
<media-condition-without-or> = <media-not> | <media-and> | <media-in-parens>

حيث:

<media-not> = not <media-in-parens>
<media-and> = <media-in-parens> [ and <media-in-parens> ]+
<media-or> = <media-in-parens> [ or <media-in-parens> ]+
<media-in-parens> = ( <media-condition> ) | <media-feature> | <general-enclosed>

حيث:

<media-feature> = ( [ <mf-plain> | <mf-boolean> | <mf-range> ] )
<general-enclosed> = [ <function-token> <any-value> ) ] | ( <ident> <any-value> )

حيث:

<mf-plain> = <mf-name> : <mf-value>
<mf-boolean> = <mf-name>
<mf-range> = <mf-name> [ '<' | '>' ]? '='? <mf-value> | <mf-value> [ '<' | '>' ]? '='? <mf-name> | <mf-value> '<' '='? <mf-name> '<' '='? <mf-value> | <mf-value> '>' '='? <mf-name> '>' '='? <mf-value>

حيث:

<mf-name> = <ident>
<mf-value> = <number> | <dimension> | <ident> | <ratio>

انظر أيضًا

  • صفحة القاعدة supports@ التي تسمح لنا بتعريف قواعد بناءً على دعم المتصفح لميزات مُعيّنة في CSS.

مصادر ومواصفات