<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: CSS</title><link>https://academy.hsoub.com/programming/css/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: CSS</description><language>ar</language><item><title>&#x627;&#x644;&#x62A;&#x646;&#x633;&#x64A;&#x642; &#x627;&#x644;&#x645;&#x62A;&#x642;&#x62F;&#x645; &#x644;&#x627;&#x633;&#x62A;&#x645;&#x627;&#x631;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628;</title><link>https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AA%D9%82%D8%AF%D9%85-%D9%84%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2404/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_09/---.png.a683c249b4d0c00d9d5f9a0ddc7fe286.png" /></p>
<p>
	نناقش في هذا المقال استخدام لغة CSS في تنسيق بعض عناصر التحكم التي يصعب تنسيقها في استمارة الويب. وكما رأينا في <a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2402/" rel="">المقال السابق</a> أن معظم العناصر سهلة التنسيق مثل الحقول النصية والأزرار، وبعضها اﻵخر صعب أو يسبب مشاكل أثناء التنسيق مثل صناديق التحقق وبعض أنواع عناصر اﻹدخال.
</p>

<p>
	ولكي نلخص ما ذكرناه سابقًا، فإن هناك نوعين من عناصر التحكم من ناحية التنسيق:
</p>

<ul>
	<li>
		<strong>صعبة التنسيق</strong>: تتطلب قواعد CSS معقدة أو استخدام حيل محددة نذكر من هذه العناصر صناديق التحقق check-boxes و أزرار الاختيار المتعدد radio buttons.
	</li>
	<li>
		<strong>غير قابلة للتنسيق الكامل</strong>: لا يمكن تنسيقها بشكل كامل باستخدام CSS مثل:
	</li>
	<li>
		حقل اﻹدخال من النوع <a href="https://wiki.hsoub.com/HTML/input/color" rel="external">color</a>.
	</li>
	<li>
		حقل اﻹدخال من النوع <a href="https://wiki.hsoub.com/HTML/input/datetime-local" rel="external">datetime</a>.
	</li>
	<li>
		حقل اﻹدخال من النوع <a href="https://wiki.hsoub.com/HTML/input/range" rel="external">range</a>.
	</li>
	<li>
		حقل اﻹدخال من النوع <a href="https://wiki.hsoub.com/HTML/input/file" rel="external">file</a>.
	</li>
	<li>
		عناصر القوائم منسدلة مثل العنصر <code><a href="https://wiki.hsoub.com/HTML/select" rel="external">&lt;select&gt;</a></code> و <code><a href="https://wiki.hsoub.com/HTML/option" rel="external">&lt;option&gt;</a></code> و <code><a href="https://wiki.hsoub.com/HTML/optgroup" rel="external">&lt;optgroup&gt;</a></code>.
	</li>
	<li>
		عناصر أشرطة التقدم مثل <code><a href="https://wiki.hsoub.com/HTML/meter" rel="external">&lt;meter&gt;</a></code> و <code><a href="https://wiki.hsoub.com/HTML/progress" rel="external">&lt;progress&gt;</a></code>.
	</li>
</ul>

<p>
	لهذا، سنتحدث في بداية عن الخاصية <code>appearance</code> التي تساعد في تنسيق تلك العناصر.
</p>

<h2 id="appearance">
	الخاصية <code>appearance</code> والتنسيق على مستوى نظام التشغيل
</h2>

<p>
	تحدثنا في <a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2402/" rel="">مقال سابق</a> كيف أن تنسيق عناصر التحكم في الاستمارات يعتمد على نظام التشغيل الذي يستضيف <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8%D8%9F-r2094/" rel="">صفحة الويب</a>، وهذا جزء من السبب الذي يجعل تنسيق بعض العناصر صعبًا. لهذا السبب أنشئت الخاصية <code>appearance</code> لتقدم طريقة للتحكم بتنسيق عناصر تحكم الاستمارة، فالقيمة التي ستتعامل معها (وقد لا ترى غيرها) لهذه الخاصية هي القيمة <code>none</code>. حيث تمنع هذه القيمة استخدام التنسيق على مستوى نظام التشغيل قدر اﻹمكان وتسمح ببناء تنسيق مخصص باستخدام <a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">CSS</a>.
</p>

<p>
	لنلق نظرة على عناصر التحكم التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4806_9" style=""><span class="tag">&lt;form&gt;</span><span class="pln">
 </span><span class="tag">&lt;p&gt;</span><span class="pln">
    </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"search"</span><span class="tag">&gt;</span><span class="pln">search: </span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"search"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"search"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"search"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
 </span><span class="tag">&lt;/p&gt;</span><span class="pln">
 </span><span class="tag">&lt;p&gt;</span><span class="pln">
    </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"text"</span><span class="tag">&gt;</span><span class="pln">text: </span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
 </span><span class="tag">&lt;/p&gt;</span><span class="pln">
 </span><span class="tag">&lt;p&gt;</span><span class="pln">
    </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"date"</span><span class="tag">&gt;</span><span class="pln">date: </span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"date"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"date"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"datetime-local"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
 </span><span class="tag">&lt;/p&gt;</span><span class="pln">
 </span><span class="tag">&lt;p&gt;</span><span class="pln">
    </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"radio"</span><span class="tag">&gt;</span><span class="pln">radio: </span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"radio"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"radio"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"radio"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
 </span><span class="tag">&lt;/p&gt;</span><span class="pln">
 </span><span class="tag">&lt;p&gt;</span><span class="pln">
    </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="tag">&gt;</span><span class="pln">checkbox: </span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
 </span><span class="tag">&lt;/p&gt;</span><span class="pln">
 </span><span class="tag">&lt;p&gt;&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="tag">/&gt;&lt;/p&gt;</span><span class="pln">
 </span><span class="tag">&lt;p&gt;&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"button"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"button"</span><span class="pln"> </span><span class="tag">/&gt;&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/form&gt;</span></pre>

<p>
	إن تطبيق القاعدة التالية سيزيل التنسيق على مستوى نظام التشغيل:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4806_11" style=""><span class="pln">input </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">appearance</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	عند تنفيذ تلك الشيفرة، ستكون لديك النتيجة التالية التي تضم عناصر التحكم التي طُبق عليها تنسيق نظام التشغيل (إلى اليسار) ونفس العناصر بعد تطبيق قاعدة CSS (إلى اليمين):
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="450" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/PorLMBY?default-tab=" style="width: 100%;" title="appearance-tester">See the Pen appearance-tester by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	يكون التأثير في معظم الأحيان إزالة الحواف المنسقة وبالتالي سيسهل هذا قليلًا استخدام CSS، قد لا يبدو لك هذا باﻷمر المهم. لكن سيظهر تأثيره المفيد في حالات استخدام عنصر حقل اﻹدخال <code><a href="https://wiki.hsoub.com/HTML/input/search" rel="external">search</a></code> وكذلك عند استخدام صناديق التحقق وأزرار الاختيار المتعدد.
</p>

<h3 id="-1">
	العمل مع صناديق البحث
</h3>

<p>
	صندوق البحث هو نوع من أنواع عناصر اﻹدخال يشابه عنصر اﻹدخال النصي، لكن ما فائدة القاعدة <code>appearance: none</code> في هذه الحالة؟ الجواب هو أن متصفح سفاري يطبق بعض القيود على صناديق البحث، فلن تتمكن من تغيير ارتفاعه <code>height</code> أو حجم الخط <code>font-size</code> بحرية. باﻹمكان إصلاح هذا اﻷمر باستخدام القاعدة السابقة التي تعطل المظهر الافتراضي. إليك مثالًا:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4806_13" style=""><span class="pln">input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"search"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">appearance</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سترى في المثال التالي صندوقي بحث متطابقين من ناحية التنسيق، لكن طبقت على الصندوق اليميني القاعدة <code>appearance: none</code> بينما لم تُطبق على الصندوق اليساري. إن نظرت جيدًا إلى الصندوقين في متصفح سفاري على نظام ماك أو إس macOS، قد تلاحظ أن أبعاد الصندوق اليساري لم تضبط بالشكل الصحيح.
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="250" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/eYwXqjE?default-tab=" style="width: 100%;" title="search-appearance">See the Pen search-appearance by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	ومن المثير للاهتمام اختفاء مشكلة اﻷبعاد السابقة عند ضبط الحواف أو الخلفية لصندوق البحث. فلم تُطبق القاعدة <code>appearance: none</code> على صندوق البحث في المثال التالي، لكنه لم يعاني من ذات المشكلة عند عرضه في متصفح سفاري!
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="178" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/yLdwmrX?default-tab=" style="width: 100%;" title="styled-search">See the Pen styled-search by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	<strong>ملاحظة</strong>: لربما لاحظت أن اﻷيقونة <code>x</code> في حقل البحث (التي تظهر عندما يكتسب صندوق البحث تركز الدخل ولم يكن فارغًا) ستختفي عندما يفقد الصندوق تركيز الدخل في متصفحي كروم وإيدج لكنها تبقى في متصفح سفاري. لإزالتها باستخدام CSS بإمكاننا استخدام القاعدة التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_7930_18" style=""><span class="pln">input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"search"</span><span class="pun">]:</span><span class="pln">not</span><span class="pun">(:</span><span class="pln">focus</span><span class="pun">,</span><span class="pln"> </span><span class="pun">:</span><span class="pln">active</span><span class="pun">)::-</span><span class="pln">webkit-search-cancel-button </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3 id="-2">
	تنسيق صناديق التحقق وأزرار الاختيار من متعدد
</h3>

<p>
	إن تنسيق هذه العناصر مربك قليلًا، فلم يؤخذ بالاعتبار إمكانية تغيير أبعاد هذه العناصر وفق تصميمها الافتراضي، وسيختلف سلوك المتصفحات عندما تحاول ذلك. لنلق نظرة على الحالة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4806_17" style=""><span class="tag">&lt;label</span><span class="pln">
 </span><span class="tag">&gt;&lt;span&gt;&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"q5"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln"> </span><span class="tag">/&gt;&lt;/span&gt;</span><span class="pln"> True</span><span class="tag">&lt;/label</span><span class="pln">
</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;label</span><span class="pln">
 </span><span class="tag">&gt;&lt;span&gt;&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"q5"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"false"</span><span class="pln"> </span><span class="tag">/&gt;&lt;/span&gt;</span><span class="pln"> False</span><span class="tag">&lt;/label</span><span class="pln">
</span><span class="tag">&gt;</span></pre>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4806_19" style=""><span class="pln">span </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> inline-block</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"checkbox"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تتعامل المتصفحات مع صندوق التحقق والعنصر <code>&lt;span&gt;</code> بطرق مختلفة وبعضها سيئ المظهر:
</p>

<table>
	<thead>
		<tr>
			<th style="text-align:right;">
				المتصفح
			</th>
			<th style="text-align:center;">
				طريقة التصيير
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td style="text-align:right;">
				فايرفوكس 71 (على ماك أو إس)
			</td>
			<td style="text-align:center;">
				<img alt="Rounded corners and 1px light grey border" style="width: 75px; height: auto;" src="https://developer.mozilla.org/en-US/docs/Learn/Forms/Advanced_form_styling/firefox-mac-checkbox.png">
			</td>
		</tr>
		<tr>
			<td style="text-align:right;">
				فايرفوكس 57 (ويندوز 10)
			</td>
			<td style="text-align:center;">
				<img alt="Rectangular corners with 1px medium grey border" style="width: 75px; height: auto;" src="https://developer.mozilla.org/en-US/docs/Learn/Forms/Advanced_form_styling/firefox-windows-checkbox.png">
			</td>
		</tr>
		<tr>
			<td style="text-align:right;">
				كروم 77 (ماك أو إس)/ سفاري 13، أوبيرا
			</td>
			<td style="text-align:center;">
				<img alt="Rounded corner with 1px medium grey border" style="width: 75px; height: auto;" src="https://developer.mozilla.org/en-US/docs/Learn/Forms/Advanced_form_styling/chrome-mac-checkbox.png">
			</td>
		</tr>
		<tr>
			<td style="text-align:right;">
				كروم 63 (ويندوز 10)
			</td>
			<td style="text-align:center;">
				<img alt="Rectangular borders with slightly greyish background instead of white." style="width: 75px; height: auto;" src="https://developer.mozilla.org/en-US/docs/Learn/Forms/Advanced_form_styling/chrome-windows-checkbox.png">
			</td>
		</tr>
		<tr>
			<td style="text-align:right;">
				إيدج 16 (ويندوز 10)
			</td>
			<td style="text-align:center;">
				<img alt="Rectangular borders with slightly greyish background instead of white." style="width: 75px; height: auto;" src="https://developer.mozilla.org/en-US/docs/Learn/Forms/Advanced_form_styling/edge-checkbox.png">
			</td>
		</tr>
	</tbody>
</table>

<h4 id="appearancenone">
	استخدام القاعدة <code>appearance: none</code> مع صناديق التحقق وأزرار الاختيار المتعدد
</h4>

<p>
	رأينا سابقًا كيف يمكننا إزالة المظهر الافتراضي لهذه العناصر دفعة واحدة باستخدام القاعدة <code>appearance: none</code>. لنلق نظرة على هذا المثال:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4806_21" style=""><span class="tag">&lt;form&gt;</span><span class="pln">
 </span><span class="tag">&lt;fieldset&gt;</span><span class="pln">
    </span><span class="tag">&lt;legend&gt;</span><span class="pln">Fruit preferences</span><span class="tag">&lt;/legend&gt;</span><span class="pln">

    </span><span class="tag">&lt;p&gt;</span><span class="pln">
     </span><span class="tag">&lt;label&gt;</span><span class="pln">
      </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"fruit"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"cherry"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
      I like cherry
     </span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;/p&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">
     </span><span class="tag">&lt;label&gt;</span><span class="pln">
      </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"fruit"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"banana"</span><span class="pln"> </span><span class="atn">disabled</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
      I can't like banana
     </span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;/p&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">
     </span><span class="tag">&lt;label&gt;</span><span class="pln">
      </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"fruit"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"strawberry"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
      I like strawberry
     </span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;/p&gt;</span><span class="pln">
 </span><span class="tag">&lt;/fieldset&gt;</span><span class="pln">
</span><span class="tag">&lt;/form&gt;</span></pre>

<p>
	سننسق صناديق التحقق كي تأخذ تصميمًا خاصًا، وسنبدأ بإلغاء التنسيق اﻷصلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4806_23" style=""><span class="pln">input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"checkbox"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">appearance</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نستطيع استخدام الصنفين الزائفين <code><a href="https://wiki.hsoub.com/CSS/:checked" rel="external">checked:</a></code> و <code><a href="https://wiki.hsoub.com/CSS/:disabled" rel="external">disabled:</a></code> لتغيير مظهر صندوق التحقق وتغيير حالته:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4806_25" style=""><span class="pln">input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"checkbox"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid gray</span><span class="pun">;</span><span class="pln">
 </span><span class="com">/* Adjusts the position of the checkboxes on the text baseline */</span><span class="pln">
 </span><span class="kwd">vertical-align</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">2px</span><span class="pun">;</span><span class="pln">
 </span><span class="com">/* Set here so that Windows' High-Contrast Mode can override */</span><span class="pln">
 </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> green</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"checkbox"</span><span class="pun">]::</span><span class="pln">before </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">content</span><span class="pun">:</span><span class="pln"> </span><span class="str">"✔"</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.2em</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">right</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.3em</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">visibility</span><span class="pun">:</span><span class="pln"> hidden</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"checkbox"</span><span class="pun">]:</span><span class="kwd">checked</span><span class="pun">::</span><span class="pln">before </span><span class="pun">{</span><span class="pln">
 </span><span class="com">/* Use `visibility` instead of `display` to avoid recalculating layout */</span><span class="pln">
 </span><span class="kwd">visibility</span><span class="pun">:</span><span class="pln"> visible</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"checkbox"</span><span class="pun">]:</span><span class="pln">disabled </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">border-color</span><span class="pun">:</span><span class="pln"> black</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#ddd</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> gray</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سنتعرف على الأصناف الزائفة ونقاط أخرى في مقال قادم، لكن ما يفعله الصنفان السابقان هو التالي:
</p>

<ul>
	<li>
		<code>checked</code>: تُطبَّق عندما يكون صندوق التحقق أو زر الاختيار المتعدد في حالة التفعيل، أي أنه نقر من قبل المستخدم.
	</li>
	<li>
		<code>disabled</code>: تُطبَّق عندما يكون صندوق التحقق أو زر الاختيار المتعدد في حالة التعطيل، أي لا يمكن للمستخدم التعامل معه.
	</li>
</ul>

<p>
	إليك نتيجة الشيفرة السابقة:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/oNrVKda?default-tab=" style="width: 100%;" title="checkboxes-styled">See the Pen checkboxes-styled by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	ستجد هنا أيضًا مثالين آخرين لتوضيح الفكرة:
</p>

<ul>
	<li>
		<a href="https://mdn.github.io/learning-area/html/forms/styling-examples/radios-styled.html" rel="external nofollow">المثال اﻷول</a> عن تنسيق أزرار الاختيار المتعدد.
	</li>
	<li>
		<a href="https://mdn.github.io/learning-area/html/forms/toggle-switch-example/" rel="external nofollow">المثال الثاني</a> عن تنسيق صندوق التحقق ليبدو وكأنه زر تبديل toggle switch.
	</li>
</ul>

<p>
	إن حاولت استعراض صناديق التحقق السابقة في متصفح لا يدعم الخاصية <code>appearance</code> لن تشاهد التنسيق الذي خصصته، لكنها ستحافظ على شكل صندوق التحقق وتؤدي نفس الوظيفة.
</p>

<h2 id="css">
	ما الذي يمكن فعله للعناصر التي لا يمكن تنسيقها باستخدام CSS فقط؟
</h2>

<p>
	ما الذي يمكن فعله لتنسيق عناصر لا يمكن تنسيقها بالكامل باستخدام CSS مثل القوائم المنسدلة والعناصر المركبة مثل <span ipsnoautolink="true">منتقي الألوان</span> color picker أو عنصر تحديد التاريخ date-time وعناصر مراقبة التقدم progress elements وغيرها؟
</p>

<p>
	تكمن مشكلة هذه العناصر اﻷساسية في اختلاف الطريقة الافتراضية لعرضها من متصفح إلى آخر، وإن استطعت تنسيقها بطريقة ما، يستحيل تنسيق بعض أجزائها الداخلية. فإن كنت مستعدًا للتآلف مع بعض الاختلافات بالشكل والمظهر، يمكنك اتباع بعض أساليب التنسيق لتحقيق تناسق في اﻷبعاد، وتطبيق تنسيق موحد للخلفيات وكذلك استخدام الخاصية <code>appearance</code> للتخلص من بعض التنسيقات على مستوى نظام التشغيل.
</p>

<p>
	لنلق نظرة على المثال التالي الذي يعرض عددًا من العناصر صعبة التنسيق في استمارة الويب:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="800" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/bGPZXQE?default-tab=" style="width: 100%;" title="ugly-controls">See the Pen ugly-controls by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	طُبقت قواعد التنسيق التالية على العناصر السابقة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4806_27" style=""><span class="pln">body </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Josefin Sans"</span><span class="pun">,</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">400px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

form </span><span class="pun">&gt;</span><span class="pln"> div </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">margin-bottom</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

select </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">appearance</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100%</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">select-wrapper </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="kwd">select-wrapper</span><span class="pun">::</span><span class="pln">after </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">content</span><span class="pun">:</span><span class="pln"> </span><span class="str">"▼"</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1rem</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

button</span><span class="pun">,</span><span class="pln">
label</span><span class="pun">,</span><span class="pln">
input</span><span class="pun">,</span><span class="pln">
select</span><span class="pun">,</span><span class="pln">
progress</span><span class="pun">,</span><span class="pln">
meter </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">inherit</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100%</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">box-sizing</span><span class="pun">:</span><span class="pln"> border-box</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100%</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"text"</span><span class="pun">],</span><span class="pln">
input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"datetime-local"</span><span class="pun">],</span><span class="pln">
input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"color"</span><span class="pun">],</span><span class="pln">
select </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">box-shadow</span><span class="pun">:</span><span class="pln"> inset </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">3px</span><span class="pln"> </span><span class="lit">#ccc</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

label </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">margin-bottom</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

button </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">60%</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	كما ترى، استطعنا على نحو مقبول جدًا تنسيق تلك العناصر الصعبة لتبدو منتظمة عبر المتصفحات الحديثة. وطبقنا في الواقع بعض<a href="https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D9%81%D9%87%D9%85-%D9%88%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-css-r1881/" rel=""> قواعد CSS</a> العامة على جميع عناصر التحكم وعناوينها كي يكون لها جميعها نفس اﻷبعاد، وتمتلك خط كتابة العنصر اﻷب وهكذا.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4806_29" style=""><span class="pln">button</span><span class="pun">,</span><span class="pln">
label</span><span class="pun">,</span><span class="pln">
input</span><span class="pun">,</span><span class="pln">
select</span><span class="pun">,</span><span class="pln">
progress</span><span class="pun">,</span><span class="pln">
meter </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">inherit</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100%</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">box-sizing</span><span class="pun">:</span><span class="pln"> border-box</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100%</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أضفنا أيضًا بعض الظلال المنتظمة والزوايا الدائرية في العناصر التي يبدو فيها اﻷمر منطقيًا:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4806_31" style=""><span class="pln">input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"text"</span><span class="pun">],</span><span class="pln">
input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"datetime-local"</span><span class="pun">],</span><span class="pln">
input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"color"</span><span class="pun">],</span><span class="pln">
select </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">box-shadow</span><span class="pun">:</span><span class="pln"> inset </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">3px</span><span class="pln"> </span><span class="lit">#ccc</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لكننا لم نطبق هذه اﻷشياء على عناصر تحكم مثل عناصر المجالات وأشرطة التقدم، فكل ما ستعرضه هو صندوق قبيح المظهر حول عنصر التحكم، ولن يبدو استخدامها منطقيًا أبدًا.
</p>

<h3 id="select">
	العنصر <code>&lt;select&gt;</code> وقوائم البيانات
</h3>

<p>
	تقدم المتصفحات الحديثة تنسيقًا افتراضيًا مقبولًا لقوائم البيانات، ولن تضطر إلى تغيير تنسيقها كثيرًا. وبالنسبة للمظهر الأساسي للصناديق فقد حافظنا عليه مع بعض التغييرات الطفيفة لتبدو منتظمة ومتناسقة، وطالما أن عناصر القوائم هي في الواقع عناصر إدخال نصي <code><a href="https://wiki.hsoub.com/HTML/input" rel="external">&lt;input&gt;</a></code> (قيمة الخاصية <code>type</code> له تساوي <code>"text"</code>) فهي بسيطة التنسيق.
</p>

<p>
	أما ما يجعل اﻷمر صعبًا فهما ناحيتان: اﻷولى هي اختلاف أيقونة السهم في العنصر <code><a href="https://wiki.hsoub.com/SQL/select" rel="external">&lt;select&gt;</a></code> التي تشير إلى اتجاه انسدال القائمة من متصفح ﻵخر، وقد تتغير هذه اﻷيقونة عند تغيير حجم صندوق الاختيار أو تتغير أبعادها بطريقة سيئة. وﻹصلاح هذه المشكلة استخدمنا بداية الخاصية <code>appearance: none</code> للتخلص من الأيقونة بالمطلق:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4806_33" style=""><span class="pln">select </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">appearance</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ثم أنشأنا أيقونة مخصصة باستخدام المحتوى المولَّد (باستخدام الخاصية <code>content</code>). ووضعنا عنصر تغليف إضافي حول عنصر التحكم لأن الصنفان <code>after::</code> و <code>before::</code> لا يعملان مع العنصر <code>&lt;select&gt;</code>. والسبب في ذلك أن موضع المحتوى المولَّد عن طريق الشيفرة سيكون منسوبًا لصندوق التنسيق الذي يحيط بها، لكن عناصر اﻹدخال تعمل كأنها عناصر مُستبدلة، إذ يقرر المتصفح طريقة عرضها ويضعها في مكانها فهي لا تمتلك صندوق تنسيق:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4806_35" style=""><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"select"</span><span class="tag">&gt;</span><span class="pln">Select a fruit</span><span class="tag">&lt;/label&gt;</span><span class="pln">
</span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"select-wrapper"</span><span class="tag">&gt;</span><span class="pln">
 </span><span class="tag">&lt;select</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"select"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"select"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;option&gt;</span><span class="pln">Banana</span><span class="tag">&lt;/option&gt;</span><span class="pln">
    </span><span class="tag">&lt;option&gt;</span><span class="pln">Cherry</span><span class="tag">&lt;/option&gt;</span><span class="pln">
    </span><span class="tag">&lt;option&gt;</span><span class="pln">Lemon</span><span class="tag">&lt;/option&gt;</span><span class="pln">
 </span><span class="tag">&lt;/select&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	نستخدم بعدها محتوى مولَّد لتمثيل سهم نحو الأسفل ونضعه في مكانه الصحيح باستخدام خاصية التموضع <code><a href="https://wiki.hsoub.com/CSS/position" rel="external">position</a></code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4806_37" style=""><span class="pun">.</span><span class="pln">select-wrapper </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="kwd">select-wrapper</span><span class="pun">::</span><span class="pln">after </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">content</span><span class="pun">:</span><span class="pln"> </span><span class="str">"▼"</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1rem</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">6px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أما الناحية الثانية الأكثر أهمية، هي عدم قدرتنا على التحكم بمظهر الصندوق الذي يضم الخيارات عند النقر على صندوق العنصر <code>&lt;select&gt;</code> لفتحه. وعلى الرغم من وراثة <a href="https://wiki.hsoub.com/CSS/font-family" rel="external">خط الكتابة</a> عن العنصر اﻷب، إلا أنك لن تكون قادرًا على ضبط التباعد بين الحروف أو اللون. وينطبق هذا اﻷمر على قوائم اﻹكمال التلقائي التي تظهر مع العنصر <code><a href="https://wiki.hsoub.com/HTML/datalist" rel="external">&lt;datalist&gt;</a></code>.
</p>

<p>
	فإن أردت تحكمًا كاملًا عند تنسيق قوائم الخيارات، عليك استخدام نوع من المكتبات التي تقدم عنصر تحكم مخصص أو أن تبني بنفسك هذا العنصر. أو استخدم في حالة العنصر <code>&lt;select&gt;</code> الخاصية <code>multiple</code> والتي تعرض جميع الخيارات معًا متجنبًا هذه المشكلة بالتحديد:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4806_39" style=""><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"select"</span><span class="tag">&gt;</span><span class="pln">Select fruits</span><span class="tag">&lt;/label&gt;</span><span class="pln">
</span><span class="tag">&lt;select</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"select"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"select"</span><span class="pln"> </span><span class="atn">multiple</span><span class="tag">&gt;</span><span class="pln">
 …
</span><span class="tag">&lt;/select&gt;</span></pre>

<p>
	ملاحظة: قد لا يتناسب هذا الحل مع تصميمك لكنه يستحق المحاولة.
</p>

<h3 id="-3">
	تنسيق عنصر التقويم
</h3>

<p>
	لجميع أنواع عنصر التقويم المسؤولة عن إدخال التاريخ والوقت مثل (<code>datetime-local</code> و <code>time</code> و <code>week</code> و <code>month</code>) نفس مشكلات التنسيق الرئيسية. فمن الممكن أن تنسق الصندوق الذي يضمها بكل سهولة كأي عنصر إدخال نصي، لكن لا يمكن تنسيق اﻷجزاء الداخلية منها مثل التقويم الذي تعرضه أو زر الزيادة والنقصان إطلاقًا، ولا يمكن إزالتها باستخدام القاعدة <code>appearance: none</code> فإن أردت تحكمًا كاملًا بهذه العناصر لا بد من الاستعانة بمكتبة خارجية تبني لك العنصر أو أن تحاول بناء عنصرك المخصص بنفسك.
</p>

<p>
	<strong>ملاحظة</strong>: علينا أن نذكر هنا عنصر اﻹدخال العددي <code>&lt;'input type = 'number&gt;</code> الذي يمتلك أيضًا زر لزيادة أو إنقاص القيمة العددية. فقد يعاني أيضًا من نفس المشكلة السابقة. لهذا إن كانت القيمة العددية بسيطة، يمكنك استخدام النوع <code>tel</code> فهو لا يعرض هذا الزر، وله مظهر النوع <code>text</code> ويعرض لوحة مفاتيح رقمية أيضًا.
</p>

<h3 id="-4">
	عنصر إدخال المجالات<code> range</code>
</h3>

<p>
	من الصعب تنسيق حقول المجال <code><a href="https://wiki.hsoub.com/HTML/input/range" rel="external">range</a></code>، لكن باﻹمكان الاستفادة من اﻷفكار السابقة بإزالة التنسيق الافتراضي كليًا واستبداله بتنسيق مخصص كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4806_41" style=""><span class="pln">input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"range"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">appearance</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">outline</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid transparent</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	مع ذلك، من الصعب جدًا استبدال تنسيق مقبض الجر drag handle، ولا بد من استخدام شيفرة CSS معقدة تتضمن العديد من العناصر غير المعيارية والمخصصة لمتصفحات معينة حتى تستطيع التحكم بتنسيق عنصر المجالات بشكل كامل.
</p>

<h3 id="-5">
	عنصر انتقاء اللون
</h3>

<p>
	لا يبدو مظهر هذا العنصر سيئًا في المتصفحات التي تدعمه، إذ تميل معظمها إلى عرض كتلة من اﻷلوان لها طار صغير. يمكنك إزالة الإطار وإبقاء الكتلة اللونية فقط باستخدام قواعد كهذه:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4806_43" style=""><span class="pln">input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"color"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أما التحكم الكامل، فيحتاج إلى حل مخصص.
</p>

<h3 id="-6">
	عنصر انتقاء الملفات
</h3>

<p>
	لا بأس بمظهر عناصر انتقاء الملفات من النوع <code><a href="https://wiki.hsoub.com/HTML/input/file" rel="external">file</a></code>، ومن السهل كما رأينا في مثال سابق أن نجعلها تبدو متناسقة مع بقية أجزاء الصفحة. إذ يرث السطر الذي يعرض الملفات التي تنتقيها العنصر اﻷب إن أردت ذلك، كما تستطيع تنسيق قائمة أسماء الملفات بالطريقة التي تريدها.
</p>

<p>
	أما المشكلة الوحيدة في منتقي الملفات هو الزر الذي تنقر عليه لفتح نافذة انتقاء الملفات، فهو غير قابل للتنسيق بأي شكل من اﻷشكال. ومن الطرق المتبعة للالتفاف على هذا الأمر هو استخدام العنوان المرتبط مع هذا العنصر بدلًا من الزر اﻷساسي. لهذا يمكنك إخفاء عنصر انتقاء الملفات وتنسيق العنوان المرتبط به ليبدو وكأنه زر ثم النقر عليه لفتح نافذة انتقاء الملفات:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4806_45" style=""><span class="pln">input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"file"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">opacity</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ثم ننسق العنوان المرتبط بالعنصر حتى يبدو وكأنه زر:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4806_47" style=""><span class="pln">label</span><span class="pun">[</span><span class="pln">for</span><span class="pun">=</span><span class="str">"file"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">box-shadow</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">3px</span><span class="pln"> </span><span class="lit">#ccc</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> linear-gradient</span><span class="pun">(</span><span class="pln">to bottom</span><span class="pun">,</span><span class="pln"> </span><span class="lit">#eee</span><span class="pun">,</span><span class="pln"> </span><span class="lit">#ccc</span><span class="pun">);</span><span class="pln">
 </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">169</span><span class="pun">,</span><span class="pln"> </span><span class="lit">169</span><span class="pun">,</span><span class="pln"> </span><span class="lit">169</span><span class="pun">);</span><span class="pln">
 </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">text-align</span><span class="pun">:</span><span class="pln"> center</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">line-height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.5</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

label</span><span class="pun">[</span><span class="pln">for</span><span class="pun">=</span><span class="str">"file"</span><span class="pun">]:</span><span class="pln">hover </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> linear-gradient</span><span class="pun">(</span><span class="pln">to bottom</span><span class="pun">,</span><span class="pln"> </span><span class="lit">#fff</span><span class="pun">,</span><span class="pln"> </span><span class="lit">#ddd</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

label</span><span class="pun">[</span><span class="pln">for</span><span class="pun">=</span><span class="str">"file"</span><span class="pun">]:</span><span class="pln">active </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">box-shadow</span><span class="pun">:</span><span class="pln"> inset </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">3px</span><span class="pln"> </span><span class="lit">#ccc</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ستكون نتيجة عرض الشيفرة السابقة كما يلي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="250" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/BagbXvN?default-tab=" style="width: 100%;" title="styled-file-picker">See the Pen styled-file-picker by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h3 id="-7">
	أشرطة التقدم والعدادات
</h3>

<p>
	قد يكون العنصران <code><a href="https://wiki.hsoub.com/HTML/meter" rel="external">&lt;meter&gt;</a></code> و <code><a href="https://wiki.hsoub.com/HTML/progress" rel="external">&lt;progress&gt;</a></code> اﻷسوء من ناحية التنسيق. صحيح أننا تمكنا في مثال سابق من ضبط اتساعها بشكل دقيق نسبيًا، لكن خلاف ذلك، من الصعب تنسيقها بأي شكل. إذ لا يمكن مثلًا أن نضمن سلوك المتصفحات فيما يخص ارتفاع هذه العناصر، وعلى الرغم من إمكانية تغيير لون الخلفية، لكن لا يمكن تغيير اللون اﻷمامي، وتطبيق القاعدة <code>appearance: none</code> تزيد اﻷمر سوءًا.
</p>

<p>
	لهذا من اﻷفضل أن تجد حلًا مخصصًا لتتحكم بالمظهر الكامل لهذه العناصر، أو يمكنك استخدام أية حلول تقدمها أطراف خارجية مثل <a href="https://kimmobrunfeldt.github.io/progressbar.js/#examples" rel="external nofollow">progressbar.js</a>
</p>

<h2 id="-8">
	الخلاصة
</h2>

<p>
	على الرغم من وجود بعض الصعوبات في تطبيق قواعد التنسيق المخصصة بلغة CSS على عناصر تحكم استمارات الويب، لكن توجد دائمًا طرق للالتفاف على هذه الصعوبات. وبالطبع لا توجد حلول عامة، لكن المتصفحات الحديثة تقدم إمكانيات جديدة. لهذا من اﻷفضل أن تتعلم أكثر عن طريقة تطبيق المتصفحات المختلفة لقواعد CSS التي تدعمها على عناصر استمارات HTML وتنسقها وفق ذلك.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="https://developer.mozilla.org/en-US/docs/Learn/Forms/Advanced_form_styling" rel="external nofollow">Advanced form styling</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2402/" rel="">تنسيق استمارات الويب باستخدام CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%AD%D9%82%D9%88%D9%84-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-%D9%81%D9%8A-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-html5-r5/" rel="">تعرف على أنواع الحقول الجديدة في نماذج HTML5</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-web-forms-r2368/" rel="">أساسيات العمل مع استمارات الويب Web forms</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D9%88%D8%B3%D8%A7%D8%A6%D8%B7-%D8%A7%D9%84%D9%85%D8%AA%D8%B9%D8%AF%D8%AF%D8%A9-%D9%88%D8%A7%D9%84%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D9%81%D9%8A-css-r2186/" rel="">تنسيق الصور والوسائط المتعددة والنماذج في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/html-%D9%88-css-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-css-r272/" rel="">HTML و CSS للمبتدئين: مقدمة إلى تنسيقات CSS</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2404</guid><pubDate>Mon, 23 Sep 2024 15:00:06 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#xFEF7;&#x635;&#x646;&#x627;&#x641; &#x627;&#x644;&#x632;&#x627;&#x626;&#x641;&#x629; pseudo-classes &#x641;&#x64A; &#x62A;&#x646;&#x633;&#x64A;&#x642; &#x648;&#x627;&#x62C;&#x647;&#x629; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x62E;&#x62F;&#x645;</title><link>https://academy.hsoub.com/programming/css/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%EF%BB%B7%D8%B5%D9%86%D8%A7%D9%81-%D8%A7%D9%84%D8%B2%D8%A7%D8%A6%D9%81%D8%A9-pseudo-classes-%D9%81%D9%8A-%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-r2405/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_09/---pseudo-classes----.png.3a68fae80ee526216586e26ae6600107.png" /></p>
<p>
	تعرفنا في <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AA%D9%82%D8%AF%D9%85-%D9%84%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2404/" rel="">مقال سابق</a> على طريقة تنسيق استمارات الويب بشكل متقدم واستعرضنا أمثلة على بعض الحالات التي نستخدم فيها أصناف التنسيق الزائفة pseudo-classes مثل <code>checked:</code> لاستهداف صندوق التحقق في الحالة التي يكون فيها مفعّلًا. وسنتابع في هذا المقال التعرف أكثر على هذه اﻷصناف الزائفة واستخداماتها في تنسيق استمارات الويب.
</p>

<p>
	ننصحك قبل المضي معنا في هذا المقال الاطلاع على <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">أساسيات HTML</a> وعلى <a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">أساسيات تنسيق الصفحات باستخدام CSS</a>، إضافة إلى إلقاء نظرة على <a href="https://academy.hsoub.com/programming/css/%25D9%2585%25D8%25AD%25D8%25AF%25D8%25AF%25D8%25A7%25D8%25AA-%25D8%25A7%25D9%2584%25D8%25A3%25D8%25B5%25D9%2586%25D8%25A7%25D9%2581-%25D8%25A7%25D9%2584%25D8%25B2%25D8%25A7%25D8%25A6%25D9%2581%25D8%25A9-pseudo-classes-%25D9%2588%25D8%25A7%25D9%2584%25D8%25B9%25D9%2586%25D8%25A7%25D8%25B5%25D8%25B1-%25D8%25A7%25D9%2584%25D8%25B2%25D8%25A7%25D8%25A6%25D9%2581%25D8%25A9-pseudo-elements-%25D9%2581%25D9%258A-css-r2124/&amp;ved=2ahUKEwiG8r3Mr4qGAxXfQ6QEHefqDmMQFnoECBIQAQ&amp;usg=AOvVaw1J4MqYvkDxF0o9I-YGmTb9" rel="">مفهوم اﻷصناف والعناصر الزائفة</a>.
</p>

<h2 id="">
	ما هي اﻷصناف الزائفة المتاحة؟
</h2>

<p>
	إليك قائمة <a href="https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D9%88%D9%85%D8%B9%D8%B1%D9%81%D8%A7%D8%AA-id-%D9%88%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D8%B2%D8%A7%D8%A6%D9%81%D8%A9-%D9%81%D9%8A-css-r1904/" rel="">باﻷصناف الزائفة</a> اﻷصلية التي تتعلق بالاستمارات كما قدمتها <a href="https://www.w3.org/TR/CSS21/selector.html#dynamic-pseudo-classes" rel="external nofollow">CSS 2.1</a>:
</p>

<ul>
	<li>
		الصنف الزائف<code> </code><a href="https://wiki.hsoub.com/CSS/:hover" rel="external">hover:</a> يختار العنصر عندما يتحرك مؤشر الفأرة فوقه.
	</li>
	<li>
		الصنف الزائف <a href="https://wiki.hsoub.com/CSS/:focus" rel="external">focus:</a> يختار العنصر عندما يكتسب تركيز الدخل (عندما تنتقل إليه عبر الضغط على الزر Tab).
	</li>
	<li>
		الصنف الزائف <a href="https://wiki.hsoub.com/CSS/:active" rel="external">active:</a> يختار العنصر عندما يُفعّل -بالنقر عليه مثلًا- أو عند الضغط على الزر Enter.
	</li>
</ul>

<p>
	لا بد أن تكون هذه اﻷصناف الأساسية معروفة بالنسبة إليك، وتزودنا <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D9%85%D8%AD%D8%AF%D8%AF%D8%A7%D8%AA-selectors-%D9%81%D9%8A-css-r249/" rel="">محددات CSS</a> أصنافًا زائفةً أخرى للعمل مع استمارات HTML، وتستخدم لاستهداف عناصر الاستمارة عند تحقق شروط معينة سنناقشها بمزيد من التفصيل في هذا المقال:
</p>

<ul>
	<li>
		<p>
			يستخدم الصنفان <a href="https://wiki.hsoub.com/CSS/:required" rel="external">required:</a>   و <a href="https://wiki.hsoub.com/CSS/:optional" rel="external">optional:</a> في استهداف عناصر HTML التي تمتلك <a href="https://wiki.hsoub.com/CSS/:required" rel="external">الخاصية required</a> والتي تحدد ما إذا كان هذا العنصر مطلوبًا أم اختياريًا.
		</p>
	</li>
	<li>
		<p>
			تستخدم الأصناف <code><a href="https://wiki.hsoub.com/CSS/:valid" rel="external">valid:</a></code> و <code><a href="https://wiki.hsoub.com/CSS/:invalid" rel="external">invalid:</a></code> و <code><a href="https://wiki.hsoub.com/CSS/:in-range" rel="external">in-range:</a></code> و <a href="https://wiki.hsoub.com/CSS/:out-of-range" rel="external">out-of-range:</a> لاستهداف عناصر الاستمارة ذات القيمة الصالحة أو غير الصالحة وفقًا لقيود التحقق من القيمة وكذلك إن كانت ضمن المجال المطلوب أو خارجه.
		</p>
	</li>
	<li>
		<p>
			تستهدف الأصناف <code><a href="https://wiki.hsoub.com/CSS/:enabled" rel="external">enabled:</a></code> و <code><a href="https://wiki.hsoub.com/CSS/:disabled" rel="external">disabled:</a></code> و <code><a href="https://wiki.hsoub.com/CSS/:read-only" rel="external">read-only:</a></code> و <a href="https://wiki.hsoub.com/CSS/:write-only" rel="external">write-only:</a> العناصر التي يمكن تعطيلها وتفعيلها (تمتلك الخاصية <code>disabled</code>)، وتلك التي تسمح بالقراءة فقط أو الكتابة فقط (تمتلك <a href="https://wiki.hsoub.com/CSS/:read-only" rel="external">الخاصية readonly</a>).
		</p>
	</li>
	<li>
		<p>
			تستهدف الأصناف <code><a href="https://wiki.hsoub.com/CSS/:checked" rel="external">checked:</a></code> و <code><a href="https://wiki.hsoub.com/CSS/:indeterminate" rel="external">indeterminate:</a></code> و <a href="https://wiki.hsoub.com/CSS/:default" rel="external">default:</a> بالترتيب صناديق التحقق وأزرار الاختيار المتعدد المفعّلة والعناصر في الحالة العائمة indeterminate (ليست مفعلة أو غير مفعلة)، والعنصر المختار افتراضيًا عند تحميل الصفحة مثل صندوق تحقق مفعل افتراضيًا أو عنصر استخدمت فيه الخاصية <code>selected</code>.
		</p>
	</li>
</ul>

<p>
	هناك العديد أيضًا من هذه اﻷصناف لكن ما ذكرناه هنا هو أوضحها استعمالًا، وبعضها يُخصص لحل مشاكل محددة جدًا. إضافة إلى ذلك، فالأصناف السابقة <a href="https://academy.hsoub.com/programming/css/%D8%AF%D8%B9%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%82%D8%AF%D9%8A%D9%85%D8%A9-%D8%B9%D9%86%D8%AF-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2314/" rel="">مدعومة جيدًا في معظم المتصفحات</a>، لكن عليك معرفة طريقة تطبيقها بشكل صحيح للتأكد من استهدافك العنصر المطلوب.
</p>

<p>
	<strong>ملاحظة</strong>: نستخدم عددًا من اﻷصناف الزائفة السابقة لتنسيق عناصر تحكم استمارة ويب وفقًا لصلاحية قيمها (قيمتها صالحة أو لا) وهذا ما سنراه في مقال لاحق، لذلك سنبقي اﻷمور بسيطة قدر اﻹمكان فيما يخص أمور التحقق من الصلاحية.
</p>

<h2 id="-1">
	تنسيق عناصر اﻹدخال في حال كانت مطلوبة أم لا
</h2>

<p>
	من أهم اﻷساسيات التي تتعلق بالتحقق من صحة المدخلات في طرف العميل تحديد إن كان عنصر إدخال ما ضروريًا (يجب إدخال قيمته قبل إرسال الاستمارة) أم اختياريًا.
</p>

<p>
	ولبعض العناصر مثل <code><a href="https://wiki.hsoub.com/HTML/input" rel="external">&lt;input&gt;</a></code> و <code><a href="https://wiki.hsoub.com/HTML/textarea" rel="external">&lt;textarea&gt;</a></code> الخاصية <code>required</code> التي تشير عند ضبطها إلى ضرورة إدخال قيمة لهذا العنصر، وإلا ستُخفق عملية إرسال الاستمارة. إليك مثالًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2263_8" style=""><span class="tag">&lt;form&gt;</span><span class="pln">
 </span><span class="tag">&lt;fieldset&gt;</span><span class="pln">
    </span><span class="tag">&lt;legend&gt;</span><span class="pln">Feedback form</span><span class="tag">&lt;/legend&gt;</span><span class="pln">
    </span><span class="tag">&lt;div&gt;</span><span class="pln">
     </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"fname"</span><span class="tag">&gt;</span><span class="pln">First name: </span><span class="tag">&lt;/label&gt;</span><span class="pln">
     </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"fname"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"fname"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">required</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div&gt;</span><span class="pln">
     </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"lname"</span><span class="tag">&gt;</span><span class="pln">Last name: </span><span class="tag">&lt;/label&gt;</span><span class="pln">
     </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"lname"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"lname"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">required</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div&gt;</span><span class="pln">
     </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"email"</span><span class="tag">&gt;</span><span class="pln">
      Email address (include if you want a response):
     </span><span class="tag">&lt;/label&gt;</span><span class="pln">
     </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"email"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"email"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"email"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div&gt;&lt;button&gt;</span><span class="pln">Submit</span><span class="tag">&lt;/button&gt;&lt;/div&gt;</span><span class="pln">
 </span><span class="tag">&lt;/fieldset&gt;</span><span class="pln">
</span><span class="tag">&lt;/form&gt;</span></pre>

<p>
	نجد في هذه الاستمارة أن الاسم الأول واﻷخير مطلوبان، لكن البريد اﻹلكتروني اختياري. ويمكنك استهداف الحالتين السابقتين باستخدام الصنفين <code>required:</code> و <code>optional:</code>. فلو طبقنا مثلًا قواعد CSS التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2263_10" style=""><span class="kwd">input</span><span class="pun">:</span><span class="pln">required </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid black</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">input</span><span class="pun">:</span><span class="pln">optional </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid silver</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سيكون للحقول المطلوبة حواف أو إطار أسود اللون، وستكون حواف العنصر غير المطلوب رمادية اللون:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="500" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/ExBMEdN?default-tab=" style="width: 100%;" title="basic-required-optional">See the Pen basic-required-optional by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	جرّب أن تنقر زر اﻹرسال دون أن تملأ الاستمارة كي ترى رسالة الخطأ الافتراضية التي يعرضها المتصفح عندما يتحقق من المدخلات.
</p>

<p>
	وعلى الرغم من أن اﻷسلوب السابق ليس سيئًا كبداية، لكن اﻹشارة إلى أن عنصر اﻹدخال مطلوب عن طريق اللون فقط أمر لا يكفي في حالات عدة منها أن يكون المستخدم مريضًا بعمى اﻷلوان، إضافة إلى وجود عرف يقضي بتعليم العنصر المطلوب بإشارة <code>*</code> أو ربط الكلمة "مطلوب required" بالعنصر. لهذا السبب، سنلقي نظرة في القسم التالي على أمثلة أفضل عن استخدام الصنف <code>required:</code> وكذلك استخدام المحتوى المولَّد.
</p>

<p>
	<strong>ملاحظة</strong>: قد لا تستخدم الصنف <code>optional:</code>في الكثير من اﻷحيان، فعناصر اﻹدخال اختيارية افتراضيًا، لهذا سيطبق التنسيق الافتراضي على هذه العناصر ويبقى عليك تخصيص تنسيق للعناصر المطلوبة.
</p>

<p>
	<strong>ملاحظة</strong>: إن كان لأحد أزرار الاختيار المتعدد في مجموعة أزرار لها نفس الاسم الخاصية <code>required</code> فلن تتمكن من إرسال الاستمارة ما لم يجري اختيار أحد أزرار المجموعة، لكن التنسيق باستخدام <code>required:</code>سيطبق فقط على الزر الذي يمتلك تلك الخاصية.
</p>

<h2 id="generatedcontent">
	استخدام المحتوى المولَّد generated content مع الأصناف الزائفة
</h2>

<p>
	اطلعنا في <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AA%D9%82%D8%AF%D9%85-%D9%84%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2404/" rel="">المقال السابق</a> على استخدام المحتوى المولَّد باستخدام الخاصية <a href="https://wiki.hsoub.com/CSS/content" rel="external">content</a>، لكننا سنناقشه بتفصيل أكبر في هذه الفقرة.
</p>

<p>
	تكمن الفكرة في إمكانية استخدام العنصرين الزائفين <code>after::</code> و <code>before::</code> مع الخاصية <code>content</code> ﻹظهار محتوى قبل أو بعد العنصر المستهدف. لن يضاف المحتوى الجديد إلى شجرة DOM وسيكون بالتالي مخفيًا عن قارئات الشاشة. وطالما أن المحتوى الجديد هو عنصر زائف، سنتمكن من تنسيقه بنفس اﻷسلوب الذي نستهدف فيه عنصرًا من DOM وننسقه.
</p>

<p>
	لهذا الأمر فائدته عندما ترغب في إضافة مؤشر مرئي إلى عنصر مثل عنوان أو أيقونة مع وجود مؤشر بديل متاح أيضًا للتأكد من سهولة وصول جميع المستخدمين. تستخدم <a href="https://mdn.github.io/learning-area/html/forms/styling-examples/radios-styled.html" rel="external nofollow">الشيفرة التالية</a> على سبيل المثال المحتوى المولّد لرسم دائرة متحركة داخل زر اختيار متعدد عند النقر عليه:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2263_14" style=""><span class="pln">input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"radio"</span><span class="pun">]::</span><span class="pln">before </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">content</span><span class="pun">:</span><span class="pln"> </span><span class="str">" "</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">6px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.2em</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">transform</span><span class="pun">:</span><span class="pln"> translate</span><span class="pun">(</span><span class="lit">3px</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3px</span><span class="pun">)</span><span class="pln"> scale</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);</span><span class="pln">
 </span><span class="kwd">transform-origin</span><span class="pun">:</span><span class="pln"> center</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">transition</span><span class="pun">:</span><span class="pln"> all </span><span class="lit">0.3s</span><span class="pln"> ease-in</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"radio"</span><span class="pun">]:</span><span class="kwd">checked</span><span class="pun">::</span><span class="pln">before </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">transform</span><span class="pun">:</span><span class="pln"> translate</span><span class="pun">(</span><span class="lit">3px</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3px</span><span class="pun">)</span><span class="pln"> scale</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
 </span><span class="kwd">transition</span><span class="pun">:</span><span class="pln"> all </span><span class="lit">0.3s</span><span class="pln"> cubic-bezier</span><span class="pun">(</span><span class="lit">0.25</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.25</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.56</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تظهر فائدة المحتوى المولّد في حالات كهذه أي عند النقر على صندوق تحقق أو زر اختيار متعدد. إذ سيعرف مستخدمو قارئات الشاشة أن هذا الصندوق مفعّل أو غير مفعّل ولا حاجة ﻹضافة عنصر <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-dom-r644/" rel="">DOM</a> تنطقه قارئات الشاشة مرة ثانية فهذا أمر مربك. بينما لن يُقرأ المحتوى المولّد من قبل قارئات الشاشة ولن يربك من يستخدمها، ويحل في نفس الوقت مشكلة اﻷشخاص صحيحي البصر.
</p>

<p>
	وبالعودة إلى مثالنا السابق الذي ينسق العناصر المطلوبة، سنستخدم في هذه النسخة محتوىً مولّدًا ﻹضافة مؤشر إلى ضرورة هذا العنصر.
</p>

<p>
	نضيف بداية مقطعًا إلى بداية الاستمارة يوضح ما نريد فعله:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2263_16" style=""><span class="tag">&lt;p&gt;</span><span class="pln">Required fields are labeled with "required".</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	ستنطق قارئات الشاشة الكلمة "required مطلوب" عندما يصل المستخدم إلى كل حق مطلوب، بينما سيرى المستخدمون الأصحاء عناونًا يوضح ذلك.
</p>

<p>
	وطالما أن عناصر اﻹدخال لا تدعم المحتوى المولّد (لأنها تسلك سلوك عناصر مستبدلة replaced elements، بينما يوضع المحتوى المولّد قبل أو بعد العنصر الذي يمتلك صندوق تنسيق فقط)، سنضيف عنصر <code>&lt;span&gt;</code> فارغ ليضم هذا المحتوى:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2263_18" style=""><span class="tag">&lt;div&gt;</span><span class="pln">
 </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"fname"</span><span class="tag">&gt;</span><span class="pln">First name: </span><span class="tag">&lt;/label&gt;</span><span class="pln">
 </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"fname"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"fname"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">required</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
 </span><span class="tag">&lt;span&gt;&lt;/span&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	أما المشكلة التي ستظهر هنا هو انتقال هذا العنصر إلى سطر جديد ﻹن كل من العنوان وعنصر اﻹدخال قد ضبطا ليشغلا كامل الاتساع <code>width: 100%</code>. لهذا ننسق العنصر اﻷب <code>&lt;div&gt;</code> ليصبح حاوية مرنة، وننسقه أيضًا أن ينقل المحتوى إلى سطر جديد إن كان طويلًا جدًا:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2263_20" style=""><span class="pln">fieldset </span><span class="pun">&gt;</span><span class="pln"> div </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">margin-bottom</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> flex</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">flex-flow</span><span class="pun">:</span><span class="pln"> row wrap</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يظهر تأثير هذا التنسيق بأن يكون العنوان وعنصر اﻹدخال ضمن سطرين منفصلين لأن كلاهما يمتد ليشمل كامل الاتساع المتاح له <code>width:100%</code>، وطالما أن للعنصر <code>&lt;span&gt;</code> له الاتساع <code>0</code>، سيقع على نفس سطر عنصر اﻹدخال. علينا اﻵن توليد المحتوى باستخدام CSS ووضعه بعد العنصر <code>&lt;span&gt;</code> الذي يأتي بعد عنصر إدخال مطلوب:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2263_22" style=""><span class="pln">input </span><span class="pun">+</span><span class="pln"> span </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">input</span><span class="pun">:</span><span class="pln">required </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">span</span><span class="pun">::</span><span class="pln">after </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.7rem</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">content</span><span class="pun">:</span><span class="pln"> </span><span class="str">"required"</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> black</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">26px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">left</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">70px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ضبطنا موقع العنصر <code>&lt;span&gt;</code> ليكون نسبيًا <code>position: relative</code> كي نتمكن من توليد محتوى توضُّعه مطلق <code>position: absolute</code> يمكن ضبط موقعه بالنسبة إلى العنصر <a href="https://wiki.hsoub.com/HTML/span" rel="external">&lt;span&gt; </a>(وضعه نسبي) وليس بالنسبة إلى العنصر <code>&lt;body&gt;</code> (إذ يعمل المحتوى المولد وكأنه أبن للعنصر الذي يولّد عليه وذلك لتوضيعه بالشكل المناسب).
</p>

<p>
	بعدها حددنا المحتوى المطلوب وهو العبارة "required مطلوب"، وكانت النتيجة كالتالي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="500" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/wvLOmyQ?default-tab=" style="width: 100%;" title="required-optional-generated">See the Pen required-optional-generated by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h2 id="-2">
	تنسيق عنصر التحكم وفقًا لصلاحية القيمة المدخلة
</h2>

<p>
	من المعايير اﻷساسية المهمة أيضًا في عملية التحقق من الاستمارات هو صحة القيم المدخلة (في حالة القيم العددية أو ضمن مجال محدد أو خارجه). أي يمكن استهداف عناصر تحكم النموذج التي لها قيم محدودة وفقًا لصلاحية هذه القيمة أو لا.
</p>

<h3 id="validinvalid">
	الصنفان <code>valid:</code> و <code>invalid:</code>
</h3>

<p>
	لاستخدام هذين الصنفين مع عناصر تحكم الاستمارة لا بد أن تتذكر أن:
</p>

<ul>
	<li>
		تُعد العناصر التي لا حدود لقيمتها، صالحة دائمًا، ويستهدفها الصنف <code>valid:</code>.
	</li>
	<li>
		تُعد العناصر المطلوبة <code>required</code> الفارغة التي لا تضم قيمًا غير صالحة، وسوف يستهدفها الصنفان <code>invalid:</code> و <code>required:</code>.
	</li>
	<li>
		تُعد العناصر التي تتحقق من القيم المدخلة إليها وفق نمط محدد مثل عناصر إدخال البريد اﻹلكتروني أو عنوان URL غير صالحة إن لم تتطابق البيانات المدخلة مع نمط التحقق الخاص بالعنصر لكنها صالحة عندما تكون فارغة.
	</li>
	<li>
		تُعد العناصر التي تتجاوز قيمتها المجال المحدد بقيمتي الخاصيتين <code>min</code> و <code>max</code> غير صالحة كما يستهدفها أيضًا الصنف <code>out-of-range:</code>.
	</li>
	<li>
		سنتعرف لاحقًا على طرق أخرى لجعل العنصر مستهدفًا من قبل الصنفين <code>valid:</code> و <code>invalid:</code> لكننا سنُبقي اﻷمر بسيطًا في هذا المقال.
	</li>
</ul>

<p>
	لنلق نظرة اﻵن على مثال يستخدم الصنفين الزائفين السابقين. وكما فعلنا في المثال السابق نستخدم عنصر <code>&lt;span&gt;</code> إضافي لتوليد المحتوى الذي يُستخدم للإشارة إن كان المحتوى صالحًا أم لا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2263_24" style=""><span class="tag">&lt;div&gt;</span><span class="pln">
 </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"fname"</span><span class="tag">&gt;</span><span class="pln">First name: </span><span class="tag">&lt;/label&gt;</span><span class="pln">
 </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"fname"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"fname"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">required</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
 </span><span class="tag">&lt;span&gt;&lt;/span&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	نستخدم شيفرة CSS التالية لعرض هذه المؤشرات:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2263_26" style=""><span class="pln">input </span><span class="pun">+</span><span class="pln"> span </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

input </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">span</span><span class="pun">::</span><span class="pln">before </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">right</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">input</span><span class="pun">:</span><span class="pln">invalid </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> solid red</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">input</span><span class="pun">:</span><span class="pln">invalid </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">span</span><span class="pun">::</span><span class="pln">before </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">content</span><span class="pun">:</span><span class="pln"> </span><span class="str">"✖"</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">input</span><span class="pun">:</span><span class="pln">valid </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">span</span><span class="pun">::</span><span class="pln">before </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">content</span><span class="pun">:</span><span class="pln"> </span><span class="str">"✓"</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> green</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ضبطنا موقع العنصر <code>&lt;span&gt;</code> ليكون نسبيًا <code>position: relative</code> كي نتمكن من توليد محتوى توضُّعه مطلق <code>position: absolute</code> بالنسبة للعنصر السابق. سيكون المحتوى إشارة <span class="ipsEmoji">❌</span> أو <span class="ipsEmoji">✅</span> ﻹظهار حالة طارئة يجدر متابعتها، كما أظهرنا إطارًا أحمر سميك ﻹظهار أن البيانات المدخلة غير صحيحة.
</p>

<p>
	<strong>ملاحظة</strong>: استخدمنا <code>before:</code> ﻹضافة هذه العناوين كما استخدمنا <code>after:</code> لوضع العنوان "required مطلوب".
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="500" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/gONEeqB?default-tab=" style="width: 100%;" title="valid-invalid">See the Pen valid-invalid by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	لاحظ كيف تكون عناصر اﻹدخال المطلوبة غير صالحة عندما تكون فارغة لكنها صالحة عندما ندخل فيها شيئًا ما. أما البريد اﻹلكتروني فهو صالح طالما أنه فارغ ويصبح غير صالح عندما لا تدخل عنوان بريد إلكتروني صحيح.
</p>

<h3 id="-3">
	بيانات داخل وخارج مجال محدد
</h3>

<p>
	يستهدف الصنفان <code>in-range:</code> و <code>out-of-range:</code> عناصر اﻹدخال العددية التي تقبل قيمًا ضمن مجال محدد تضبطه الخاصيتين <code>min</code> و <code>max</code> وذلك إن كانت القيمة المدخلة ضمن هذا المجال أو خارجه.
</p>

<p>
	<strong>ملاحظة</strong>: عناصر اﻹدخال العددية هي العناصر <code>date</code> و <code>month</code> و <code>week</code> و <code>time</code> و <code>datetime-local</code> و <code>number</code> و <code>range</code>.
</p>

<p>
	من الجدير ملاحظة أن القيم التي تقع ضمن المجال تستهدف من قبل الصنف <code>valid:</code> وإن كانت خارج المجال ستسهدف من قبل الصنف <code>invalid:</code>. هذا اﻷمر تحديدًا من الأمور الدلالية التي نهتم فيها بمدلول استخدام الصنف. فالصنف <code>out-of-range:</code> هو نوع ذو دلالة خاصة من أنواع عدم الصلاحية invalidation، فمن اﻷفضل في هذه الحالات إبلاغ المستخدم أنه أدخل قيمة خارج المجال بدلًا من أن تقول له أن القيمة غير صالحة وحسب، وقد ترغب في اﻹشارة إلى الحالتين معًا.
</p>

<p>
	لنلق نظرة على مثالنا عن القيم خارج المجال والذي بني على أساس المثال السابق لعرض رسالة خارج المجال للمدخلات العددية واﻹشارة إلى أن هذه القيمة مطلوبة أو لا.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2263_28" style=""><span class="tag">&lt;div&gt;</span><span class="pln">
 </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"age"</span><span class="tag">&gt;</span><span class="pln">Age (must be 12+): </span><span class="tag">&lt;/label&gt;</span><span class="pln">
 </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"age"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"age"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"number"</span><span class="pln"> </span><span class="atn">min</span><span class="pun">=</span><span class="atv">"12"</span><span class="pln"> </span><span class="atn">max</span><span class="pun">=</span><span class="atv">"120"</span><span class="pln"> </span><span class="atn">required</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
 </span><span class="tag">&lt;span&gt;&lt;/span&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	وستبدو تنسيقات CSS كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2263_30" style=""><span class="pln">input </span><span class="pun">+</span><span class="pln"> span </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

input </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">span</span><span class="pun">::</span><span class="pln">after </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.7rem</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">26px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">input</span><span class="pun">:</span><span class="pln">required </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">span</span><span class="pun">::</span><span class="pln">after </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> black</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">content</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Required"</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">left</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">70px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">input</span><span class="pun">:</span><span class="pln">out-of-range </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">span</span><span class="pun">::</span><span class="pln">after </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">155px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">content</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Outside allowable value range"</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">left</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">182px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نطبق هنا ما فعلناه سابقًا مع مثال <code>required:</code> مع اختلاف واحد هو أننا فصلنا هنا التصريحات التي تُطبق على أي محتوى مولّد بعد العنصر <code>after::</code> ضمن قاعدة خاصة، وأعطينا كل من الحالتين <code>required:</code> و <code>out-of-range:</code> محتوىً وتنسيقًا خاصًا بها:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="500" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/gONEeqB?default-tab=" style="width: 100%;" title="valid-invalid">See the Pen valid-invalid by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	فمن الممكن أن يكون الرقم المدخل مطلوبًا وخارج المجال في الوقت ذاته، فما الذي سيحدث عندها؟ طالما أن القاعدة <code>out-of-range:</code> تظهر بعد <code>required:</code> في الشيفرة المصدرية، ووفقًا لقواعد CSS، ستستخدم أولًا وتظهر رسالة <code>out-of-range</code>.
</p>

<p>
	يعمل هذا التنسيق جيدًا في الواقع. فعندما تحمل الصفحة للمرة الأولى ستظهر رسالة "required مطلوب" مع إشارة <span class="ipsEmoji">❌</span> وحواف حمراء لعنصر اﻹدخال، وعندما تدخل رقمًا ضمن المجال المسموح (12-120) تصبح القيم المدخلة صالحة، وإلا ستظهر الرسالة "Outside allowable value range خارج المجال المسموح" بدلًا من "required".
</p>

<p>
	<strong>ملاحظة</strong>: عليك النقر على عنصر التحكم وكتابة الرقم ضمنه لتجرب ما ذكرناه، ولن يسمح لك زر الزيادة واﻹنقاص الذي يظهر بتجاوز الحدود المسموحة.
</p>

<h2 id="-4">
	تنسيق عناصر اﻹدخال المعطلّة والمفعلة وعناصر القراءة فقط والكتابة فقط
</h2>

<p>
	العناصر المفعلة هي العناصر التي يمكن اختيارها أو نقرها أو الكتابة ضمنها، ويكون العنصر معطلًا إن لم يتمكن المستخدم من التفاعل معه بأي شكل، ولن ترسل بياناته إلى الخادم.
</p>

<p>
	يمكن استهداف العناصر وفقًا لتفعيلها من حلال الصنفين الزائفين <code>enabled:</code> و <code>disabled:</code>، لكن لماذا قد نستهدف عنصرًا معطلّا؟ إن لم تكن بيانات محددة ضرورية لبعض المستخدمين، فلن ترغب بإرسالها إلى الخادم عند إرسال الاستمارة. من اﻷمثلة على هذه الحالة استمارة شحن البضائع فقد يطلب منك وضع عنوان الدفع وعنوان وجهة البضاعة، وعندما يكون العنوان نفسه في الحالتين، عندها يمكن تعطيل حقل عنوان الدفع مثلًا.
</p>

<p>
	لنلق نظرة على مثال بسيط يوضح اﻷمر. ويضم المثل شيفرة HTML بسيطة تضم عناصر إدخال نصية وصندوق تحقق لتعطيل أو تفعيل عنوان الدفع الذي يكون معطلًا افتراضيًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2263_32" style=""><span class="tag">&lt;form&gt;</span><span class="pln">
 </span><span class="tag">&lt;fieldset</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"shipping"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;legend&gt;</span><span class="pln">Shipping address</span><span class="tag">&lt;/legend&gt;</span><span class="pln">
    </span><span class="tag">&lt;div&gt;</span><span class="pln">
     </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"name1"</span><span class="tag">&gt;</span><span class="pln">Name: </span><span class="tag">&lt;/label&gt;</span><span class="pln">
     </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"name1"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"name1"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">required</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div&gt;</span><span class="pln">
     </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"address1"</span><span class="tag">&gt;</span><span class="pln">Address: </span><span class="tag">&lt;/label&gt;</span><span class="pln">
     </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"address1"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"address1"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">required</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div&gt;</span><span class="pln">
     </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"pcode1"</span><span class="tag">&gt;</span><span class="pln">Zip/postal code: </span><span class="tag">&lt;/label&gt;</span><span class="pln">
     </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"pcode1"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"pcode1"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">required</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
 </span><span class="tag">&lt;/fieldset&gt;</span><span class="pln">
 </span><span class="tag">&lt;fieldset</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"billing"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;legend&gt;</span><span class="pln">Billing address</span><span class="tag">&lt;/legend&gt;</span><span class="pln">
    </span><span class="tag">&lt;div&gt;</span><span class="pln">
     </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"billing-checkbox"</span><span class="tag">&gt;</span><span class="pln">Same as shipping address:</span><span class="tag">&lt;/label&gt;</span><span class="pln">
     </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"billing-checkbox"</span><span class="pln"> </span><span class="atn">checked</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div&gt;</span><span class="pln">
     </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"name"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"billing-label disabled-label"</span><span class="tag">&gt;</span><span class="pln">Name: </span><span class="tag">&lt;/label&gt;</span><span class="pln">
     </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"name"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"name"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">disabled</span><span class="pln"> </span><span class="atn">required</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div&gt;</span><span class="pln">
     </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"address2"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"billing-label disabled-label"</span><span class="tag">&gt;</span><span class="pln">
      Address:
     </span><span class="tag">&lt;/label&gt;</span><span class="pln">
     </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"address2"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"address2"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">disabled</span><span class="pln"> </span><span class="atn">required</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div&gt;</span><span class="pln">
     </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"pcode2"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"billing-label disabled-label"</span><span class="tag">&gt;</span><span class="pln">
      Zip/postal code:
     </span><span class="tag">&lt;/label&gt;</span><span class="pln">
     </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"pcode2"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"pcode2"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">disabled</span><span class="pln"> </span><span class="atn">required</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
    </span><span class="tag">&lt;/div&gt;</span><span class="pln">
 </span><span class="tag">&lt;/fieldset&gt;</span><span class="pln">

 </span><span class="tag">&lt;div&gt;&lt;button&gt;</span><span class="pln">Submit</span><span class="tag">&lt;/button&gt;&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/form&gt;</span></pre>

<p>
	أما الجزء المتعلق بموضوعنا في <a href="https://academy.hsoub.com/programming/css/%D9%87%D9%8A%D9%83%D9%84%D9%8A%D8%A9-%D9%84%D8%BA%D8%A9-css-r2002/" rel="">شيفرة CSS</a> هو التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2263_34" style=""><span class="pln">input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"text"</span><span class="pun">]:</span><span class="pln">disabled </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#eee</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid </span><span class="lit">#ccc</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">disabled-label </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#aaa</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	اخترنا مباشرة عناصر اﻹدخال النصي المعطلة باستخدام <code>input[type="text"]:disabled</code>، لكننا نريد أيضًا إظهار العناوين المرتبطة بها بلون رمادي. وطالما أن استهدافها ليس سهلًا، استخدمنا صنفًا يطبق عليها <code>disabled-label.</code> كي تُستهدف.
</p>

<p>
	استخدمنا أخيرًا جافا سكريبت للتنقل بين حالتي التعطيل والتفعيل لحقول عنوان الدفع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2263_40" style=""><span class="com">// انتظر حتى تنهي الصفحة تحميلها</span><span class="pln">
document</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="pln">
 </span><span class="str">"DOMContentLoaded"</span><span class="pun">,</span><span class="pln">
 </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// إلى صندوق التحقق `change` إضافة مترصد الحدث</span><span class="pln">
    document
     </span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">"billing-checkbox"</span><span class="pun">)</span><span class="pln">
     </span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">"change"</span><span class="pun">,</span><span class="pln"> toggleBilling</span><span class="pun">);</span><span class="pln">
 </span><span class="pun">},</span><span class="pln">
 </span><span class="kwd">false</span><span class="pun">,</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> toggleBilling</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 </span><span class="com">// اختيار حقول عنوان الدفع</span><span class="pln">
 </span><span class="kwd">const</span><span class="pln"> billingItems </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelectorAll</span><span class="pun">(</span><span class="str">'#billing input[type="text"]'</span><span class="pun">);</span><span class="pln">
 </span><span class="com">// اختيار العناوين المرتبطة بحقول عنوان الدفع</span><span class="pln">
 </span><span class="kwd">const</span><span class="pln"> billingLabels </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelectorAll</span><span class="pun">(</span><span class="str">".billing-label"</span><span class="pun">);</span><span class="pln">

 </span><span class="com">// تغيير حالة التعطيل والتفعيل للحقول والعناوين</span><span class="pln">
 </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">let</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> billingItems</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    billingItems</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">disabled </span><span class="pun">=</span><span class="pln"> </span><span class="pun">!</span><span class="pln">billingItems</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">disabled</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">
     billingLabels</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">getAttribute</span><span class="pun">(</span><span class="str">"class"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="str">"billing-label disabled-label"</span><span class="pln">
    </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     billingLabels</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">"class"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"billing-label"</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     billingLabels</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">"class"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"billing-label disabled-label"</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
 </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تستخدم شيفرة جافا سكريبت مترصد للحدث <code>change</code> كي نسمح للمستخدم تعطيل أو تفعيل حقول عنوان الدفع وتغيير التنسيق العناوين المرتبطة بها في كل حالة.
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="600" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/jOjJzjO?default-tab=" style="width: 100%;" title="enabled-disabled-shipping">See the Pen enabled-disabled-shipping by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h3 id="readonlyreadwrite">
	استخدام الصنفين <code>read-only:</code> و <code>read-write:</code>
</h3>

<p>
	يستخدم الصنفان السابقان لاستهداف عناصر اﻹدخال وفقًا ﻹمكانية الكتابة والقراءة. فعناصر اﻹدخال المخصصة للقراءة فقط، سترسل محتواها إلى الخادم لكن المستخدم لن يتمكن من تعديلها. بينما يمكن للمستخدم تعديل محتوى العنصر في العناصر القابلة للقراءة والكتابة معًا.
</p>

<p>
	يمكن ضبط عنصر اﻹدخال ليكون مخصصًا للقراءة فقط باستخدام الخاصية <code>readonly</code>. وكمثال على ذلك، نفترض أن المطور قد صمم صفحة للتحقق من صحة جميع البيانات المدخلة. حيث تُنقل إليها جميع البيانات التي قدمها المستخدم حتى يتحقق منها دفعة واحدة ويؤكد الطلب قبل إرسالها إلى الخادم دفعة واحدة.
</p>

<p>
	لنلق نظرة اﻵن على الشكل التي قد تكون عليه الاستمارة، إليك جزءًا من شيفرة HTML يوضح استخدام الخاصية <code>readonly</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2263_42" style=""><span class="tag">&lt;div&gt;</span><span class="pln">
 </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"name"</span><span class="tag">&gt;</span><span class="pln">Name: </span><span class="tag">&lt;/label&gt;</span><span class="pln">
 </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"name"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"name"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"Mr Soft"</span><span class="pln"> </span><span class="atn">readonly</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	إن جربت المثال مباشرة قد تلاحظ أن عناصر الاستمارة العليا لا يمكن أن تتلقى تركيز الدخل، مع ذلك تُرسل قيمها عند تسليم النموذج. كما نسقنا النموذج بالاعتماد على الصنفين <code>read-only:</code> و <code>read-write:</code>
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2263_44" style=""><span class="kwd">input</span><span class="pun">:</span><span class="pln">read-only</span><span class="pun">,</span><span class="pln">
</span><span class="kwd">textarea</span><span class="pun">:</span><span class="pln">read-only </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">box-shadow</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">textarea</span><span class="pun">:</span><span class="pln">read-write </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">box-shadow</span><span class="pun">:</span><span class="pln"> inset </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">3px</span><span class="pln"> </span><span class="lit">#ccc</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يبدو المثال بشكله المكتمل كالتالي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="700" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/ZEdPoEp?default-tab=" style="width: 100%;" title="readonly-confirmation">See the Pen readonly-confirmation by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	<strong>ملاحظة</strong>: قد لا تستخدم الصنفين <code>enabled:</code> و <code>read-write:</code> إلا نادرًا كون الحالتين الموافقتين لهما (التفعيل والقراءة والكتابة) هي الحالات الافتراضية للعناصر.
</p>

<h2 id="-5">
	تنسيق صناديق التحقق وأزرار الاختيار المتعدد وفق حالاتها
</h2>

<p>
	يمكن لصناديق التحقق وأزرار الاختيار المتعدد أن تكون مفعلة أو غير مفعلة أو معطلة، لكن هنالك عدة حالات يمكن النظر إليها:
</p>

<ul>
	<li>
		<code>default:</code>: وهو صنف يستهدف الحالة التي يكون فيها العنصر مفعلًا افتراضيًا عند تحميل الصفحة أي استُخدمت ضمنه الخاصية <code>checked</code>. وتبقى هذه العناصر مستهدفة حتى لو ألغى المستخدم تفعيلها.
	</li>
	<li>
		<code>indeterminate:</code> إن لم يكن صندوق التحقق أو زر الاختيار مفعلًا أو غير مفعل، سنتمكن من استهدافه باستخدام هذا الصنف الزائف.
	</li>
</ul>

<h3 id="checked">
	الصنف <code>checked:</code>
</h3>

<p>
	عندما يفعّل عنصر التحقق أو زر الاختيار سيستهدفه الصنف <code>checked:</code>. يشيع استخدام هذا الصنف عندما تُفعّل هذه العناصر، وخاصة عندما تزيل التنسيق الافتراضي باستخدام <code>appearance:none</code> وتريد تنسيقه بنفسك، وقد رأينا أمثلة في<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AA%D9%82%D8%AF%D9%85-%D9%84%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2404/" rel=""> المقال السابق</a> عن هذا الاستخدام.
</p>

<p>
	وإذا عدنا إلى مثال تنسيق أزرار الاختيار المتعدد في مقال "<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AA%D9%82%D8%AF%D9%85-%D9%84%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2404/" rel="">التنسيق المتقدم لاستمارات الويب</a>"، سنرى أننا استخدمنا الشيفرة التالية في التنسيق:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2263_46" style=""><span class="pln">input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"radio"</span><span class="pun">]::</span><span class="pln">before </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">content</span><span class="pun">:</span><span class="pln"> </span><span class="str">" "</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">6px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.2em</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">transform</span><span class="pun">:</span><span class="pln"> translate</span><span class="pun">(</span><span class="lit">3px</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3px</span><span class="pun">)</span><span class="pln"> scale</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);</span><span class="pln">
 </span><span class="kwd">transform-origin</span><span class="pun">:</span><span class="pln"> center</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">transition</span><span class="pun">:</span><span class="pln"> all </span><span class="lit">0.3s</span><span class="pln"> ease-in</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"radio"</span><span class="pun">]:</span><span class="kwd">checked</span><span class="pun">::</span><span class="pln">before </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">transform</span><span class="pun">:</span><span class="pln"> translate</span><span class="pun">(</span><span class="lit">3px</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3px</span><span class="pun">)</span><span class="pln"> scale</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
 </span><span class="kwd">transition</span><span class="pun">:</span><span class="pln"> all </span><span class="lit">0.3s</span><span class="pln"> cubic-bezier</span><span class="pun">(</span><span class="lit">0.25</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.25</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.56</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بإمكانك تجربتها في اﻹطار التالي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="250" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/NWZJMaG?default-tab=" style="width: 100%;" title="radios-styled">See the Pen radios-styled by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	لقد نسقنا في تلك الشيفرة مظهر الدائرة الداخلية التي تظهر ضمن أزرار الاختيار المتعدد باستخدام العنصر الزائف <code>before::</code> ثم طبقنا تحويلًا باستخدام الخاصية <code>transform</code> قيمته <code>(scale(0</code>. ومن ثم طبقنا انتقالًا <code>transition</code> لتوليد محتوى متحرك ضمن الزر عندما يُفعَّل أو يُلغى تفعيله. إن ميزة استخدام التحويل بدلًا من تطبيق انتقال على الارتفاع والاتساع هو إمكانية استخدام الخاصية <code>transform-origin</code> حتى يبدأ الرسم المتحرك من مركز الدائرة ثم ينمو وليس من طرف الدائرة ثم يقفز بعدها إلى المركز. أما الارتداد الخفيف للدائرة نحو المركز فكان باستخدام <a href="https://academy.hsoub.com/programming/javascript/%25D9%2585%25D9%2586%25D8%25AD%25D9%2586%25D9%2589-%25D8%25A8%25D9%258A%25D8%25B2%25D9%258A%25D9%2587-%25D9%2588%25D8%25A3%25D9%2587%25D9%2585%25D9%258A%25D8%25AA%25D9%2587-%25D9%2581%25D9%258A-%25D8%25A7%25D9%2584%25D8%25B1%25D8%25B3%25D9%2588%25D9%2585%25D9%258A%25D8%25A7%25D8%25AA-%25D9%2588%25D8%25B5%25D9%2586%25D8%25A7%25D8%25B9%25D8%25A9-%25D8%25A7%25D9%2584%25D8%25AD%25D8%25B1%25D9%2583%25D8%25A7%25D8%25AA-%25D9%2581%25D9%258A-%25D8%25AC%25D8%25A7%25D9%2581%25D8%25A7%25D8%25B3%25D9%2583%25D8%25B1%25D8%25A8%25D8%25AA-r1339/&amp;ved=2ahUKEwj_3JzO2pGGAxWKBfsDHanPAhoQFnoECCcQAQ&amp;usg=AOvVaw1DbGWk4McP9dLiXKdYPAgU" rel="">تابع بيزيه التكعيبي</a>.
</p>

<h3 id="defaultindeterminate">
	الصنفان <code>default:</code> و <code>indeterminate:</code>
</h3>

<p>
	يستهدف الصنف <code>default:</code> عناصر التحقق وأزرار الاختيار المتعدد في الحالة التي تكون فيها مفعلةً افتراضيًا عند تحميل الصفحة حتى لو نقرها المستخدم بعد ذلك. وقد يكون استخدامها مفيدًا في الحالات التي نريد فيها اﻹشارة إلى الخيارات المفعلة افتراضيًا كي يتذكرها المستخدم في حال أراد أن يعيد العناصر إلى وضعها الأصلي.
</p>

<p>
	كما يستهدف الصنف الزائف <code>indeterminate:</code> تلك العناصر عندما تكون غير محددة الحالة أو عائمة أي ليست مفعلة وليست غير مفعلة، ونصادف هذه الحالة عندما:
</p>

<ul>
	<li>
		عندما تكون جميع أزرار التحقق في نفس المجموعة غير مفعلّة.
	</li>
	<li>
		عندما تُضبط الخاصية <code>indeterminate</code> لصندوق التحقق على القيمة <code>true</code>.
	</li>
	<li>
		العناصر <code><a href="https://wiki.hsoub.com/HTML/progress" rel="external">&lt;progress&gt;</a></code> التي ليس لها قيمة.
	</li>
</ul>

<p>
	قد لا تستخدم هذا الصنف كثيرًا، وأكثر الحالات الواضحة الاستخدام هي تذكير المستخدم بضرورة النقر على أحد خيارات قائمة قبل الانتقال إلى مكان آخر.
</p>

<p>
	سنلقي نظرة اﻵن على نسختين مختلفتين من المثال السابق، اﻷولى تذكر المستخدم ما هي الخيارات التي كانت مفعلة افتراضيًا والثانية ننسق فيها عناوين أزرار الاختيار المتعدد عندما تكون في الحالة غير المحددة. ولكلتا النسختين شيفرة HTML التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2263_48" style=""><span class="tag">&lt;p&gt;</span><span class="pln">
 </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"radio"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"fruit"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"cherry"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"cherry"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
 </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"cherry"</span><span class="tag">&gt;</span><span class="pln">Cherry</span><span class="tag">&lt;/label&gt;</span><span class="pln">
 </span><span class="tag">&lt;span&gt;&lt;/span&gt;</span><span class="pln">
</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	أضفنا في النسخة اﻷولى الخاصية <code>checked</code> إلى زر الاختيار الأوسط الذي سيكون مختارًا بشكل افتراضي عند تحميل الصفحة، وننسقه كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2263_50" style=""><span class="pln">input </span><span class="pun">~</span><span class="pln"> span </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">input</span><span class="pun">:</span><span class="pln">default </span><span class="pun">~</span><span class="pln"> </span><span class="kwd">span</span><span class="pun">::</span><span class="pln">after </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.7rem</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">content</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Default"</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> black</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">right</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">65px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">3px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تولد هذه الشيفرة محتوى نصي عنوانه "Default" إلى جوار العنصر الذي كان مختارًا افتراضيًا عند تحميل الصفحة. لاحظ كيف استخدمنا <a href="https://academy.hsoub.com/programming/css/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D9%85%D8%AD%D8%AF%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D9%81%D9%8A-css-r2044/" rel="">محدد التجميع</a> (<code>~</code>) الذي <a href="https://wiki.hsoub.com/CSS/Adjacent_sibling_combinator" rel="external">يستهدف الأشقاء</a> بدلًا من محدد التجميع (<code>+</code>) الذي <a href="https://wiki.hsoub.com/CSS/Adjacent_sibling_combinator" rel="external">يستهدف أشقاء متجاورين</a>، ذلك أن العنصر <code>&lt;span&gt;</code> لا يأتي بالضرورة بعد العنصر <code>&lt;input&gt;</code> مباشرة في ترتيب الشيفرة المصدرية. إليك نتيجة الشيفرة:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/RwzdyoE?default-tab=" style="width: 100%;" title="radios-checked-default">See the Pen radios-checked-default by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	لم نختر زر افتراضي في النسخة الثانية من المثال، لأننا لن نحصل هكذا على حالة عائمة أو غير محددة للأزرار يمكن استهدافها بتنسيق معين. إليك شيفرة CSS المستخدمة في التنسيق:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_2263_54" style=""><span class="pln">input</span><span class="pun">[</span><span class="pln">type</span><span class="pun">=</span><span class="str">"radio"</span><span class="pun">]:</span><span class="pln">indeterminate </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">outline</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> solid red</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">animation</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.4s</span><span class="pln"> linear infinite alternate outline-pulse</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">@</span><span class="pln">keyframes outline-pulse </span><span class="pun">{</span><span class="pln">
 from </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">outline</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> solid red</span><span class="pun">;</span><span class="pln">
 </span><span class="pun">}</span><span class="pln">

 to </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">outline</span><span class="pun">:</span><span class="pln"> </span><span class="lit">6px</span><span class="pln"> solid red</span><span class="pun">;</span><span class="pln">
 </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تعطي الشيفرة السابقة أسلوبًا رسوميًا لطيفًا للإشارة أنك لم تختر أي زر من اﻷزار، على أمل أن تنتبه وتختار أحدها. إليك نتيجة هذا المثال:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="250" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/wvLOjdv?default-tab=" style="width: 100%;" title="radios-checked-indeterminate">See the Pen radios-checked-indeterminate by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h2 id="-6">
	أصناف زائفة أخرى
</h2>

<p>
	لنتحدث قليًلا عن بعض اﻷصناف التي لم نغطيها لكنها تستحق الوقت الذي قد تقضيه في الاطلاع عليها:
</p>

<ul>
	<li>
		<code>focus-within:</code>: يستهدف العنصر الذي يتلقى تركيز الدخل أو الذي يضم عنصرًا تلقى تركيز الدخل. ويستخدم مثلًا إن أردت اﻹشارة إلى استمارة تلقى أحد عناصرها تركيز الدخل.
	</li>
	<li>
		<code>focus-visible:</code>: يستهدف العناصر التي تلقت تركيز الدخل عبر لوحة المفاتيح (بدلًا من النقر بالفأرة)، ولهذا الصنف فائدته إن أردت التمييز بين الحالتين.
	</li>
	<li>
		<code>placeholder_shown:</code>: ويستهدف العناصر التي تعرض حدود موضعها المؤقت placeholder وذلك عندما تستخدم الخاصية <code>placeholder</code>.
	</li>
</ul>

<p>
	وهذه الأصناف مميزة أيضًا لكنها غير مدعومة جيدًا من قبل المتصفحات:
</p>

<ul>
	<li>
		<p>
			<code>blank:</code>: يستهدف عناصر التحكم الفارغة (التي لا تضم محتوى).
		</p>
	</li>
	<li>
		<p>
			<code>empty:</code>: يستهدف العناصر التي لا تضم أبناءً وبالتالي تستهدف أيضًا العناصر الخالية void elements التي لا يمكن أن تضم أبناء أصلًا مثل عناصر <code>&lt;input&gt;</code> و <code>&lt;hr&gt;</code>. وتعد أكثر دعمًا من سابقتها، لأن <code>blank:</code> صنف لا يزال في فترة إعداد التوصيفات الخاصة به ولم يُدعم بعد.
		</p>
	</li>
	<li>
		<p>
			<code>user-invaild:</code>: سيكون مشابهًا -عندما يُدعم- للصنف <code>invaild:</code> لكنه سيقدم تجربة مستخدم أفضل. فعندما تكون القيمة المدخلة صالحة عندما يتلقى العنصر التركيز، قد يستهدفه الصنف <code>invaild:</code> وكذلك عندما يدخل المستخدم قيمة غير صالحة مؤقتًا. بينما سيستهدف الصنف <code>user-invaild:</code> العنصر إن كانت القيمة المدخلة غير صالحة وفقد العنصر تركيز الدخل. وإذا كانت القيمة غير صالحة أصلًا، يستهدف كلا الصنفين العنصر طالما أنه يحتفظ بتركيز الدخل. وسيتوقف استهداف العنصر من كلا الصنفين عندما تصبح القيمة صالحة.
		</p>
	</li>
</ul>

<h2 id="-7">
	الخلاصة
</h2>

<p>
	لقد أنهينا في هذا المقال اﻹطلاع على اﻷصناف الزائفة التي تستهدف عناصر واجهة المستخدم وخاصة الاستمارات. يبقى عليك متابعة التجربة والعمل على هذه اﻷصناف لتألف طريقة استهدافها للعناصر وبالتالي تطبيق التنسيق المطلوب عليها.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="https://developer.mozilla.org/en-US/docs/Learn/Forms/UI_pseudo-classes" rel="external nofollow">UI pseudo-classes</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AA%D9%82%D8%AF%D9%85-%D9%84%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2404/" rel="">التنسيق المتقدم لاستمارات الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AD%D8%AF%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D8%A7%D9%84%D8%B2%D8%A7%D8%A6%D9%81%D8%A9-pseudo-classes-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%B2%D8%A7%D8%A6%D9%81%D8%A9-pseudo-elements-%D9%81%D9%8A-css-r2124/" rel="">محددات الأصناف الزائفة pseudo-classes والعناصر الزائفة pseudo-elements في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/5-%D9%81%D8%A6%D8%A7%D8%AA-%D8%B2%D8%A7%D8%A6%D9%81%D8%A9-pseudo-class-%D9%8A%D8%AC%D8%A8-%D8%B9%D9%84%D9%8A%D9%83-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87%D8%A7-%D9%81%D9%8A-css-r189/" rel="">5 أصناف زائفة (pseudo-class) يجب عليك معرفتها في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D9%85%D8%AD%D8%AF%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D9%81%D9%8A-css-r2044/" rel="">أنواع محددات التنسيق في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D9%81%D9%8A-html5-%D9%85%D8%B9-%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D8%A7%D9%84%D8%B2%D9%91%D8%A7%D8%A6%D9%81%D8%A9-pseudo-classes-%D9%81%D9%8A-css3-r25/" rel="">استخدام النماذج في HTML5 مع الأصناف الزّائفة (pseudo-classes) في CSS</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2405</guid><pubDate>Sun, 22 Sep 2024 15:00:00 +0000</pubDate></item><item><title>&#x62A;&#x646;&#x633;&#x64A;&#x642; &#x627;&#x633;&#x62A;&#x645;&#x627;&#x631;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; CSS</title><link>https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2402/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_09/--.png.865633398c6a7a1393aef78249191814.png" /></p>
<p>
	بدأنا في مقال سابق التعرف على استمارات الويب <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-web-forms-r2368/" rel="">web forms</a> وطريقة بنائها باستخدام عناصر <code>&lt;HTML&gt;</code>، وسنتعلم في هذا المقال كيفية تنسيق هذه الاستمارات بصورة احترافية باستخدام CSS.
</p>

<p>
	ننصحك قبل المتابعة في قراءة هذا المقال الاطلاع على <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">أساسيات HTML</a> وعلى <a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">أساسيات تنسيق الصفحات باستخدام CSS</a>.
</p>

<h2 id="">
	تحديات تنسيق عناصر تحكم الاستمارة
</h2>

<p>
	أُدخلت عناصر تحكم الاستمارات في مواصفات HTML2 عام 1995، لكن لم تظهر <a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">لغة CSS</a> حتى أواخر عام 1996، ولم تكن مدعومة من معظم المتصفحات حتى السنوات اللاحقة. لهذا السبب، اعتمدت المتصفحات على أنظمة التشغيل لعرض أو تصيير render عناصر التحكم.
</p>

<p>
	وحتى بعد ظهور CSS، تجاهل منتجو المتصفحات في البداية دعم تنسيق عناصر التحكم، لأن المستخدمين اعتادوا على مظهرها ضمن متصفحاتهم. أما حاليًا فقد تغير اﻷمر، ومعظم عناصر التحكم قابلة للتنسيق مع بعض الاستثناءات.
</p>

<h3 id="-1">
	أنواع عناصر التحكم
</h3>

<p>
	تُصتف عناصر التحكم وفقًا لسهولة تنسيقها إلى:
</p>

<h4 id="-2">
	عناصر سهلة التنسيق
</h4>

<p>
	نذكر منها:
</p>

<ol>
	<li>
		عنصر الاستمارة <code><a href="https://wiki.hsoub.com/HTML/form" rel="external">&lt;form&gt;</a></code>
	</li>
	<li>
		عناصر تجميع الحقول <code><a href="https://wiki.hsoub.com/HTML/fieldset" rel="external">&lt;fieldset&gt;</a></code> و <code><a href="https://wiki.hsoub.com/HTML/legend" rel="external">&lt;legend&gt;</a></code>
	</li>
	<li>
		عناصر اﻹدخال وحيدة السطر <code><a href="https://wiki.hsoub.com/HTML/input" rel="external">&lt;input&gt;</a></code> مثل text و url و email (ماعدا search).
	</li>
	<li>
		حقل الإدخال متعدد الأسطر <code><a href="https://wiki.hsoub.com/HTML/textarea" rel="external">&lt;textarea&gt;</a></code>
	</li>
	<li>
		اﻷزرار الفعلية <code><a href="https://wiki.hsoub.com/HTML/button" rel="external">&lt;button&gt;</a></code> وأزرار الإدخال <code><a href="https://wiki.hsoub.com/HTML/input/button" rel="external">&lt;input&gt;</a></code>.
	</li>
	<li>
		عنصر التسمية <code><a href="https://wiki.hsoub.com/HTML/label" rel="external">&lt;label&gt;</a></code>
	</li>
	<li>
		عنصر الإخراج <code><a href="https://wiki.hsoub.com/HTML/output/" rel="external">&lt;output&gt;</a></code>
	</li>
</ol>

<h4 id="-3">
	عناصر صعبة التنسيق
</h4>

<ul>
	<li>
		صناديق التحقق <a href="https://wiki.hsoub.com/HTML/input/checkbox" rel="external">checkboxes</a> وأزرار الاختيار من متعدد <a href="https://wiki.hsoub.com/HTML/input/radio" rel="external">radio buttons</a>.
	</li>
	<li>
		عنصر اﻹدخال <code><a href="https://wiki.hsoub.com/HTML/input/" rel="external">&lt;input&gt;</a></code> من النوع <code><a href="https://wiki.hsoub.com/HTML/input/search" rel="external">search</a></code>.
	</li>
</ul>

<p>
	سنعرض طريقة تنسيقها في <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D8%AA%D9%82%D8%AF%D9%85-%D9%84%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2404/" rel="">مقال لاحق</a>.
</p>

<h4 id="css-1">
	عناصر لها تنسيق داخلي ولا يمكن تنسيقها باستخدام CSS وحدها
</h4>

<ul>
	<li>
		حقل اﻹدخال من النوع <a href="https://wiki.hsoub.com/HTML/input/color" rel="external">color</a>.
	</li>
	<li>
		حقل اﻹدخال من النوع <a href="https://wiki.hsoub.com/HTML/input/datetime-local" rel="external">datetime</a>.
	</li>
	<li>
		حقل اﻹدخال من النوع <a href="https://wiki.hsoub.com/HTML/input/range" rel="external">range</a>.
	</li>
	<li>
		عنصر اﻹدخال من النوع <a href="https://wiki.hsoub.com/HTML/input/file" rel="external">file</a>.
	</li>
	<li>
		عناصر إنجاز قوائم منسدلة مثل <code><a href="https://wiki.hsoub.com/HTML/select" rel="external">&lt;select&gt;</a></code> و <code><a href="https://wiki.hsoub.com/HTML/option" rel="external">&lt;option&gt;</a></code> و <code><a href="https://wiki.hsoub.com/HTML/optgroup" rel="external">&lt;optgroup&gt;</a></code>.
	</li>
	<li>
		عنصر إنجاز أشرطة التقدم مثل <code><a href="https://wiki.hsoub.com/HTML/meter" rel="external">&lt;meter&gt;</a></code> و <code><a href="https://wiki.hsoub.com/HTML/progress" rel="external">&lt;progress&gt;</a></code>.
	</li>
</ul>

<p>
	فعنصر اختيار التاريخ أو الزر الذي يعرض قائمة العناصر ضمن العنصر <code><a href="https://wiki.hsoub.com/HTML/select" rel="external">&lt;select&gt;</a></code> لا يمكن تنسيقهما باستخدام CSS لوحدها. سنرى لاحقًا في مقال قادم طريقة تنسيق هذه العناصر.
</p>

<p>
	<strong>ملاحظة</strong>: يمكن لبعض <a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AD%D8%AF%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D8%A7%D9%84%D8%B2%D8%A7%D8%A6%D9%81%D8%A9-pseudo-classes-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%B2%D8%A7%D8%A6%D9%81%D8%A9-pseudo-elements-%D9%81%D9%8A-css-r2124/" rel="">عناصر التنسيق الزائفة</a> في CSS تنسيق مثل هذه العناصر، نذكر منها <code>moz-range-track-::</code> لكنها غير مدعومة في جميع المتصفحات لهذا لا يمكن الاعتماد عليها.
</p>

<h2 id="-4">
	تنسيق عناصر تحكم استمارة بسيطة
</h2>

<p>
	باﻹمكان الاستفادة من تقنيات التنسيق التي عرضناها في المقالين "<a href="https://academy.hsoub.com/programming/css/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A8%D8%B3%D9%8A%D8%B7-%D9%84%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%A5%D8%B1%D8%B3%D8%A7%D9%84-%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA%D9%87%D8%A7-%D9%84%D9%84%D8%AE%D8%A7%D8%AF%D9%85-r2369/" rel="">تنسيق استمارة ويب بسيطة</a>" و "<a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css-r1688/" rel="">أساسيات لغة CSS</a>" في تنسيق العناصر سهلة التنسيق، كما ستجد محددات تنسيق selectors مخصصة تُدعى <a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AD%D8%AF%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D8%A7%D9%84%D8%B2%D8%A7%D8%A6%D9%81%D8%A9-pseudo-classes-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%B2%D8%A7%D8%A6%D9%81%D8%A9-pseudo-elements-%D9%81%D9%8A-css-r2124/" rel="">أصناف واجهة المستخدم الزائفة</a> UI pseudo classes تمكنك من تنسيق العناصر وفقًا للحالة الراهنة لواجهة المستخدم.
</p>

<p>
	سنعمل على مثال تطبيقي خلال بقية أقسام المقال، لكن سنناقش أولًا بعض جوانب تنسيق الاستمارات التي يُفضل الاطلاع عليها.
</p>

<h3 id="-5">
	النصوص والخطوط
</h3>

<p>
	يمكن تنسيق النصوص والخطوط بسهولة في عناصر التحكم ويمكنك أيضًا استخدام <code><a href="https://wiki.hsoub.com/CSS/@font-face" rel="external">font-face@</a></code>. لكن سلوك المتصفحات ليس متماثلًا. فلا ترث بعض عناصر التحكم الخاصية <code><a href="https://wiki.hsoub.com/CSS/font-family" rel="external">font-family</a></code> و <code><a href="https://wiki.hsoub.com/CSS/font-size" rel="external">font-size</a></code> افتراضيًا من العنصر اﻷب، وتستخدم بعض المتصفحات المظهر الافتراضي لنظام التشغيل. لهذا، ولكي تجعل الاستمارة متناسقة مع باقي المحتوى، بإمكانك إضافة القواعد التالية ضمن ورقة التنسيق:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5293_10" style=""><span class="pln">button</span><span class="pun">,</span><span class="pln">
input</span><span class="pun">,</span><span class="pln">
select</span><span class="pun">,</span><span class="pln">
textarea </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">inherit</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تضبط القيمة <code>inherit</code> القيمة المحسوبة للخاصية لتعادل قيمة نفس الخاصية للعنصر اﻷب، أي ترث قيمة الخاصية من العنصر اﻷب.
</p>

<p>
	توضح لقطة الشاشة التالية الفرق. على اليسار المظهر الافتراضي للعناصر <code>&lt;"input type = "text&gt;</code> و <code>&lt;"input type = "date&gt;</code> و <code>&lt;select&gt;</code> و <code>&lt;textarea&gt;</code> و <code>&lt;button&gt;</code> و <code>&lt;input "type = "submit&gt;</code> في متصفح كروم على ماك أو إس وفقًا للتنسيق الافتراضي للنظام، وعلى اليمين نفس العناصر وقد طبقنا عليها قواعد التنسيق السابقة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="157343" href="https://academy.hsoub.com/uploads/monthly_2024_09/01_forms_fontfamily.png.62812fe5b1545e38aa688b09648ee87a.png" rel=""><img alt="01 forms fontfamily" class="ipsImage ipsImage_thumbnailed" data-fileid="157343" data-unique="gvzjyak16" src="https://academy.hsoub.com/uploads/monthly_2024_09/01_forms_fontfamily.png.62812fe5b1545e38aa688b09648ee87a.png"> </a>
</p>

<p>
	يختلف التنسيق الافتراضي من نواحٍ عدة، <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%82%D8%A8-%D9%88%D8%A7%D9%84%D8%AA%D8%AE%D8%B5%D9%8A%D8%B5-%D9%88%D8%A7%D9%84%D9%88%D8%B1%D8%A7%D8%AB%D8%A9-%D9%81%D9%8A-css-r2042/" rel="">فالوراثة</a> تجعل الخط المستخدم هو نفسه خط العنصر اﻷب. وفي حالتنا كان الخط الافتراضي serif للعنصر اﻷب، وقد طُبقت القاعدة على جميع العناصر ما عدا استثناء وحيد هو العنصر <code>&lt;"input type = "submit&gt;</code> الذي لم يرث تنسيق العنصر اﻷب في متصفح كروم. وقد استخدم المتصفح بدلًا من ذلك القاعدة <code>font-family: system-ui</code>، لهذا من اﻷفضل استخدام العنصر <code><a href="https://wiki.hsoub.com/HTML/button" rel="external">&lt;button&gt;</a></code> بدلًا من عنصر اﻹدخال <code><a href="https://wiki.hsoub.com/HTML/input" rel="external">&lt;input&gt;</a></code> المكافئ.
</p>

<p>
	لا يزال الجدل قائمًا بين أفضلية ترك تنسيق النماذج مطابقًا للتنسيق الافتراضي للنظام، أو تنسيقها بما يلائم المحتوى، والقرار يعود لك دائمًا.
</p>

<h3 id="-6">
	تحديد أبعاد الصندوق
</h3>

<p>
	تدعم العناصر النصية جميع الخاصيات التعلقة <a href="https://academy.hsoub.com/programming/css/%D8%AF%D9%84%D9%8A%D9%84-%D9%85%D8%AE%D8%AA%D8%B5%D8%B1-%D8%A5%D9%84%D9%89-%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%A7%D9%84%D8%B5%D9%86%D8%AF%D9%88%D9%82-box-model-%D9%81%D9%8A-%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-css-r2126/" rel="">بنموذج الصندوق في CSS</a> مثل الاتساع <code>width</code> والارتفاع <code>height</code> والحاشية <code>padding</code> والهوامش <code>margin</code> والحواف <code>border</code>. وكما ذكرنا ، يعتمد المتصفح على نظام التشغيل في تنسيق عناصر التحكم وعرضها، ويعود اﻷمر إليك في اختيار ما يناسب المحتوى في صفحتك. وإن قررت أن تستخدم نظام التنسيق الافتراضي، فقد تواجه بعض المشاكل عندما تحاول جعل أبعاد العناصر متناسقةً، وذلك لأن لكل عنصر تحكم قواعد خاصة في ضبط الحواف والحاشية والهوامش. وﻹعطاء نفس اﻷبعاد لجميع عناصر التحكم، استخدم الخاصية <code>box-sizing</code> مع بعض القيم المتناسقة لبقية الخاصيات:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5293_12" style=""><span class="pln">input</span><span class="pun">,</span><span class="pln">
textarea</span><span class="pun">,</span><span class="pln">
select</span><span class="pun">,</span><span class="pln">
button </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">150px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">box-sizing</span><span class="pun">:</span><span class="pln"> border-box</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تعرض لقطة الشاشة التالية التصيير الافتراضي للعناصر:<code>&lt;"input type="radio&gt;</code> و <code>&lt;"input type="checkbox&gt;</code> و <code>&lt;"input type="range&gt;</code> و <code>&lt;"input type="text&gt;</code> و <code>&lt;"inputtype="date"&gt;</code> و <code>&lt;select&gt;</code> و <code>&lt;textarea&gt;</code> و <code>&lt;"input type="submit&gt;</code> و <code>&lt;button&gt;</code> على يسار الشاشة، ويعرض نفس العناصر على يمين الشاشة بعد تطبيق قواعد التنسيق السابقة عليها. لاحظ كيف تبدو العناصر إلى اليمين وكأنها تشغل نفس المساحة بغض النظر عن قواعد التنسيق الافتراضية لنظام التشغيل:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="157344" href="https://academy.hsoub.com/uploads/monthly_2024_09/02_boxmodel_formcontrols1.png.17c85b4080ae1ceda1ab8f0e79d711d9.png" rel=""><img alt="02 boxmodel formcontrols1" class="ipsImage ipsImage_thumbnailed" data-fileid="157344" data-unique="egzrkr6ph" src="https://academy.hsoub.com/uploads/monthly_2024_09/02_boxmodel_formcontrols1.png.17c85b4080ae1ceda1ab8f0e79d711d9.png"> </a>
</p>

<p>
	ما قد لا يكون واضحًا في اللقطة السابقة هو زر الاختيار المتعدد وصندوق التحقق إذا يبدوان متشابهين في كلتا الحالتين، لكنهما يتمركزان في وسط المساحة التي يشغلانها والتي تحددها قيمة الخاصية <code>width</code>(هنا 150 بكسل). قد لا توضِّع متصفحات أخرى هذه العناصر في المنتصف لكنها تتقيد بالمساحة المحددة.
</p>

<h3 id="legends">
	إزاحة العلامات Legends
</h3>

<p>
	باﻹمكان تنسيق عنصر العلامة <code><a href="https://wiki.hsoub.com/HTML/legend" rel="external">&lt;legend&gt;</a></code>، لكن من الصعب إزاحته بالنسبة لموضعه اﻷصلي. يتوضع العنصر تلقائيًا قرب الزاوية اليسارية العليا للعنصر اﻷب، ولوضعه في مكان آخر، كأن يكون ضمن عنصر <code><a href="https://wiki.hsoub.com/HTML/fieldset" rel="external">&lt;fieldset&gt;</a></code> أو قرب الزاوية اليسارية السفلى، عليك أن تعتمد في هذه الحالة على خاصيات التوضّع positioning. إليك مثالًا:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="450" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/JjQzvgw?default-tab=" style="width: 100%;" title="styling-web-forms">See the Pen styling-web-forms by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	لكي نضع العلامة في المكان الذي تعرضه الشيفرة السابقة، استخدمنا قواعد التنسيق التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5293_14" style=""><span class="pln">fieldset </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

legend </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">bottom</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ينبغي أيضًا تحديد موضع العنصر <code>&lt;fieldset&gt;</code> أيضًا وبالتالي سيُحدد موضع العلامة بالنسبة إلى هذا العنصر. وإن لم نفعل ذلك سيوضِّع المتصفح العلامة بالنسبة إلى العنصر <code>&lt;body&gt;</code>.
</p>

<p>
	وللعنصر <code>&lt;legend&gt;</code> أهمية كبيرة عند أخذ سهولة الوصول بعين الاعتبار، إذ ستقرأ التقنيات المساعدة محتوى العلامة كجزء من عنوان كل عنصر تحكم ضمن <code>&lt;fieldset&gt;</code>. لن يغير التنسيق السابق شيئًا من ناحية سهولة الوصول، إذ ستُقرأ العلامة بنفس الطريقة.
</p>

<p>
	<strong>ملاحظة</strong>: بإمكانك أيضًا استخدام الخاصية <code>transform</code> لتساعدك في تحديد موضع العنصر <code>&lt;legend&gt;</code>. فإن استخدمت القاعدة <code>;()transform: translateY</code> مثلًا، ستتحرك العلامة فعلًا لكنها ستترك خلفها فراغًا مزعجًا لا يسهل التخلص منه ضمن العنصر <code>&lt;fieldset&gt;</code>.
</p>

<h2 id="-7">
	تمرين تطبيقي: تنسيق مخصص لاستمارة ويب
</h2>

<p>
	لنلق نظرة اﻵن على تمرين أساسي يعرض تنسيق استمارات HTML، نبني فيه استمارة اتصال لها شكل بطاقة بريدية جميلة المظهر. بإمكانك الاطلاع على <a href="https://mdn.github.io/learning-area/html/forms/postcard-example/" rel="external nofollow">النسخة الكاملة من التمرين</a> على جت-هاب.
</p>

<p>
	إما إن أردت العمل معنا خطوة خطوة، لا بد من إنشاء نسخة محلية من <a href="https://github.com/mdn/learning-area/blob/main/html/forms/postcard-example/postcard-start.html" rel="external nofollow">ملف التمرين</a> على جهازك ومتابعة اﻹرشادات في الفقرات القادمة.
</p>

<h3 id="html">
	شيفرة HTML
</h3>

<p>
	إن الشيفرة المستخدمة أوسع من الشيفرة التي عملنا معها في مقال "<a href="https://academy.hsoub.com/programming/css/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A8%D8%B3%D9%8A%D8%B7-%D9%84%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%A5%D8%B1%D8%B3%D8%A7%D9%84-%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA%D9%87%D8%A7-%D9%84%D9%84%D8%AE%D8%A7%D8%AF%D9%85-r2369/" rel=""> إضافة تنسيق بسيط لاستمارة الويب</a>"، إذ تضم ترويسة وبعض المعرّفات:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5293_16" style=""><span class="tag">&lt;form&gt;</span><span class="pln">
 </span><span class="tag">&lt;h1&gt;</span><span class="pln">to: Mozilla</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

 </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"from"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"name"</span><span class="tag">&gt;</span><span class="pln">from:</span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"name"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"user_name"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
 </span><span class="tag">&lt;/div&gt;</span><span class="pln">

 </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"reply"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"mail"</span><span class="tag">&gt;</span><span class="pln">reply:</span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"email"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"mail"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"user_email"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
 </span><span class="tag">&lt;/div&gt;</span><span class="pln">

 </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"message"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"msg"</span><span class="tag">&gt;</span><span class="pln">Your message:</span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;textarea</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"msg"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"user_message"</span><span class="tag">&gt;&lt;/textarea&gt;</span><span class="pln">
 </span><span class="tag">&lt;/div&gt;</span><span class="pln">

 </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"button"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"submit"</span><span class="tag">&gt;</span><span class="pln">Send your message</span><span class="tag">&lt;/button&gt;</span><span class="pln">
 </span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/form&gt;</span></pre>

<p>
	ضع الشيفرة السابقة ضمن العنصر<code>&lt;body&gt;</code> لملف HTML.
</p>

<h3 id="-8">
	تنظيم الأصول
</h3>

<p>
	قبل أن نبدأ كتابة الشيفرة نحتاج إلى المواد المساعدة التالية:
</p>

<ol>
	<li>
		خلفية للبطاقة البريدية، نزّل <a href="https://developer.mozilla.org/en-US/docs/Learn/Forms/Styling_web_forms/background.jpg" rel="external nofollow">صورة الخلفية</a> وضعها في نفس المجلد الذي يضم ملف HTML.
	</li>
	<li>
		خط مميز للكتابة مثل "<a href="https://www.dafont.com/moms-typewriter.font?back=theme" rel="external nofollow">Mom's Typewriter</a>" من موقع "dafont.com"، نزّل الملف ذو الامتداد <code>TTf.</code> في نفس المجلد السابق.
	</li>
	<li>
		خط يماثل كتابة اليد مثل "<a href="https://www.dafont.com/journal.font" rel="external nofollow">Journal</a>" من <a href="https://www.dafont.com/" rel="external nofollow">موقع dafont </a>نزّل الملف ذو الامتداد <code>TTf.</code> في نفس المجلد السابق.
	</li>
</ol>

<p>
	وعليك معالجة ملفات الخطوط قليلًا قبل أن تستخدمها:
</p>

<ol>
	<li>
		انتقل إلى تطبيق <a href="https://www.fontsquirrel.com/tools/webfont-generator" rel="external nofollow">Webfont Generator</a> على موقع <a href="https://www.fontsquirrel.com/" rel="external nofollow">fontsquirrel</a>
	</li>
	<li>
		حمّل ملفي الخطوط من خلال الاستمارة الموجودة في التطبيق لتوليد خط ويب، ونزّل الملفين الناتجين على حاسوبك.
	</li>
	<li>
		استخرج محتويات الملفين.
	</li>
	<li>
		ضمن المجلد الناتج عن الاستخراج ستجد بعض ملفات الخطوط مثل <code>woff.</code> و <code>woff2.</code> (قد تختلف هذه الملفات مستقبلًا). انقل الملفات إلى مجلد جديد باسم <code>fonts</code> ضمن المجلد الذي يضم شيفرة HTML. ونستخدم ملفي خط لكل من عائلتي الخطين السابقين لتعزيز التوافقية مع متصفحات مختلفة. بإمكانك الاطلاع على مقال <a href="https://academy.hsoub.com/programming/css/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AE%D8%B7%D9%88%D8%B7-%D8%A7%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%85%D8%B9-css-r2222/" rel="">استخدام خطوط الكتابة في الويب مع CSS</a> لمزيد من التفاصيل.
	</li>
</ol>

<h3 id="css-2">
	شيفرة CSS
</h3>

<p>
	ضع الشيفرة الموجودة في اﻷسفل داخل العنصر <code>&lt;style&gt;</code> في ملف HTML.
</p>

<h4 id="-9">
	التخطيط الإجمالي
</h4>

<p>
	عرّفنا بداية القاعدة <code>font-face@</code> وأعددنا التنسيقات الأساسية للعنصر <code>&lt;body&gt;</code> ولعناصر الاستمارة <code>&lt;form&gt;</code>. إن كانت الملفات الناتجة عن تطبيق تحويل الخطوط مختلفة عما شرحناه، ستجد كتلة القاعدة <code>font-face@</code> ضمن الملف المضغوط الذي نزّلته. استبدل القاعدة <code>font-face@</code> الموجودة في الملف <code>stylesheet.css</code> بالكتلة الموجودة في الملف المضغوط، وانتبه لتحديث المسارات لتطابق المسار الذي وضعت فيه التمرين.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5293_25" style=""><span class="pun">@</span><span class="pln">font-face </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> </span><span class="str">"handwriting"</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">src</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">url</span><span class="pun">(</span><span class="str">"fonts/journal-webfont.woff2"</span><span class="pun">)</span><span class="pln"> format</span><span class="pun">(</span><span class="str">"woff2"</span><span class="pun">),</span><span class="pln">
    </span><span class="kwd">url</span><span class="pun">(</span><span class="str">"fonts/journal-webfont.woff"</span><span class="pun">)</span><span class="pln"> format</span><span class="pun">(</span><span class="str">"woff"</span><span class="pun">);</span><span class="pln">
 </span><span class="kwd">font-weight</span><span class="pun">:</span><span class="pln"> normal</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">font-style</span><span class="pun">:</span><span class="pln"> normal</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">@</span><span class="pln">font-face </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> </span><span class="str">"typewriter"</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">src</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">url</span><span class="pun">(</span><span class="str">"fonts/momot___-webfont.woff2"</span><span class="pun">)</span><span class="pln"> format</span><span class="pun">(</span><span class="str">"woff2"</span><span class="pun">),</span><span class="pln">
    </span><span class="kwd">url</span><span class="pun">(</span><span class="str">"fonts/momot___-webfont.woff"</span><span class="pun">)</span><span class="pln"> format</span><span class="pun">(</span><span class="str">"woff"</span><span class="pun">);</span><span class="pln">
 </span><span class="kwd">font-weight</span><span class="pun">:</span><span class="pln"> normal</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">font-style</span><span class="pun">:</span><span class="pln"> normal</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

body </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">font</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.3rem</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.5em</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#222</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

form </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">740px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">498px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">box-sizing</span><span class="pun">:</span><span class="pln"> border-box</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#fff</span><span class="pln"> </span><span class="kwd">url</span><span class="pun">(</span><span class="str">background.jpg</span><span class="pun">);</span><span class="pln">

 </span><span class="com">/* we create our grid */</span><span class="pln">
 </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">grid-gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">);</span><span class="pln">
 </span><span class="kwd">grid-template-rows</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10em</span><span class="pln"> </span><span class="lit">1em</span><span class="pln"> </span><span class="lit">1em</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ كيف استخدمنا <a href="https://academy.hsoub.com/programming/css/%25D8%25AA%25D8%25AE%25D8%25B7%25D9%258A%25D8%25B7-%25D8%25B5%25D9%2581%25D8%25AD%25D8%25A7%25D8%25AA-%25D9%2588%25D9%258A%25D8%25A8-%25D8%25A8%25D8%25A7%25D8%25B3%25D8%25AA%25D8%25AE%25D8%25AF%25D8%25A7%25D9%2585-%25D8%25AA%25D8%25AE%25D8%25B7%25D9%258A%25D8%25B7-%25D8%25A7%25D9%2584%25D8%25B4%25D8%25A8%25D9%2583%25D8%25A9-grid-%25D9%2581%25D9%258A-css-r2282/&amp;ved=2ahUKEwiygJCjyYWGAxUzTaQEHewODk0QFnoECBIQAQ&amp;usg=AOvVaw2deP1GCCNmRuG3bSAirYcL" rel="">تخطيط الشبكة</a> CSS Grid وتخطيط <a href="https://academy.hsoub.com/programming/css/%25D8%25AA%25D8%25AE%25D8%25B7%25D9%258A%25D8%25B7-%25D8%25A7%25D9%2584%25D8%25B5%25D9%2586%25D8%25AF%25D9%2588%25D9%2582-%25D8%25A7%25D9%2584%25D9%2585%25D8%25B1%25D9%2586-flexbox-%25D9%2581%25D9%258A-%25D8%25B5%25D9%2581%25D8%25AD%25D8%25A7%25D8%25AA-%25D8%25A7%25D9%2584%25D9%2588%25D9%258A%25D8%25A8-r2279/&amp;ved=2ahUKEwiBtZGuyYWGAxXUTKQEHX82CdsQFnoECBIQAQ&amp;usg=AOvVaw3mQc97NbWfUyjm0zaG_epE" rel="">الصندوق المرن</a> flexbox لتنظيم الاستمارة، وسيسهل ذلك وضع جميع العناصر بما في ذلك العنوان الرئيسي ضمن الاستمارة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5293_27" style=""><span class="pln">h1 </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">font</span><span class="pun">:</span><span class="pln">
    </span><span class="lit">1em</span><span class="pln"> </span><span class="str">"typewriter"</span><span class="pun">,</span><span class="pln">
    monospace</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">align-self</span><span class="pun">:</span><span class="pln"> end</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">#</span><span class="pln">message </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">grid-row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">#</span><span class="pln">from</span><span class="pun">,</span><span class="pln">
</span><span class="pun">#</span><span class="pln">reply </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> flex</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h4 id="-10">
	العناوين وعناصر التحكم
</h4>

<p>
	يمكننا اﻵن تنسيق عناصر الاستمارة. ونتأكد بداية أن العناوين <code>&lt;label&gt;</code> لها نفس خط الكتابة المطلوب:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5293_29" style=""><span class="pln">label </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">font</span><span class="pun">:</span><span class="pln">
    </span><span class="lit">0.8em</span><span class="pln"> </span><span class="str">"typewriter"</span><span class="pun">,</span><span class="pln">
    sans-serif</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يحتاج العنصر <code>&lt;fieldset&gt;</code> إلى بعض التنسيقات التي تطبق على جميع عناصره، لهذا أزلنا التنسيقات المتعلقة بالحواف <code>borders</code>والخلفية <code>background</code> وأعدنا تضبط الخاصيتين <code>padding</code> و <code>margin</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5293_31" style=""><span class="pln">input</span><span class="pun">,</span><span class="pln">
textarea </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">font</span><span class="pun">:</span><span class="pln">
    </span><span class="lit">1.4em</span><span class="pun">/</span><span class="lit">1.5em</span><span class="pln"> </span><span class="str">"handwriting"</span><span class="pun">,</span><span class="pln">
    cursive</span><span class="pun">,</span><span class="pln">
    sans-serif</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">80%</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	عندما يكتسب أحد هذه العناصر تركيز الدخل، نظلل خلفيته باللون الرمادي الفاتح مع إكسابها بعض الشفافية، فمن المهم أن تعطي تنسيقًا مميزًا للعنصر عندما يكتسب تركيز الدخل لسهولة الاستخدام وسهولة الوصول إليه عبر لوحة المفاتيح:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5293_33" style=""><span class="kwd">input</span><span class="pun">:</span><span class="pln">focus</span><span class="pun">,</span><span class="pln">
</span><span class="kwd">textarea</span><span class="pun">:</span><span class="pln">focus </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">10%</span><span class="pun">);</span><span class="pln">
 </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعد اكتمال تنسيق الحقول النصية، لا بد من تعديل طريقة عرض النصوص أحادية ومتعددة اﻷسطر، لأنها لن تظهر متشابهة في التنسيق الافتراضي.
</p>

<h4 id="textarea">
	تغييرات على المربع النصي متعدد الأسطر textarea
</h4>

<p>
	تعرض العناصر <code>&lt;textarea&gt;</code> والتي تمثل مربعًا نصيًا مكونًا من عدة أسطر على شكل عناصر كتلية سطرية <code>inline-block</code> افتراضيًا . وما يهمنا من خاصيات تنسيق في هذا المضمار هما الخاصيتان <code>resize</code> و <code>overflow</code>. وطالما أن تصميمنا للاستمارة ثابت الحجم، يمكننا استخدام الخاصية <code>resize</code> لمنع المستخدم من تغيير أبعاد المربع النصي، لكن من اﻷفضل ألا نفعل ذلك فقد يرغب المستخدم أن يغير الحجم. وتُستخدم الخاصية <code>overflow</code> للتحكم بالطريقة التي يتصرف فيها المتصفح عند زيادة كمية المحتوى عما يمكن للمساحة المخصصة استيعابها. تستخدم بعض المتصفحات القيمة الافتراضية <code>auto</code>بينما تستخدم متصفحات أخرى القيمة <code>scroll</code>، لهذا من اﻷفضل أن تضبط هذه القيمة على <code>auto</code> لجميع الحقول النصية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5293_35" style=""><span class="pln">textarea </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="pln">

 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">-</span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100%</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">90%</span><span class="pun">;</span><span class="pln">

 </span><span class="kwd">border-right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid</span><span class="pun">;</span><span class="pln">

 </span><span class="com">/* resize : none; */</span><span class="pln">
 </span><span class="kwd">overflow</span><span class="pun">:</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h4 id="submit">
	تنسيق زر التسليم submit
</h4>

<p>
	يُعد الزر الفعلي <code>&lt;button&gt;</code> أكثر ملائمة للتنسيق باستخدام CSS مقارنةً باستخدام عناصر أخرى،  إذ يمكنك تطبيق ما تريده من قواعد التنسيق بما في ذلك <a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AD%D8%AF%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B5%D9%86%D8%A7%D9%81-%D8%A7%D9%84%D8%B2%D8%A7%D8%A6%D9%81%D8%A9-pseudo-classes-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%B2%D8%A7%D8%A6%D9%81%D8%A9-pseudo-elements-%D9%81%D9%8A-css-r2124/" rel="">اﻷصناف الزائفة</a>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5293_37" style=""><span class="pln">button </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">font</span><span class="pun">:</span><span class="pln"> bold </span><span class="lit">0.6em</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> solid </span><span class="lit">#333</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">cursor</span><span class="pun">:</span><span class="pln"> pointer</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">transform</span><span class="pun">:</span><span class="pln"> rotate</span><span class="pun">(-</span><span class="lit">1.5deg</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">button</span><span class="pun">:</span><span class="pln">after </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">content</span><span class="pun">:</span><span class="pln"> </span><span class="str">" &gt;&gt;&gt;"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">button</span><span class="pun">:</span><span class="pln">hover</span><span class="pun">,</span><span class="pln">
</span><span class="kwd">button</span><span class="pun">:</span><span class="pln">focus </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#000</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#fff</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3 id="-11">
	النتيجة النهائية
</h3>

<p>
	ستبدو الاستمارة شبيهة بهذه البطاقة البريدية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="157345" href="https://academy.hsoub.com/uploads/monthly_2024_09/03_updated-form-screenshot.jpg.b0c7141014ce38ceb3fc8f95ed5a9066.jpg" rel=""><img alt="03 updated form screenshot" class="ipsImage ipsImage_thumbnailed" data-fileid="157345" data-unique="ankfiiyrb" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_09/03_updated-form-screenshot.jpg.b0c7141014ce38ceb3fc8f95ed5a9066.jpg"> </a>
</p>

<p>
	<strong>ملاحظة</strong>: إن لم يعمل التمرين بالطريقة المتوقعة، وأردت التحقق من عملك، يمكنك <a href="https://mdn.github.io/learning-area/html/forms/postcard-example/" rel="external nofollow">تجربته مباشرة</a> على جت-هاب والاطلاع أيضًا على <a href="https://github.com/mdn/learning-area/tree/main/html/forms/postcard-example" rel="external nofollow">شيفرته المصدرية</a>.
</p>

<h2 id="-12">
	الخلاصة
</h2>

<p>
	رأينا في هذا المقال سهولة تنسيق استمارات الويب التي تتضمن أزرارًا وحقولًا نصية فقط، وسنتابع في المقال القادم العمل مع العناصر صعبة التنسيق في هذه الاستمارات.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/Forms/Styling_web_forms" rel="external nofollow">Styling web forms</a>
</p>

<h2 id="-13">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/html/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%AA%D8%AD%D9%83%D9%85-%D9%85%D8%AA%D9%86%D9%88%D8%B9%D8%A9-%D9%8A%D9%85%D9%83%D9%86-%D8%A5%D8%B6%D8%A7%D9%81%D8%AA%D9%87%D8%A7-%D9%84%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2398/" rel="">تعرف على عناصر تحكم متنوعة يمكن إضافتها لاستمارات الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-forms-%D9%81%D9%8A-%D9%85%D8%AA%D8%B5%D9%81%D8%AD-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9%D9%87%D8%A7-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1193/" rel="">الاستمارات (forms) في متصفح الويب وكيفية التعامل معها في جافاسكربت</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D9%88%D8%AC%D8%B2-%D8%A5%D9%84%D9%89-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%85%D9%88%D9%82%D8%B9-%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-r1883/" rel="">الدليل الموجز إلى تصميم موقع إلكتروني</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%A7%D9%84%D9%86%D9%85%D8%A7%D8%B0%D8%AC-forms-%D9%81%D9%8A-html5-r370/" rel="">النماذج (Forms) في HTML5</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2402</guid><pubDate>Tue, 10 Sep 2024 15:08:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x644;&#x645; &#x637;&#x631;&#x64A;&#x642;&#x629; &#x625;&#x646;&#x634;&#x627;&#x621; &#x644;&#x648;&#x62D;&#x627;&#x62A; &#x644;&#x648;&#x646;&#x64A;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x62F;&#x627;&#x644;&#x629; &#x645;&#x632;&#x62C; &#x627;&#x644;&#x623;&#x644;&#x648;&#x627;&#x646; color-mix &#x641;&#x64A; CSS</title><link>https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D9%84%D9%85-%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%84%D9%88%D8%AD%D8%A7%D8%AA-%D9%84%D9%88%D9%86%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AF%D8%A7%D9%84%D8%A9-%D9%85%D8%B2%D8%AC-%D8%A7%D9%84%D8%A3%D9%84%D9%88%D8%A7%D9%86-color-mix-%D9%81%D9%8A-css-r2381/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_08/-----()color-mix---CSS.png.7812343ce68bceb90cb49b44ceb6081c.png" /></p>
<p>
	عند إنشاء موقع الويب، نختار في البداية ألوانًا أساسية معروفة ومحددة بعناية، ولكن مع مرور الوقت، قد نضيف ألوانًا جديدة أكثر تخصيصًا أو نحتاج لإضافة إضاءة إلى لون زر معين لأسباب تتعلق بإمكانية الوصول وغيرها من الأمور الأخرى دون تخطيط جيد، مما قد يؤدي إلى حدوث فوضى في الألوان وفقدان جمالية التصميم، فكيف نضمن أن الألوان التي نختارها تتناسب مع نظام التصميم الخاص بمشروعنا؟ نكتشف في مقال اليوم دالة مزج الألوان<code>()color-mix</code> الجديدة نسبيًا في <a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">لغة CSS </a>وكيف نستطيع من خلالها إنشاء ألوان متنوعة تعزز تصميم الموقع وجماليته.
</p>

<h2 id="colormix">
	ما هي وظيفة الدالة <code>()color-mix</code>
</h2>

<p>
	إن الدالة <code>()color-mix</code> دالة مهمة جدًا <a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D9%88%D8%AC%D8%B2-%D8%A5%D9%84%D9%89-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%85%D9%88%D9%82%D8%B9-%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-r1883/" rel="">لتصميم المواقع</a>، فهي تسمح بتحديد اللونين اللذين نريد مزجهما معًا لإنتاج لون جديد، كما تمكننا من التحكم في مقدار كل لون في المزيج واختيار مساحة الاستيفاء اللوني (color interpolation space) التي تحدد بدقة كيفية دمج الألوان مع بعضها البعض.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="155075" href="https://academy.hsoub.com/uploads/monthly_2024_08/1.png.d01151123e6db401f80fa4de853942c2.png" rel=""><img alt="1" class="ipsImage ipsImage_thumbnailed" data-fileid="155075" data-unique="pms6937wa" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_08/1.thumb.png.f2ad7ea645eb2e926c085cf23572392e.png"> </a>
</p>

<p>
	فلفهم كيفية مزج الألوان مع بعضها علينا فهم طريقة الاستيفاء اللوني (color interpolation) لكونها معاملًا مطلوبًا لهذه الدالة، وسنناقش هذا الموضوع في فقرة لاحقة، ونعتمد على المعامل <code>srgb</code> في الأمثلة الحالية.
</p>

<p>
	سنحدد كمية كل لون في المزيج اللوني على هيئة نسبة مئوية، وفي حال عدم وضع النسب المئوية ستضع الدالة <code>()color-mix</code> نسبة افتراضية 50% لكل من اللونين كما هو موضح في المثال التالي، فعند دمج اللون الأزرق مع الأحمر بدون وضع نسب مئوية ستكون النتيجة هي اللون البنفسجي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="155076" href="https://academy.hsoub.com/uploads/monthly_2024_08/2.png.1e047d37ab79ed4aa7c6893fba6810bd.png" rel=""><img alt="2" class="ipsImage ipsImage_thumbnailed" data-fileid="155076" data-unique="txf8ukr8c" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_08/2.png.1e047d37ab79ed4aa7c6893fba6810bd.png"> </a>
</p>

<p>
	أما في حال تحديد النسبة المئوية لأحد اللونين فستضع الدالة <code>()color-mix</code> النسبة المئوية للون الآخر بشكل افتراضي بحيث يكون مجموع النسبتين هو 100%.
</p>

<p>
	على سبيل المثال إذا أعطينا اللون الأحمر نسبة 10% ستكون النسبة المئوية الافتراضية للون الأزرق هي 90% والعكس صحيح إذا أعطينا اللون الأزرق نسبة 90% ستكون النسبة المئوية الافتراضية للون الأحمر هي 10% وستكون النتيجة نفسها في كلا الحالتين
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5412_20" style=""><span class="com">/* Both these will produce the same resultant color */</span><span class="pln">
color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> blue </span><span class="lit">90%</span><span class="pun">,</span><span class="pln"> red</span><span class="pun">)</span><span class="pln">
color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> blue</span><span class="pun">,</span><span class="pln"> red </span><span class="lit">10%</span><span class="pun">)</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="155077" href="https://academy.hsoub.com/uploads/monthly_2024_08/3.png.095abb2617d55f44a6c9321904e68f42.png" rel=""><img alt="3" class="ipsImage ipsImage_thumbnailed" data-fileid="155077" data-unique="0r8rm78mz" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_08/3.png.095abb2617d55f44a6c9321904e68f42.png"> </a>
</p>

<p>
	أما إذا كان مجموع النسبتين المئويتين للونين أقل من 100% فسيكون تصرف الدالة <code>()color-mix</code> مختلفًا قليلًا، إذ ستحفظ المجموع كمضاعف ألفا (alpha multiplier) ومن ثم تقيّس اللونين بالاعتماد على هذا المضاعف بحيث يصل المجموع إلى 100%. أي سيعوض الفرق بين النسبتين وتوسَّعان لجعل مجموعها 100% مما يضمن حساب اللون النهائي بشكل صحيح.
</p>

<p>
	في المثال التالي ستمزج الدالة <code>()color-mix</code> نفس الكمية من كل لون في كلا الحالتين، وستكون النتيجة نفس اللون في الحالة الثانية (حيث يكون مجموع النسبيتن 40%) ولكن بمضاعف ألفا قيمته <code>0.4 </code>الذي يعوض انخفاض مجموع هاتين النسبتين لينتج نفس اللون لكنه شفاف جزئيًا لكون مجموع النسب أقل من 100%.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5412_24" style=""><span class="com">/* Result: rgb(128 0 128) */</span><span class="pln">
color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> blue</span><span class="pun">,</span><span class="pln"> red</span><span class="pun">)</span><span class="pln">

</span><span class="com">/* Result: rgb(128 0 128 / 0.4) */</span><span class="pln">
color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> blue </span><span class="lit">20%</span><span class="pun">,</span><span class="pln"> red </span><span class="lit">20%</span><span class="pun">)</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="155078" href="https://academy.hsoub.com/uploads/monthly_2024_08/4.png.44a0bffc3665eaa4f028e9cab01da569.png" rel=""><img alt="4" class="ipsImage ipsImage_thumbnailed" data-fileid="155078" data-unique="fty0elo5f" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_08/4.png.44a0bffc3665eaa4f028e9cab01da569.png"> </a>
</p>

<h2 id="colormix-1">
	إنشاء تدرجات فاتحة وداكنة للون معين باستخدام الدالة <code>()color-mix</code>
</h2>

<p>
	غالبًا ما نحتاج في الواقع العملي إلى إنتاج تدرجات أفتح وأغمق للون معين، ولتحقيق المطلوب يمكننا دمج اللون الأبيض أو الأسود مع اللون الأساسي بنسب متفاوتة حسب الحاجة باستخدام الدالة <code>()color-mix</code>.
</p>

<p>
	نخلط في المثال أدناه كميات مختلفة من اللونين الأبيض والأسود مع اللون الأزرق الأساسي باستخدام الدالة <code>()color-mix</code> للحصول على تدرجات زرقاء فاتحة وداكنة.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5412_16" style=""><span class="com">/* Initial base color */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">bg-blue </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/* 50% blue, 50% white */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">bg-blue-light </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> blue</span><span class="pun">,</span><span class="pln"> white</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/* 25% blue, 75% white */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">bg-blue-lighter </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> blue</span><span class="pun">,</span><span class="pln"> white </span><span class="lit">75%</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/* 50% blue, 50% black */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">bg-blue-dark </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> blue</span><span class="pun">,</span><span class="pln"> black</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/* 25% blue, 75% black */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">bg-blue-darker </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> blue</span><span class="pun">,</span><span class="pln"> black </span><span class="lit">75%</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سنحصل على التدرجات المبينة في الصورة التالية:
</p>

<p style="text-align: center;">
	<img alt="5.png" class="ipsImage ipsImage_thumbnailed" data-fileid="155110" data-ratio="29.22" data-unique="tuw6xioeg" width="486" src="https://academy.hsoub.com/uploads/monthly_2024_08/5.png.662787777262f1ce8520c15837ef670c.png">
</p>

<h3 id="">
	استخدام خصائص محددة لإعادة استخدام التدرجات اللونية
</h3>

<p>
	يمكننا تخزين قيم الدالة <code>()color-mix</code> كخصائص محددة custom properties وإعادة استخدامها ضمن الكود، وهذا الأسلوب مفيد عندما نريد إنشاء تدرجات أفتح أو أغمق للون الأساسي.
</p>

<p>
	يوضح الكود التالي طريقة تعريف اللون الأساسي وتخزينه كقيمة للخاصية <code>brand--</code> وبهذا يسهل تعديل اللون والحصول على درجات مختلفة فاتحة وداكنة منه.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5412_12" style=""><span class="pun">:</span><span class="pln">root </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">brand</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">

  </span><span class="pun">--</span><span class="kwd">brand-light</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">brand</span><span class="pun">),</span><span class="pln"> white</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">brand-lighter</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">brand</span><span class="pun">),</span><span class="pln"> white </span><span class="lit">75%</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">brand-dark</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">brand</span><span class="pun">),</span><span class="pln"> black</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">brand-darker</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">brand</span><span class="pun">),</span><span class="pln"> black </span><span class="lit">75%</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	كما يمكن أيضًا إنشاء تدرجات مختلفة من الشفافية عن طريق الخاصية <code>transparent</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5412_14" style=""><span class="pun">:</span><span class="pln">root </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">brand</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">brand-alpha-50</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> blue</span><span class="pun">,</span><span class="pln"> transparent</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">brand-alpha-75</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> blue </span><span class="lit">75%</span><span class="pun">,</span><span class="pln"> transparent</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="colormix-2">
	مثال عملي لتنسيق تدرجات لونية للزر باستخدام خصائص محددة للدالة <code>()color-mix</code>
</h2>

<p>
	سننسق في هذا المثال العملي أزار بسيطة أساسية وثانوية في الموقع، نعرف في البداية خصائص محددة تمثل اللون الأساسي وهو الأزرق، واللون الثانوي الناتج عن دمج الأزرق مع الزهري باستخدام الدالة <code>()color-mix</code> ونعرف من خلالها أيضًا تدرجات أفتح لكلا اللونين كما يلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3830_8" style=""><span class="pun">:</span><span class="pln">root </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">brand</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">brand-light</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> blue</span><span class="pun">,</span><span class="pln"> white</span><span class="pun">);</span><span class="pln">

  </span><span class="pun">--</span><span class="kwd">secondary</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">brand</span><span class="pun">),</span><span class="pln"> pink</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">secondary-light</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">secondary</span><span class="pun">),</span><span class="pln"> white</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	في الخطوة الثانية، سنطبق اللون الأساسي والثانوي على الأزرار الأساسية والثانوية في الموقع، ونضيف تأثير لتفتيح ألوان الأزرار عندما نمرر مؤشر الفأرة فوقها لإحداث تأثير (hover states) كما يلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5412_26" style=""><span class="pln">button </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">brand</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">button</span><span class="pun">:</span><span class="pln">where</span><span class="pun">(:</span><span class="pln">hover</span><span class="pun">,</span><span class="pln"> </span><span class="pun">:</span><span class="pln">focus</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">brand-light</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

button</span><span class="pun">.</span><span class="pln">secondary </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">secondary</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

button</span><span class="pun">.</span><span class="kwd">secondary</span><span class="pun">:</span><span class="pln">where</span><span class="pun">(:</span><span class="pln">hover</span><span class="pun">,</span><span class="pln"> </span><span class="pun">:</span><span class="pln">focus</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">secondary-light</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ستظهر نتيجة الكود على النحو التالي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="200" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/eYwWdzp?default-tab=result" style="width: 100%;" title="Untitled">See the Pen Untitled by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	لسنا ملزمين بتعريف الخصائص في مستوى الجذر فقط، إذ يمكننا على سبيل المثال تعريف خاصية اللون الأساسي للمكوّن أو الزر، وإنشاء تدرجات مختلفة لهذا اللون ضمن تنسيق المكوّن باستخدام الدالة <code>()color-mix</code>، ويمكن ببساطة تطبيق لون أساسي مختلف للنسخة الثانوية من المكوّن، كما يوضح الكود التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8725_7" style=""><span class="pun">.</span><span class="pln">card </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">color</span><span class="pun">),</span><span class="pln"> white </span><span class="lit">80%</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">border-top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pln"> solid var</span><span class="pun">(--</span><span class="pln">color</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1rem</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">secondary </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> deeppink</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p style="text-align: center;">
	 
</p>

<p>
	وستظهر نتيجة الكود أعلاه على النحو التالي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/jOjmMrj?default-tab=result" style="width: 100%;" title="color-mix2">See the Pen color-mix2 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	وفيما يلي عرض توضيحي لتطبيق هذا المفهوم على مجموعة متنوعة من مكونات واجهة المستخدم، لاحظ انسجام الألوان وتناغمها.
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="600" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/GRbmjjG?default-tab=result" style="width: 100%;" title="color-mix-3">See the Pen color-mix-3 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h3 id="colormix-3">
	إنشاء تدرجات الألوان الدافئة والباردة باستخدام الدالة <code>()color-mix</code>
</h3>

<p>
	تستخدم الدالة <code>()color-mix</code> في الغالب لإنشاء تدرجات مختلفة أفتح أو أغمق من لون موجود، كما يمكن استخدامها أيضًَا لإنشاء تدرجات دافئة وباردة من اللون من خلال مزج ألوان دافئة أو باردة مع الألوان الأساسية. في هذا المثال، نحدد لوحة ألوان أساسية مأخوذة من موقع <a href="https://coolors.co/" rel="external nofollow">Coolors</a> ثم نضيف الألوان التي نريد مزجها لإنشاء التدرجات اللونية الدافئة والباردة بتعريف خصائص محددة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8725_9" style=""><span class="pun">:</span><span class="pln">root </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">yellow</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">221</span><span class="pln"> </span><span class="lit">215</span><span class="pln"> </span><span class="lit">141</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">peach</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">220</span><span class="pln"> </span><span class="lit">191</span><span class="pln"> </span><span class="lit">133</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">chocolate</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">139</span><span class="pln"> </span><span class="lit">99</span><span class="pln"> </span><span class="lit">92</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">khaki</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">96</span><span class="pln"> </span><span class="lit">89</span><span class="pln"> </span><span class="lit">77</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">grey</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">147</span><span class="pln"> </span><span class="lit">162</span><span class="pln"> </span><span class="lit">155</span><span class="pun">);</span><span class="pln">

  </span><span class="pun">--</span><span class="kwd">mix-warm</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">mix-cool</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">palette </span><span class="pun">&gt;</span><span class="pln"> div </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">yellow</span><span class="pun">);</span><span class="pln">

  </span><span class="pun">&amp;:</span><span class="pln">nth-child</span><span class="pun">(</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">--</span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">peach</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="pun">&amp;:</span><span class="pln">nth-child</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">--</span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">chocolate</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="pun">&amp;:</span><span class="pln">nth-child</span><span class="pun">(</span><span class="lit">4</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">--</span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">khaki</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="pun">&amp;:</span><span class="pln">nth-child</span><span class="pun">(</span><span class="lit">5</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">--</span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">grey</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعد ذلك سنستخدم هذه الخصائص لمزج اللون الثاني مع اللون الأساسي الأصلي مع تحديد كمية هذا اللون، كما سنحدد أيضًا القيم الافتراضية فإذا لم تمرر قيمة افتراضية للدالة <code>()color-mix</code> فسيتسخدم اللون الأساسي الأصلي.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8725_11" style=""><span class="pun">.</span><span class="pln">palette </span><span class="pun">&gt;</span><span class="pln"> div </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">
    in srgb</span><span class="pun">,</span><span class="pln">
    var</span><span class="pun">(--</span><span class="pln">color</span><span class="pun">),</span><span class="pln">
    var</span><span class="pun">(--</span><span class="pln">mix</span><span class="pun">,</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">color</span><span class="pun">))</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">amount</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10%</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بهذه الطريقة سنكون قادرين على مزج ألوان مختلفة وتطبيق ذلك على كامل اللوحة
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8725_13" style=""><span class="pun">.</span><span class="pln">cool </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">mix</span><span class="pun">:</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">mix-cool</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">cool--20 </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">amount</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">warm </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">mix</span><span class="pun">:</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">mix-warm</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">warm--20 </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">--</span><span class="kwd">amount</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="800" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/YzoVGpe?default-tab=result" style="width: 100%;" title="color-mix-4">See the Pen color-mix-4 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h2 id="colormix-4">
	تحديد فضاء الألوان المستخدمة في الاستيفاء اللوني ضمن الدالة <code>()color-mix</code>
</h2>

<p>
	استخدمنا في الفقرات السابقة نظام الألوان <code>srgb</code> (وهو النموذج اللوني المعياري أحمر أخضر أزرق) كطريقة لتداخل اللون، لكننا نستطيع أن نغير النتيجة بشكل جذري عن طريق تعديل فضاء الألوان color spaces المستخدم للتداخل أو الاستيفاء اللوني interpolation. تعد فضاءات الألوان مفاهيم معقدة وشرحها يتجاوز نطاق هذه المقالة، لكن من الجدير بالذكر بعض مزايا وعيوب فضاءات الألوان عند اتخاذ قرار بشأن استخدامها في الدالة <code>()color-mix</code>.
</p>

<h3 id="-1">
	خيارات فضاءات الألوان
</h3>

<p>
	يعني استيفاء اللون الطريقة التي ينتقل بها لون إلى لون آخر، ويتم ذلك باستخدام ما يُعرف بالتدرجات اللونية gradients (مثل تحول لون من الأحمر إلى الأزرق تدريجيًا) في النظام التقليدي RGB، قد تظهر الألوان في وسط التدرج بشكل باهت، بينما باستخدام أنظمة ألوان أخرى مثل <code>lch</code> أو <code>oklch</code> ستبقى الألوان مضيئة وحيوية حتى في وسط التدرج، وتكون النتائج مختلفة تمامًا عند تطبيقها على لوحات الألوان الدافئة والباردة في المثال السابق، ويمكنك رؤية الفرق بين هذه الأنظمة في الصورة أدناه.
</p>

<p style="text-align: center;">
	<img alt="مقارنة بين النموذجين اللونيين sRGB و OKLCH" class="ipsImage ipsImage_thumbnailed" data-fileid="155112" data-ratio="53.33" data-unique="71kdnxwwv" style="width: 600px; height: auto;" width="771" src="https://academy.hsoub.com/uploads/monthly_2024_08/10.png.fb9fbc74ec7495cdf824bc2a5224708c.png">
</p>

<p>
	بالرغم من أن نظامي الألوان <code>sRGB</code> و <code>HSL</code> شائعان لتمثيل الألوان، لكنهما لا يقدمان نتائج دقيقة عندما يتعلق الأمر بكيفية رؤية البشر للألوان أما نموذجا <code>oklch</code> و<code>oklab</code> فهما طريقتان أحدث لتمثيل الألوان مصممتان بحيث تكون التغيرات العددية فيها مماثلة للتغيرات التي يدرك فيها الإنسان الألوان بحواسه فإذا غيرت اللون بمقدار معين على محور الإحداثيات، فإن التغيير سيكون ملاحظًا أو مرئيًا بنفس المقدار بغض النظر عن اللون الأصلي، لذا يعطي استخدام <code>oklch</code> و<code>oklab</code> نتائج أكثر دقة في رؤية الألوان عند مزجها أو تدرجها، لهذا يفضل معظم المطورن استخدامهما عند مزج الألوان باستخدام دالة <code>()color-mix</code>، ولكن الخيار متروك لك في النهاية.
</p>

<h3 id="-2">
	مسارات الاستيفاء اللوني الأقصر والأطول
</h3>

<p>
	يمكننا في فضاءات الألوان الدائرية مثل <code>oklch</code> و <code>oklab</code> و <code>hsl</code> اختيار الاتجاه الذي الذي ننتقل أو نتدرج فيه من لون إلى آخر لتحقيق الدمج، فعندما نمزج لونين بالتساوي ستكون زاوية اللون الناتج في منتصف الطريق بين زاويتي اللونين، وتختلف هذه الزاوية بالاعتماد على مسار الاستيفاء وإن كان يتبع المسار الأطول والأقصر حول دائرة اللون.
</p>

<p>
	تخيل دائرة الألوان مثل عجلة ألوان، إذا كان لديك لونان على هذه العجلة، فيمكنك الانتقال من لون لآخر عن طريق الدوران في اتجاه عقارب الساعة أو عكس اتجاه عقارب الساعة. فعند مزج لونين بالتساوي سيكون اللون الناتج في منتصف الطريق بين اللونين على العجلة ولكن يمكن أن يكون هناك مسار أقصر ومسار أطول للوصول إلى هذا اللون، في حال اختيار المسار الأقصر سيكون الدوران عبر جزء صغير من العجلة، بينما في المسار الأطول سيكون الدوران عبر جزء أكبر من العجلة. لذا، فإن اختيار الاتجاه الذي تتبعه يمكن أن يؤثر على النتيجة النهائية للون الناتج.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9490_10" style=""><span class="pln">color-mix</span><span class="pun">(</span><span class="pln">in hsl</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">255</span><span class="pln"> </span><span class="lit">88</span><span class="pln"> </span><span class="lit">88</span><span class="pun">),</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">86</span><span class="pln"> </span><span class="lit">86</span><span class="pln"> </span><span class="lit">255</span><span class="pun">));</span><span class="pln">
color-mix</span><span class="pun">(</span><span class="pln">in hsl longer hue</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">255</span><span class="pln"> </span><span class="lit">88</span><span class="pln"> </span><span class="lit">88</span><span class="pun">),</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">86</span><span class="pln"> </span><span class="lit">86</span><span class="pln"> </span><span class="lit">255</span><span class="pun">));</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="155085" href="https://academy.hsoub.com/uploads/monthly_2024_08/11.png.3b327844784735281423d276460c05e8.png" rel=""><img alt="11" class="ipsImage ipsImage_thumbnailed" data-fileid="155085" data-unique="vff9y3zvz" style="width: 599px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_08/11.thumb.png.9507b4f2ef88734cdba80e8961f10fc3.png"> </a>
</p>

<p>
	جرب مزج الألوان في فضاءات الألوان وأطوال المسارات المختلفة الموضحة في الإطار التالي، ولاحظ الفرق في النتائج التي ستحصل عليها:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="800" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/RwzVGgJ?default-tab=result" style="width: 100%;" title="color-mix-5">See the Pen color-mix-5 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h2 id="colormix-5">
	دعم متصفحات الإنترنت للدالة <code>()color-mix</code>
</h2>

<p>
	دُعمت الدالة <code>()color-mix</code> في جميع المتصفحات الحديثة من منتصف عام 2023، وبالطبع لن يملك جميع المستخدمين نسخًا حديثة من المتصفحات لذا سيكون الحل بوضع قيمة أولية ثابتة للألوان أولاً (بدون الاعتماد على الدالة <code>()color-mix</code>)، فإذا لم يدعم المتصفح الدالة سيستخدم هذه الألوان المحددة.
</p>

<p>
	على سبيل المثال، لن تتمكن المتصفحات التي لا تدعم الدالة <code>()color-mix</code> من التعامل مع السطر الثاني من هذا الكود:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9490_13" style=""><span class="pln">div </span><span class="pun">{</span><span class="pln">
  </span><span class="com">/* First declaration is fallback for browsers that do not support color-mix() */</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">150</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> blue</span><span class="pun">,</span><span class="pln"> red</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ولمعرفة إذا كان المتصفح يدعم الدالة <code>()color-mix</code> يمكن استخدام الاستعلام التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9490_15" style=""><span class="pun">.</span><span class="pln">card </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> lightblue</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">@</span><span class="pln">supports </span><span class="pun">(</span><span class="pln">color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> blue</span><span class="pun">,</span><span class="pln"> white</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">card </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">--</span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> color-mix</span><span class="pun">(</span><span class="pln">in srgb</span><span class="pun">,</span><span class="pln"> var</span><span class="pun">(--</span><span class="pln">color</span><span class="pun">),</span><span class="pln"> white </span><span class="lit">80%</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">border-top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pln"> solid var</span><span class="pun">(--</span><span class="pln">color</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	كما يمكنك ثثبيت ملحق إضافي يدعى <a href="https://preset-env.cssdb.org/blog/postcss-color-mix-function/" rel="external nofollow">PostCSS</a> يتيح لك كتابة جميع وظائف الدالة <code>()color-mix</code> دون الحاجة لمعرفة حالة المتصفح حيث يقوم بتحويل الكود تلقائيًا إلى كود <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> متوافق مع جميع المتصفحات.
</p>

<p>
	على سبيل المثال يقوم الملحق PostCSS بتحويل الكود التالي:
</p>

<pre class="ipsCode">.some-element {
  background-color: color-mix(in srbg, red, blue);
}
</pre>

<p>
	إلى كود CSS كما يلي:
</p>

<pre class="ipsCode">.some-element {
  background-color: rgb(128 0 128);
}
</pre>

<h2 id="-3">
	الخلاصة
</h2>

<p>
	تعرفنا في هذا المقال على طريقة استخدام الدالة <code>()color-mix</code> لإنشاء تدرجات مختلفة للألوان ،وطريقة استخدام هذه الدالة لدمج الألوان بطرق مختلفة والاستفادة منها في تصميم المواقع، كما تعرفنا على دعم المتصفحات لهذه الدالة ويمكن القول أننا مقبلون على عصر جديد من التعامل مع الألوان على مواقع وتطبيقات الويب.
</p>

<p>
	ترجمة وبتصرف للمقال <a href="https://developer.mozilla.org/en-US/blog/color-palettes-css-color-mix/" rel="external nofollow">Creating color palettes with the CSS color-mix() function</a> لكاتبته Michelle Barker
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-css-r2000/" rel="">تعرف على CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%A3%D9%84%D9%88%D8%A7%D9%86-%D9%81%D9%8A-css-r255/" rel="">التعامل مع الألوان في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-css-r1054/" rel="">التنسيقات الأساسية للعناصر في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%83%D8%AA%D8%B4%D8%A7%D9%81-%D8%AF%D8%B9%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%84%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%A3%D8%AB%D9%86%D8%A7%D8%A1-%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1988/" rel="">كيفية اكتشاف دعم المتصفحات للميزات أثناء اختبار مشاريع الويب</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2381</guid><pubDate>Tue, 06 Aug 2024 15:00:00 +0000</pubDate></item><item><title>&#x625;&#x636;&#x627;&#x641;&#x629; &#x62A;&#x646;&#x633;&#x64A;&#x642; &#x628;&#x633;&#x64A;&#x637; &#x644;&#x627;&#x633;&#x62A;&#x645;&#x627;&#x631;&#x629; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x648;&#x625;&#x631;&#x633;&#x627;&#x644; &#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A;&#x647;&#x627; &#x644;&#x644;&#x62E;&#x627;&#x62F;&#x645;</title><link>https://academy.hsoub.com/programming/css/%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A8%D8%B3%D9%8A%D8%B7-%D9%84%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%88%D8%A5%D8%B1%D8%B3%D8%A7%D9%84-%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA%D9%87%D8%A7-%D9%84%D9%84%D8%AE%D8%A7%D8%AF%D9%85-r2369/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_07/---.png.05e2b5068baaddc7c2530f9dc4d9cd8c.png" /></p>
<p>
	تعرفنا في المقال السابق على <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-web-forms-r2368/" rel="">أساسيات العمل مع استمارات الويب Web forms</a> وأهميتها كوسيلة للتفاعل بين المستخدم وموقع الويب، ووضحنا بمثال عملي كيفية بناء استمارة تواصل بسيطة باستخدام عناصر HTML الأساسية، وسنشرح في مقال اليوم كيفية تنسيق هذه الاستمارة لمنحها منظرًا أكثر احترافية، وطريقة التعامل مع إرسال البيانات التي يكتبها المستخدم في هذه الاستمارة إلى خادم الويب.
</p>

<h3 id="css">
	التنسيق اﻷساسي لاستمارة الويب باستخدام CSS
</h3>

<p>
	بعد أن انتهيت في <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-web-forms-r2368/" rel="">المقال السابق </a>من كتابة شيفرة HTML التي تحدد مكونات أو عناصر الاستمارة الأساسية وعرضت الصفحة في المتصفح، لن يعجبك مظهر هذه الاستمارة بالتأكيد، حيث سيبدو منظرها بدائيًا جدًا كما في الصورة التالية:
</p>

<p style="text-align: center;">
	<img alt="استمارة-ويب-دون-تنسيق.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="153645" data-ratio="48.30" data-unique="37ie0ysl1" width="412" src="https://academy.hsoub.com/uploads/monthly_2024_07/---.PNG.dfb744ec96473abd962ab3660e42680f.PNG">
</p>

<p>
	<strong>ملاحظة</strong>: إن كنت تعتقد أن شيفرتك ليس صحيحة، قارن الكود الذي كتبته مع هذه  <a href="https://github.com/mdn/learning-area/blob/main/html/forms/your-first-HTML-form/first-form.html" rel="external nofollow">النسخة المكتملة</a> من التطبيق على جت-هاب للاطلاع على <span ipsnoautolink="true">النسخة بعد تنسيقها</span> (وبإمكانك <a href="https://mdn.github.io/learning-area/html/forms/your-first-HTML-form/first-form.html" rel="external nofollow">تجربتها مباشرة</a>) أيضًا.
</p>

<p>
	لتحسين مظهر الاستمارة نحتاج لتنسيقها باستخدام لغة CSS وسنركز في مقال اليوم فقط على إضافة بعض تنسيقات <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> البسيطة كي نحسّن مظهر الاستمارة العام، لكننا لن نتطرق إلى تنسيق عناصر الاستمارات بشكل مكثف فهذا اﻷمر واسع ومتشعب، فاستمارات الويب تتكون عادة من عدة عناصر مختلفة مثل الحقول النصية والأزرار ومربعات الاختيار والقوائم المنسدلة وغيرها وكل نوع من هذه العناصر قد يتطلب تنسيقًا خاصًا به، كما أن هناك تنسيقات تتعلق بسهولة الوصول accessibility، وتنسيقات أخرى تتعلق بعرض رسائل خطأ عند إدخال بيانات غير صحيحة وغيرها من التفاصيل التي تقع خارج نطاق مقالنا حاليًا.
</p>

<p>
	لتنسيق الاستمارة أضف بداية العنصر <code>&lt;style&gt;</code> إلى كود صفحتك ضمن الترويسة <code>&lt;head&gt;</code>، وسيبدو اﻷمر كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1755_7" style=""><span class="pun">&lt;</span><span class="pln">style</span><span class="pun">&gt;</span><span class="pln">
 </span><span class="pun">…</span><span class="pln">
</span><span class="pun">&lt;/</span><span class="pln">style</span><span class="pun">&gt;</span></pre>

<p>
	بعدها أضف الشيفرة التالية ضمن وسمي البداية والنهاية <code>&lt;style&gt; &lt;style/&gt;</code> للعنصر السابق:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_1755_9" style=""><span class="pln">body </span><span class="pun">{</span><span class="pln">
 </span><span class="com">/* ضبط موقع الاستمارة منتصف الصفحة */</span><span class="pln">
 </span><span class="kwd">text-align</span><span class="pun">:</span><span class="pln"> center</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

form </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> inline-block</span><span class="pun">;</span><span class="pln">
 </span><span class="com">/* اﻹطار الخارجي للاستمارة */</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid </span><span class="lit">#ccc</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

ul </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">list-style</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

form li </span><span class="pun">+</span><span class="pln"> li </span><span class="pun">{</span><span class="pln">
 </span><span class="kwd">margin-top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

label </span><span class="pun">{</span><span class="pln">
 </span><span class="com">/* تنسيق الحجم والمحاذاة بشكل منتظم */</span><span class="pln">
 </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> inline-block</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">min-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">90px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">text-align</span><span class="pun">:</span><span class="pln"> right</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

input</span><span class="pun">,</span><span class="pln">
textarea </span><span class="pun">{</span><span class="pln">
 </span><span class="com">/*للتأكد من أن كل الحقول النصية لها نفس إعدادات الخط
 monospace خط أحادي الفراغ textarea افتراضيًا، يكون للعناصر */</span><span class="pln">
 </span><span class="kwd">font</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
 </span><span class="com">/* حجم متساوي لجميع الحقول النصية */</span><span class="pln">
 </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">300px</span><span class="pun">;</span><span class="pln">
 </span><span class="kwd">box-sizing</span><span class="pun">:</span><span class="pln"> border-box</span><span class="pun">;</span><span class="pln">
 </span><span class="com">/* ضبط حواف حقول الاستمارة */</span><span class="pln">
 </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid </span><span class="lit">#999</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">input</span><span class="pun">:</span><span class="pln">focus</span><span class="pun">,</span><span class="pln">
</span><span class="kwd">textarea</span><span class="pun">:</span><span class="pln">focus </span><span class="pun">{</span><span class="pln">
 </span><span class="com">/* تظليل إضافي للعناصر التي تتلقى تركيز الدخل */</span><span class="pln">
 </span><span class="kwd">border-color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#000</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

textarea </span><span class="pun">{</span><span class="pln">
 </span><span class="com">/* محاذاة الحقول النصية إلى جوار عناوينها*/</span><span class="pln">
 </span><span class="kwd">vertical-align</span><span class="pun">:</span><span class="pln"> top</span><span class="pun">;</span><span class="pln">
 </span><span class="com">/* تأمين مساحة للكتابة ضمنها */</span><span class="pln">
 </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5em</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">button </span><span class="pun">{</span><span class="pln">
 </span><span class="com">/* محاذاة الزر مع الحقول النصية */</span><span class="pln">
 </span><span class="kwd">padding-left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">90px</span><span class="pun">;</span><span class="pln"> </span><span class="com">/* نفس قياس العناوين */</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

button </span><span class="pun">{</span><span class="pln">
 </span><span class="com">/*هوامش إضافية تماثل المسافة بين العناوين والحقول النصية المقابلة */</span><span class="pln">
 </span><span class="kwd">margin-left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.5em</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	احفظ التغيّرات وأعد تحميل الصفحة، وسيبدو الاستمارة أفضل حالًا كما يلي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="350" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/gONPzBe?default-tab=result" style="width: 100%;" title="webform-1">See the Pen webform-1 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	<strong>ملاحظة</strong>: يمكنك مقارنة الكود الذي كتبته مع <a href="https://github.com/mdn/learning-area/blob/main/html/forms/your-first-HTML-form/first-form-styled.html" rel="external nofollow">هذه النسخة</a> من التطبيق على جت-هاب للاطلاع على <span ipsnoautolink="true">النسخة بعد تنسيقها</span><span style="display: none;"> </span>، وبإمكانك <a href="https://mdn.github.io/learning-area/html/forms/your-first-HTML-form/first-form-styled.html" rel="external nofollow">تجربتها مباشرة</a> أيضًا.
</p>

<h2 id="-1">
	إرسال بيانات الاستمارة إلى الخادم
</h2>

<p>
	نأتي إلى القسم الأخير من التطبيق وقد يكون الأصعب، وهو التعامل مع تسليم بيانات هذه الاستمارة إلى الخادم أو بمعنى آخر <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-http-%D8%B4%D8%B1%D8%AD-%D8%A7%D9%84%D8%AA%D8%AE%D8%A7%D8%B7%D8%A8-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%84-%D9%88%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%85-r74/" rel="">التخاطب بين العميل والخادم</a>، حيث يحدد العنصر <code><a href="https://wiki.hsoub.com/HTML/form" rel="external">&lt;form&gt;</a></code> كما ذكرنا <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-web-forms-r2368/" rel="">في المقال السابق</a> أين ستذهب البيانات وكيف ستنقل للخادم من خلال السمتين <code>action</code> و <code>method</code>.
</p>

<p>
	إذ تحدد <code>action</code> الوجهة النهائية للبيانات المُدخلة في الاستمارة، بينما تحدد <code>method </code>الطريقة التي سيتم بها إرسال البيانات إلى الخادم وهناك طريقتان رئيسيتان يمكن استخدامهما: الأولى هي <code>GET </code>حيث تلحق بيانات الاستمارة بعنوان URL وترسل كجزء من رابط الصفحة ولا تناسب هذه الطريقة إرسال بيانات حساسة لأن البيانات المرسلة ستكون مرئية في شريط العنوان، والثانية هي <code>POST </code>حيث ترسل البيانات كجزء من جسم طلب HTTP وهي تناسب إرسال البيانات الحساسة أو إرسال كميات كبيرة من البيانات من العميل للخادم.
</p>

<p>
	وكنا قد زودنا سابقًا كل عنصر من عناصر الاستمارة بالسمة <code>name</code> وهي ضرورية عند العمل مع طرفي العميل والخادم. إذ تخبر هذه السمة المتصفح على الاسم الذي سيطلقه على كل جزء من البيانات، أما الخادم فسيتعامل مع هذه البيانات وفق هذا الاسم، ثم ترسل البيانات إلى الخادم على شكل أزواج أو ثنائيات مكونة من اسم/قيمة.
</p>

<p>
	فلتسمية البيانات في الاستمارة ستحتاج إلى السمة <code>name</code> لكل عنصر تحكم يجمع جزءًا من البيانات المطلوبة.
</p>

<p>
	لنلق نظرة على شيفرة الاستمارة ونتذكر عناصرها:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9173_19" style=""><span class="pun">&lt;</span><span class="pln">form action</span><span class="pun">=</span><span class="str">"/my-handling-form-page"</span><span class="pln"> method</span><span class="pun">=</span><span class="str">"post"</span><span class="pun">&gt;</span><span class="pln">
  </span><span class="pun">&lt;</span><span class="pln">ul</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="pln">li</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">label for</span><span class="pun">=</span><span class="str">"name"</span><span class="pun">&gt;</span><span class="kwd">Name</span><span class="pun">:&lt;/</span><span class="pln">label</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">input type</span><span class="pun">=</span><span class="str">"text"</span><span class="pln"> id</span><span class="pun">=</span><span class="str">"name"</span><span class="pln"> name</span><span class="pun">=</span><span class="str">"user_name"</span><span class="pln"> </span><span class="pun">/&gt;</span><span class="pln">
    </span><span class="pun">&lt;/</span><span class="pln">li</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="pln">li</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">label for</span><span class="pun">=</span><span class="str">"mail"</span><span class="pun">&gt;</span><span class="kwd">Email</span><span class="pun">:&lt;/</span><span class="pln">label</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">input type</span><span class="pun">=</span><span class="str">"email"</span><span class="pln"> id</span><span class="pun">=</span><span class="str">"mail"</span><span class="pln"> name</span><span class="pun">=</span><span class="str">"user_email"</span><span class="pln"> </span><span class="pun">/&gt;</span><span class="pln">
    </span><span class="pun">&lt;/</span><span class="pln">li</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;</span><span class="pln">li</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">label for</span><span class="pun">=</span><span class="str">"msg"</span><span class="pun">&gt;</span><span class="kwd">Message</span><span class="pun">:&lt;/</span><span class="pln">label</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">textarea id</span><span class="pun">=</span><span class="str">"msg"</span><span class="pln"> name</span><span class="pun">=</span><span class="str">"user_message"</span><span class="pun">&gt;&lt;/</span><span class="pln">textarea</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;/</span><span class="pln">li</span><span class="pun">&gt;</span><span class="pln">

    </span><span class="pun">&lt;</span><span class="pln">li class</span><span class="pun">=</span><span class="str">"button"</span><span class="pun">&gt;</span><span class="pln">
      </span><span class="pun">&lt;</span><span class="pln">button type</span><span class="pun">=</span><span class="str">"submit"</span><span class="pun">&gt;</span><span class="pln">Send your message</span><span class="pun">&lt;/</span><span class="pln">button</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">&lt;/</span><span class="pln">li</span><span class="pun">&gt;</span><span class="pln">
  </span><span class="pun">&lt;/</span><span class="pln">ul</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&lt;/</span><span class="pln">form</span><span class="pun">&gt;</span></pre>

<p>
	على جانب العميل، سيرسل النموذج ثلاثة أجزاء من البيانات أسماؤها هي "<code>user_name</code>" و "<code>user_email</code>" و "<code>user_message</code>" إلى عنوان URL التالي<br>
	"<code>/my-handling-form-page/</code>" باستخدام الطلب HTTP POST.
</p>

<p>
	على جانب الخادم، سيكون لدينا سكريبت بلغة برمجة معينة موجود على العنوان "<code>/my-handling-form-page/</code>" يستقبل البيانات المرسلة من النموذج وفق ثلاثة قوائم من الشكل مفتاح/قيمة ضمن طلب HTTP.
</p>

<p>
	أما طريقة تعامل السكريبت مع هذه البيانات فهو أمر عائد للمبرمج، فلكل لغة برمجة تعمل على الخادم آلية مخصصة للتعامل مع البيانات. هذا الموضوع خارج إطار مقالنا الحالي لكننا سنعرض بعض الأمثلة المختلفة مع شرحها بالتفصيل في مقال لاحق.
</p>

<h2 id="-2">
	الخلاصة
</h2>

<p>
	تهانينا! لقد بنيت أول استمارة ويب خاصة بك ونسقتها بطريقة أنيقة وتعرفت على أساسيات حول التعامل مع بياناتها، لا زالنا بالطبع في بداية التعامل مع الاستمارات، وسنتابع الغوص في بناء استمارات ويب وهيكلتها وتنسيقها وإرسال بياناتها للخادم في مقالات قادمة، فإمكانات استمارات الويب أكبر بكثير مما عرضناه في هذا المقال.
</p>

<p>
	ترجمة -وبتصرف- للجزء الثاني من المقال: <a href="https://developer.mozilla.org/en-US/docs/Learn/Forms/Your_first_form" rel="external nofollow">Your first form</a>
</p>

<p>
	اقرأ أيضًا
</p>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D8%B3%D8%AA%D9%85%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-web-forms-r2368/" rel="">أساسيات التعامل مع استمارات الويب Web Forms</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D9%88%D9%82%D8%B9-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D8%A7%D8%AA-html-r1909/" rel="">كيفية تنسيق الموقع الإلكتروني باستخدام تعليمات HTML</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">تعرف على أساسيات لغة CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%A7%D9%84%D8%AA%D8%AD%D9%82%D9%82-%D9%85%D9%86-%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1328/" rel="">التحقق من سهولة الوصول لصفحات الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/php/%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%B7%D9%84%D8%A8%D9%8A%D8%A7%D8%AA-http-%D9%88%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%B1%D9%81%D8%B9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-php-r1129/" rel="">معالجة بيانات طلبيات HTTP والتعامل مع أخطاء رفع الملفات في PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2369</guid><pubDate>Thu, 25 Jul 2024 03:02:01 +0000</pubDate></item><item><title>&#x627;&#x644;&#x628;&#x62F;&#x621; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x633;&#x62A;&#x639;&#x644;&#x627;&#x645;&#x627;&#x62A; &#x627;&#x644;&#x62D;&#x627;&#x648;&#x64A;&#x629; &#x641;&#x64A; &#x644;&#x63A;&#x629; CSS</title><link>https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%A8%D8%AF%D8%A1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%A7%D9%88%D9%8A%D8%A9-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-css-r2356/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_07/-----CSS.png.5ede0b2d14e29dca90ec43158e83ff9c.png" /></p>
<p>
	سنتعرف في مقال اليوم على مفهوم استعلامات الحاوية Container Queries في لغة CSS التي أصبحت مدعومة مؤخرًا من قبل العديد من المتصفحات الرئيسية، إذا تسمح هذه الميزة بتطبيق تنسيقات CSS على عنصر ما بناءً على حجم هذا العنصر (أو حجم الحاوية الموجود فيها) بدلاً من حجم نافذة المتصفح ككل، أي تمكنك هذه الميزة من تغيير تصميم صفحات الويب بالاعتماد على أبعاد الحاوية التي تحتوي عناصر الصفحة، مما يوفر مرونة أكبر في التصميم وينظم الكود ويسهل صيانته.
</p>

<p>
	سنشرح في الفقرات التالية ما هي هذه الاستعلامات؟ وكيف يمكننا استخدامها لبناء تصاميم أكثر أناقة ومرونة؟ وهل ما زلنا بحاجة إلى استعلامات الوسائط <a href="https://academy.hsoub.com/programming/css/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A5%D9%84%D9%89-%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D8%B3%D8%A7%D8%A6%D8%B7-media-queries-%D9%81%D9%8A-css-r2309/" rel="">Media Queries</a> أم أن استعلامات الحاوية ستحل محلها؟
</p>

<h2 id="">
	مشكلة استخدام استعلامات الوسائط في التصميم
</h2>

<p>
	كي نفهم فائدة استعلامات الحاوية وكيف يمكننا استخدامها لنأخذ المثال التالي لتصميم موقع أخباري، فكما تلاحظ في الصورة يتألف موقعنا الإخباري من مجموعة من الأخبار أو المقالات التي تحتوي على صورة وعنوان ومحتوى نصي، كما يوجد شريط جانبي على الجانب الأيمن للصفحة يحتوي على المقالات الشائعة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152034" href="https://academy.hsoub.com/uploads/monthly_2024_06/1.png.b83101b7e242795fdffeaea577b839d4.png" rel=""><img alt="1" class="ipsImage ipsImage_thumbnailed" data-fileid="152034" data-unique="yp6pb2v38" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_06/1.thumb.png.9d92d6eea833b64351e63bccc064c6b2.png"> </a>
</p>

<p>
	يمكننا تقسيم هذا التصميم إلى جزأين أو شبكتين: شبكة على الطرف الأيسر مكونة من 4 أعمدة، وشبكة على الطرف الأيمن مؤلفة من عمود واحد على النحو التالي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152035" href="https://academy.hsoub.com/uploads/monthly_2024_06/2.png.4c2994735923a0d119e3e02d7e8e4e8e.png" rel=""><img alt="2" class="ipsImage ipsImage_thumbnailed" data-fileid="152035" data-unique="qplyufbu7" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_06/2.thumb.png.5401c7e37959a208ff87816ca759503c.png"> </a>
</p>

<p>
	لدينا مقالة مميزة كبيرة على اليسار تمتد على أربعة أعمدة، وإلى الأسفل منها يوجد لدينا مقالتان تمتد كل منهما على عمودين، ولكل مقالة من هاتين المقالتين تصميم أفقي مؤلف من صورة على اليسار ونص على اليمين، وتحت هاتين المقالتين يوجد لدينا أربع مقالات أصغر حجمًا تمتد كل منها على عمود واحد. كما يظهر عمود المقالات الشائعة بنفس التصميم كشريط جانبي على الطرف الأيمن للصفحة.
</p>

<p>
	نلاحظ في هذا الموقع وجود ثلاث تنسيقات مختلفة ومميزة والتي سنستعرض تاليًا جميع مكوناتها وطريقة تنفيذها. ولكن قبل هذا دعنا نرى ماذا سيحدث للتصميم عند استخدام حجم نوافذ عرض أصغر من خلال الشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152036" href="https://academy.hsoub.com/uploads/monthly_2024_06/3.png.3f806794e5be2c349e6875279f29ef2e.png" rel=""><img alt="3" class="ipsImage ipsImage_thumbnailed" data-fileid="152036" data-unique="l0k0ekmrp" src="https://academy.hsoub.com/uploads/monthly_2024_06/3.thumb.png.a99d5dc50fbd83207ea6b04b1709eebe.png"> </a>
</p>

<p>
	عندما تعرض الموقع باستخدام الهواتف المحمولة ستظهر الصور فوق النصوص في جميع المقالات بما في ذلك المقالة الرئيسية بحيث لا يمكن التمييز بين تصماميم هذه المقالات، وعند استعراضها في أحجام الشاشات الأكبر قليلًا سيكون للمقالات تخطيط أفقي، أما في نوافذ العرض الأكبر (كالحاسوب اللوحي على سبيل المثال) ستظهر  مقالتان أفقيتان تحت المقالة الرئيسية وأربع مقالات موجودة أسفل هاتين المقالتين، وبالمحصلة النهائية سيكون لدينا ثلاثة تصميمات مختلفة للمقالات بحسب حجم نافذة العرض viewport.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152037" href="https://academy.hsoub.com/uploads/monthly_2024_06/4.png.6ca19cecc282137ecc77577c6eb73952.png" rel=""><img alt="4" class="ipsImage ipsImage_thumbnailed" data-fileid="152037" data-unique="hkhpqjrjv" style="width: 699px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_06/4.thumb.png.35866a6b6ecab005dab9fc41462752b0.png"> </a>
</p>

<p>
	إذا أردت استخدام استعلامات الوسائط Media Queries لتنفيذ هذا التصميم من خلال الاستعلام عن حجم نافذة العرض، فستحتاج إلى إنشاء مكونات منفصلة للتعامل مع تصميم كل مقالة على حدة. وهذا يجعل الكود المكتوب غير عملي وصعب الصيانة ويتطلب تعديلات مستمرة لكل عنصر من عناصر التصميم بدلاً من الاعتماد على حجم الحاوية المحيطة بكل عنصر بشكل مباشر.
</p>

<h3 id="-1">
	وضع المحتوى ضمن المساحة المتوفرة
</h3>

<p>
	إذا أراد أحد محرري الموقع وضع محتوى مختلف بجانب موجز الأخبار، ستكون النتيجة أن التصميم الذي قمنا به والمؤلف من خمسة أعمدة لن يكون مناسبًا لهذا الموقع، وبالتالي يتوجب علينا إعادة التصميم ووضع المقالات فوق بعضها البعض كما يلي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152038" href="https://academy.hsoub.com/uploads/monthly_2024_06/5.png.aa378f1ec04da4b3ced8f4bfe7c30419.png" rel=""><img alt="5" class="ipsImage ipsImage_thumbnailed" data-fileid="152038" data-unique="9tgniqyh1" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_06/5.thumb.png.33a6595857e3a824ed00732766a468e0.png"> </a>
</p>

<p>
	فعندما نستخدم استعلامات الوسائط لاكتشاف حجم إطار العرض أو نافذة العرض viewport، سيعتمد التصميم على أبعاد نافذة المتصفح بشكل عام، وليس على أبعاد العناصر الفردية داخل تلك النافذة، وهذا قد يؤدي لتصميم غير <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-responsive-web-design-r2302/" rel="">متجاوب</a> بما فيه الكفاية في حال وجود عناصر ذات أحجام مختلفة ومتفاوتة بشكل كبير ضمن نفس نافذة العرض، والحل الأفضل في هذه الحالة هو استخدام استعلامات الحاوية container queries .
</p>

<h2 id="containerqueries">
	ما هي استعلامات الحاوية Container Queries؟
</h2>

<p>
	استعلامات الحاوية هي الاستعلامات التي تسمح لك بالاستعلام عن حجم العنصر بدلًا من الاستعلام عن حجم نافذة العرض، ولتنسيق العناصر وفق ذلك يمكننا استخدام هذه الاستعلامات بطريقة مشابهة لاستخدام استعلامات الوسائط media queries لكن ستوفر لنا استعلامات الحاوية container queries مرونة أكبر بكثير عند إنجاز التصميم، كما أن استعلامات الحاوية تبسط الكود بشكل كبير.
</p>

<h2 id="-2">
	تخطيط عناصر صفحة الويب باستخدام استعلامات الحاوية
</h2>

<p>
	لنأخذ على سبيل المثال أحد العناصر من موقعنا الإخباري وليكن أحد المقالات ونتعرف على كيفية <a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-r1499/" rel="">إنشاء تصميم متجاوب</a> له باستخدام استعلامات الحاوية container queries.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152039" href="https://academy.hsoub.com/uploads/monthly_2024_06/6.png.f408764f10e276b4de864f9983c66666.png" rel=""><img alt="6" class="ipsImage ipsImage_thumbnailed" data-fileid="152039" data-unique="t7i89t4yl" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_06/6.thumb.png.fe99511556a9ffd70cdb3a10ab11ca9b.png"> </a>
</p>

<h3 id="-3">
	إنشاء الحاوية
</h3>

<p>
	تحتاج إلى عنصر حاوية للاستعلام عنه قبل البدء بكتابة استعلام الحاوية، وبما أن المثال الذي بين أيدينا هو موقع أخباري فإننا بحاجة إلى عنصر الحاوية الذي يغلف كل مقالة على حدة ويتعامل معها على أنها حاوية container. والاختيار الأنسب في هذه الحالة هو عنصر القائمة <code>&lt;li&gt;</code> نظرًا لأن موقعنا يعرض قائمة من المقالات، ولذلك سنضع صنف لعنصر القائمة يحمل الاسم <code>article-container</code> لتمييزها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152040" href="https://academy.hsoub.com/uploads/monthly_2024_06/7.png.67dad53413eed80f53cd8a2d5d89a7f0.png" rel=""><img alt="7" class="ipsImage ipsImage_thumbnailed" data-fileid="152040" data-unique="rsrhnzrl0" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_06/7.thumb.png.382b8891ca4270d24e2df0c2b52c8db1.png"> </a>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5126_13" style=""><span class="tag">&lt;ul</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"grid"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"article-container"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;article&gt;</span><span class="pln">...</span><span class="tag">&lt;/article&gt;</span><span class="pln">
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"article-container"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;article&gt;</span><span class="pln">...</span><span class="tag">&lt;/article&gt;</span><span class="pln">
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"article-container"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;article&gt;</span><span class="pln">...</span><span class="tag">&lt;/article&gt;</span><span class="pln">
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  ...
</span><span class="tag">&lt;/ul&gt;</span></pre>

<p>
	سننشئ الحاوية باستخدام خاصيتين من خصائص CSS هما اسم الحاوية <code>container-name</code> و نوع الحاوية <code>container-type</code>، بالنسبة لاسم الحاوية فهو اسم اختياري ولكن يفضل اختيار اسم مناسب خاصة عندما نستخدم أكثر من حاوية ضمن الصفحة، وبما أن صفحتنا تتحدث عن المقالات سنختار لها اسم <code>article</code>.
</p>

<p>
	أما بالنسبة للخاصية <code>container-type</code> فيجب أن تأخذ القيمة <code>inline-size</code> وهذه القيمة هي قيمة منطقية تشير إلى العرض عندما نستخدم نظام الكتابة الأفقي وإلى الارتفاع عندما نستخدم نظام الكتابة العمودي (المستخدم في لغات مثل الصينية واليابانية التقليدية).
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5126_15" style=""><span class="pun">.</span><span class="pln">article-container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">container-name</span><span class="pun">:</span><span class="pln"> article</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">container-type</span><span class="pun">:</span><span class="pln"> inline-size</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ويمكنك كتابة اسم ونوع الحاوية container في سطر برمجي واحد للاختصار كما يلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5126_17" style=""><span class="pun">.</span><span class="pln">article-container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">container</span><span class="pun">:</span><span class="pln"> article </span><span class="pun">/</span><span class="pln"> inline-size</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3 id="-4">
	الاستعلام عن الحاوية
</h3>

<p>
	بمجرد تعريف الحاوية يمكنك كتابة استعلام الحاوية بطريقة مشابهة لاستعلام الوسائط، ويمكنك اختيار اسم الحاوية عند كتابة الاستعلام أو تركها بدون اسم وفي هذه الحالة سيستخدم الاستعلام الحاوية الأقرب بشكل افتراضي.
</p>

<p>
	إذا لم تعرف الحاوية المناسبة، فسيكون سلوك الاستعلام مشابهًا لسلوك استعلام الوسائط، وبالتالي سيتم الاستعلام عن حجم إطار العرض viewport لا عن حجم العنصر المحدد.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5126_19" style=""><span class="com">/* Without a named container */</span><span class="pln">
</span><span class="pun">@</span><span class="pln">container </span><span class="pun">(</span><span class="pln">width </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">700px</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">/* Styles applied to elements within any container when the container is over 700px wide  */</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	في هذه الحالة ستطبق التنسيقات على أي عنصر داخل أي حاوية container عرضها أكبر من 700 بكسل.
</p>

<p>
	من المفيد بالطبع تحديد حاوية ذات اسم مميز حتى نتأكد من الحاوية التي نستعلم عنها ولتجنب المشكلات خاصة عند التعامل مع تصاميم تحتوي على حاويات متداخلة فيما بينها كما يلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5126_21" style=""><span class="com">/* Specifying a named container */</span><span class="pln">
</span><span class="pun">@</span><span class="pln">container article </span><span class="pun">(</span><span class="pln">width </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">700px</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">/* Styles applied to elements within the 'article' container when the container is over 700px wide  */</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ويمكنا بشكل مشابه تمامًا لاستعلام الوسائط استخدام عدة استعلامات حاوية، لاحظ الكود التالي استخدام استعلامات الحاوية لجعل تصميم العناصر يتكيف بناءً على حجم الحاوية، إذ حددنا أنماطًا مختلفة للعناصر داخل الحاوية بناءً على عرض الحاوية لتحقيق مرونة أكبر في التصميم واستجابة أفضل للعناصر المتداخلة داخل الحاويات المختلفة.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5126_23" style=""><span class="pun">.</span><span class="pln">article-container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">container</span><span class="pun">:</span><span class="pln"> article </span><span class="pun">/</span><span class="pln"> inline-size</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

article </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1rem</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">@</span><span class="pln">container article </span><span class="pun">(</span><span class="pln">inline-size </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">500px</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">/* Styles for horizontal article */</span><span class="pln">
  article </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">2fr</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">@</span><span class="pln">container article </span><span class="pun">(</span><span class="pln">inline-size </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">800px</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  article </span><span class="pun">{</span><span class="pln">
    </span><span class="com">/* Styles for article in a large space (e.g. featured article) */</span><span class="pln">
    </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2rem</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.2rem</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  h3 </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2rem</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3 id="-5">
	صيغة استعلام الوسائط الجديد
</h3>

<p>
	ربما تلاحظ اختلافًا بسيطًا بين طريقة كتابة استعلامات الحاوية وطريقة كتابة استعلامات الوسائط العادية، فبدلًا من استخدام الخاصتين <code>min-width</code> و<br>
	<code>max-width</code>، نستخدم صيغة مجال استعلام الوسائط، وهذه الميزة تقلل عدد الاستعلامات.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5126_25" style=""><span class="com">/* Old syntax for styles between 700px and 900px */</span><span class="pln">
</span><span class="pun">@</span><span class="pln">container </span><span class="pun">(</span><span class="kwd">min-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">700px</span><span class="pun">)</span><span class="pln"> and </span><span class="pun">(</span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">900px</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/* New syntax */</span><span class="pln">
</span><span class="pun">@</span><span class="pln">container </span><span class="pun">(</span><span class="lit">700px</span><span class="pln"> </span><span class="pun">&lt;=</span><span class="pln"> width </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">900px</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وهذه الاستعلامات ملاءمة أكثر في حال استخدام الخصائص أو الشروط المنطقية، فبدلًا من كتابة تنسيقات تعتمد على الحد الأدنى والحد الأعلى للعرض، نستطيع أن نقول: إذا كان الحجم أكبر من أو أصغر من قيمة معينة طبق التنسيقات التالية عليه.
</p>

<p>
	لنعد كتابة استعلام الحاوية في مثالنا السابق باستخدام الخاصية <code>inline-size</code> بدلًا من الخاصة <code>min-width</code>
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5126_27" style=""><span class="pun">@</span><span class="pln">container article </span><span class="pun">(</span><span class="pln">inline-size </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">700px</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  article </span><span class="pun">{</span><span class="pln">
    </span><span class="com">/* Styles for horizontal article */</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يطبق التنسيق في هذه الحالة إذا كانت الحاوية <code>article</code> تمتد لعرض يزيد على 700 بكسل.
</p>

<h2 id="nestedcontainers">
	الحاويات المتداخلة Nested Containers
</h2>

<p>
	أحيانًا يكون لديك تصميم يحتاج إلى التجاوب مع المساحة المتوفرة وليس فقط مع العناصر الفردية، وتغيير الطريقة التي تُرتب بها العناصر ضمن شبكة أو تخطيط معين. في هذه الحالة، يمكن استخدام الحاويات المتداخلة، على سبيل المثال يحتاج تصميم الشبكة في مثالنا للاستجابة للمساحة المتوفرة إضافًة إلى حاجته إلى مكونات <code>article</code> متجاوبة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="152041" href="https://academy.hsoub.com/uploads/monthly_2024_06/8.png.ad069d53b6b8dcf649bed66b473c22d0.png" rel=""><img alt="8" class="ipsImage ipsImage_thumbnailed" data-fileid="152041" data-unique="m248bhwoe" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_06/8.thumb.png.f26fa9849633b46e873a1ca11d68f534.png"> </a>
</p>

<p>
	وهذا يعني أننا بحاجة إلى إنشاء حاوية إضافية محيطة بشبكتنا، وبالتالي سنحتاج إلى تعديل كود HTML لتضمين الحاوية الإضافية
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5126_35" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"grid-container"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;ul</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"grid"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"article-container"</span><span class="tag">&gt;</span><span class="pln">...</span><span class="tag">&lt;/li&gt;</span><span class="pln">
    </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"article-container"</span><span class="tag">&gt;</span><span class="pln">...</span><span class="tag">&lt;/li&gt;</span><span class="pln">
    </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"article-container"</span><span class="tag">&gt;</span><span class="pln">...</span><span class="tag">&lt;/li&gt;</span><span class="pln">
    ...
  </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	أما كود CSS فسيصبح كما يلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5126_33" style=""><span class="pun">.</span><span class="pln">grid-container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">container</span><span class="pun">:</span><span class="pln"> layout </span><span class="pun">/</span><span class="pln"> inline-size</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سنكتب في الكود التالي استعلامات حاوية مخصصة لعمودين. واستعلامات حاوية مخصصة لأربعة أعمدة على التناوب في حال توفر المساحة الكافية.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5126_37" style=""><span class="com">/* Initial styles for single column layout */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">grid </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1rem</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">@</span><span class="pln">container layout </span><span class="pun">(</span><span class="pln">inline-size </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">800px</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">grid </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="com">/* The featured article should span two columns */</span><span class="pln">
  </span><span class="pun">.</span><span class="kwd">article-container</span><span class="pun">:</span><span class="pln">first-child </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> span </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">@</span><span class="pln">container layout </span><span class="pun">(</span><span class="pln">inline-size </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">1000px</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">grid </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="pun">.</span><span class="kwd">article-container</span><span class="pun">:</span><span class="pln">first-child </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> span </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="pun">.</span><span class="kwd">article-container</span><span class="pun">:</span><span class="pln">nth-child</span><span class="pun">(</span><span class="lit">2</span><span class="pun">),</span><span class="pln">
  </span><span class="pun">.</span><span class="kwd">article-container</span><span class="pun">:</span><span class="pln">nth-child</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> span </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	إذا غيرت حجم العنصر أو المكون، ستلاحظ كيف ستستجيب كل من تصميم الشبكة والمقالات المتداخلة للمساحة المتوفرة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="152433" href="https://academy.hsoub.com/uploads/monthly_2024_07/container-queries.gif.1d8a048c5ed0bf556e0195e84b3befe7.gif" rel=""><img alt="container-queries.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="152433" data-ratio="66.67" data-unique="7mioseyma" style="width: 700px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_07/container-queries.thumb.gif.fbf01a38f0ce74e0eb034936e17f5fe6.gif"></a>
</p>

<h2 id="containerunits">
	وحدات الحاوية Container Units
</h2>

<p>
	من خبرتك السابقة، قد تكون على دراية بالفعل <a href="https://academy.hsoub.com/programming/css/%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D9%82%D9%8A%D8%A7%D8%B3-%D9%88%D8%A7%D9%84%D9%82%D9%8A%D9%85-%D9%81%D9%8A-css-r2161/" rel="">بوحدات قياس</a> إطار العرض viewport units المستخدمة لتحديد حجم العناصر بما يتناسب مع حجم نافذة العرض مثل <a href="https://wiki.hsoub.com/CSS/length#vw" rel="external">vw</a> التي تمثل نسبة مئوية من كامل عرض النافذة و <a href="https://wiki.hsoub.com/CSS/length#vh" rel="external">vh</a> التي تمثل نسبة مئوية من كامل ارتفاع النافذة، أما وحدات الحاوية container units فهي تمكنك من تحديد حجم العناصر بما يتناسب مع حجم الحاوية وهذه الوحدات مفيدة بشكل خاص في تنسيق المقالات في موقعنا الأخباري، حيث يمكننا استخدامها لتحديد الحواشي <a href="https://wiki.hsoub.com/CSS/padding" rel="external">padding</a> وحجم الخط <a href="https://wiki.hsoub.com/CSS/font-size" rel="external">font-size</a>، مما يقلل الحاجة إلى ضبط النقاط الحديّة <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D9%84%D8%B4%D8%B1%D8%AD-%D8%A7%D9%84%D9%86%D9%82%D8%A7%D8%B7-%D8%A7%D9%84%D8%AD%D8%AF%D9%8A%D8%A9-%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8%D8%A9-r861/" rel="">breakpoints</a> المختلفة.
</p>

<p>
	تُستخدم وحدة cqi لتحديد النسبة المئوية من الحجم المضمن للحاوية inline-size كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5126_39" style=""><span class="pln">article </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4cqi</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يحدد هذا الكود قيمة الكود الحواشي padding للعنصر <code>article</code> لتكون 4% من العرض الداخلي لحاوية العنصر.
</p>

<p>
	ملاحظة: لا داعي لكتابة هذه التنسيقات داخل استعلام الحاوية، فمادمت قد عرّفتها في البداية فستكون جاهزة للاستخدام ضمن الحاوية.
</p>

<p>
	نستطيع أن نستخدم التابع <code>()clamp</code> لمنع الحاشية padding من أن تكون كبيرة جدًا أو صغيرة جدًأ. وسيجد هذا التابع بدوره القيمة الوسطى middle value عن طريق تمرير قيمتين ثابتتين بالإضافة إلى القيمة الممررة <code>cqi</code> وبذلك نستطيع التأكد من أن القيمة padding لن تكون أصغر من <code>1rem</code> ولا أكبر من <code>3rem</code>.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4491_7" style=""><span class="pln">article </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> clamp</span><span class="pun">(</span><span class="lit">1rem</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4cqi</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2rem</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ويمكن بنفس الطريقة لضبط حجم الخط بحيث يتكيف مع حجم الحاوية عن طريق التابع <code>clamp</code> ووحدات الحاوية container units.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6336_9" style=""><span class="pln">article </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> clamp</span><span class="pun">(</span><span class="lit">1rem</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4cqi</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2rem</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> clamp</span><span class="pun">(</span><span class="lit">1rem</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2cqi</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3rem</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="152438" href="https://academy.hsoub.com/uploads/monthly_2024_07/container-queries-02.gif.e3eb0dc7538c5c454214c7e577a415f2.gif" rel=""><img alt="container-queries-02.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="152438" data-ratio="56.29" data-unique="j5kj3qwco" style="width: 700px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_07/container-queries-02.thumb.gif.df701eecafab46899153870578a8b6a9.gif"></a>
</h2>

<h2 id="-6">
	دعم المتصفحات والخيارات الاحتياطية
</h2>

<p>
	أصبحت استعلامات الحاوية مدعومة في جميع المتصفحات الرئيسية مؤخرًا، ولكن لازال معظم المستخدمين يستخدمون متصفحات قديمة، ولتلبية احتياجاتهم ما علينا سوى استخدام الملف <a href="https://github.com/GoogleChromeLabs/container-query-polyfill" rel="external nofollow">polyfill</a> المقدم من فريق العمل في google chrome. حيث يوفر هذا الملف دعمًا لاستعلامات الحاوية في المتصفحات التي لا تدعمها بشكل أصلي عن طريق تحويل استعلامات الحاوية إلى استعلامات وسائط مع استخدام خصائص CSS مخصصة للحفاظ على نفس السلوك. هذا يمكن من استخدام ميزات استعلامات الحاوية الجديدة دون التخلي عن المستخدمين الذين لديهم متصفحات أقدم.
</p>

<h2 id="stylequeries">
	استعلامات التنسيق Style queries
</h2>

<p>
	لقد ناقشنا فيما سبق عملية بناء التنسيق باستخدام استعلامات الحاوية للاستعلام عن الحجم الداخلي للعنصر، ولكن يمكن أن تطبق استعلامات الحاوية على أمور أخرى مثل الاستعلام عن تنسيقات العنصر المطبقة على خصائص محددة.
</p>

<p>
	بالعودة إلى موقعنا الإخباري ربما نرغب في لفت الانتباه إلى المقالات المميزة والتي قد يكون لها تنسيقات مختلفة، يمكننا عمل ذلك من خلال وضع خاصية محددة ضمن الكود كما يمكننا تطبيق التنسيقات على العناصر ذات التي تحمل قيمة محددة لهذه الخاصية.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5126_41" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"grid-container"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;ul</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"grid"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"article-container"</span><span class="tag">&gt;</span><span class="pln">...</span><span class="tag">&lt;/li&gt;</span><span class="pln">
    </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"article-container"</span><span class="tag">&gt;</span><span class="pln">...</span><span class="tag">&lt;/li&gt;</span><span class="pln">
    </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"article-container"</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="pun">--</span><span class="kwd">featured</span><span class="pun">:</span><span class="pln"> true</span><span class="atv">"</span><span class="tag">&gt;</span><span class="pln">...</span><span class="tag">&lt;/li&gt;</span><span class="pln">
    ...
  </span><span class="tag">&lt;/ul&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<pre class="ipsCode">@container style(--featured: true) {
  article {
    border-radius: 0.2rem;
    background: pink;
    border: 1px solid deeppink;
    padding: clamp(1rem, 5cqi, 3rem);
  }
}
</pre>

<p>
	لاحظ أننا لا نحتاج في هذا الكود إلى تعريف الحاوية container حيث أن كل عنصر يحتوي تلقائيًا على التنسيق الخاص به.
</p>

<h3 id="-7">
	القيود ودعم المتصفحات
</h3>

<p>
	حتى وقت كتابة هذا المقال يدعم كل من متصفح Chrome ومتصفح Edge استعلامات تنسيق الحاوية بينما لا يدعم المتصفحان Firefox و Safari هذه التقنية، والسبب في ذلك هو عدم الإيفاء ببند موجود في مواصفات المستوى 3 لوحدة احتواء CSS للاستعلام عن الخاصية والقيمة معًا وليس الاستعلام عن خاصية محددة. وعلى كل حال لا توجد متصفحات تدعم هذه الخواص حتى الآن.
</p>

<h2 id="-8">
	هل ما زلنا بحاجة إلى استعلامات الوسائط
</h2>

<p>
	من خلال استخدامنا لاستعلامات الحاوية أصبح بإمكاننا الاستعلام عن حجم إطار العرض وحجم العنصر، وهنا يتبادر إلى أذهاننا السؤال التالي: هل ما زلنا بحاجة إلى استخدام استعلامات الوسائط في الكود؟ الجواب القطعي هو نعم لأن استعلامات الوسائط تستخدم في أمور أكثر بكثير من موضوع الحجم.على سبيل المثال لا الحصر يمكننا من خلال استخدام استعلامات الوسائط اكتشاف تفضيلات المستخدمين من خلال التابع <code>prefers-reduced-motion</code> والتابع <code>prefers-color-scheme</code>.
</p>

<p>
	من المحتمل أن نحتاج في بعض الحالات إلى تصميم عنصر ضمن حاوية متداخلة وفقًا لحجم إطار العرض، في هذه الحالة ربما يكون استخدام استعلام الوسائط هو الطريقة الأبسط، ولكننا نعتقد أن استعلامات الحاوية ستحل مكانها في المستقبل غير البعيد حيث ستأخذ استعلامات الحاوية مكان استعلامات الوسائط عندما يتعلق الأمر بتخطيط التصميم أما استعلامات الوسائط فسوف تحافظ على استخداماتها التي ذكرنا فيما سبق من هذا المقال.
</p>

<h2 id="-9">
	الخلاصة
</h2>

<p>
	تساعدنا استعلامات الحاوية في الوصول إلى تصاميم سريعة الاستجابة بالإضافة إلى مساعدتنا في كتابة كود CSS مختصر وقوي وقابل للصيانة. جرب البدء بالتعامل مع استعلامات الحاوية مع عناصر صفحتك، وإذا كان هناك عنصر ما تواجه صعوبة في إنشائه باستخدام استعلامات الحاوية، يمكن أن ننشئه باستخدام استعلامات الوسائط كالمعتاد.
</p>

<p>
	نتمنى لكم الاستفادة الجيدة من هذا المقال، وفي حال كان لديكم أي تساؤل يمكن تركه في قسم التعليقات أسفل المقال أو كتابته في <a href="https://academy.hsoub.com/questions/" rel="">قسم الأسئلة والأجوبة</a> في الأكاديمية.
</p>

<p>
	ترجمة وبتصرف للمقال <a href="https://developer.mozilla.org/en-US/blog/getting-started-with-css-container-queries/" rel="external nofollow">Getting started with CSS container queries</a> لكاتبته Michelle Barker.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">تعرف على أساسيات لغة CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82-css-r551/" rel="">الدليل السريع إلى لغة التنسيق CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D9%82%D9%8A%D8%A7%D8%B3-%D9%88%D8%A7%D9%84%D9%82%D9%8A%D9%85-%D9%81%D9%8A-css-r2161/" rel="">وحدات القياس والقيم في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%AD%D8%AC%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B4%D9%8A%D8%A7%D8%A1-%D9%81%D9%8A-css-r2162/" rel="">تحجيم الأشياء في CSS</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2356</guid><pubDate>Fri, 05 Jul 2024 15:00:00 +0000</pubDate></item><item><title>&#x62F;&#x639;&#x645; &#x627;&#x644;&#x645;&#x62A;&#x635;&#x641;&#x62D;&#x627;&#x62A; &#x627;&#x644;&#x642;&#x62F;&#x64A;&#x645;&#x629; &#x639;&#x646;&#x62F; &#x62A;&#x62E;&#x637;&#x64A;&#x637; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628;</title><link>https://academy.hsoub.com/programming/css/%D8%AF%D8%B9%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%82%D8%AF%D9%8A%D9%85%D8%A9-%D8%B9%D9%86%D8%AF-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2314/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_05/-------.png.e349556e028d446feb25ac153470fb8a.png" /></p>
<p>
	من الضروري لأي مصمم مواقع ويب أن يتم بتصميم موقعه بشكل يتوافق مع احتياجات وتفضيلات الجمهور المستهدف. وفي مقال اليوم نناقش كيفية تحقيق ذلك وإظهار الموقع بشكل مقبول على مجموعة متنوعة من المتصفحات، بما في ذلك الإصدارات القديمة، مما يضمن تجربة مرضية لجميع الزوار.
</p>

<p>
	عليك قبل البدء في قراءة سلسلة المقالات هذه أن:
</p>

<ol>
	<li>
		تطلع على أساسيات HTML كما شرحناها في سلسلة المقالات <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">مدخل إلى HTML</a>.
	</li>
	<li>
		تتفهم أساسيات CSS كما شرحناها في سلسلة المقالات <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-css-r70/" rel="">خطواتك الأولى في CSS</a>.
	</li>
</ol>

<p>
	فقد يزور صفحتك بعض الزوار الذين يستخدمون متصفحات أقدم او لا تدعم <a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2238/" rel="">أساليب تخطيط صفحات الويب الحديثة</a>. وهذا ما يحدث في عالم الويب، فلا تدعم كل المتصفحات جميع الميزات الجديدة مباشرة بل يعتمد مطورها أولويات مختلفة في دعم ما يستجد. وسنشرح في هذا المقال كيف نستخدم تقنيات الويب المعاصرة دون أن نستثني من يستخدم التقنيات الأقدم.
</p>

<h2 id="-1">
	ما المتصفحات التي ستعرض عليها موقعك؟
</h2>

<p>
	تختلف مواقع الويب عن بعضها وفقًا للجمهور المستهدف، لهذا لا بد من معرفة عدد متابعي موقعك الذين يستخدمون متصفحات قديمة بل أن تقرر النهج الذي تتبعه في تصميم الموقع. وهذه العملية واضحة ومباشرة إن كان لديك موقع ويب ترغب في تعديله أو استبداله بآخر، فمن المحتمل أن تمتلك مجموعة من الأدوات التحليلية القادرة على تحديد التقنية التي يستخدمها الزائرون.أما إن لم تكن تمتلك هذه الأدوات، أو كان موقعك جديد كليًا، فستجد مواقع مثل <a href="https://gs.statcounter.com/" rel="external nofollow">Statcounter</a> تستطيع تزويدك بإحصائيات وفقًا لموقعك الجغرافي.
</p>

<p>
	لا بد أن تأخذ أيضًا بعين الاعتبار نوع الجهاز الذي يستخدمه الزائر لتصفح موقعك. فقد تجد أن نسبة مستخدمي الهواتف المحمولة تزيد عن المتوسط. كما أن مراعاة شمولية الوصول أمر ضروري، فمعرفة عدد الزائرين الذين يستخدمون تقنيات حساسة أمر ضروري وقد يغدو حيويًا في بعض المواقع. إذ يلاحظ أن مطوري الويب مهتمون جدًا بتعزيز تجربة مستخدمي متصفحات إنترنت إكسبلورر القديمة الذين لا تتجاوز نسبتهم 1%، ولا يهتمون إطلاقًا بالزائرين ذوي الاحتياجات الخاصة الذين يشكلون نسبة أعلى بكثير.
</p>

<h2 id="-2">
	ما هو الدعم المقدم للميزات التي تريد استخدامها؟
</h2>

<p>
	بعد أن تطلع على أنواع المتصفحات التي قد تستعرض موقعك، يمكنك تقييم التقنيات التي عليك استخدامها بناء على دعم المتصفحات لها وسهولة تقديم بديل للزائرين الذين لا تدعم متصفحاتهم هذه التقنيات. سنحاول في هذا المقال تسهيل الأمر عليك ستجد في <a href="https://wiki.hsoub.com/CSS" rel="external">موسوعة حسوب</a> شرحًا لكل خاصية وأدنى إصدار للمتصفحات التي تدعمها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="149137" href="https://academy.hsoub.com/uploads/monthly_2024_05/01_hsoub_css.png.30af908cbd02af29d38bfa7530f345e9.png" rel=""><img alt="01 hsoub css" class="ipsImage ipsImage_thumbnailed" data-fileid="149137" data-unique="81d5n9sqx" src="https://academy.hsoub.com/uploads/monthly_2024_05/01_hsoub_css.thumb.png.b57ebc539d302abd4d6ec1f6dfad3faf.png"> </a>
</p>

<p>
	كما ستجد معلومات مماثلة ضمن موقع <a href="https://developer.mozilla.org/en-US/docs/Web/CSS" rel="external nofollow">شبكة مطوري موزيلا</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="149138" href="https://academy.hsoub.com/uploads/monthly_2024_05/02_mozilla_css.png.f33614e44d0e1960e7a793da94346a60.png" rel=""><img alt="02 mozilla css" class="ipsImage ipsImage_thumbnailed" data-fileid="149138" data-unique="sgahk9j4e" src="https://academy.hsoub.com/uploads/monthly_2024_05/02_mozilla_css.thumb.png.9e9e41ccb6904c1a9a521c8eb682a9b1.png"> </a>
</p>

<p>
	ومن الطرق الشعبية الأخرى لمعرفة دعم المتصفحات لخاصية ما نجد مواقع مساعدة مثل <a href="https://caniuse.com/" rel="external nofollow">Can I Use</a>. إذ يعرض هذا الموقع قوائم لتقنيات الويب و منصاتها الرئيسية ومعلومات عن دعم المتصفحات المختلفة لها. كما ستتمكن من معرفة إحصائيات عن استخدام ميزة ما في نطاق موقعك الجغرافي أو أي منطقة تريد من العالم. وبإمكانك أيضًا ربط حساب جوجل أنيلتيكس Google Analytics كي تحصل على تحليل للمعلومات وفقًا لمعلومات مستخدميك.
</p>

<p>
	ستزيد معرفة التقنيات التي يستخدمها زائرو موقعك ودعم المتصفحات لها من قدرتك على اتخاذ القرار المناسب والطريقة الأنسب لدعمهم جميعًا.
</p>

<h2 id="-3">
	لا يعني الدعم رؤية ما تتوقع أن تراه دائمًا!
</h2>

<p>
	لا يمكن أن ترى موقعك بنفس الشكل دائمًا على جميع المتصفحات، فقد يستعرض بعض الزائرين موقعك على هاتف محمول وآخرين على شاشة حاسوب مكتبي عريضة. وكذلك ستجد أن بعضهم يستخدم متصفحات أقدم وآخرين يستخدمون أحدث إصدارات متصفح معين. كما يقد يستمع بعض الزائرين لموقعك عن طريق قارئات الشاشة أو قد يكبرون أو يصغرون الشاشة للحصول على تجربة قراءة أوضح. ويعني تمامًا دعم جميع هؤلاء المستخدمين تقديم نسخة دفاعية من المحتوى، إذ تبدو هذه النسخة رائعة في المتصفحات الحديثة وتبقى صالحة من ناحية تقديم الوظيفة الأساسية للموقع ضمن المتصفحات الأقدم.
</p>

<p>
	يأتي المستوى الأول من دعم المتصفحات عن طريق هيكلة محتوى الصفحة جيدًا كي تتوافق مع تخطيط الانسياب الأساسي الاعتيادي <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%A7%D9%86%D8%B3%D9%8A%D8%A7%D8%A8-%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D9%8A%D8%A7%D8%AF%D9%8A-normal-flow-%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2269/" rel="">normal flow</a>. فقد لا يستفيد زائر يستخدم هاتفًا محدود الميزات من ميزات التنسيق، لكن انسياب المحتوى بشكل صحيح سيسهّل عليه التتبع والقراءة. وبالتالي نجعل الهيكلة الجيدة لصفحة HTML نقطة الانطلاق دائمًا، وينبغي ألا يتأثر محتوى الصفحة من ناحية البنية والتتابع إن حذفت تنسيقات CSS.
</p>

<p>
	ويرى البعض أن تُبقي على هذه الطريقة الأساسية في عرض الصفحة كي يتراجع إليها مستخدمو المتصفحات القديمة أو المحدودة الإمكانيات. فإن كان عدد المستخدمين هؤلاء ممن يزورون صفحتك قليلًا جدًا، قد لا يكون مفيدًا من ناحية تجارية أن تهدر وقتك في منحهم تجربة تماثل تجربة مستخدمي المتصفحات الحديثة. ومن الأجدى أن تستغل هذا الوقت في جعل موقعك أفضل من ناحية شمولية الوصول (الوصول السهل Accessibility) فقد يخدم ذلك عددًا أكبر من الزائرين. إذًا هنالك دائمًا خيار وسط بين صفحة HTML الأساسية وكل الزخارف التي تقدمها تنسيقات CSS، وقد ساهمت CSS بالفعل في جعل التراجع إلى النسخة الأساسية مباشرًا وسهلًا.
</p>

<h2 id="css">
	إنشاء خطة تراجع في CSS
</h2>

<p>
	تتضمن مواصفات CSS معلومات تشرح ما يفعله المتصفح عندما يُطبّق تخطيطين مختلفين في الوقت ذاته. أي يوجد تعريف محدد لما سيحصل إن كان العنصر معومًا و عنصر شبكة في نفس الوقت على سبيل المثال. وبالاستفادة من فكرة أن المتصفح يتجاهل قواعد التنسيق التي لا يفهمها ومعرفتك بطريقة إنشاء تخطيطات وفق التقنيات القديمة التي غطيناها في <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D9%84%D9%8A%D8%A8-%D8%A7%D9%84%D9%82%D8%AF%D9%8A%D9%85%D8%A9-%D9%81%D9%8A-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2312/" rel="">مقال سابق</a> والتي تهمل مقابل تخطيط الشبكة سيُعرض الموقع بالشكل الأمثل ضمن المتصفحات الحديثة التي تفهمها وبشكل مقبول وظيفيًا في المتصفحات الأقدم.
</p>

<h3 id="-4">
	التراجع من تخطيط الشبكة إلى تخطيط التعويم
</h3>

<p>
	لدينا في مثالنا التالي ثلاث حاويات <code>&lt;div&gt;</code> معروضة في نفس السطر تراها المتصفحات التي لا تدعم تخطيط الشبكة كثلاث صناديق معوّمة. وبما أن العنصر المعوّم الذي يصبح عنصر شبكة سيفقد سلوك التعويم، ستصبح هذه العناصر عناصر شبكة. وبالتالي ستُعرض على شكل عناصر شبكة في المتصفحات الحديثة وستتتجاهل المتصفحات الأقدم الخاصية <code>display: grid</code> وما يتعلق بها وتستخدم تخطيط التعويم.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_7480_14" style=""><span class="pun">*</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">box-sizing</span><span class="pun">:</span><span class="pln"> border-box</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> palegoldenrod</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">400px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">item </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">207</span><span class="pln"> </span><span class="lit">232</span><span class="pln"> </span><span class="lit">220</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">@</span><span class="pln">supports </span><span class="pun">(</span><span class="kwd">grid-template-rows</span><span class="pun">:</span><span class="pln"> subgrid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">grid-template-rows</span><span class="pun">:</span><span class="pln"> subgrid</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> lightblue</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">text-align</span><span class="pun">:</span><span class="pln"> center</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7480_16" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"wrapper"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Item One</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Item Two</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Item Three</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Item Four</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Item Five</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Item Six</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/MWRdrrv?default-tab=result" style="width: 100%;" title="Untitled">See the Pen Untitled by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	<strong>ملاحظة</strong>: لا تأثير للخاصية <a href="https://wiki.hsou.com/CSS/clear" rel="external nofollow"><code>clear</code></a> أيضًا عندما تصبح العناصر عناصر شبكة، لهذا تستطيع إنشاء تخطيط له تذييل footer معزول باستخدام <code>clear</code> والذي يتحول عندها إلى تخطيط شبكة.
</p>

<h3 id="-5">
	أساليب التراجع
</h3>

<p>
	هنالك العديد من التخطيطات التي يمكن استخدامها بطريقة تشابه مثالنا السابق، وبإمكانك اختيار الطريقة التي تراها أنسب لما يحتاجه موقعك:
</p>

<ul>
	<li>
		<p>
			<strong>أسلوب التعويم والعزل</strong>: كما رأينا في المثال السابق، تؤثر الخاصيتين <code>float</code> و <code>clear</code> على التخطيط إن تحوّلت العناصر المعوّمة أو المعزولة إلى عناصر مرنة flex أو عناصر شبكة grid.
		</p>
	</li>
	<li>
		<p>
			<strong>استخدام القاعدة <code>display: inline-block</code></strong>: تُستخدم هذه الطريقة لإنشاء تخطيط أعمدة. فإن تحوّل عنصر يمتلك الخاصية <code>display: inline-block</code> إلى عنصر مرن أو عنصر شبكة سيتجاهل المتصفح القاعدة <code>display: inline-block</code>.
		</p>
	</li>
	<li>
		<p>
			<strong>القاعدة <code>display:table</code></strong>: يُستخدم هذا الأسلوب في إنشاء تخطيط جدول. فإن امتلك العنصر خواص مثل <code>display: table</code> و <code>display: table-cell</code> ثم تحوّل إلى عنصر شبكة أو عنصر مرن، يتجاهل المتصفح سلوك الخاصية <code>display</code>.
		</p>
	</li>
	<li>
		<p>
			<strong>التخطيط متعدد الأعمدة</strong>: يمكنك في حالات محددة استخدام <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D9%85%D8%AA%D8%B9%D8%AF%D8%AF-%D8%A7%D9%84%D8%A3%D8%B9%D9%85%D8%AF%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2297/" rel="">التخطيط متعدد الأعمدة</a> كتخطيط تراجع إذا امتلكت الحاوية إحدى الخاصيات <code>-column</code> ومن ثم تحوّلت إلى حاوية شبكة، سيتجاهل حينها المتصفح سلوك تعدد الأعمدة.
		</p>
	</li>
	<li>
		<p>
			<strong>التراجع من تخطيط الشبكة إلى تخطيط الصندوق المرن</strong>: يتمتع <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B5%D9%86%D8%AF%D9%88%D9%82-%D8%A7%D9%84%D9%85%D8%B1%D9%86-flexbox-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2279/" rel="">تخطيط الصندوق المرن</a> بدعم أوسع من قبل المتصفحات موازنة بتخطيط الشبكة كونه مدعوم من متصفح إنترنت إكسبلورر بنسختيه 10 و 11. فإن حوّلت تخطيط الصندوق المرن إلى تخطيط شبكة سيتجاهل المتصفح أي خاصية من خواص <code>flex</code> التي تُطبق على العناصر الأبناء.
		</p>
	</li>
</ul>

<p>
	باستخدام حيل CSS كالتي استعرضناها ستكون قادرًا على منح مستخدمي المتصفحات الأقدم تجربة لائقة. إذ يمكننا إضافة تخطيط أبسط مبني على تقنيات قديمة مدعومة جيدًا ثم نستخدم خاصيات تنسيق أحدث لإنشاء تخطيط عصري يراه أكثر من 90% من المستخدمين. لكن لا بد في بعض الحالات كتابة شيفرة تراجع تتضمن تقنيات تفهمها المتصفحات الحديثة أيضًا، ومن الأمثلة عليها استخدام نسبة مئوية لتقدير اتساع العناصر المعوّمة كي تبدو الأعمدة أقرب إلى شكل الشبكة وتتمدد لتملأ الحاوية.
</p>

<p>
	يُحسب اتساع العنصر المعوّم ليكون 33.333% من اتساع الحاوية، أي ثلث الاتساع، بينما تحسب نسبة 33.333% في الشبكة من المساحة التي يقع ضمنها في الشبكة وستصبح ثلث القياس الذي نريد بمجرد تحوّل التخطيط إلى تخطيط شبكة.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_7480_20" style=""><span class="pun">*</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">box-sizing</span><span class="pun">:</span><span class="pln"> border-box</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">79</span><span class="pun">,</span><span class="pln"> </span><span class="lit">185</span><span class="pun">,</span><span class="pln"> </span><span class="lit">227</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">400px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">item </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">207</span><span class="pun">,</span><span class="pln"> </span><span class="lit">232</span><span class="pun">,</span><span class="pln"> </span><span class="lit">220</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">33.333%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7480_30" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"wrapper"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Item One</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Item Two</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Item Three</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="200" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/BaEeJqK?default-tab=result" style="width: 100%;" title="Untitled">See the Pen Untitled by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	للتعامل مع هذه الحالة لابد من طريقة لمعرفة إن كان تخطيط الشبكة مدعومًا وبالتالي ستتجاوز اتساع التخطيط الأقدم ،وهنا تقدم لنا CSS حلًا.
</p>

<h2 id="-6">
	الاستعلام عن الميزات
</h2>

<p>
	يساعدك الاستعلام عن الميزات في اختبار دعم المتصفح لأي ميزة من ميزات CSS، أي بإمكانك كتابة تنسيقات خاصة بالمتصفحات التي لا تدعم ميزات معينة، ثم التحقق لترى إن كان المتصفح يدعم ما تختبره من ميزات فإن كان كذلك سيعرض التخطيط العصري.
</p>

<p>
	إن أضفنا استعلام عن ميزة إلى مثالنا السابق، سنتمكن من إعادة ضبط الاتساعات العناصر على القيمة <code>auto</code> إن علمنا أن المتصفح يدعم تخطيط الشبكة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_7480_28" style=""><span class="pun">*</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">box-sizing</span><span class="pun">:</span><span class="pln"> border-box</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">79</span><span class="pun">,</span><span class="pln"> </span><span class="lit">185</span><span class="pun">,</span><span class="pln"> </span><span class="lit">227</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">400px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">item </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">207</span><span class="pun">,</span><span class="pln"> </span><span class="lit">232</span><span class="pun">,</span><span class="pln"> </span><span class="lit">220</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">33.333%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">@</span><span class="pln">supports </span><span class="pun">(</span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">item </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7480_26" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"wrapper"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Item One</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Item Two</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"item"</span><span class="tag">&gt;</span><span class="pln">Item Three</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="200" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/WNWBdYR?default-tab=result" style="width: 100%;" title="Untitled">See the Pen Untitled by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	تدعم المتصفحات الحديثة استعلامات الميزات جيدًا، لكن عليك الانتباه إلى أن المتصفحات التي لا تدعم تخطيط الشبكة قد لا تدعم استعلامات الميزات. ويعني ذلك أن المقاربة التي فصلناها في المثال السابق ستعمل أيضًا جيدًا في تلك المتصفحات. فما نفعله هو كتابة تنسيقات CSS القديمة أولًا خارج إطار الاستعلام. فالمتصفحات التي لا تدعم الشبكة ولا تدعم استعلام الميزات ستستعمل معلومات التنسيق القديم التي تفهمها وتتجاهل كليًا أي شيء آخر. أما المتصفحات التي تدعم استعلام الميزات وتدعم تخطيط الشبكة ستنفذ تنسيقات الشبكة الموجودة ضمن استعلام الميزات وتتجاهل كل شيء آخر.
</p>

<p>
	تتضمن توصيفات استعلام الميزات القدرة على اختبار عدم قدرة المتصفح على دعم ميزة وهذا مفيد فقط إن دعم المتصفح استعلام الوسائط. سنرى مستقبلًا مقاربة مبنية على التحقق من عدم دعم المتصفح للميزات، إذ ستختفي المتصفحات التي لا تدعم استعلامات الميزات. أما الآن، فعليك استخدام مقاربة التنسيقات القديمة أولًا ثم تجاوزها إذا دعم المتصفح الميزات الأحدث.
</p>

<h2 id="1110">
	نسخ من خاصيات الشبكة الخاصة بمتصفح إنترنت إكسبلورر 11 و10
</h2>

<p>
	ضمّت توصيفات شبكة CSS دعمًا أوليًا للمتصفح إنرتنت إكسبلور 10. وطالما أن إنترنت إكسبلورر بنسختيه 10 و 11 لا يقدم دعمًا للشبكات العصرية، فهو لا يمتلك نسخة جيدة من تخطيط الشبكة يمكن استخدامها. ولدعم تخطيط الشبكة في هذين المتصفحين توضع البادئة <code>-ms-</code> قبل اسم الخاصية، ويعني ذلك إمكانية استخدام هذه الخاصية لدعم إنترنت إكسبلورر 10 و11 وستتجاهل بقية المتصفحات هذه الخاصيات. مع ذلك لا يزال مايكروسوفت إيدج قادرًا على فهم الصياغة القديمة، لهذا لا بد من الانتباه جيدًا والتأكد من تجاوز الخاصيات القديمة بأمان إن كنت تعمل على تخطيط شبكة عصري.
</p>

<p>
	وعمومًا إن لم يكن عدد مستخدمي إنترنت إكسبلورر من زائري موقعك كبيرًا، قد يكون من الأفضل التركيز على إنجاز نسخة تراجع تعمل جيدًا مع جميع المتصفحات التي لا تدعم تخطيط الشبكة العصري.
</p>

<h2 id="-7">
	اختبار المتصفحات الأقدم
</h2>

<p>
	تدعم معظم المتصفحات الحديثة تخطيطي الصندوق المرن وتخطيط الشبكة، وسيكون من الصعب أن تختبر المتصفحات القديمة. من الطرق التي قد تنفع في هذا الحالة استخدام أدوات اختبار مثل Sauce Labs.
</p>

<p>
	بإمكانك أيضًا تنزيل وتثبيت محاكيات افتراضية ومن ثم تشغيل نسخ أقدم من المتصفحات ضمن بيئة معزولة. إن كنت ترى أن دعم إنترنت إكسبلورر ضروري، ستجد <a href="https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/" rel="external nofollow">مجموعة من المحاكيات التي تقدمها مايكروسوفت مجانًا،</a> وهي متاحة لأنظمة تشغيل ويندوز وماك ولينكس وهي بالفعل طريقة ممتازة لاختبار متصفحات ويندوز القديمة والحديثة حتى لو لم تكن تستخدم حاسوبًا يعمل على هذا النظام.
</p>

<h2 id="-8">
	الخلاصة
</h2>

<p>
	لديك الآن كل ما تحتاجه من المعلومات لاستخدام تقنيات مثل تخطيط الشبكة وإنشاء نسخ تراجع خاصة بالمتصفحات الأقدم، ولاستخدام أية تقنيات جديدة قد تظهر في المستقبل.
</p>

<p>
	ترجمة -وبتصرف لمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Supporting_Older_Browsers" rel="external nofollow">Supporting older browsers</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D9%84%D9%8A%D8%A8-%D8%A7%D9%84%D9%82%D8%AF%D9%8A%D9%85%D8%A9-%D9%81%D9%8A-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2312/" rel="">الأساليب القديمة في تخطيط صفحات الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81-%D8%AA%D8%AA%D8%AD%D9%82%D9%91%D9%82-%D9%85%D9%86-%D8%A7%D9%84%D8%AE%D8%B5%D8%A7%D8%A6%D8%B5-%D8%A7%D9%84%D9%85%D8%AF%D8%B9%D9%88%D9%85%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r520/" rel="">كيف تتحقّق من الخصائص المدعومة في المتصفحات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-r706/" rel="">سهولة الوصول</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%AC%D8%B3%D9%85-%D8%B5%D9%81%D8%AD%D8%A9-%D9%85%D9%88%D9%82%D8%B9-%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r1913/" rel="">كيفية تصميم جسم صفحة موقع إلكتروني باستخدام CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D9%91%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%8E%D9%85%D9%8E%D9%88%D9%92%D8%B6%D9%8F%D8%B9-%D8%B9%D9%84%D9%89-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-css-positioning-101-r46/" rel="">أساسيّات التَمَوْضُع على صفحات الويب (CSS Positioning 101)</a>
	</li>
</ul>

<p>
	 
</p>
]]></description><guid isPermaLink="false">2314</guid><pubDate>Wed, 01 May 2024 12:07:01 +0000</pubDate></item><item><title>&#x627;&#x644;&#x623;&#x633;&#x627;&#x644;&#x64A;&#x628; &#x627;&#x644;&#x642;&#x62F;&#x64A;&#x645;&#x629; &#x641;&#x64A; &#x62A;&#x62E;&#x637;&#x64A;&#x637; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628;</title><link>https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D9%84%D9%8A%D8%A8-%D8%A7%D9%84%D9%82%D8%AF%D9%8A%D9%85%D8%A9-%D9%81%D9%8A-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2312/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_04/------.png.c382093a35d69c49a385d4c5c15ac6bb.png" /></p>
<p>
	يُعد استخدام الشبكة Grid ميزة من ميزات تخطيط الصفحات اعتمادًا على CSS. لكن ما جرى قبل ظهور هذه الخاصية هو اعتماد أسلوب تعويم العناصر float أو استخدام ميزات أخرى. إذًا كان عليك أن تتخيل مثلًا صفحتك بعدة أعمدة ( 4 أو 6 أو 12 وهكذا) ومن ثم العمل على ترتيب المحتوى ضمن هذه الأعمدة التخيلية. ما ستكتشفه في هذا المقال هي الأساليب القديمة في تخطيط الصفحات كي تفهم طريقة عملها إن اضطررت للعمل على مشروع قديم.
</p>

<p>
	عليك قبل البدء في قراءة هذا المقال أن:
</p>

<ol>
	<li>
		تطلع على <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">أساسيات HTML</a>.
	</li>
	<li>
		تفهم <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-css-r70/" rel="">أساسيات عمل CSS</a>.
	</li>
</ol>

<h2 id="css">
	تخطيط الصفحات والشبكات قبل ظهور تخطيط شبكات CSS
</h2>

<p>
	قد يتفاجأ القادمون الجدد الذين لديهم خلفية في التصميم أن شبكات CSS لم تظهر إلا مؤخرًا، وقد استخدمت قبلها أساليب متنوعة ليست مثالية في إنشاء تصميمات شبيهة بالشبكات، ندعوها الآن بالأساليب القديمة أو الموروثة legacy.
</p>

<p>
	تعتمد المشاريع الحديثة على تخطيط شبكات CSS برفقة واحدة أو أكثر من أساليب التخطيط الحديثة لإنشاء أساس لأي تخطيط. لكن، قد تصادف تخطيط شبكة يعتمد على الأساليب القديمة بين الفينة والأخرى، لهذا من المفيد أن تتعرف على طريقة عملها ولماذا تختلف هذه الشبكات عن شبكات CSS.
</p>

<p>
	سنشرح في هذا المقال كيف تعمل منظومات الشبكات القديمة وإطارات عمل الشبكات grid frameworks اعتمادًا على التعويم ومبدأ الصندوق المرن. وقد تتفاجأ إن درست شبكات CSS بتعقيد هذه المنظومات، لكن معرفتك ستساعدك على كتابة شيفرة تراجع أو شيفرة آمنة من أجل المتصفحات التي لا تدعم الأساليب الحديثة في التخطيط. إضافة إلى ذلك، ستكون قادرًا على العمل على مشاريع سابقة تعتمد هذه الطرق القديمة في التخطيط.
</p>

<p>
	ومن المهم أن تتذكر دائمًا أن منظومات الشبكات القديمة لا تعمل إطلاقًا بالطريقة التي يعمل بها تخطيط شبكات CSS، بل تعتمد فكرة إعطاء العناصر أبعادًا محددةً ثم دفعها بطريقة تجعلها تبدو أنها شبكة.
</p>

<h2 id="-1">
	تخطيط من عمودين
</h2>

<p>
	لنبدأ بأكثر الأمثلة بساطة وهو تخطيط مكون من عمودين. بإمكانك متابعة العمل معنا بإنشاء ملف باسم <code>index.html</code> على حاسوبك ثم نقل <a href="https://github.com/mdn/learning-area/blob/main/html/introduction-to-html/getting-started/index.html" rel="external nofollow">قالب HTML الخاص بالمثال</a> إليه ومن ثم وضع الشيفرة التالية في أماكنها المناسبة ضمن القالب. سترى في نهاية المثال كيف ستبدو نتيجة العمل مباشرة.
</p>

<p>
	أولًا لابد من توفير محتوىً ما لوضعه ضمن الأعمدة، لهذا، استبدل كل ما هو موجود ضمن جسم الصفحة بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_282_6" style=""><span class="tag">&lt;h1&gt;</span><span class="pln">2 column layout example</span><span class="tag">&lt;/h1&gt;</span><span class="pln">
</span><span class="tag">&lt;div&gt;</span><span class="pln">
  </span><span class="tag">&lt;h2&gt;</span><span class="pln">First column</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;p&gt;</span><span class="pln">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
    aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
    pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at
    ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta. Integer
    ligula ipsum, tristique sit amet orci vel, viverra egestas ligula. Curabitur
    vehicula tellus neque, ac ornare ex malesuada et. In vitae convallis lacus.
    Aliquam erat volutpat. Suspendisse ac imperdiet turpis. Aenean finibus
    sollicitudin eros pharetra congue. Duis ornare egestas augue ut luctus.
    Proin blandit quam nec lacus varius commodo et a urna. Ut id ornare felis,
    eget fermentum sapien.
  </span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span><span class="pln">

</span><span class="tag">&lt;div&gt;</span><span class="pln">
  </span><span class="tag">&lt;h2&gt;</span><span class="pln">Second column</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;p&gt;</span><span class="pln">
    Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada
    ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed
    est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus
    tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies
    lectus sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis
    vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque
    penatibus et magnis dis parturient montes, nascetur ridiculus mus.
  </span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	يحتاج كل عمود إلى عنصر خارجي كي يضم محتواه لهذا سنحاول فعل ذلك. اخترنا في مثالنا العنصر الحاوي <code>&lt;div&gt;</code>، وبإمكانك أيضًا اختيار عنصر آخر أكثر ملائمة من ناحية الدلالة مثل <a href="https://wiki.hsoub.com/HTML/article" rel="external"><code>&lt;article&gt;</code></a> و <a href="https://wiki.hsoub.com/HTML/section" rel="external"><code>&lt;section&gt;</code></a> و <a href="https://wiki.hsoub.com/HTML/aside" rel="external"><code>&lt;aside&gt;</code></a>.
</p>

<p>
	أما بالنسبة لتنسيق CSS، فعليك أولًا تطبيق ما يلي على صفحتك لضبطها مبدئيًا:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_8" style=""><span class="pln">body </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">90%</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">900px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سيشكل جسم الصفحة 90% من نافذة العرض لكن دون أن يزيد عن 900 بكسل وعندها سيحافظ على هذا الاتساع ويتمركز في وسط الصفحة. ستمتد العناصر الأبناء له (العنصر <code>&lt;h1&gt;</code> والعنصران <code>&lt;div&gt;</code>) حتى يشغلا كامل اتساع الجسم. ولو أردنا أن يعوم العنصران <code>&lt;div&gt;</code> إلى جوار بعضهما، لا بد عندها من ضبط اتساعهما ليشغلا 100% من اتساع العنصر الأب أو أقل. لهذا أضف الشيفرة التالية إلى نهاية تنسيقات CSS:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_10" style=""><span class="kwd">div</span><span class="pun">:</span><span class="pln">nth-of-type</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">48%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">div</span><span class="pun">:</span><span class="pln">nth-of-type</span><span class="pun">(</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">48%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ضبطنا اتساع كلا العنصرين ليشغل 48% من مساحة العنصر الأب وبالتالي سيشغلان معًا 96% من المساحة الكلية له، وتركنا 4% لتمثل قناة تفصل بينهما وتعطي المحتوى مجالًا للتنفس. علينا الآن تعويم الأعمدة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_12" style=""><span class="kwd">div</span><span class="pun">:</span><span class="pln">nth-of-type</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">48%</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">div</span><span class="pun">:</span><span class="pln">nth-of-type</span><span class="pun">(</span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">48%</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> right</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تكون النتيجة النهائية للمثال كالتالي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="530" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/poBqGwo?default-tab=result" style="width: 100%;" title="Legacy layout">See the Pen Legacy layout by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	ستلاحظ أننا استخدمنا نسب مئوية لتقدير الاتساعات، وهي استراتيجية جيدة كونها تنشئ تخطيطًا مرنًا أو "سائلًا" يمكن ضبطه ليلائم مختلف أبعاد الشاشات ويحافظ على نفس نسبة الاتساع الذي يأخذه كل عمود ضمن الشاشات الأصغر. حاول أن تغيّر أبعاد نافذة المتصفح وراقب ما يحدث!
</p>

<p>
	<strong>ملاحظة</strong>: يمكنك أن تتابع طريقة <a href="https://mdn.github.io/learning-area/css/css-layout/floats/0_two-column-layout.html" rel="external nofollow">عمل هذا المثال</a> على جيت-هاب (كما يمكنك الاطلاع على <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/floats/0_two-column-layout.html" rel="external nofollow">شيفرته المصدرية</a>)
</p>

<h2 id="-2">
	إنشاء إطار عمل لشبكة وفق الأسلوب القديم
</h2>

<p>
	تستخدم معظم أطر العمل القديمة سلوك التعويم <a href="https:/wiki.hsoub.com/CSS/float" rel=""><code>float</code></a> كي تعوّم أحد الأعمدة إلى جانب الآخر والحصول على تخطيط يشبه الشبكة. ويساعدك العمل على إنشاء شبكة من هذا النوع في معرفة طريقة عملها ويقدم لك بعض المفاهيم المتقدمة كي تبني على الأساسيات التي تعلمناها في مقال <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/floats/0_two-column-layout.html" rel="external nofollow">تعويم العناصر في CSS</a>.
</p>

<p>
	يُعد إطار العمل الأسهل لهذا النوع من الشبكات هو الإطار ذو الاتساع الثابت. وكل ما نحتاجه هو معرفة مقدار الاتساع المطلوب لتصميمنا، وكم عدد الأعمدة وما هو اتساعها واتساع الأقنية الفاصلة بينها. بينما إن أردنا أن نبني شبكتنا على شكل أعمدة تتسع وتتقلص وفقًا لاتساع نافذة المتصفح، لا بد حينها من حساب اتساع الأعمدة والأقنية كنسب مئوية.
</p>

<p>
	سنلقي نظرة في القسم التالي على كيفية إنشاء التخطيطين السابقين، وسننشئ شبكة من 12 عمودًا وهو خيار شائع جدًا وواسع الاستخدام لحالات كثيرة كونه عدد قابل للقسمة على 2 و 4 و 6.
</p>

<h3 id="-3">
	شبكة بسيطة ثابتة الاتساع
</h3>

<p>
	لننشئ بداية شبكة ذات أعمدة ثابتة الاتساع، وعليك أن تبدأ بإنشاء نسخة عن <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/grids/simple-grid.html" rel="external nofollow">ملف المثال</a> على حاسوبك والتي تضم الشيفرة التالية لجسم الصفحة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_282_14" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"wrapper"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"row"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">1</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">2</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">3</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">4</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">5</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">6</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">7</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">8</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">9</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">10</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">11</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">12</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"row"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col span1"</span><span class="tag">&gt;</span><span class="pln">13</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col span6"</span><span class="tag">&gt;</span><span class="pln">14</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col span3"</span><span class="tag">&gt;</span><span class="pln">15</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col span2"</span><span class="tag">&gt;</span><span class="pln">16</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	إن الغاية من ذلك الحصول على شبكة من سطرين و 12 عمودًا، إذ يظهر السطر الأول قياس كل عمود بينما يعرض السطر الثاني مناطق مختلفة القياسات من الشبكة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148739" href="https://academy.hsoub.com/uploads/monthly_2024_04/01_css_fixed_grid.png.c9803efb793f3d42562d097266d6debd.png" rel=""><img alt="01 css fixed grid" class="ipsImage ipsImage_thumbnailed" data-fileid="148739" data-unique="ln9i6f80g" src="https://academy.hsoub.com/uploads/monthly_2024_04/01_css_fixed_grid.thumb.png.def45049663af7193d096a6bf1fb42b9.png"> </a>
</p>

<p>
	أضف ضمن العنصر <code>&lt;style&gt;</code> الشيفرة التالية والتي تعطي لحاوية التغليف اتساعًا مقداره 980 بكسل مع حشوة إلى جهة اليمين مقدارها 20 بكسل. يترك لنا ذلك اتساعًا مقداره 960 بكسل للأعمدة والأقنية الفاصلة بينها، والسبب في أن الحشوة قد استهلكت مساحة من الاتساع الكلي هو أننا ضبطنا قيمة الخاصية <code>box-sizing</code> على القيمة <code>border-box</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_16" style=""><span class="pun">*</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">box-sizing</span><span class="pun">:</span><span class="pln"> border-box</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

body </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">980px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">padding-right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	استخدم الآن حاوية السطر التي تغلف كل سطر من أسطر الشبكة لتمييز كل سطر عن الآخر وذلك من خلال إضافة شيفرة التنسيق التالية بعد شيفرة التنسيق السابقة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9829_11" style=""><span class="pun">.</span><span class="pln">row </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">clear</span><span class="pun">:</span><span class="pln"> both</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ويعني تطبيق هذا التباعد أنه لا ضرورة لملئ السطر بالعناصر حتى نحصل على 12 عمودًا، بل ستبقى الأسطر منفصلة وغير متداخلة مع بعضها. أما بالنسبة للأقنية الفاصلة فقط جعلنا اتساعها 20 بكسل وأنشأناها على شكل هامش إلى يسار العمود بما في ذلك العمود الأول وذلك لموازنة الحشوة الموجودة إلى يمين الحاوية والتي كان اتساعها 20 بكسل. وبالتالي لدينا الآن 12 قناة تفصل بين الأعمدة اتساعها <code>12x20=240</code>.
</p>

<p>
	لا بد من طرح المساحة السابقة من 960 بكسل وتكون النتيجة 720 بكسل للأعمدة جميعها وبتقسيم هذه القيمة على 12 وهو عدد الأعمدة سيكون اتساع العمود 60 بكسل.
</p>

<p>
	ننشئ كخطوة ثانية الصنف <code>col.</code> الذي يضبط العمود ويعوّمه إلى اليسار، إذ ضبطنا فيه الخاصية <a href="https://wiki.hsoub.com/CSS/margin-left" rel="external"><code>margin-left</code></a> على القيمة <code>20px</code> لإنشاء قناة فصل، ومنحناه اتساعًا <a href="https://wiki.hsoub.com/CSS/width" rel="external"><code>width</code></a> مقداره 60 بكسل، إليك قواعد التنسيق اللازمة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_18" style=""><span class="pun">.</span><span class="pln">col </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin-left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">60px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سيظهر السطر الأول بأعمدة مفردة وكأنه شبكة.
</p>

<p>
	<strong>ملاحظة</strong>: منحنا كل عمود لونًا أحمر فاتح لكي ترى تمامًا الاتساع الذي يشغله.
</p>

<p>
	أما تخطيط الحاوية التي نريدها أن تمتد إلى عدة أعمدة فيتطلب أصنافًا خاصة لضبط قيم الاتساع للأعمدة المطلوبة إضافة إلى اتساع الأقنية بينها. نحتاج في مثالنا إلى صنف جديد ليسمح للحاويات أن تمتد بين العمودين 2 و 12. وينتج كل اتساع عن إضافة اتساع كل عمود من تلك الأعمدة إلى اتساع أقنية الفصل والتي عددها أقل دائمًا بواحد من عدد الأعمدة.
</p>

<p>
	أضف الشيفرة التالية إلى آخر شيفرة CSS:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_20" style=""><span class="com">/* Two column widths (120px) plus one gutter width (20px) */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span2 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">140px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">/* Three column widths (180px) plus two gutter widths (40px) */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span3 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">220px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">/* And so on… */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span4 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">300px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span5 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">380px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span6 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">460px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span7 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">540px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span8 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">620px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span9 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">700px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span10 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">780px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span11 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">860px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span12 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">940px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بهذه الأصناف التي أنشأناها سنتمكن من وضع أعمدة مختلفة الاتساع ضمن الشبكة. حاول أن تحفظ التغييرات وتعيد تحميل الصفحة لترى تأثيرها.
</p>

<p>
	<strong>ملاحظة</strong>: إن وجدت صعوبة في تطبيق المثال السابق، الق نظرة عليه <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/grids/simple-grid-finished.html" rel="external nofollow">بشكله النهائي</a> على جت-هاب (تستطيع أيضًا <a href="https://mdn.github.io/learning-area/css/css-layout/grids/simple-grid-finished.html" rel="external nofollow">تنفيذه مباشرة هناك</a>).
</p>

<p>
	حاول أن تعدّل الأصناف التي تطبقها على عناصرك أو حتى إضافة أو إزالة بعض الحاويات، لترى كيف يمكن أن يتغير التخطيط. إذ يمكنك مثلًا أن تجعل السطر الثاني يبدو كالتالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_282_22" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"row"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col span8"</span><span class="tag">&gt;</span><span class="pln">13</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col span4"</span><span class="tag">&gt;</span><span class="pln">14</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	لقد حصلنا الآن على شبكة يمكنك فيها تعريف عدد الأسطر والأعمدة في كل منها، ومن ثم وضع المحتوى الذي تريد في كل حاوية.
</p>

<h3 id="-4">
	إنشاء شبكة مرنة أو "سائلة"
</h3>

<p>
	تعمل كما رأينا الشبكة السابقة جيدًا، لكن مشكلتها هو اتساعها الثابت. لكن ما نحتاجه حقًا هو شبكة مرنة تنمو وتتقلص وفقًا لاتساع نافذة عرض المتصفح. ولإنجاز الأمر، يمكن تحويل وحدات الاتساع من البكسل إلى نسب مئوية.
</p>

<p>
	تُعطى المعادلة التي تحوّل الاتساع الثابت إلى نسبة مئوية مرنة التالي:
</p>

<pre class="ipsCode">target / context = result
</pre>

<p>
	بالنسبة إلى مثالنا سيكون الاتساع المستهدف للعمود <strong>target</strong> هو 60 بكسل والسياق أو الاتساع الكلي <strong>context</strong> هو 960 بكسل. سنستخدم هذه المعادلة لحساب النسب المئوية:
</p>

<pre class="ipsCode">60 / 960 = 0.0625
</pre>

<p>
	بإزاحة الفاصلة العشرية مرتبتين إلى اليمين نحصل على النسبة المئوية 6.25%، ونستطيع الآن استبدال اتساع العمود المقدّر 60 بكسل بالنسبة المئوية 6.25%.
</p>

<p>
	سنفعل الشيء نفسه لضبط اتساع الأقنية الفاصلة:
</p>

<pre class="ipsCode">20 / 960 = 0.02083333333
</pre>

<p>
	لهذا نستبدل قيمة الخاصية <code>margin-left</code> في الصنف <code>col.</code> وقيمة الخاصية <a href="https://wiki.hsoub.com/CSS/padding-right" rel="external"><code>padding-right</code></a> في الصنف <code>wrapper.</code> لتصبحان 2.083%.
</p>

<h4 id="-5">
	تحديث الشبكة في مثالنا
</h4>

<p>
	لتبدأ العمل في هذا القسم أنشئ نسخة جديدة عن المثال السابق على جهازك أو نسخة جديدة عن <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/grids/simple-grid-finished.html" rel="external nofollow">ملف المثال</a> لتستخدمه كنقطة انطلاق.
</p>

<p>
	غيّر قاعدة التنسيق الثانية في المحدد <code>wrapper.</code> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_24" style=""><span class="pln">body </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">90%</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">980px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">padding-right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2.08333333%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لم نغير قيمة الاتساع <code>width</code> لتصبح كنسبة مئوية فقط، بل أضفنا الخاصية <code>max-width</code> كي لايصبح التخطيط واسعًا أكثر مما هو مطلوب.
</p>

<p>
	عدّل بعد ذلك القاعدة الرابعة في المحدد <code>col.</code> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_26" style=""><span class="pun">.</span><span class="pln">col </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin-left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2.08333333%</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">6.25%</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سنبدأ الآن الجزء الذي يتطلب مزيدًا من العمل، ونحتاج إلى تحديث كل قواعد المحددات <code>col.span.</code> كي تستخدم النسب المئوية بدلًا من البكسل. يستغرق الأمر وقتًا لإنجاز الحسابات، لكن لتوفير الوقت أجريت هذه الحسابات مسبقًا.
</p>

<p>
	حدّث الكتلة السفلية من قواعد CSS كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_28" style=""><span class="com">/* Two column widths (12.5%) plus one gutter width (2.08333333%) */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span2 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">14.58333333%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">/* Three column widths (18.75%) plus two gutter widths (4.1666666) */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span3 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">22.91666666%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">/* And so on… */</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span4 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">31.24999999%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span5 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">39.58333332%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span6 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">47.91666665%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span7 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">56.24999998%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span8 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">64.58333331%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span9 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">72.91666664%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span10 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">81.24999997%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span11 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">89.5833333%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span12 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">97.91666663%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	احفظ التغييرات التي أجريتها على الشيفرة وأعد تحميل الصفحة ثم حاول تغيير اتساع نافذة المتصفح. من المفترض أن ترى كيف يتغير اتساع الأعمدة بما يلائم اتساع نافذة المتصفح.
</p>

<p>
	<strong>ملاحظة</strong>: إن وجدت صعوبة في تطبيق المثال السابق، الق نظرة عليه <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/grids/fluid-grid.html" rel="external nofollow">بشكله النهائي</a> على جت-هاب (تستطيع أيضًا <a href="https://mdn.github.io/learning-area/css/css-layout/grids/fluid-grid.html" rel="external nofollow">تنفيذه مباشرة</a>).
</p>

<h3 id="calc">
	إجراءات حسابات أسهل باستخدام الدالة <code>()calc</code>
</h3>

<p>
	بإمكاننا استخدام الدالة <a href="https://wiki.hsoub.com/CSS/calc" rel="external"><code>()calc</code></a> لتنفيذ العمليات الحسابية ضمن شيفرة CSS، إذ تسمح لك بإدخال معادلات رياضية بسيطة لحساب قيمة CSS. هذه الدالة مفيدة خصوصًا عندما تضطر لتنفيذ علاقات رياضية معقدة، كما تساعد في تنفيذ حسابات باستخدام وحدات مختلفة كان تريد مثلًا أن يكون ارتفاع العنصر 100% من ارتفاع العنصر الأب دائمًا بينما يكون ارتفاعه 50 بكسل.
</p>

<p>
	بالعودة إلى شبكتنا، نجد أن أي عمود يمتد ليغطي أكثر من عمود في شبكتنا له الاتساع 6.25% مضروبًا بعدد الأعمدة التي يمتد عليها ومضافًا إليه الاتساع 2.083% مضروبًا بعدد الأقنية الفاصلة (وهو عدد الأعمدة ناقصًا واحد). تسمح لنا الدالة <a href="https://wiki.hsoub.com/CSS/calc" rel="external"><code>()calc</code></a> بإجراء الحسابات السابقة ضمن قيمة الخاصية <code>width</code>، فمن أجل أي عمود يمتد على أربعة أعمدة مثلًا يمكن تنفيذ الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_30" style=""><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span4 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">((</span><span class="lit">6.25%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">4</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2.08333333%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">3</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	جرّب أن تستبدل الشيفرة في كتلة CSS الأخيرة بالقواعد التالية، ثم أعد تحميل الصفحة لترى النتيجة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_32" style=""><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span2 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">((</span><span class="lit">6.25%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2.08333333%</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span3 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">((</span><span class="lit">6.25%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2.08333333%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span4 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">((</span><span class="lit">6.25%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">4</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2.08333333%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">3</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span5 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">((</span><span class="lit">6.25%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">5</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2.08333333%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">4</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span6 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">((</span><span class="lit">6.25%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">6</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2.08333333%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">5</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span7 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">((</span><span class="lit">6.25%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">7</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2.08333333%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">6</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span8 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">((</span><span class="lit">6.25%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">8</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2.08333333%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">7</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span9 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">((</span><span class="lit">6.25%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">9</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2.08333333%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">8</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span10 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">((</span><span class="lit">6.25%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2.08333333%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">9</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span11 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">((</span><span class="lit">6.25%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">11</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2.08333333%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">10</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">.</span><span class="pln">col</span><span class="pun">.</span><span class="pln">span12 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">((</span><span class="lit">6.25%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">12</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2.08333333%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">11</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>ملاحظة1</strong>: إن وجدت صعوبة في تطبيق المثال السابق، الق نظرة عليه <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/grids/fluid-grid-calc.html" rel="external nofollow">بشكله النهائي</a> على جت-هاب (تستطيع أيضًا <a href="https://mdn.github.io/learning-area/css/css-layout/grids/fluid-grid-calc.html" rel="external nofollow">تنفيذه مباشرة</a>).
</p>

<p>
	<strong>ملاحظة2</strong>: قد لا تتمكن من تطبيق المثال لأن المتصفح لا يدعم الدالة <code>()calc</code> مع أنها مدعومة جيدًا في أغلب المتصفحات وصولًا إلى مايكروسوفت إنترنت إكسبلورر IE9.
</p>

<h3 id="-6">
	منظومات الشبكات الدلالية وغير الدلالية
</h3>

<p>
	إن إضافة أصناف التنسيق إلى شيفرة <a href="https://wiki.hsoub.com/HTML" rel="external">HTML</a> لتعريف التخطيطات يعني أن شيفرتك ومحتوى صفحتك مرهونان تمامًا بمنظورك الشخصي، لهذا قد تسمع أن هذه الطريقة في استخدام أصناف <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> هي طريقة غير دلالية أي لا تصف تمامًا كيف ينظَّم المحتوى بدلًا من استخدام الأصناف لتوصيف المحتوى، وهذا هو الأمر في حالتنا مع الأصناف <code>span</code>.
</p>

<p>
	لا يُعد النهج الذي استخدمناه هو المنهج الوحيد، بل يمكنك أن تقرر ما هي أبعاد شبكتك ثم تضيف معلومات عن هذه الأبعاد إلى قواعد الصفوف الدلالية الموجودة. فلو كان لديك العنصر <code>&lt;div&gt;</code> الذي يمتلك الصنف <code>content</code> وأردته أن يمتد على 8 أعمدة، يمكن إضافة القاعدة التالية إلى المحدد <code>content.</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_34" style=""><span class="pun">.</span><span class="pln">content </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">((</span><span class="lit">6.25%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">8</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2.08333333%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">7</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>ملاحظة</strong>: إن كنت تستخدم معالج أولي للتنسيق مثل <a href="https://wiki.hsoub.com/Sass" rel="external">Sass</a> تكون قادرًا على إنشاء توجيه <code>mixin@</code> لإدراج تلك القيم في أي مكان تريده من الصفحة.
</p>

<h3 id="-7">
	تمكين حاويات الإزاحة في الشبكة
</h3>

<p>
	تعمل شبكتنا جيدًا طالما أننا نريد أن تتدفق الحاويات ابتداءً من الطرف اليميني للشبكة. لكن إن أردنا ترك فراغ بحجم عمود قبل أول حاوية أو بين حاويتين، لا بد عندها من إيجاد نوع من الإزاحة باستخدام صنف تنسيق يضيف هامشًا إلى اليسار كي يدفع الموقع عبر الشبكة.
</p>

<p>
	لنحاول أن نفعل ذلك، ولنبدأ بالشيفرة السابقة أو استخدم <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/grids/fluid-grid.html" rel="external nofollow">ملف المثال</a> كنقطة انطلاق. شننشئ أيضًا صنفًا يعمل على إزاحة الحاوية بمقدار اتساع عمود واحد. أضف الشيفرة التالية في شيفرة CSS:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_36" style=""><span class="pun">.</span><span class="pln">offset-by-one </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">margin-left</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">(</span><span class="lit">6.25%</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2.08333333%</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أو إن أردت حساب النسب المئوية لاتساع الأعمدة بنفسك، استخدم الشيفرة التالية:
</p>

<pre class="ipsCode">.offset-by-one {
  margin-left: 10.41666666%;
}
</pre>

<p>
	بإمكانك الآن إضافة هذا الصنف إلى أية حاوية تريد كي تترك مساحة فارغة باتساع عمود من ناحية اليسار. فلو كان لدينا مثلًا شيفرة HTML التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_282_38" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col span6"</span><span class="tag">&gt;</span><span class="pln">14</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	استبدلها بهذه الشيفرة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_282_40" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col span5 offset-by-one"</span><span class="tag">&gt;</span><span class="pln">14</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	<strong>ملاحظة</strong>: انتبه إلى ضرورة تقليل عدد الأعمدة التي تريدها أن تمتد كي تترك مساحة للإزاحة.
</p>

<p>
	جرّب تحميل وتحديث الصفحة لترى الفرق، وبإمكانك أن ترى <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/grids/fluid-grid-offset.html" rel="external nofollow">المثال</a> على جيت-هاب وأن تجربته هنالك <a href="https://mdn.github.io/learning-area/css/css-layout/grids/fluid-grid-offset.html" rel="external nofollow">مباشرة</a>. سيظهر المثال بشكله النهائي كالتالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148740" href="https://academy.hsoub.com/uploads/monthly_2024_04/02_offset_grid.png.f0bc04658c841b645a7a7414809f91e6.png" rel=""><img alt="02 offset grid" class="ipsImage ipsImage_thumbnailed" data-fileid="148740" data-unique="3yzveyhbi" src="https://academy.hsoub.com/uploads/monthly_2024_04/02_offset_grid.thumb.png.791ebec7f6392b103ed35fed72563eec.png"> </a>
</p>

<p>
	<strong>تمرين</strong>: هل بإمكانك كتابة صنف <code>offset-by-two</code> لإزاحة عمود بمقدار عمودين؟
</p>

<h3 id="-8">
	محدودية الشبكة المعوّمة
</h3>

<p>
	عند استخدام شبكة كهذه لا بد من حساب مجموع الاتساعات الإجمالي بشكل صحيح، وأن لا تضع عناصر في صف تجعله يمتد إلى أعمدة أكثر مما يمكنه أن يضم. ونظرًا للطريقة التي يعمل وفقها مبدأ التعويم، إن أصبح عدد أعمدة الشبكة أكثر مما تستوعبه الشبكة ستنتقل العناصر في نهاية السطر إلى سطر جديد وتخرّب الشبكة.
</p>

<p>
	تذكر أيضًا، إن ازداد اتساع محتوى عنصر أكثر من قدرة السطر على استيعابه سيطفح المحتوى خارج العمود ويبدو الأمر كارثيًا.
</p>

<p>
	وتبقى المحدودية الأهم لهذا الشبكة هي أنها وحيد البعد، فما نفعله هو التعامل مع أعمدة وجعل العناصر تتمدد على عدد منها ولا نتعامل مع أسطر فعليًا. من الصعب إذًا التعامل مع هذه التخطيطات القديمة للتحكم بارتفاع العناصر دون أن تحدد هذه الإرتفاع صراحة وهذه مقاربة لا تتمتع بالمرونة إطلاقًا، فلا يمكن أن تضمن النتائج ما لم تضمن أنّ المحتوى سيكون دائمًا بارتفاع محدد.
</p>

<h2 id="-9">
	شبكات الصندوق المرن
</h2>

<p>
	إن اطلعت على مقالنا السابق حول [تخطيط الصندوق المرن]() فقد ترى أن هذا التخطيط هو الحل المثالي لإنشاء شبكة عناصر. إذ توجد بالفعل الكثير من تخطيطات الشبكات المعتمدة على الصندوق المرن وتخطيطات صندوق مرن التي تحل الكثير من المشاكل التي شرحناها في هذا المقال. لكن لم يُصمم الصندوق المرن لإنشاء منظومة شبكة لهذا ستظهر مشاكل عدة عند استخدامه. وكمثال بسيط يشرح ما نقصده، سنعود إلى نفس شيفرة المثال السابق ومن ثم نستخدم شيفرة CSS التالية لتنسيق الأصناف <code>wrapper</code> و <code>raw</code> و <code>col</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_42" style=""><span class="pln">body </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">90%</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">980px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">padding-right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2.08333333%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">row </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> flex</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">col </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">margin-left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2.08333333%</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin-bottom</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">6.25%</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">flex</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	حاول أن تجري التعديلات السابقة على نسختك من المثال أو الق نظرة على <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/grids/flexbox-grid.html" rel="external nofollow">نسخته</a> على جت-هاب ( كما يمكنك الاطلاع على <a href="https://mdn.github.io/learning-area/css/css-layout/grids/flexbox-grid.html" rel="external nofollow">طريقة عمله</a> أيضًا)
</p>

<p>
	ما فعلناه هنا هو تحويل كل سطر إلى حاوية مرنة فلا زلنا نحتاج إلى الأسطر في شبكات الصندوق المرن كي نستطيع استخدام العناصر التي يصل مجموع اتساعاتها إلى أقل من 100%. لهذا ضبطنا الخاصية <code>display</code> للحاوية على القيمة <code>flex</code>.
</p>

<p>
	ضبطنا أيضًا قيمة الخاصية <code>flex</code> في الصنف <code>col.</code> على القيمة 1 لتجعل العنصر يتمدد، وكذلك الخاصية <code>flex-shrink</code> على القيمة 1 كي يتقلص العنصر. أما قيمة الخاصية <code>flex-basis</code> فكانت <code>auto</code> لأن العنصر له اتساع محدد، وتستخدم تلك القيمة هذا الاتساع كقيمة للخاصية <code>flex-basis</code>.
</p>

<p>
	لدينا 12 صندوق في السطر الأول ضمن شبكة تنمو وتتقلص بشكل متماثل مع تغيّر اتساع نافذة العرض. وفي السطر الثاني لدينا فقط 4 أعمدة تتمدد وتتقلص أيضًا على أساس الاتساع المحدد 60 بكسل. وهكذا ستتمكن الأعمدة الأربعة في السطر الثاني من التمدد أكثر من الأعمدة في السطر الأول وستشغل هذه الأعمدة مساحة السطر الثاني بأكملها:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148741" href="https://academy.hsoub.com/uploads/monthly_2024_04/03_flexbox_grid.png.6ec64060c447ec588e25b260273fd91f.png" rel=""><img alt="03 flexbox grid" class="ipsImage ipsImage_thumbnailed" data-fileid="148741" data-unique="zbw7a58yb" src="https://academy.hsoub.com/uploads/monthly_2024_04/03_flexbox_grid.thumb.png.42757222631fd88d842bf13d4a3829f8.png"> </a>
</p>

<p>
	ولإصلاح الأمر لابد من استخدام الأصناف <code>span</code> لتزويدنا باتساع يستبدل تلك القيمة التي تستخدمها الخاصية <code>flex-basis</code> للعنصر المحدد. وهذه الأصناف لا تحترم أيضًا تخطيط الشبكة الذي تنتظم وفقه العناصر لأنها لا تعرف شيئًا عن الشبكة. فالصندوق المرن تخطيط وحيد البعد ويتعامل مع أسطر أو أعمدة وليس الاثنان معًا. لهذا السبب لا يمكن إنشاء شبكة صريحة من أعمدة وأسطر، وهذا يعني أننا لا زلنا بحاجة إلى حساب نسب مئوية للأبعاد كما في عملية تعويم العناصر floating.
</p>

<p>
	مع ذلك قد تقرر استخدام الشبكة المرنة بدلًا من التعويم لأنها تقدم ميزات أفضل من ناحية المحاذاة وتوزيع المساحات الفارغة. لكن لا بد من الانتباه أنك تستخدم أداة لم تخصص لهذا الغرض، وقد تشعر أنك تدور في حلقات إضافية حتى تصل إلى النتيجة المطلوبة.
</p>

<h2 id="-10">
	شبكات تؤمنها أطراف خارجية أخرى
</h2>

<p>
	بعد أن تعرفنا على طريقة حساب الأبعاد في شبكتنا، بإمكاننا الآن استيعاب بعض المنظومات التي صممتها أطراف أخرى للاستخدامات العامة. فإن بحثت في الويب عن " أطر عمل شبكات CSS" أو "CSS Grid framework" ستجد عددًا كبيرًا من الخيارات منها <a href="https://wiki.hsoub.com/Bootstrap" rel="external">Bootstrap</a> و <a href="https://get.foundation/" rel="external nofollow">Foundation</a> والتي تضم تخطيط شبكة خاصة بها. كما ستجد منظومات شبكات مستقلة جرى تطويرها باستخدام CSS أو باستخدام معالجات أولية.
</p>

<p>
	لنلق نظرة على إحدى هذه المنظومات المستقلة لنعرض التقنيات الشائعة في إطارات عمل الشبكات. سنستخدم شبكة تمثلًا جزءًا من إطار العمل Skeleton وهو إطار عمل CSS بسيط. لهذا <a href="http://getskeleton.com/" rel="external nofollow">انتقل إلى موقع الويب الخاص</a> بإطار العمل ثم نزّل الملف المضغوط الخاص بإطار العمل واستخرج ملفاته إلى حاسوبك ثم انسخ الملفين <code>skeleton.css</code> و <code>normalize.css</code> إلى مجلد جديد. انسخ أيضًا الملف <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/grids/html-skeleton.html" rel="external nofollow">html-skeleton.html</a> إلى نفس المجلد السابق.
</p>

<p>
	اربط الملفين Normalize و skeleton بصفحة الويب بإضافة ما يلي إلى ترويسة الصفحة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_282_44" style=""><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"normalize.css"</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;link</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"skeleton.css"</span><span class="pln"> </span><span class="atn">rel</span><span class="pun">=</span><span class="atv">"stylesheet"</span><span class="pln"> </span><span class="tag">/&gt;</span></pre>

<p>
	يتضمن الملف أكثر من نظام شبكة كما يضم شيفرة لتنسيق خط الكتابة وتنسيق عناصر أخرى يمكنك الاستفادة منها كنقطة انطلاق. سنترك كل شيء كما هو افتراضيًا، فالشبكة الافتراضية هي التي نحتاجها حاليًا.
</p>

<p>
	<strong>ملاحظة</strong>: تُعد المكتبة <a href="https://necolas.github.io/normalize.css/" rel="external nofollow">Normalize</a> مكتبة تنسيقات CSS مفيدة حقًا كتبها نيكولاس غالفر، وتجري بعض الإصلاحات الأساسية على التخطيط ليظهر التنسيق الافتراضي للعناصر أكثر اتساقًا ضمن المتصفح.
</p>

<p>
	نستخدم تاليًا نفس شيفرة HTML للمثال السابق، لهذا أضف ما يلي إلى جسم ملف HTML:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_282_46" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"container"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"row"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">1</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">2</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">3</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">4</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">5</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">6</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">7</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">8</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">9</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">10</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">11</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">12</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"row"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">13</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">14</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">15</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col"</span><span class="tag">&gt;</span><span class="pln">16</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	كي نبدأ باستخدام Skeleton لا بد أن يمتلك عنصر التغليف <code>&lt;div&gt;</code> الصنف <code>container</code> وهو موجود أصلًا في ملف HTML. ويجمّع هذا الصنف المحتوى في مركز الحاوية التي تأخذ اتساع أعظمي مقداره 960 بكسل. بإمكانك أن ترى كيف لن يتجاوز اتساع الصناديق 960 بكسل.
</p>

<p>
	إن ألقيت نظرة على الملف skeleton.css سترى التنسيقات التي تُطبّق عند استخدام ذلك الصنف. إذ سترى كيف يتوضع المحتوى في مركز الحاوية باستخدام هوامش يمينية ويسارية بقيمة <code>auto</code>، كما تُطبّق حشوات يسارية ويمينية مقدارها 20 بكسل.وتُضبط أيضًا قيمة الخاصية <code>box-sizing</code> على <code>border-box</code> كما فعلنا سابقًا كي يجري تضمين اتساع الحشوات والإطار ضمن اتساع الحاوية الكلي.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_48" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100%</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">960px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">box-sizing</span><span class="pun">:</span><span class="pln"> border-box</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يكون العنصر جزءًا من الشبكة إن كان ضمن سطر <code>row</code>، لهذا سنحتاج -كما هو الحال في مثالنا السابق- إلى عنصر <code>&lt;div&gt;</code> آخر يمتلك الصنف ويأتي بين العنصر <code>&lt;div&gt;</code> الخاص بالمحتوى والعنصر <code>&lt;div&gt;</code> الخاص بالحاوية.
</p>

<p>
	لنرتب الآن الصناديق ضمن الحاوية، فالإطار Skeleton مكوّن من شبكة ذات 12 عمودًا. وتحتاج صناديق السطر الأول إلى أصناف <code>one column</code> كي تجعلها تمتد على عمود واحد.
</p>

<p>
	أضف الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_282_50" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"container"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"row"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"one column"</span><span class="tag">&gt;</span><span class="pln">1</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"one column"</span><span class="tag">&gt;</span><span class="pln">2</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"one column"</span><span class="tag">&gt;</span><span class="pln">3</span><span class="tag">&lt;/div&gt;</span><span class="pln">
    /* and so on */
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	اعط الآن حاويات السطر الثاني أصنافًا تشرح عدد الأعمدة التي ستمتد عليها هذه الحاويات كالتالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_282_52" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"row"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"one column"</span><span class="tag">&gt;</span><span class="pln">13</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"six columns"</span><span class="tag">&gt;</span><span class="pln">14</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"three columns"</span><span class="tag">&gt;</span><span class="pln">15</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"two columns"</span><span class="tag">&gt;</span><span class="pln">16</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	احفظ التغييرات على ملف HTML وحمّل الصفحة من جديد في المتصفح لترى ما يحدث!
</p>

<p>
	<strong>ملاحظة</strong>: إن واجهت مشكلة في تشغيل هذا المثال، حاول أن توسّع نافذة العرض التي تستخدمها فلن تُعرض الشبكة كما وصفنا إن كانت نافذة العرض ضيّقة. لم ينفع الأمر، حاول أن توازن ما فعلت بالملف <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/grids/html-skeleton-finished.html" rel="external nofollow">html-skeleton-finished.html</a> (أو اطّلع على <a href="https://mdn.github.io/learning-area/css/css-layout/grids/html-skeleton-finished.html" rel="external nofollow">طريقة تنفيذه مباشرة</a>).
</p>

<p>
	إن ألقيت نظرة على الملف skeleton.css بإمكانك معرفة كيف يعمل المثال. فالملف يتضمن الأصناف "three columns" التالية لتنسيق العناصر بثلاثة أعمدة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_282_54" style=""><span class="pun">.</span><span class="pln">three</span><span class="pun">.</span><span class="pln">columns </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">22%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	إن إطار العمل Skeleton وغيره من إطارات عمل الشبكات يُعرّف مسبقًا أصناقًا يمكنك استخدامها في صفحاتك. وتعمل كما لو أجريت الحسابات بالنسبة المئوية بنفسك.
</p>

<p>
	وكما ترى، لن تحتاج إلى كتابة الكثير من التنسيقات باستخدام Skeleton، فهي تتعامل مع العناصر المعوّمة نيابة عنا بمجرد إضافة أصناف التنسيق الملائمة إلى شيفرة HTML. إن هذه القدرة على التحكم بالتخطيط هو ما يجعل إطارات العمل لبناء شبكات خيارًا جذّابًا. لكن، ومع ظهور ت<a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-grid-%D9%81%D9%8A-css-r2282/" rel="">خطيط شبكة CSS</a>، يبتعد المطوّرون عن استخدام أطر العمل لاستخدام تلك التقنية المدمجة التي تقدمها CSS بشكل أصيل.
</p>

<h2 id="-11">
	الخلاصة
</h2>

<p>
	تعرّفنا في هذا المقال كيف تعمل مختلف منظومات الشبكات، وهذا أمر مهم عند العمل مع مواقع قديمة، ولفهم الفرق بين شبكة CSS الأصيلة وهذه الأنظمة الأقدم للشبكات.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Legacy_Layout_Methods" rel="external nofollow">Legacy layout methods</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/css/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A5%D9%84%D9%89-%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D8%B3%D8%A7%D8%A6%D8%B7-media-queries-%D9%81%D9%8A-css-r2309/" rel="">دليلك إلى استعلامات الوسائط Media Queries في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D8%B6%D8%A8%D8%B7-%D9%85%D8%AD%D8%A7%D8%B0%D8%A7%D8%A9-%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-css-r1050/" rel="">التحكم في تخطيط الصفحة وضبط محاذاة العناصر في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2238/" rel="">مدخل إلى تخطيط صفحات الويب باستخدام CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D9%85%D8%AA%D8%B9%D8%AF%D8%AF-%D8%A7%D9%84%D8%A3%D8%B9%D9%85%D8%AF%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2297/" rel="">التخطيط متعدد الأعمدة باستخدام CSS</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2312</guid><pubDate>Mon, 29 Apr 2024 12:00:00 +0000</pubDate></item><item><title>&#x62F;&#x644;&#x64A;&#x644;&#x643; &#x625;&#x644;&#x649; &#x627;&#x633;&#x62A;&#x639;&#x644;&#x627;&#x645;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x633;&#x627;&#x626;&#x637; Media Queries &#x641;&#x64A; CSS</title><link>https://academy.hsoub.com/programming/css/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A5%D9%84%D9%89-%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D8%B3%D8%A7%D8%A6%D8%B7-media-queries-%D9%81%D9%8A-css-r2309/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_04/------Media-Queries--CSS(1).png.2ec52827e4517445e7ee877ff73228ea.png" /></p>
<p>
	سنوضح في مقال اليوم طريقة التعامل مع استعلام الوسائط Media Query في CSS والتي توفر طريقة لتطبيق تنسيقات معينة على عناصر HTML عندما تحقق بيئة العرض في جهاز أو متصفح معايير أوشروط محددة، كأن يكون اتساع نافذة العرض أكبر من 480 بكسل.
</p>

<p>
	إن هذا النمط من الاستعلام هو المفتاح لتصميم الويب المتجاوب <a href="https://academy.hsoub.com/design/user-experience/%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-responsive-design-r751/" rel="">Responsive web design</a>، إذ يساعد فى بناء تخطيطات مختلفة للصفحات وفقًا لاتساع نافذة العرض. كما يمكن استخدام هذه الاستعلامات في معرفة بعض ميزات البيئة التي يعمل ضمنها موقعك كأن تعرف إن كان المستخدم يستعمل شاشة لمس بدلًا من الفأرة. لهذا سنتعلم أولًا طريقة صياغة استعلامات الوسائط، ثم سنتعلم استخدامها عمليًا من خلال مثال تفاعلي يشرح كيفية تحويل تخطيط بسيط إلى تخطيط متجاوب.
</p>

<p>
	عليك قبل البدء في قراءة هذا المقال أن:
</p>

<ol>
	<li>
		تطلع على أساسيات HTML كما شرحناها في سلسلة المقالات <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">مدخل إلى HTML</a>.
	</li>
	<li>
		تفهم <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-css-r70/" rel="">أساسيات عمل CSS</a>.
	</li>
</ol>

<h2 id="">
	أساسيات استعلامات الوسائط
</h2>

<p>
	تبدو شيفرة استعلام الوسائط بشكلها الأبسط كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9493_10" style=""><span class="kwd">@media</span><span class="pln"> media-type and </span><span class="pun">(</span><span class="pln">media-feature-rule</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">/* CSS rules go here */</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وهي تتكون من الأجزاء التالية:
</p>

<ul>
	<li>
		نوع واسطة العرض media type والذي يخبر المتصفح بطبيعة واسطة العرض التي كُتبت هذه الشيفرة من أجلها (طابعة، شاشة، ...إلخ.).
	</li>
	<li>
		شرط تطبيق الاستعلام media expression وهي قاعدة أو اختبار لا بد من تحققه حتى تُطبق شيفرة CSS المطلوبة.
	</li>
	<li>
		مجموعة قواعد تنسيق CSS التي تُطبق عند تحقق شرط تطبيق الاستعلام.
	</li>
</ul>

<h3 id="-1">
	أنواع وسائط العرض
</h3>

<p>
	هناك ثلاث قيم لواسطة العرض:
</p>

<ul>
	<li>
		<code>all</code>
	</li>
	<li>
		<code>print</code>
	</li>
	<li>
		<code>screen</code>
	</li>
</ul>

<p>
	يضبط الاستعلام التالي مثلًا <a href="https://wiki.hsoub.com/CSS/font-size" rel="external">حجم الخط</a> في جسم الصفحة على <code>12pt</code> عند طباعة الصفحة، لكن هذه القاعدة لن تطبق عند عرض هذه الصفحة ضمن المتصفح:
</p>

<pre class="ipsCode">@media print {
  body {
    font-size: 12pt;
  }
}
</pre>

<p>
	<strong>ملاحظة1</strong>: إن نوع الوسائط في الاستعلامات مفهوم مختلف عن ما يُدعى نوع الوسائط المتعددة أو نوع المحتوى MIME-type وهو سلسلة نصية تُرسل مع الملف المرسل عبر الانترنت لتحديد نوعه أو وصف تنسيقه، على سبيل المثال، يمكن تسمية ملف صوتي audio/ogg، أو ملف صورة  image/png).
</p>

<p>
	<strong>ملاحظة2</strong>: توجد أنواع أخرى من وسائط العرض أصّيفت في مواصفات <a href="https://www.w3.org/TR/mediaqueries-3/" rel="external nofollow">المستوى الثالث من استعلامات الوسائط،</a> لكنها أهملت ويجب تحاشيها.
</p>

<p>
	<strong>ملاحظة3</strong>: نوع الوسائط media type قيمة اختيارية، فإن لم ترغب بتحديد نوع واسطة العرض فلا تفعل وستكون القيمة الافتراضية <code>all</code> أي جميع الوسائط.
</p>

<h3 id="-2">
	قواعد تطبيق ميزات استعلام الوسائط
</h3>

<p>
	بعد تخصيص نوع واسطة العرض يمكنك استهداف إحدى ميزات هذه الواسطة كي تحقق شرطًا أو اختبارًا ما:
</p>

<h4 id="-3">
	الاتساع والارتفاع
</h4>

<p>
	أكثر الميزات استهدافًا للحصول على تصميم متجاوب وأكثرها دعمًا من قبل مختلف المتصفحات هي اتساع نافذة العرض viewport width. وهكذا يمكننا تطبيق مجموعة من قواعد التنسيق إن كان اتساع نافذة العرض أعلى أو أدنى أو يعادل قيمة محددة باستخدام ميزات استعلام الوسائط التالية: <code>min-width</code><br>
	و <code>max-width</code> و <code>width</code>.
</p>

<p>
	تُستخدم الميزات السابقة في إنشاء تخطيطات تتجاوب مع مختلف أبعاد الشاشات. فلو أردنا مثلًا تغيير لون خط الكتابة في جسم المستند إلى اللون الأحمر عندما يكون اتساع نافذة العرض 600 بكسل تمامًا، سنستخدم الاستعلام التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9493_19" style=""><span class="kwd">@media</span><span class="pln"> screen and </span><span class="pun">(</span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">600px</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  body </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>ألق </strong>نظرة على <a href="https://mdn.github.io/css-examples/learn/media-queries/width.html" rel="external nofollow">هذا المثال</a> على جيت-هاب أو اطلع على <a href="https://github.com/mdn/css-examples/blob/main/learn/media-queries/width.html" rel="external nofollow">الشيفرة المصدرية</a>.
</p>

<p>
	يمكن استخدام ميزتي الاتساع والارتفاع كمجالات وعندها تسبقان بالبادئة <code>-min</code> أو <code>-max</code> للإشارة إلى أن القيمة المعطاة هي أدنى أو أعلى قيمة. فإن أردنا في مثالنا السابق أن يكون لون الخط أحمر إن كان اتساع نافذة العرض 600 بكسل أو أضيق فنستخدم الميزة <code>max-width</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9493_21" style=""><span class="kwd">@media</span><span class="pln"> screen and </span><span class="pun">(</span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">600px</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  body </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكنك إلقاء نظرة على <a href="https://mdn.github.io/css-examples/learn/media-queries/max-width.html" rel="external nofollow">هذا المثال</a> على جيت-هاب أو الاطلاع على <a href="https://github.com/mdn/css-examples/blob/main/learn/media-queries/max-width.html" rel="external nofollow">الشيفرة المصدرية</a>.
</p>

<p>
	إن استخدام القيم العظمى والصغرى أكثر فائدة عمليًا في التصميم المتجاوب، لهذا قلما تُستخدم الميزتان <code>width</code> أو <code>height</code> وحدهما.
</p>

<p>
	ستجد العديد من ميزات وسائط الاستعلام التي يمكن استهدافها على الرغم من محدودية دعم المتصفحات للميزات الأحدث الموضوعة في مواصفات المستويين 4 و 5 من استعلامات الوسائط. ويمكنك الاطلاع على كل ميزة ومدى دعم المتصفحات لها من خلال <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_media_queries/Using_media_queries#syntax" rel="external nofollow">شبكة مطوري موزيللا</a>.
</p>

<h4 id="-4">
	جهة انسياب المحتوى
</h4>

<p>
	من الميزات المدعومة جيدًا لاستعلامات الوساط نجد الميزة <code>orientation</code> التي تسمح باختيار نمط عرض الصورة إما كصورة عمودية portrait أو أفقية landscape. ولكي نغير لون خط كتابة جسم الصفحة إن كان نمط عرض الجهاز أفقيًا، نستخدم الاستعلام التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9493_23" style=""><span class="kwd">@media</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">orientation</span><span class="pun">:</span><span class="pln"> landscape</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  body </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> rebeccapurple</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>يمكنك إلقاء</strong> نظرة على <a href="https://mdn.github.io/css-examples/learn/media-queries/orientation.html" rel="external nofollow">هذا المثال</a> على جيت-هاب أو الاطلاع على <a href="https://github.com/mdn/css-examples/blob/main/learn/media-queries/orientation.html" rel="external nofollow">الشيفرة المصدرية</a>.
</p>

<p>
	تعتمد شاشات حواسيب سطح المكتب نمط العرض الأفقي، وما يعمل جيدًا وفق نمط العرض هذا قد لا يعمل جيدًا على الهاتف المحمول أو الجهاز اللوحي الذي يعمل على النمط العمودي. وبالتالي سيساعدك الاستعلام عن نمط العرض في تبني تخطيط محسّن يخدم نمط العرض في الجهاز المستهدف.
</p>

<h4 id="-5">
	استخدام جهاز تأشير pointing device
</h4>

<p>
	قدّمت مواصفات <a href="https://www.w3.org/TR/mediaqueries-4/" rel="external nofollow">المستوى 4 لاستعلامات الوسائط</a> الميزة <code>hover</code> التي تساعدك على اختبار قدرة المستخدم على إحداث أثر عند المرور فوق عنصر مما يدل على استخدامه نمطًا من أجهزة التأشير كالفأرة، فلا يمكن إحداث أثر عند المرور فوق عنصر في شاشات اللمس أو عند استخدام لوحة المفاتيح في التنقل بين العناصر.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9493_26" style=""><span class="kwd">@media</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">hover</span><span class="pun">:</span><span class="pln"> hover</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  body </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> rebeccapurple</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ألق نظرة على <a href="https://github.com/mdn/css-examples/blob/main/learn/media-queries/hover.html" rel="external nofollow">هذا المثال</a> على جت-هاب.
</p>

<p>
	فإن عرفت أن المستخدم لا يعتمد على جهاز تأشير، بإمكانك عندها تقديم بعض الميزات التفاعلية للصفحة افتراضيًا، بينما يمكن تقديم هذه الميزات لمستخدمي أجهزة التأشير عند مرور المؤشر فوق العنصر.
</p>

<p>
	كما تضم مواصفات المستوى الرابع الميزة <code>pointer</code> التي تأخذ واحدة من ثلاث قيم هي <code>none</code> و <code>fine</code> و <code>coarse</code>. تُستخدم القيمة <code>fine</code> لأجهزة تأشير مثل الفأرة أو لوحة التتبع، وتساعد المستخدم على استهداف مساحة ضيقة من الصفحة. أما القيمة <code>coarse</code> فتدل على أن المستخدم يستعمل أصابعه أو يستعمل شاشة لمس. وأخيرًا تشير القيمة <code>none</code> إلى عدم استخدام أجهزة تأشير كحالة استخدام لوحة مفاتيح أو استخدام الأوامر الصوتية.
</p>

<p>
	يساعدك استخدام الميزة السابقة في تصميم واجهات مستخدم متجاوبة مع طريقة تفاعل المستخدم مع الشاشة. فبإمكانك مثلًا إنشاء مساحة لمس أوسع لمستخدم يستعمل شاشة لمس.
</p>

<h2 id="-6">
	استعلامات وسائط أكثر تعقيدًا
</h2>

<p>
	قد ترغب أحيانًا بضم أكثر من استعلام أو إنشاء قائمة استعلامات قد يتحقق أيًا منها
</p>

<h3 id="and">
	استخدام عامل الربط المنطقي and
</h3>

<p>
	يُستخدم العامل <code>and</code> بنفس الطريقة التي استخدمناها سابقًا لربط نوع واسطة العرض مع الميزة. فقد نرغب مثلًا أن نختبر الميزتين <code>min-width</code><br>
	و <code>orientation</code> معًا. إذ نريد مثلًا أن يكون لون خط الكتابة أزرق إن كان اتساع نافذة العرض اكبر من 600 بكسل وكان الجهاز يعتمد طريقة العرض الأفقية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9493_30" style=""><span class="kwd">@media</span><span class="pln"> screen and </span><span class="pun">(</span><span class="kwd">min-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">600px</span><span class="pun">)</span><span class="pln"> and </span><span class="pun">(</span><span class="kwd">orientation</span><span class="pun">:</span><span class="pln"> landscape</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  body </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ألق نظرة على <a href="https://mdn.github.io/css-examples/learn/media-queries/and.html" rel="external nofollow">هذا المثال</a> على جيت-هاب أو اطلع على <a href="https://github.com/mdn/css-examples/blob/main/learn/media-queries/and.html" rel="external nofollow">الشيفرة المصدرية</a>.
</p>

<h3 id="or">
	استخدام عامل الربط المنطقي "or"
</h3>

<p>
	ويُستخدم لتطبيق تنسيق معين عند تحقق واحدة من عدة استعلامات على الأقل وعندها نستخدم الفاصلة <code>,</code> للفصل بين هذه الاستعلامات. إذ يعرض المثال التالي خط الكتابة باللون الأزرق إن كانت اتساع نافذة العرض 600 بكسل على الأقل واعتمد الجهاز المستهدف طريقة العرض الأفقية.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9493_32" style=""><span class="kwd">@media</span><span class="pln"> screen and </span><span class="pun">(</span><span class="kwd">min-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">600px</span><span class="pun">),</span><span class="pln"> screen and </span><span class="pun">(</span><span class="kwd">orientation</span><span class="pun">:</span><span class="pln"> landscape</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  body </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>أ</strong>لق نظرة على <a href="https://mdn.github.io/css-examples/learn/media-queries/or.html" rel="external nofollow">هذا المثال</a> على جيت-هاب أو اطلع على <a href="https://github.com/mdn/css-examples/blob/main/learn/media-queries/or.html" rel="external nofollow">الشيفرة المصدرية</a>.
</p>

<h3 id="not">
	استخدام عامل النفي المنطقي not
</h3>

<p>
	بإمكانك نفي الاستعلام بالكامل باستخدام العامل <code>not</code>، إذ يعكس هذا العامل معنى الاستعلام تمامًا. لاحظ كيف يكون النص في مثالنا التالي أزرق اللون إن كان نمط العرض عموديًا:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9493_34" style=""><span class="kwd">@media</span><span class="pln"> not all and </span><span class="pun">(</span><span class="kwd">orientation</span><span class="pun">:</span><span class="pln"> landscape</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  body </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>أ</strong>لق نظرة على <a href="https://mdn.github.io/css-examples/learn/media-queries/not.html" rel="external nofollow">هذا المثال</a> على جيت-هاب أو اطلع على <a href="https://github.com/mdn/css-examples/blob/main/learn/media-queries/not.html" rel="external nofollow">الشيفرة المصدرية</a>.
</p>

<h3 id="breakpoints">
	كيفية اختيار النقاط الحدِّية breakpoints
</h3>

<p>
	حاول المصممون في بدايات التصميم المتجاوب استهداف شاشات بقياسات محددة، بالاستفادة من قوائم تضم أبعاد شاشات أكثر الهواتف المحمولة والأجهزة اللوحية شعبية، وبالتالي سيكون التصميم ملائمًا تمامًا لنافذة العرض المستهدفة.
</p>

<p>
	أما الآن، وبوجود كم هائل من الأجهزة مختلفة الأبعاد، فلا جدوى من هذا النهج. وبدلًا من استهداف قياسات بعينها، ظهرت مقاربة تعتمد على تغيير التصميم أو التخطيط عندما لا يعود هذا التصميم ملائمًا لأبعاد الشاشة التي تعرضه. فقد يغدو السطر في نص ما طويلًا جدًا أو أن يضغط وتظهر أشرطة تمرير تصعب معها القراءة.
</p>

<p>
	في هذه الحالات، تساعدك استعلامات الوسائط في تغيير التصميم إلى آخر أفضل يلائم المساحة المتاحة للعرض. وهذا يعني أنك لن تحتاج إلى معرفة القياسات الدقيقة لأبعاد الشاشة المستخدمة، بل يتغير التصميم ضمن مجالات محددة لأبعاد نافذة العرض. تُدعى النقاط التي تُعرّف عندها استعلام الوسائط بنقاط الانتقال أو النقاط الحدية <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D9%84%D8%B4%D8%B1%D8%AD-%D8%A7%D9%84%D9%86%D9%82%D8%A7%D8%B7-%D8%A7%D9%84%D8%AD%D8%AF%D9%8A%D8%A9-%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8%D8%A9-r861/" rel="">Breakpoints</a> التي تسمح بالانتقال من تخطيط لآخر أو من تنسيق لآخر).
</p>

<p>
	يُساعدك نمط التصميم المتجاوب في أدوات مطوري ويب لمتصفح فايرفوكس في تفقد عمل نقاط الانتقال. إذ يمكنك بسهولة تصغير نافشة العرض أو تكبيرها لتتفحص كيفية تحسين التصميم إن أضفت استعلامات وسائط.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148551" href="https://academy.hsoub.com/uploads/monthly_2024_04/01_devtools_firefox.png.2e285f02ba7cd14f73153e55cf9cda07.png" rel=""><img alt="01 devtools firefox" class="ipsImage ipsImage_thumbnailed" data-fileid="148551" data-unique="w4h9nkilu" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_04/01_devtools_firefox.thumb.png.9a64ac926c933bff2b63c73a3e705e3a.png"> </a>
</p>

<h2 id="-7">
	تطبيق عملي: التصميم المتجاوب وقاعدة "الهاتف المحمول أولًا"
</h2>

<p>
	يمكنك عمومًا اختيار أحد نهجين في التصميم المتجاوب. فإما أن <strong>تبدأ التصميم للحواسيب المكتبية أو الشاشات العريضة</strong> ثم تضيف نقاط انتقال يتغير عندها التصميم عند الانتقال إلى شاشات أضيق. أو أن تبدأ تصميمك لأصغر نوافذ العرض ثم تغير التخطيط مع ازدياد اتساع نافذة العرض. يُدعى النهج الأخير بنهج <strong>الهاتف المحمول أولًا</strong> وهو غالبًا ما يكون النهج الأفضل عمليًا.
</p>

<p>
	يُعرض المحتوى في الشاشات الصغيرة عادة ضمن تخطيط عمود واحد بسيط، كما هو الحال في تخطيط الانسياب الاعتيادي <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%A7%D9%86%D8%B3%D9%8A%D8%A7%D8%A8-%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D9%8A%D8%A7%D8%AF%D9%8A-normal-flow-%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2269/" rel="">normal flow</a>. أي أنك لن تحتاج غالبًا إلى تخطيطات معقدة للأجهزة الصغيرة، وكل ما عليك فعله هو ترتيب الشيفرة المصدرية جيدًا لتحصل على تخطيط واضح مقروء افتراضيًا.
</p>

<p>
	سنعمل في التطبيق التالي على توضيح هذا النهج من خلال تخطيط بسيط جدًا، وتذكّر أنه في المواقع الفعلية قد تواجه أشياء أكثر تعقيدًا تحتاج إلى ضبطها من خلال استعلامات الوسائط، لكن النهج سيبقى ذاته.
</p>

<h3 id="-8">
	تخطيط بسيط على نهج "الهاتف المحمول أولًا"
</h3>

<p>
	سننطلق من مستند HTML مع بعض تنسيقات CSS التي تضيف ألونًا لخلفيات الأقسام المختلفة للتخطيط كما يلي.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9493_41" style=""><span class="pun">*</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">box-sizing</span><span class="pun">:</span><span class="pln"> border-box</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

body </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">90%</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2em</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">font</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">/</span><span class="lit">1.3</span><span class="pln"> Arial</span><span class="pun">,</span><span class="pln"> Helvetica</span><span class="pun">,</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">link</span><span class="pun">,</span><span class="pln">
</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">visited </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#333</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

nav ul</span><span class="pun">,</span><span class="pln">
aside ul </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">list-style</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

nav </span><span class="kwd">a</span><span class="pun">:</span><span class="pln">link</span><span class="pun">,</span><span class="pln">
nav </span><span class="kwd">a</span><span class="pun">:</span><span class="pln">visited </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> rgba</span><span class="pun">(</span><span class="lit">207</span><span class="pun">,</span><span class="pln"> </span><span class="lit">232</span><span class="pun">,</span><span class="pln"> </span><span class="lit">220</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.2</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> solid </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">79</span><span class="pun">,</span><span class="pln"> </span><span class="lit">185</span><span class="pun">,</span><span class="pln"> </span><span class="lit">227</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">text-decoration</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#333</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">font-weight</span><span class="pun">:</span><span class="pln"> bold</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

nav </span><span class="kwd">a</span><span class="pun">:</span><span class="pln">hover </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> rgba</span><span class="pun">(</span><span class="lit">207</span><span class="pun">,</span><span class="pln"> </span><span class="lit">232</span><span class="pun">,</span><span class="pln"> </span><span class="lit">220</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.7</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">related </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> rgba</span><span class="pun">(</span><span class="lit">79</span><span class="pun">,</span><span class="pln"> </span><span class="lit">185</span><span class="pun">,</span><span class="pln"> </span><span class="lit">227</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.3</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">79</span><span class="pun">,</span><span class="pln"> </span><span class="lit">185</span><span class="pun">,</span><span class="pln"> </span><span class="lit">227</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">sidebar </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> rgba</span><span class="pun">(</span><span class="lit">207</span><span class="pun">,</span><span class="pln"> </span><span class="lit">232</span><span class="pun">,</span><span class="pln"> </span><span class="lit">220</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.5</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

article </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">margin-bottom</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لم ندخل أية تغييرات على التخطيط من خلال شيفرة التنسيق السابقة، لكننا رتبنا الشيفرة المصدرية بطريقة تجعل المحتوى واضحًا. هذه الخطوة أساسية ومهمة من جهة، وتضمن سهولة قراءة المحتوى من قبل قارئات الشاشة من ناحية أخرى.
</p>

<pre class="ipsCode">&lt;body&gt;
  &lt;div class="wrapper"&gt;
    &lt;header&gt;
      &lt;nav&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href=""&gt;About&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=""&gt;Contact&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=""&gt;Meet the team&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href=""&gt;Blog&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/nav&gt;
    &lt;/header&gt;
    &lt;main&gt;
      &lt;article&gt;
        &lt;div class="content"&gt;
          &lt;h1&gt;Veggies!&lt;/h1&gt;
          &lt;p&gt;…&lt;/p&gt;
        &lt;/div&gt;
        &lt;aside class="related"&gt;
          &lt;p&gt;…&lt;/p&gt;
        &lt;/aside&gt;
      &lt;/article&gt;

      &lt;aside class="sidebar"&gt;
        &lt;h2&gt;External vegetable-based links&lt;/h2&gt;
        &lt;ul&gt;
          &lt;li&gt;…&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/aside&gt;
    &lt;/main&gt;

    &lt;footer&gt;&lt;p&gt;&amp;copy;2019&lt;/p&gt;&lt;/footer&gt;
  &lt;/div&gt;
&lt;/body&gt;
</pre>

<p>
	يعمل هذا التخطيط البسيط جيدًا على الهاتف المحمول. وبإمكانك استخدام نمط التصميم المتجاوب في أدوات مطوري الويب لترى كيف يعمل بشكل واضح ومرضٍ على شاشة الهاتف المحمول.
</p>

<p>
	 اطلع على <a href="https://mdn.github.io/css-examples/learn/media-queries/step1.html" rel="external nofollow">الخطوة الأولى</a> ضمن متصفحك أو ألق نظرة على <a href="https://github.com/mdn/css-examples/blob/main/learn/media-queries/step1.html" rel="external nofollow">الشيفرة المصدرية</a>. وإن أردت أن تتابع العمل معنا، نزّل نسخة من الملف <a href="https://github.com/mdn/css-examples/blob/main/learn/media-queries/step1.html" rel="external nofollow">step1.html</a> على حاسوبك.
</p>

<p>
	ابتداءً من هذه الخطوة، اسحب نافذة العرض في وضع التصميم المتجاوب لتصبح أوسع حتى اللحظة التي ترى فيها أن طول سطر الكتابة أصبح طويلًا، ولدينا متسع من المساحة لعرض المحتوى أفقيًا، هنا سنضع أول استعلام وسائط. سنستخدم<a href="https://academy.hsoub.com/programming/css/%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D9%82%D9%8A%D8%A7%D8%B3-%D9%88%D8%A7%D9%84%D9%82%D9%8A%D9%85-%D9%81%D9%8A-css-r2161/" rel=""> واحدة em</a> وتعني أنه إذا زاد المستخدم حجم الخط فإن نقطة الانتقال ستحدث عند طول السطر ذاته لكن ضمن نافذة عرض أوسع.
</p>

<p>
	أضف الشيفرة التالية إلى آخر الملف step1.html:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9493_45" style=""><span class="kwd">@media</span><span class="pln"> screen and </span><span class="pun">(</span><span class="kwd">min-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">40em</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  article </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">column-gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  nav ul </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> flex</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  nav li </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">flex</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يعطينا تنسيق CSS تخطيطًا من عمودين ضمن العنصر <code>&lt;article&gt;</code> الأول يضم محتوى المقال الأساسي والآخر لمعلومات متعلقة بالمحتوى إلى الجانب. كما استخدمنا الصندوق المرن لوضع قائمة التنقل ضمن صف واحد.
</p>

<p>
	اطلع على <a href="https://mdn.github.io/css-examples/learn/media-queries/step2.html" rel="external nofollow">الخطوة الثانية</a> ضمن متصفحك أو الق نظرة على <a href="https://github.com/mdn/css-examples/blob/main/learn/media-queries/step2.html" rel="external nofollow">الشيفرة المصدرية</a>.
</p>

<p>
	نتابع الآن العمل ونزيد الاتساع بالمقدار الذي نرى أنه مناسب كي يشكل الشريط الجانبي عمودًا جديدًا. وسنضع ضمن استعلام الوسائط شيفرة تحوّل العنصر الأساسي إلى شبكة من عمودين، وعلينا عندها إزالة <code>margin-bottom</code> من العنصر كي يتحاذى العمودان، كما سنضيف حدًا <code>border</code> أعلى التذييل. إن ما فعلناه عمليًا هو الشيء الذي نحتاجه ليبدو التصميم جيدًا عند كل نقطة انتقال.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9493_47" style=""><span class="kwd">@media</span><span class="pln"> screen and </span><span class="pun">(</span><span class="kwd">min-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">70em</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  main </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">column-gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  article </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">margin-bottom</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  footer </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">border-top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid </span><span class="lit">#ccc</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">margin-top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2em</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	اطلع على <a href="https://mdn.github.io/css-examples/learn/media-queries/step3.html" rel="external nofollow">الخطوة الثالثة</a> ضمن متصفحك أو الق نظرة على <a href="https://github.com/mdn/css-examples/blob/main/learn/media-queries/step3.html" rel="external nofollow">الشيفرة المصدرية</a>.
</p>

<p>
	لو نظرت إلى المثال الأخير سترى كيف يتجاوب التصميم مع الاتساعات المختلفة للشاشة ابتداءًا من عمود واحد ثم عمودين وثلاثة أعمدة وفقًا للاتساع المتاح. وهذا بالطبع مثال بسيط عن التصميم وفق مبدأ "الهاتف المحمول أولًا".
</p>

<h2 id="meta">
	الوسم <code>&lt;meta&gt;</code> الخاص بنافذة العرض
</h2>

<p>
	إن ألقيت نظرة على الشيفرة المصدرية لصفحة متجاوبة سترى عادة الوسم <a href="https://wiki.hsoub.com/HTML/meta" rel="external"><code>&lt;meta&gt;</code></a> ضمن الترويسة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9493_49" style=""><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"viewport"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"width=device-width,initial-scale=1"</span><span class="pln"> </span><span class="tag">/&gt;</span></pre>

<p>
	وهي طريقة للتحكم بكيفية تصيير متصفحات الهاتف المحمول للمحتوى، لأن متصفحات الهواتف المحمولة لا تكون صادقة تمامًا فيما يخص اتساع نافذة العرض.ولا تُعرض معظم المواقع غير المتجاوية بالشكل الأفضل ضمن نوافذ العرض الضيقة. لهذا تصيير الهواتف الذكية المحتوى وفق نافذة العرض أوسع من نافذة العرض الفعلية للجهاز (عادة 980 بكسل) ومن ثم تقلّص الصفحة بعد تصييرها لتلائم شاشة الجهاز.
</p>

<p>
	ويعني هذا أن المواقع المتجاوبة لن تعمل كما هو متوقع إن كان اتساع نافذة العرض التي يتعامل معها الجهاز هي 980 بكسل. فالتخطيط الذي تريده عند النقطة الحدِّية<code>{}media screen and (max-width: 600px)@</code> مثلًا لن يُصيّر كما هو متوقع.
</p>

<p>
	يأتي الحل لهذه المشكلة باستخدام الوسم <a href="https://wiki.hsoub.com/HTML/meta" rel="external"><code>&lt;meta&gt;</code></a> الذي يعرف نافذة العرض كما في الشيفرة السابقة والذي يمنع متصفح الهاتف من تصيير المحتوى على أساس اتساع 980 بكسل، بل وفقًا لنافذة العرض الفعلية للجهاز، ويضبط المقياس افتراضيًا ليكون كمقياس الصفحة الأصلي. عندها ستعمل استعلامات الوسائط كما هو متوقع.
</p>

<h2 id="-9">
	هل نحتاج فعلًا استعلامات الوسائط؟
</h2>

<p>
	تقدم لك تقنيات مثل الصندوق المرن<a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B5%D9%86%D8%AF%D9%88%D9%82-%D8%A7%D9%84%D9%85%D8%B1%D9%86-flexbox-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2279/" rel="">flexbox</a> وتخطيط الشبكة <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-grid-%D9%81%D9%8A-css-r2282/" rel="">grid</a> والتخطيط متعدد الأعمدة <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D9%85%D8%AA%D8%B9%D8%AF%D8%AF-%D8%A7%D9%84%D8%A3%D8%B9%D9%85%D8%AF%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2297/" rel="">multicol</a> وسيلة لإنشاء صفحات ويب مرنة ومتجاوبة دون الحاجة إلى استعلامات الوسائط. ومن الأفضل التفكير في تصميمك إن كان يحتاج فعلًا إلى هذه الاستعلامات أو لا، فقد ترغب مثلًا بعرض مجموعة من البطاقات اتساعها على الأقل 200 بكسل بقدر ما تتسع له الحاوية، هذا الأمر سهل الإنجاز باستخدام تخطيط الشبكة دون استعلامات وسائط كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9493_51" style=""><span class="tag">&lt;ul</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"grid"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">
    </span><span class="tag">&lt;h2&gt;</span><span class="pln">Card 1</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">…</span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">
    </span><span class="tag">&lt;h2&gt;</span><span class="pln">Card 2</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">…</span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">
    </span><span class="tag">&lt;h2&gt;</span><span class="pln">Card 3</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">…</span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">
    </span><span class="tag">&lt;h2&gt;</span><span class="pln">Card 4</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">…</span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">
    </span><span class="tag">&lt;h2&gt;</span><span class="pln">Card 5</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">…</span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span></pre>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9493_53" style=""><span class="pun">.</span><span class="pln">grid </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">list-style</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="pln">auto-fill</span><span class="pun">,</span><span class="pln"> minmax</span><span class="pun">(</span><span class="lit">200px</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">grid li </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid </span><span class="lit">#666</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	افتح <a href="https://mdn.github.io/css-examples/learn/media-queries/grid.html" rel="external nofollow">هذا المثال</a> باستخدام المتصفح أو اطلع على <a href="https://github.com/mdn/css-examples/blob/main/learn/media-queries/grid.html" rel="external nofollow">الشيفرة المصدرية</a>.
</p>

<p>
	إن فتحت المثال في متصفحك، حاول أن تغيير اتساع نافذة المتصفح لترى كيف يتغير عدد الأعمدة في الصفحة. والمثير في هذه الطريقة عدم اعتماد الشبكة على اتساع نافذة العرض بل على مقدار المساحة المتاحة للعنصر أو الحاوية.
</p>

<p>
	قد تجد كتابة مقال عن استعلامات الوسائط ثم التوصية باستخدام تقنيات أخرى أمرًا غريبًا، لكن ما ستراه في الواقع التطبيقي هو تخطيطات ويب حديثة مدعومة باستعلامات وسائط للحصول على أفضل النتائج.
</p>

<h2 id="-10">
	الخلاصة
</h2>

<p>
	تعلمنا في هذا المقال مبادئ استعلامات الوسائط وكيفية استخدامها عمليًا في إنشاء تصميمات تعتمد على قاعدة "الهاتف المحمول أولًا". بإمكانك استخدام الأمثلة والشيفرات المصدرية التي عرضناها كنقطة انطلاق وتتمرن بعدها على تطبيق استعلامات الوسائط المختلفة كأن تغير مثلًا حجم قائمة التنقل إن اكتشفت أن الزائر يستخدم جهاز تأشير خشن (غير دقيق) بالاستفادة من الميزة <code>pointer</code>.
</p>

<p>
	يمكنك اختبار الاستعلامات أيضًا بإضافة مكونات مختلفة وتحري إن كان إضافة استعلامات وسائط أو استخدام أساليب التخطيط المختلفة كالصندوق المرن أو الشبكات هو الأفضل في جعل تلك المكونات متجاوبة. إذًا لا توجدغالبًا طريقة صحيحة وأخرى خاطئة، وما عليك فعله هو التجريب لتعرف ما هو الأنسب لتصميمك.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Media_queries" rel="external nofollow">Beginners guide to media queries</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-responsive-web-design-r2302/" rel="">التصميم المتجاوب لصفحات الويب Responsive Web Design</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D8%B3%D8%A7%D8%A6%D8%B7-media-queries-%D9%81%D9%8A-css-r1059/" rel="">استعلامات الوسائط (Media Queries) في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/design/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-%D9%88%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D9%83%D9%8A%D9%81-r724/" rel="">مدخل إلى التصميم المتجاوب والتصميم المتكيف</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%B9%D8%B1%D8%B6-%D9%85%D8%AD%D8%AA%D9%88%D9%89-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D9%85%D8%AA%D8%B9%D8%AF%D8%AF%D8%A9-r1517/" rel="">عرض محتوى صفحات الويب بتجاوب على الأجهزة المتعددة</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2309</guid><pubDate>Mon, 22 Apr 2024 12:06:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x635;&#x645;&#x64A;&#x645; &#x627;&#x644;&#x645;&#x62A;&#x62C;&#x627;&#x648;&#x628; &#x644;&#x635;&#x641;&#x62D;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; Responsive Web Design</title><link>https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-responsive-web-design-r2302/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_04/CSS.png.e1ca7c9f84d52032dbbd62a5a3fb2e81.png" /></p>
<p>
	يُعد مفهوم التصميم المتجاوب للويب responsive web design واختصارًا RWD نهجًا يسمح للصفحة أن تغيّر تخطيطها ومظهرها لتلائم الاتساعات المختلفة لشاشات الأجهزة والدقات المختلفة لها، وضمان الاستخدام الأمثل للمحتوى. لهذا سنساعدك في هذا المقال على فهم بعض التقنيات التي تحتاجها لتتقن التصميم المتجاوب.
</p>

<p>
	ننصحك قبل المتابعة في قراءة هذا المقال أن:
</p>

<ol>
	<li>
		تطلع على <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">أساسيات HTML</a>.
	</li>
	<li>
		تفهم <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-css-r70/" rel="">أساسيات عمل CSS</a>.
	</li>
</ol>

<p>
	تُعد عناصر HTML متجاوبة أساسًا وقابلة للانسياب وفقًا لتوجه نافذة العرض. فلو أنشأت صفحة ويب باستخدام شيفرة HTML فقط دون تنسيقات CSS وغيّرت أبعاد المتصفح، سيغيّر المتصفح عندها انسياب العناصر لتلائم نافذة العرض.
</p>

<p>
	قد يبدو الأمر للوهلة الأولى بأن التجاوب الأساسي الذي يقدمه المتصفح هو كل ما نحتاجه، إلا أن النصوص ذات الأسطر الطويلة مثلًا والتي تعرض بأكملها ضمن الشاشات الواسعة قد تكون صعبة القراءة. فإن قللنا اتساع السطر باستخدام تنسيقات CSS بإنشاء أعمدة أو إضافة حشوات حول المحتوى، قد يبدو حينها الموقع منكمشًا بالنسبة لمستخدمي الأجهزة أو المتصفحات قليلة الاتساع.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148346" href="https://academy.hsoub.com/uploads/monthly_2024_04/01_squashed_column_page.png.079b546b6afcbad617042cbe496ca378.png" rel=""><img alt="01 squashed column page" class="ipsImage ipsImage_thumbnailed" data-fileid="148346" data-ratio="135.50" data-unique="cmimu3ox6" style="width: 400px; height: auto;" width="400" src="https://academy.hsoub.com/uploads/monthly_2024_04/01_squashed_column_page.thumb.png.531ee92691fbd30a61f97029a3d5b112.png"> </a>
</p>

<p>
	لن تعمل أيضًا فكرة صفحة ويب ثابتة الحجم بتثبيت اتساع الصفحة لأنه سيؤدي إلى ظهور أشرطة التمرير ضمن نافذة عرض الأجهزة قليلة الاتساع ومساحة فارغة مبالغ فيها في الأجهزة التي تتمتع بشاشات واسعة.
</p>

<p>
	لهذا ظهر مفهوم التصميم المتجاوب للويب كنهج موجّه للتعامل مع مجموعة واسعة من الأجهزة بمختلف الأبعاد، إذ يسمح هذا النهج بالتكيف التلقائي مع الشاشات سواء عّرض محتوى الصفحة ضمن جهاز لوحي أو جوّال أو تلفاز أو ساعة.
</p>

<p>
	والتصميم المتجاوب كما أشرنا هو نهج وليس تقانة منفصلة، يصف مجموعة من الممارسات التطبيقية المستخدمة في بناء تخطيطات لمواقع الويب يسمح لها بالتجاوب مع أي جهاز يعرض محتواها.
</p>

<p>
	استخدم مصطلح الويب المتجاوب أول مرة من قبل <a href="https://alistapart.com/article/responsive-web-design/" rel="external nofollow">إيثان ماركوتي عام 2010</a> في وصف الشبكات الانسيابية fluid grid والصور الانسيابية fluid image واستعلامات الوسائط media query التي تُستخدم في بناء محتوى متجاوب.
</p>

<p>
	لقد اقتُرح حينها استخدام الخاصية <code>float</code> للتخطيطات واستخدام استعلامات الوسائط لتحري اتساع شاشة الجهاز ووضع نقاط محددة (تتعلق بالأبعاد المفترضة للأجهزة) يتغير عندها التخطيط. ضُبطت أيضًا الصور الانسيابية كي لا يتجاوز اتساعها اتساع الحاوية باستخدام القاعدة <code>;max-width: 100%</code>. وهكذا تصغر الصورة عندما يضيق العمود الذي يضمها لكن حجمها لايزيد عن الحجم الأصلي إن زاد اتساع العمود. وبهذا الطريقة تتغير أبعاد الصورة لتتسع إلى المحتوى دون طفحان ودون أن يزداد حجمها عن الحجم الأصلي وتتشوه عند ازدياد حجم الحاوية عن حجم الصورة.
</p>

<p>
	إن طرق تخطيط صفحات الويب العصرية باستخدام CSS متجاوبة بطبيعتها، ومنذ بدأت فكرة الويب المتجاوب ظهرت ميزات وأدوات لتسهيل تصميم مواقع الويب المتجاوبة. لهذا سنشير في بقية هذا المقال إلى الميزات المختلفة التي قد ترغب في معرفتها لإنشاء مواقع ويب متجاوبة.
</p>

<h2 id="-1">
	استعلامات الوسائط
</h2>

<p>
	تسمح لك <a href="https://wiki.hsoub.com/CSS/CSS_media_queries" rel="external">هذه الاستعلامات</a> بتنفيذ اختبارات (كأن تكون شاشة المستخدم أكثر اتساعًا من قيمة محددة أو دقة محددة) وانتقاء تنسيق CSS مناسب للصفحة بما يتلائم مع حاجة المستخدم.
</p>

<p>
	يختبر الاستعلام التالي مثلًا إن كانت صفحة الويب معروضة كشاشة وسائط screen media (أي لا يمكن طباعتها كمستند) وإن كان اتساع نافذة العرض على الأقل <code>80rem</code>. إن قواعد التنسيق الموجودة ضمن المحدد <code>container.</code> ستُطبق فقط إن تحقق الشرطين السابقين:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6695_9" style=""><span class="kwd">@media</span><span class="pln"> screen and </span><span class="pun">(</span><span class="kwd">min-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">80rem</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pln"> </span><span class="lit">2em</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بإمكانك إضافة عدة استعلامات وسائط في صفحة التنسيقات لتعدّل تخطيطك وفقًا لنتائج تلك الاستعلامات، وبما يتلائم مع المقاسات المختلفة للشاشات. تُدعى النقاط التي تُطبق فيها استعلامات الوسائط ويتغير تخطيط الصفحة بنقاط الانتقال breakpoints.
</p>

<p>
	من أكثر المقاربات شيوعًا في استخدام استعلامات الوسائط هي استخدام تخطيط عمود وحيد للشاشات الضيقة (مثل شاشات الجوّال) ثم تبني تخطيط من عدة أعمدة عندما تتحقق من خلال الاستعلامات أن اتساع الشاشة أصبح ملائمًا لذلك. يُعرف تصميم الصفحات لتلائم أجهزة الجوال بمصطلح "الجوّال أولًا mobile first".
</p>

<p>
	من الممارسات المفضلة عند استخدام نقاط الانتقال تعريف الأبعاد <a href="https://academy.hsoub.com/programming/css/%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D9%82%D9%8A%D8%A7%D8%B3-%D9%88%D8%A7%D9%84%D9%82%D9%8A%D9%85-%D9%81%D9%8A-css-r2161/" rel="">بصفتها وحدات نسبية</a> relative unites بدلًا من الوحدات المطلقة لكل جهاز.
</p>

<p>
	سترى أيضًا عدة مقاربات تنسيق ضمن كتلة الاستعلام منها ربط ملفات تنسيق بصفحة الويب من خلال العنصر <code>&lt;link&gt;</code> وفقًا لأبعاد مختلفة للمتصفح أو استخدم متغيرات مخصصة لضبط بعض الخاصيات وتخزين القيم الملائمة لها عند كل نقطة انتقال.
</p>

<p>
	تساعد استعلامات الوسائط في التصميم المتجاوب لكنها ليست ضرورية، إذ يمكن استخدام الشبكات المرنة والوحدات النسبية والقيم العظمى والصغرى للخاصيات دون الحاجة إلى استعلامات الوسائط.
</p>

<h2 id="-2">
	تقنيات التخطيطات المتجاوبة
</h2>

<p>
	تُبنى المواقع المتجاوبة باستخدام الشبكات المرنة، بمعنى أنك لن تحتاج استهداف كل الاتساعات المحتملة للأجهزة بتخطيطات منفصلة لضمان دقة العرض. إذ تسمح لك الشبكات المرنة بتغيير ميزة أو إضافة نقطة انتقال لتغيير التصميم في الحالات التي يُعرض فيها المحتوى بشكل سيء. فلكي تضمن مثلًا أن طول الأسطر في نص لن يزيد إلى الحد الذي يعيق القراءة وذلك عندما تكون الشاشة واسعة، بإمكانك استخدام الأعمدة <a href="https://wiki.hsoub.com/CSS/columns" rel="external"><code>columns</code></a>؛ وإن انكمش صندوق النص ليعرض مثلًا كلمتين فقط في السطر عندما تضيق الشاشة بإمكانك وضع نقطة انتقال لتغيير التخطيط.
</p>

<p>
	تتمتع عدة تخطيطات مثل <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D9%85%D8%AA%D8%B9%D8%AF%D8%AF-%D8%A7%D9%84%D8%A3%D8%B9%D9%85%D8%AF%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2297/" rel="">التخطيط المتعدد الأعمدة</a> <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B5%D9%86%D8%AF%D9%88%D9%82-%D8%A7%D9%84%D9%85%D8%B1%D9%86-flexbox-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2279/" rel="">وتخطيط الصندوق المرن</a> <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-grid-%D9%81%D9%8A-css-r2282/" rel="">وتخطيط الشبكة</a> بقدرتها على التجاوب افتراضيًا. إذ تفترض جميعها أنك تحاول بناء شبكة مرنة وتساعدك على تنفيذ الأمر بأبسط الطرق.
</p>

<h3 id="-3">
	تخطيط متعدد الأعمدة
</h3>

<p>
	تستطيع في هذه الحالة تحديد قيمة للخاصية <code>column-count</code> لتشير إلى العدد الأعظمي للأعمدة التي تريد توزيع المحتوى ضمنها. وعندها يحسب المتصفح عندها الاتساع المناسب لكل عمود وبما يناسب اتساع شاشة العرض.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6695_11" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">column-count</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بينما لو خصصت قيمة للخاصية <code>column-width</code> ستخصص في هذه الحالة أدنى اتساع للعمود، وسينشئ حينها المتصفح أكبر قدر ممكن من الأعمدة بهذا الاتساع بما يلائم اتساع الحاوية، وإن بقيت مساحة فارغة (بقية مساحة أقل من مساحة عمود) سيقسمها بالتساوي بين تلك الأعمدة. وهكذا سيتغير عدد الأعمدة بتغير المساحة المتوفرة.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6695_13" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">column-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10em</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وكذلك الأمر، بإمكانك استخدام الخاصية المختصرة <a href="https://wiki.hsoub.com/CSS/columns" rel="external"><code>columns</code></a> لتزويد المتصفح بأعلى عدد من الأعمدة وأدنى اتساع لكل منها. وهذا ما يضمن مثلًا ألا يصبح طول سطر الكتابة أكبر مما يسمح بتجربة قراءة مقبولة -وذلك عندما يزداد اتساع الشاشة- أو قصيرًا جدًا عندما تضيق الشاشة.
</p>

<h3 id="-4">
	الصندوق المرن
</h3>

<p>
	تتقلص العناصر المرنة في تخطيط الصندوق المرن وتتمدد مغيرة مقدار المساحات المتاحة بين العناصر وفقًا للمساحة الكلية للحاوية المرنة. وبتغيير قيم الخاصيتين <code>flex-grow</code> و <code>flex-shrink</code> بإمكانك تحديد سلوك العناصر عندما تزيد المساحة الفارغة المحيطة بها أو تقل.
</p>

<p>
	سيأخذ كل عنصر مرن في مثالنا التالي نفس المساحة ضمن الحاوية المرنة باستخدام القاعدة <code>flex: 1</code> وقد أشرنا إلى هذا الموضوع بتفصيل أوفى في المقال الذي يتحدث عن <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B5%D9%86%D8%AF%D9%88%D9%82-%D8%A7%D9%84%D9%85%D8%B1%D9%86-flexbox-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2279/" rel="">تخطيط الصندوق المرن.</a>
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6695_15" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> flex</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">item </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">flex</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>ملاحظة</strong>: في مثال عن استخدام الصندوق المرن (اطلع على الشيفرة المصدرية)، بنينا تخطيطًا متجاوبًا بسيطًا يتضمن نقاط انتقال إلى الوضع متعدد الأعمدة عندما يزداد شاشة العرض وتقييدًا لأبعاد المحتوى الرئيسي باستخدام الخاصية <a href="https://wiki.hsoub.com/CSS/max-width" rel="external"><code>max-width</code></a>، إليك <a href="https://mdn.github.io/css-examples/learn/rwd/flex-based-rwd.html" rel="external nofollow">هذا المثال</a> (اطلع على <a href="https://github.com/mdn/css-examples/blob/main/learn/rwd/flex-based-rwd.html" rel="external nofollow">الشيفرة المصدرية</a> أيضًا).
</p>

<h3 id="css">
	شبكة CSS
</h3>

<p>
	تسمح لك الواحدة <code>fr</code> في تخطيط الشبكة توزيع المساحة الفارغة المتاحة بين مسارات الشبكة. سنرى في مثالنا التالي كيف ننشئ شبكة حاوية بثلاث مسارات قياس كل منها <code>1fr</code> وستكون النتيجة ثلاثة أعمدة يشغل كل منها جزءًا من المساحة المتاحة في الحاوية. يمكنك الاطلاع على تفاصيل أوفى عن استخدام الشبكة في مقال <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-grid-%D9%81%D9%8A-css-r2282/" rel="">تخطيط صفحات ويب باستخدام خاصيات الشبكة في CSS</a>
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6695_17" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>ملاحظة</strong>: إن النسخة المتجاوبة المبنية على تخطيط الشبكة أبسط لأنه بالإمكان تعريف الأعمدة ضمن الصنف <code>wrapper.</code>
</p>

<p>
	ألق نظرة <a href="https://mdn.github.io/css-examples/learn/rwd/grid-based-rwd.html" rel="external nofollow">على المثال</a> على github (كما يمكنك الاطلاع على <a href="https://github.com/mdn/css-examples/blob/main/learn/rwd/grid-based-rwd.html" rel="external nofollow">الشيفرة المصدرية</a> أيضًا)
</p>

<h2 id="-5">
	الصور المتجاوبة
</h2>

<p>
	لكي تضمن أن حجم الصورة لن يزيد عن حجم الحاوية، يمكنك استخدام المقاربة التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6695_19" style=""><span class="pln">img</span><span class="pun">,</span><span class="pln">
picture</span><span class="pun">,</span><span class="pln">
video </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تُطبق هذه القاعدة على الوسائط المتعددة كي لا تطفح خارج الحاوية. ولا بد من إدراك أن استخدام صورة كبيرة الحجم ثم تصغيرها لتلائم الشاشات الضيقة سيهدر حزمة البيانات نظرًا لتزيل صورة أكبر من المطلوب.
</p>

<p>
	يساعد استخدام العنصر <a href="https://wiki.hsoub.com/HTML/picture" rel="external"><code>&lt;picture&gt;</code></a> مع السمتين <code>srcset</code> و <code>sizes</code> للعنصر <code>&lt;img&gt;</code> في تقديم صور تتلائم مع نوافذ عرض مختلفة ودقات مختلفة. إذ يمكنك مثلًا إضافة صورة مربعة الشكل لأجهزة الجوال ونفس الصورة لكن على شكل مستطيل للحواسب المكتبية.
</p>

<p>
	ستتمكن باستخدام العنصر <code>&lt;picture&gt;</code> من تقديم قياسات مختلفة مع تلميحات (على شكل بيانات وصفية توضّح حجم الشاشة ودقة الصورة و الطريقة الأمثل لعرضها) يختار بعدها المتصفح الصورة الأكثر ملائمة لكل جهاز ليضمن المستخدم تنزيل الصورة ذات الحجم الأنسب للجهاز الذي يستخدمه. ومع استخدام مع الخاصية <code>max-width</code> لا حاجة بعد ذلك لاستخدام استعلامات الوسائط لتغيير أبعاد الشاشة، وستتمكن من استهداف نوافذ عرض مختلفة بصور تختلف في نسب أبعادها.
</p>

<p>
	كما يمكنك توجيه الصورة فنيًا (وضع رؤية فنية) باستخدام أحجام مختلفة للصورة ذاتها، باقتصاص الصورة أو استخدام أخرى بأبعاد مختلفة. يمكنك الاطلاع على مشكلة الرؤية الفنية ضمن مقال "<a href="https://academy.hsoub.com/programming/html/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8%D8%A9-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1834/" rel="">استخدام الصور المتجاوبة في صفحات الويب</a>" على أكاديمية حسوب.
</p>

<h2 id="-6">
	خطوط الكتابة المتجاوبة
</h2>

<p>
	يُقصد بتجاوب خطوط الكتابة هو تغيير حجم الخط من خلال استعلامات الوسائط أو باستخدام وحدات قياس مرتبطة بنافذة العرض.
</p>

<h3 id="-7">
	استخدام استعلامات الوسائط للحصول على خطوط كتابة متجاوبة
</h3>

<p>
	سنرى في مثالنا التالي عنوانًا من المستوى الأول ضُبط حجم الخط فيه على <code>4rem</code>، ويعني ذلك أن الحجم سيكون أربعة أضعاف الحجم الأساسي للخط المستخدم. وهذا في الواقع حجم كبير لعنوان من المستوى الأول، ولا نحتاجه سوى في شاشة العرض الواسعة، لهذا أنشأنا أولًا عنوانًا بحجم أصغر، وبعدها استخدمنا استعلامًا يلغي الحجم الصغير ويستبدله بالحجم الأكبر إن كان اتساع الشاشة أكبر من <code>1200px</code>
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6695_21" style=""><span class="pln">html </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

h1 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2rem</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">@media</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">min-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1200px</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  h1 </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4rem</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	عدّلنا مثال الشبكة المتجاوبة السابق كي يتضمن أيضًا نوعًا متجاوبًا باستخدام الطريقة الموضّحة سابقًا. بإمكانك ملاحظة تبدّل حجم الخط في العنوان عندما يتغير التخطيط إلى تخطيط عمودين.
</p>

<p>
	في الهواتف المحمولة سيكون العنوان أصغر حجمًا:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148347" href="https://academy.hsoub.com/uploads/monthly_2024_04/02_responsive_des_mobile.png.0fe84376083efa8a67941534f58cb685.png" rel=""><img alt="02 responsive des mobile" class="ipsImage ipsImage_thumbnailed" data-fileid="148347" data-ratio="135.50" data-unique="le0t53z5l" style="width: 400px; height: auto;" width="400" src="https://academy.hsoub.com/uploads/monthly_2024_04/02_responsive_des_mobile.thumb.png.c085e71ceb00778b2cf8193ce3a3883c.png"> </a>
</p>

<p>
	في الحواسب المكتبية سنرى الحجم الأكبر للعنوان:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148348" href="https://academy.hsoub.com/uploads/monthly_2024_04/03_responsive_des_desktop.png.36c02694e44aab5220be1721926eaf4a.png" rel=""><img alt="03 responsive des desktop" class="ipsImage ipsImage_thumbnailed" data-fileid="148348" data-ratio="28.29" data-unique="0tl6amil3" style="width: 700px; height: auto;" width="700" src="https://academy.hsoub.com/uploads/monthly_2024_04/03_responsive_des_desktop.thumb.png.37800372b47162b37d0bcc5e66b2262e.png"> </a>
</p>

<p>
	وكما رأينا في هذه المقاربة، لم نستخدم استعلامات الوسائط لتغيير تخطيط الصفحة، ويمكن استخدام الأسلوب ذاته في تغيير أي عنصر ليكون أسهل استخدامًا أو جاذبيةّ ضمن شاشات مختلفة الأبعاد.
</p>

<h3 id="-8">
	استخدام وحدات قياس نوافذ العرض للحصول على خطوط كتابة متجاوبة
</h3>

<p>
	يمكن استخدام وحدات نافذة العرض <code>vw</code> في التصميم المتجاوب لخطوط الكتابة دون الحاجة إلى ضبط نقاط انتقال في استعلامات الوسائط. فالقيمة <code>1vw</code> هي واحد في المئة من اتساع نافذة العرض، وبالتالي أيًا كانت شاشة العرض فستكون أبعاد حجم الكتابة مضبوطةً بالنسبة لها.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6695_25" style=""><span class="pln">h1 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">6vw</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تظهر المشكلة عند تكبير وتصغير النصوص فلن يتمكن من ذلك طالما أن حجم خط الكتابة منسوب إلى حجم نافذة العرض. وبالتالي لا يجب استخدام هذه الوحدات بمفردها.
</p>

<p>
	من الحلول المتاحة للمشكلة استخدام الدالة <a href="https://wiki.hsoub.com/CSS/calc" rel="external"><code>()calc</code></a>. إذ يمكنك إضافة القيمة المقدرة بواحدة <code>vw</code> إلى قيمة ثابتة مثل وعندها تحسب الدالة السابقة القيمة الجديدة مع بقاء النص قابلًا للتصغير والتكبير. فالقيمة <code>vw</code> تضاف إلى القيمة الناتجة عن التكبير أو التصغير.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6695_27" style=""><span class="pln">h1 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> calc</span><span class="pun">(</span><span class="lit">1.5rem</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">3vw</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وهكذا لا نحتاج سوى تحديد حجم الخط سوى مرة واحدة بدلًا من ضبط قيم لكل شاشة عرض باستخدام استعلامات الوسائط. سيزداد حجم النص الآن أو يقل وفقًا لاتساع شاشة العرض.
</p>

<h2 id="meta">
	الوسم <code>&lt;meta&gt;</code> الخاص بنافذة العرض
</h2>

<p>
	إن ألقيت نظرة على الشيفرة المصدرية لصفحة متجاوية سترى عادة الوسم <a href="https://wiki.hsoub.com/HTML/meta" rel="external"><code>&lt;meta&gt;</code></a> ضمن الترويسة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6695_31" style=""><span class="tag">&lt;meta</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"viewport"</span><span class="pln"> </span><span class="atn">content</span><span class="pun">=</span><span class="atv">"width=device-width,initial-scale=1"</span><span class="pln"> </span><span class="tag">/&gt;</span></pre>

<p>
	يجبر هذا الوسم متصفحات الهاتف المحمول أن تضبط اتساع نافذة العرض لتكون نفسها اتساع الجهاز، ومن ثم ضبط حجم الصفحة لتكون 100% من الحجم المحدد لها، وهكذا ستُعرض الصفحة بالشكل الأمثل على هذه الأجهزة.
</p>

<p>
	لماذا نحتاج إلى هذا الوسم؟ لأن متصفحات الهواتف المحمولة لا تكون صادقة تمامًا فيما يخص اتساع نافذة العرض.
</p>

<p>
	عندما ظهرت الهواتف الذكية، لم تُعرض معظم المواقع بالشكل الأفضل ضمنها. لهذا ضبطت الهواتف الذكية اتساع نافذة العرض على 980 بكسل وصيّرت الصفحة وفقًا لهذا القيمة ومن ثم عرضتها كنسخة مصغّرة عن نسخة الحواسب. وهكذا كان على المستخدمين تكبير وتصغير الصفحة للوصول إلى النقطة التي يريدون، وكان المظهر بالطبع سيئًا.
</p>

<p>
	وباستخدام السمة <code>width=device-width</code> تلغى القيمة الافتراضية للهاتف المحمول وتستبدل بالقيمة الحقيقية لنافذة العرض. ودون هذه السمة، قد لا يعمل التصميم المتجاوب الذي يعتمد على استعلامات الوسائط ونقاط الانتقال كما ينبغي ضمن أجهزة الهاتف المحمول، فإن كنت تستهدف مثلًا نقطة انتقال عند الاتساع 480 بكسل أو أقل واعتبر الهاتف أن استاع نافذة عرضه هي 980 بكسل فلن يرى المستخدم أبدًا تأثير نقاط الانتقال.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		استخدم دائمًا وسم نافذة العرض
	</p>
</blockquote>

<h2 id="">
	الخلاصة
</h2>

<p>
	يشير مصطلح التصميم المتجاوب إلى تصميم موقع أو تطبيق يتجاوب مع البيئة التي يُعرض فيها. وتُستخدم في ذلك مجموعة من ميزات CSS و HTML وبعض التقنيات الأخرى التي أصبحت أساسية الآن عند بناء مواقع الويب. فلن تجد حاليًا على الأغلب موقعًا يُعرض على هاتف محمول بنفس تخطيط الحواسب المكتبية لكن بشكل مصغّر أو أن تستخدم أشرطة التمرير الجانبية للوصول إلى مكان ما في الصفحة، لأن تصميم الويب المعاصر قد انتقل كليًا إلى نهج التجاوب.
</p>

<p>
	وقد أضحى من السهل أيضًا إنجاز تصاميم متجاوبة بالاستفادة من طرق تخطيط الصفحات التي تعلمناها في مقالات سابقة. فلو كنت حديث العهد بتطوير الويب، ستجد الكثير من الأدوات التي لم تكن موجودة في البدايات. لهذا من الأفضل أن تتحقق من تاريخ أي مادة تعليمية تستخدمها. وعلى الرغم من أهمية بعض المواد القديمة، إلا أن الميزات الجديدة في CSS و HTML تزوّدك بتصاميم أنيقة ومفيدة، أيًا كان الجهاز الذي يستعرض موقعك.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Responsive_Design" rel="external nofollow">Responsive design</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D9%85%D8%AA%D8%B9%D8%AF%D8%AF-%D8%A7%D9%84%D8%A3%D8%B9%D9%85%D8%AF%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2297/" rel="">التخطيط متعدد الأعمدة باستخدام CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-r1499/" rel="">أساسيات تصميم الويب المتجاوب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%81%D9%84%D8%B3%D9%81%D8%A9-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-r1532/" rel="">فلسفة تصميم الويب المتجاوب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8%D8%A9-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1834/" rel="">استخدام الصور المتجاوبة في صفحات الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%B9%D8%B1%D8%B6-%D9%85%D8%AD%D8%AA%D9%88%D9%89-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D9%85%D8%AA%D8%B9%D8%AF%D8%AF%D8%A9-r1517/" rel="">عرض محتوى صفحات الويب بتجاوب على الأجهزة المتعددة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/design/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-%D9%88%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D8%AA%D9%83%D9%8A%D9%81-r724/" rel="">مدخل إلى التصميم المتجاوب والتصميم المتكيف</a>
	</li>
</ul>

<p>
	 
</p>
]]></description><guid isPermaLink="false">2302</guid><pubDate>Wed, 17 Apr 2024 12:08:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x62E;&#x637;&#x64A;&#x637; &#x645;&#x62A;&#x639;&#x62F;&#x62F; &#x627;&#x644;&#x623;&#x639;&#x645;&#x62F;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; CSS</title><link>https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D9%85%D8%AA%D8%B9%D8%AF%D8%AF-%D8%A7%D9%84%D8%A3%D8%B9%D9%85%D8%AF%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2297/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_04/----CSS.png.50b743f6cb1819c3e55450b2ed254ef9.png" /></p>
<p>
	التخطيط متعدد الأعمدة هو أسلوب لترتيب العناصر في صفحات الويب ضمن أعمدة كما تُرتب أعمدة الصحف، وهذا ما سنشرحه في هذا المقال.
</p>

<p>
	عليك قبل البدء في قراءة هذا المقال أن:
</p>

<ol>
	<li>
		تطلع على <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">أساسيات HTML</a>.
	</li>
	<li>
		تتفهم <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-css-r70/" rel="">أساسيات عمل CSS</a>.
	</li>
</ol>

<h2 id="">
	مثال تمهيدي
</h2>

<p>
	نختبر في هذا المثال التخطيط المتعدد الأعمدة والذي يشار إليه في الإنجليزية اختصارًا multicol. بإمكانك متابعة العمل معنا بعد تنزيل نسختك من <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/multicol/0-starting-point.html" rel="external nofollow">الملف المخصص للتمرين</a> وإضافة شيفرة CSS في الأماكن المناسبة. سترى في نهاية القسم مثالًا عما ينبغي أن تكونه الشيفرة النهائية.
</p>

<h3 id="-1">
	تخطيط من ثلاث أعمدة
</h3>

<p>
	يضم الملف شيفرة HTML بسيطة جدًا مؤلفة من عنصر تغليف <code>&lt;div&gt;</code> يمتلك صنف التنسيق <code>container</code> وضمن عنصر التغليف ستجد عنوانًا وبعض الفقرات. سنحوّل عنصر التنسيق السابق إلى حاوية من ثلاث أعمدة باستخدام واحدة من الخاصيتين <a href="https://wiki.hsoub.com/CSS/column-count" rel="external"><code>column-count</code></a> أو <a href="https://wiki.hsoub.com/CSS/column-width" rel="external"><code>column-width</code></a>. إذ تأخذ الخاصية الأولى قيمتها على شكل أعداد وتنشئ أعمدة بمقدار هذه القيمة. فإن أضفت الشفرة التالية إلى تنسيق الصفحة وأعدت تحميلها ستحصل على ثلاثة أعمدة.
</p>

<pre class="ipsCode">.container {
  column-count: 3;
}
</pre>

<p>
	للأعمدة التي تنشئها اتساع مرن وسيعمل المتصفح على تقدير الاتساع الذي يأخذه كل عمود.
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/OJGQYoa?default-tab=result" style="width: 100%;" title="Multiple-column-1">See the Pen Multiple-column-1 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h3 id="columnwidth">
	ضبط اتسع العمود باستخدام <code>column-width</code>
</h3>

<p>
	عدّل شيفرة CSS كي تستخدم <code>column-width</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_7082_11" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">column-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">200px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سيعمل المتصفح في هذه الحالة على إنشاء أكبر عدد من الأعمدة بما يتناسب مع اتساع الحاوية، ثم يقسم المساحة المتبقية على الأعمدة. ويعني ذلك أنك لن تحصل بالضرورة على الاتساع الذي تريده ما لم يكن اتساع الحاوية قابلًا للقسمة على هذا الاتساع.
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/zYXRQmK?default-tab=result" style="width: 100%;" title="Multiple-column-2">See the Pen Multiple-column-2 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h2 id="-2">
	تنسيق الأعمدة
</h2>

<p>
	لا يمكن تنسيق الأعمدة التي تنشئها باستخدام خاصيات تعدد الأعمدة بشكل منفصل، فلن تجد طريقة لجعل عمود أكثر اتساع من آخر أو أن تغير لون أو خلفية أحد الأعمدة فقط دون البقية. وعمومًا، لديك طريقتين لتغيير طريقة عرض الأعمدة:
</p>

<ul>
	<li>
		<a href="https://wiki.hsoub.com/CSS/column-gap" rel="external"><code>column-gap</code></a>: لتغيير حجم المسافة الفارغة بين عمودين.
	</li>
	<li>
		<a href="https://wiki.hsoub.com/CSS/column-rule" rel="external"><code>column-rule</code></a>: لإضافة فاصل بين عمودين.
	</li>
</ul>

<p>
	جرّب أن تغيّر في مثالنا حجم المسافة الفارغة بين الأعمدة باستخدام <code>column-width</code> وإسناد أية قيم تراها مناسبة إذ تقبل هذه الخاصية أية قيم لها واحدة الطول.
</p>

<p>
	أضف أيضًا فاصلًا بين الأعمدة باستخدام الخاصية <code>column-rule</code> التي تمثل خاصية مختصرة مشابهة للخاصية <a href="https://wiki.hsoub.com/CSS/border" rel="external"><code>border</code></a> وتضم ثلاثة خاصيات هي <a href="https://wiki.hsoub.com/CSS/column-rule-color" rel="external"><code>column-rule-color</code></a> و <a href="https://wiki.hsoub.com/CSS/column-rule-style" rel="external"><code>column-rule-style</code></a> و <a href="https://wiki.hsoub.com/CSS/column-rule-width" rel="external"><code>column-rule-width</code></a> وتقبل نفس القيم التي تأخذها خاصيات <code>border</code>.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_7082_13" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">column-count</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">column-gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">column-rule</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4px</span><span class="pln"> dotted </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">79</span><span class="pun">,</span><span class="pln"> </span><span class="lit">185</span><span class="pun">,</span><span class="pln"> </span><span class="lit">227</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	حاول أن تضيف أعمدة بتنسيقات وألوان مختلفة:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/mdgXYQK?default-tab=result" style="width: 100%;" title="Multiple-column-3">See the Pen Multiple-column-3 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	من الجدير بالملاحظة هنا أن الفواصل لا تملك اتساعًا مخصصًا بها، بل تستقر في المسافة الفارغة بين الأعمدة التي حددتها باستخدام <code>column-gap</code>. لهذا ستحتاج إلى زيادة أبعاد المسافة الفارغة بين الأعمدة حتى تزيد اتساع الفواصل.
</p>

<h2 id="-3">
	الأعمدة المتمددة
</h2>

<p>
	بالإمكان أن تجعل عنصرًا يمتد على جميع الأعمدة، وفي هذه الحالة ينتقل المحتوى إلى سطر جديد في النقطة التي يظهر فيها العمود الممتد ثم يكمل تحته ضمن مجموعة جديدة من الأعمدة.
</p>

<p>
	وحتى يمتد العنصر على جميع الأعمدة يجب أن تضبط قيمة الخاصية <a href="https://wiki.hsoub.com/CSS/column-span" rel="external"><code>column-span</code></a> على <code>all</code>.
</p>

<p>
	<strong>ملاحظة</strong>: من غير الممكن أن تجعل عنصرًا يمتد على عدد معين من الأعمدة، فإما أن يتمدد على كل الأعمدة <code>all</code> أو أن لا يتمدد أبدًا <code>none</code>.
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/ExJQzrZ?default-tab=result" style="width: 100%;" title="Multiple-column-4">See the Pen Multiple-column-4 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h2 id="-4">
	الأعمدة وتجزئة المحتوى
</h2>

<p>
	يُجزّأ محتوى التخطيط متعدد الأعمدة، ويسلك أساسًا سلوك محتوى صفحات متعددة الوسائط كما يُلاحظ عند طباعة صفحة ويب. فعندما تحوّل المحتوى إلى حاوية متعددة الأعمدة فأنت تجزئ هذا المحتوى إلى أعمدة، ولكي يحدث ذلك لا بد للمحتوى من الانتقال إلى أسطر جديدة.
</p>

<h3 id="-5">
	الصناديق المجزأة
</h3>

<p>
	يحدث انتقال المحتوى إلى أسطر جديدة أحيانًا في أماكن قد تسيء إلى تجربة القراءة. ولتوضيح الأمر، استخدمنا في المثال التالي تخطيطًا متعدد الأعمدة لتوزيع سلسلة من الصناديق لكلٍ منها عنوان ونص. سيظهر العنوان منفصلًا عن النص إذا حدث التجزئة بينهما.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7082_15" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"container"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"card"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;h2&gt;</span><span class="pln">I am the heading</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
      aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
      pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc,
      at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta.
      Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula.
    </span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">

  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"card"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;h2&gt;</span><span class="pln">I am the heading</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
      aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
      pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc,
      at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta.
      Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula.
    </span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">

  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"card"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;h2&gt;</span><span class="pln">I am the heading</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
      aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
      pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc,
      at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta.
      Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula.
    </span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"card"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;h2&gt;</span><span class="pln">I am the heading</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
      aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
      pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc,
      at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta.
      Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula.
    </span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">

  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"card"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;h2&gt;</span><span class="pln">I am the heading</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
      aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
      pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc,
      at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta.
      Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula.
    </span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">

  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"card"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;h2&gt;</span><span class="pln">I am the heading</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
      aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
      pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc,
      at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta.
      Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula.
    </span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">

  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"card"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;h2&gt;</span><span class="pln">I am the heading</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
    </span><span class="tag">&lt;p&gt;</span><span class="pln">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
      aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
      pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc,
      at ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta.
      Integer ligula ipsum, tristique sit amet orci vel, viverra egestas ligula.
    </span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_7082_17" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">column-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">250px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">column-gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">card </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">207</span><span class="pun">,</span><span class="pln"> </span><span class="lit">232</span><span class="pun">,</span><span class="pln"> </span><span class="lit">220</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> solid </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">79</span><span class="pun">,</span><span class="pln"> </span><span class="lit">185</span><span class="pun">,</span><span class="pln"> </span><span class="lit">227</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">1em</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="500" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/wvZybNO?default-tab=result" style="width: 100%;" title="Multiple-column-5">See the Pen Multiple-column-5 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h3 id="breakinside">
	ضبط الانتقال إلى سطر جديد مع الخاصية <code>break-inside</code>
</h3>

<p>
	للتحكم بهذا الأمر، يمكننا استخدام خاصيات التجزئة التي تتحكم بانتقال المحتوى إلى سطر جديد في التخطيط متعدد الأعمدة. فلو استخدمنا مثلًا الخاصية <a href="https://wiki.hsoub.com/CSS/break-inside" rel="external"><code>break-inside</code></a> بعد إسناد القيمة <code>avoid</code> لها ضمن المحدد <code>card.</code> الذي ينسّق الحاوية التي تضم العنوان والنص، سيمنع هذا من تجزئة المحتوى ضمن الحاوية.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_7082_19" style=""><span class="pun">.</span><span class="pln">card </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">break-inside</span><span class="pun">:</span><span class="pln"> avoid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">207</span><span class="pun">,</span><span class="pln"> </span><span class="lit">232</span><span class="pun">,</span><span class="pln"> </span><span class="lit">220</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> solid </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">79</span><span class="pun">,</span><span class="pln"> </span><span class="lit">185</span><span class="pun">,</span><span class="pln"> </span><span class="lit">227</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">1em</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	إن إضافة هذه الخاصية تُبقي الصندوق كما هو جزءًا واحدًا ولن يتجزأ المحتوى ضمنه بين الأعمدة.
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="500" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/QWPQRoe?default-tab=result" style="width: 100%;" title="Multiple-column-6">See the Pen Multiple-column-6 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h2 id="-6">
	الخلاصة
</h2>

<p>
	إلى هنا تكون قد وصلت لنهاية هذا المقال الذي تعلمت من خلاله طريقة استخدام الميزات الأساسية للتخطيط متعدد الأعمدة في CSS، وهي أداة مفيدة أخرى يمكنك استعمالها في تنفيذ تصاميم صفحات موقعك الإلكتروني عند اختيار طريقة التخطيط الملائمة لعملك.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Multiple-column_Layout" rel="external nofollow">Multi-column layout</a>
</p>

<p>
	اقرأ أيضًا
</p>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/css/%D8%B6%D8%A8%D8%B7-%D8%AA%D9%85%D9%88%D8%B6%D8%B9-%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2292/" rel="">ضبط تموضع العناصر في صفحات ويب باستخدام CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2238/" rel="">مدخل إلى تخطيط صفحات الويب باستخدام CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-grid-layout-r527/" rel="">مفاهيم أساسية في التعامل مع تخطيط الشبكة Grid Layout</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%86%D8%A8%D8%B0%D8%A9-%D8%B9%D9%86-%D8%A7%D9%84%D8%B7%D8%B1%D9%82-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-%D9%81%D9%8A-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-css-r605/" rel="">نبذة عن الطرق الجديدة في تصميم صفحات CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B5%D9%86%D8%AF%D9%88%D9%82-%D8%A7%D9%84%D9%85%D8%B1%D9%86-flexbox-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2279/" rel="">تخطيط الصندوق المرن Flexbox في صفحات الويب</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2297</guid><pubDate>Sat, 13 Apr 2024 12:05:02 +0000</pubDate></item><item><title>&#x636;&#x628;&#x637; &#x62A;&#x645;&#x648;&#x636;&#x639; &#x627;&#x644;&#x639;&#x646;&#x627;&#x635;&#x631; &#x641;&#x64A; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x648;&#x64A;&#x628; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; CSS</title><link>https://academy.hsoub.com/programming/css/%D8%B6%D8%A8%D8%B7-%D8%AA%D9%85%D9%88%D8%B6%D8%B9-%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2292/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_04/-------CSS.png.6ce0ae55d3909ce804196539d7d7df03.png" /></p>
<p>
	تسمح لنا فكرة ضبط موقع العناصر بلغة CSS بإخراج عنصر من <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%A7%D9%86%D8%B3%D9%8A%D8%A7%D8%A8-%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D9%8A%D8%A7%D8%AF%D9%8A-normal-flow-%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2269/" rel="">التخطيط الاعتيادي</a> للمستند وتغيير سلوكه، كأن نقرر بأن يظهر فوق عنصر آخر أو يبقى دائمًا في نفس المكان ضمن نافذة عرض المتصفح. لهذا نشرح في هذا المقال القيم المختلفة للخاصية <a href="https://wiki.hsoub.com/CSS/position" rel="external"><code>position</code></a> وكيفية استخدامها.
</p>

<p>
	ملاحظة: يمكنك أن تنجز تمارين المقال على حاسوبك الشخصي، لهذا حاول أن تحضر نسخة من الملف <a href="https://mdn.github.io/learning-area/css/css-layout/positioning/0_basic-flow.html" rel="external nofollow"><code>0_basic-flow.html</code></a> من مستودع جيت-هاب (حمّل <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/positioning/0_basic-flow.html" rel="external nofollow">الشيفرة المصدرية</a> أيضًا) واستخدامه كنقطة انطلاق.
</p>

<h2 id="">
	مدخل إلى تموضع العناصر
</h2>

<p>
	يسمح لك تحديد مواضع العناصر في صفحة الويب في الحصول على نتائج مثيرة بتجاوز تنسيق الانسياب الاعتيادي. فماذا لو أردت أن تغيّر قليلًا موقع بعض الصناديق عن موقعها الافتراضي في الانسياب الاعتيادي لتمنح المستخدم تجربة خاصة مثلًا؟ سيكون تموضع العناصر الأداة المثالية لك في هذه الحالة.
</p>

<p>
	أو تخيّل أنك تريد أن تنشئ كائنًا في واجهة صفحتك يعوم فوق أجزاء أخرى أو أن يبقى دائمًا في مكانه ضمن نافذة المتصفح بصرف النظر عن تمرير المحتوى. سيساعدك توضيع العناصر أيضًا في إنجاز الأمر.
</p>

<p>
	توجد أنواع مختلفة لضبط مواضع العناصر، ولتحديد طريقة الضبط التي نحتاجها، سنستخدم الخاصية <a href="https://wiki.hsoub.com/CSS/position" rel="external"><code>position</code></a> ونوضح لك تاليًا خيارات مختلفة لاستخدامها.
</p>

<h2 id="static">
	التموضع الساكن Static
</h2>

<p>
	وهو التموضع الافتراضي لأي عنصر، ويعني "ضع العنصر في موقعه الطبيعي ضمن الانسياب الاعتيادي". ولكي ترى ذلك (وتحضّر الملف الذي ستتمرن عليه في الأقسام اللاحقة). أضف أولًا الصنف <code>positioned</code> إلى الفقرة النصية <code>&lt;p&gt;</code> الثانية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4083_10" style=""><span class="tag">&lt;p</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"positioned"</span><span class="tag">&gt;</span><span class="pln">…</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	أضف الآن القاعدة التالية في نهاية شيفرة <a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">CSS</a>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4083_12" style=""><span class="pun">.</span><span class="pln">positioned </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> static</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> yellow</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لن تجد عندما تحفظ التغيّرات وتعيد تحميل الصفحة أي اختلاف سوى لون الخلفية الجديد للفقرة النصية الثانية. وهذا بالفعل ما سيحدث فالتموضع الساكن هو التموضع الافتراضي للعنصر.
</p>

<h2 id="relative">
	التموضع النسبي Relative
</h2>

<p>
	وهو أول التموضعات التي سنناقشها، ويشبه كثيرًا التموضع الساكن باستثناء أنه بمجرد أنك وضّعت العنصر في مكانه ضمن الانسياب الاعتيادي، بإمكانك عندها تعديل موقعه النهائي بما في ذلك وضعه فوق عناصر أخرى في الصفحة. لتوضيح الأمر، غيّر التصريح <code>positioned</code> في شيفرتك إلى:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4083_14" style=""><span class="pln">position: relative;</span></pre>

<p>
	لن تجد أي شيئ قد تغيّر أيضًا في هذه المرحلة إن حفظت التغيّرات وأعدت تحميل الصفحة، لكن كيف سنغير الموقع النهائي للعنصر؟ سنحتاج إلى استخدام الخاصيات <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/top" rel="external nofollow"><code>top</code></a> و <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/bottom" rel="external nofollow"><code>bottom</code></a> و <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/left" rel="external nofollow"><code>left</code></a> و <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/right" rel="external nofollow"><code>right</code></a> والتي سنشرحها تاليًا.
</p>

<h3 id="topbottomleftright">
	الخاصيات <code>top</code> و <code>bottom</code> و <code>left</code> و <code>right</code>
</h3>

<p>
	تستخدم هذه الخاصيات مع الخاصية <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/position" rel="external nofollow"><code>position</code></a> لتحديد المكان الذي تريد وضع العنصر فيه بدقة. لتجريب الأمر أضف إلى التصريح <code>positioned.</code> الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4083_16" style=""><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span></pre>

<p>
	<strong>ملاحظة</strong>: يمكن أن تأخذ هذه الخاصيات قيمًا بأية <a href="https://academy.hsoub.com/programming/css/%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D9%82%D9%8A%D8%A7%D8%B3-%D9%88%D8%A7%D9%84%D9%82%D9%8A%D9%85-%D9%81%D9%8A-css-r2161/" rel="">واحدات</a> مثل البكسل و mm و rem و %.
</p>

<p>
	إن حفظت لتغيرات الآن وأعدت تحميل الصفحة ستكون النتيجة كالتالي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="400" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/oNOpVyO?default-tab=result" style="width: 100%;" title="positioning-css1">See the Pen positioning-css1 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	لقد توضح الأمر قليلًا، أليس كذلك؟ لكن لا أعتقد أنك توقعت النتيجة. لماذا تحرّكت الفقرة نحو الأسفل واليمين مع أننا حددنا قيم الخاصيتين <code>top</code> و <code>left</code>. عليك أن تتخيل الموضوع كما لو كانت هناك قوة تدفع الفقرة من الجانبين السابقين (أعلى ويسار) وبالتالي ستنقل الفقرة نحو اليمين والأسفل. فلو كان <code>;top: 30px</code> فيبدو الأمر كقوة تدفع صندوق الفقرة النصية من الأعلى نحو الأسفل وتحركه مقدار 30 بكسل.
</p>

<h2 id="absolute">
	التموضع المطلق Absolute
</h2>

<p>
	يأتي التموضع المطلق بنتائج مختلفة جدًا.
</p>

<h3 id="-1">
	ضبط الوضع المطلق
</h3>

<p>
	غيّر قيمة الخاصية <code>position</code> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4083_19" style=""><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="pun">;</span></pre>

<p>
	لو حاولت حفظ التغيير وإعادة تحميل الصفحة ستجد النتيجة التالية:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="400" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/MWRrxqr?default-tab=result" style="width: 100%;" title="positioning-css2">See the Pen positioning-css2 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	لاحظ بداية أن المكان المحجوز سابقًا للفقرة النصية الثانية في الانسياب الاعتيادي لم يعد موجودًا، وظهرت الفقرة النصية الثالثة بعد الأولى مباشرة. هذا الأمر صحيح نوعًا ما، فالعنصر الذي يأخذ توضعًا مطلقًا لن يظهر ضمن الانسياب الاعتيادي للعناصر، بل يتوضع ضمن طبقة خاصة به منفصلة عن الطبقة التي تضم عناصر الانسياب الاعتيادي. ولهذا الأمر فائدته، إذ يعني أنه بإمكاننا إنشاء واجهة مستخدم مستقلة لا تتداخل مع التخطيط الذي يضم بقية عناصر الصفحة. وكمثال عن هذه الواجهات نجد الصناديق المنبثقة ولوحات التحكم واللوحات القابلة للطي وعناصر واجهة المستخدم التي يمكن جرها وإفلاتها في أي مكان في الصفحة وغيرها.
</p>

<p>
	ونلاحظ ثانيًا أن موضع العنصر قد تغيّر، لأن سلوك الخاصيات <code>top</code> و <code>bottom</code> و <code>left</code> و <code>right</code> قد تغيّر مع التموضع المطلق. فبدلًا من توضيع العنصر بناء على موقعه بالنسبة إلى تخطيط الانسياب الاعتيادي، ستحدد تلك الخاصيات بعد صندوق العنصر عن حواف العنصر الحاوي. أي كأننا نقول في مثالنا أن صندوق الفقرة النصية ذات التموضع المطلق ستبتعد 30 بكسل عن الحافة العليا للعنصر الحاوي و 30 بكسل عن الحافة اليسرى له (إن العنصر الحاوي في حالتنا هي الكتلة الحاوية الأساسية initial containing block).
</p>

<p>
	<strong>ملاحظة</strong>: يمكنك استخدام <code>top</code> و <code>bottom</code> و <code>left</code> و <code>right</code> لإعادة تحديد أبعاد العناصر. جرّب مثلًا القيم التالية:<br>
	<code>;top: 0 </code>و <code>;bottom: 0 </code>و<code>;left: 0</code> و <code>;</code> <code> right: 0</code> و <code>;margin: 0</code>  على العنصر الذي تحدد موضعه وراقب ما الذي سيحدث! أعد كل شيء إلى حاله عندما تنتهي.
</p>

<p>
	<strong>ملاحظة</strong>: تؤثر الهوامش على نوع العنصر، لكن لا تؤثر به خاصيات الهوامش المنقبضة Margin collapsing.
</p>

<h3 id="-2">
	سياق تموضع العناصر
</h3>

<p>
	من هو العنصر الحاوي لعنصر ذو توضّع مطلق؟ يعتمد هذا الأمر كثيرًا على قيمة الخاصية <code>position</code> للعنصر الأب للعنصر المطلق. فإن لم يكن للعنصر عنصر أب قد حُددت قيمة الخاصية <code>position</code> له صراحةً فسيأخذ العنصر الأب التموضع الساكن. وتكون النتيجة أن يُحتوى العنصر المطلق ضمن الكتلة الحاوية الأساسية. للحاوية الأساسية أبعاد نافذة العرض وهي أيضًا الكتلة التي تحتوي العنصر <code>&lt;html&gt;</code> . وبعبارة أخرى، سيُعرض العنصر المطلق خارج حدود العنصر الأب ويتوضع بالنسبة إلى نافذة العرض.
</p>

<p>
	يقع العنصر المطلق ضمن العنصر <code>&lt;body&gt;</code> في شيفرة HTML المصدرية، لكن ستجده في التخطيط النهائي بعيدًا مسافة 30 بكسل عن الحد الأعلى للصفحة. بإمكاننا تغيير سياق توضع العنصر بمعنى كيفية توضعه المطلق وبالنسبة لأية عناصر. ننجز ذلك بضبط قيمة الخاصية <code>position</code> لأحد العناصر الآباء، أي العناصر التي يقع ضمنها العنصر ذو التموضع المطلق (إذ لا يمكن ضبط موقع عنصر بالنسبة إلى عنصر آخر إذا لم يكن ضمن هذا الأخير). لترى التأثير الذي نتحدث عنه، أضف التصريح التالي إلى القاعدة <code>body</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4083_21" style=""><span class="kwd">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span></pre>

<p>
	من المفترض أن تحصل على النتيجة التالية:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="400" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/rNbpRqK?default-tab=result" style="width: 100%;" title="positioning-css3">See the Pen positioning-css3 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	ضُبط موقع العنصر الآن بالنسبة إلى العنصر <code>&lt;body&gt;</code>.
</p>

<h3 id="zindex">
	الخاصية <code>z-index</code>
</h3>

<p>
	ما تقدمه فكرة التموضع المطلقة أمر ممتع، لكن هناك ميزة أخرى لم نذكرها بعد. فقد يبرز سؤال مهم عندما تتراكب العناصر فوق بعضها يتعلق بالعنصر الذي سيظهر فوق الجميع. ففي مثالنا حتى الآن، لدينا عنصر واحد قد غيّر موضعه وقد ظهر أعلى جميع العناصر الأخرى لأنها غير موضّعة، فما الذي سيحدث إذًا عندما نحدد موضع أكثر من عنصر؟
</p>

<p>
	أضف شيفرة CSS التالية لتوضّع الفقرة النصية الأولى توضّعًا مطلقًا أيضًا:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4083_23" style=""><span class="kwd">p</span><span class="pun">:</span><span class="pln">nth-of-type</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> lime</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سترى الفقرة الأولى بعد تطبيق التغييرات الجديدة وقد ظهرت باللون الأخضر الفاتح وانتُزعت من الانسياب الاعتيادي للعناصر ثم وضعت في موقع أعلى من مكانها السابق. لاحظ أيضًا كيف حُشرت تحت الفقرة النصية التي وضّعناها سابقًا حيث تراكبت الفقرتين فوق بعضهما. ولأن الفقرة النصية الثانية (التي تمتلك الصنف <code>positioned.</code> ) قد ظهرت ثانيًا في ترتيب العناصر في الشيفرة المصدرية، فالعناصر الموّضعه التي ترتيبها متأخر عن العناصر الموّضعة الأخرى في الشيفرة المصدرية تربح أولوية الظهور في الأعلى.
</p>

<p>
	لكن هل يمكن تغيير الأمر؟ نعم باستخدام الخاصية <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/z-index" rel="external nofollow"><code>z-index</code></a> والتي تُعرف باسم "مؤشر العلو". وهي قيمة مرجعية للمحور الثالث Z الذي نفترض أنه يتجه نحو المستخدم عموديًا على الشاشة. وقد تتذكر من مقالات سابقة كيف استخدمنا المحور الأفقي (المحور X) والمحور العمودي (المحور Y) لتحديد إحداثيات أشياء مثل موقع صور الخلفية وتأثيرات الظل. فمن أجل اللغات التي تكتب من اليسار إلى اليمين، يمثل الإحداثي <code>(0,0)</code> الزاوية العليا اليسرى للصفحة أو العنصر ضمن حاويته. ويتحرك منها الإحداثي X نحو اليمين والإحداثي Y نحو الأسفل.
</p>

<p>
	للصفحات أيضًا محور ثالث هو المحور Z وهو كما ذكرنا محور تخيلي ينطلق من سطح الشاشة نحو المستخدم. وتؤثر قيمة محور العلو <code>z-index</code> على موقع العنصر الموّضع على هذا المحور، وكلما كانت قيمة هذه الخاصية أعلى لعنصر ظهر فوق العنصر ذو القيمة الأقل. ولكل العناصر القيمة الافتراضية للخاصية <code>z-index</code> وهي عمليًا القيمة 0. يسمح باستخدام القيم السالبة والتي تجعل العنصر ينزل نحو الأسفل.
</p>

<p>
	ولكي تغير ترتيب العناصر المتراكبة، أضف التصريح التالي إلى القاعدة <code>p:nth-of-type(1)</code> :
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4083_25" style=""><span class="kwd">z-index</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span></pre>

<p>
	سترى الآن الفقرة ذات اللون الأخضر الفاتح في الأعلى:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="330" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/vYMpPvY?default-tab=result" style="width: 100%;" title="positioning-css4">See the Pen positioning-css4 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	يجدر الانتباه إلى أن الخاصية <code>z-index</code> تقبل فقط قيمًا بلا وحدات، فلا يمكنك تخصيص قيمة مثل <code>23px</code>. ودائمًا تأتي القيم الأكبر فوق القيم الأصغر، ولك حرية تخصيص هذه القيم بأي قيم تريدها، فاستخدام قيمتين مثل 2 و 3 يماثل استخدام القيمتين 300 و400.
</p>

<h3 id="fixed">
	التموضع الثابت Fixed
</h3>

<p>
	لنلق نظرة الآن على التموضع الثابت للعناصر، والذي يعمل تمامًا مثل التموضع المطلق مع اختلاف جوهري واحد. إذ يثبّت التموضع المطلق موقع العنصر بالنسبة إلى أقرب عنصر أب ضبطت خاصية التموضع له (والكتلة الحاوية الأساسية في حال لا يوجد عنصر سلف مضبوط الموقع)، بينما يثبت التموضع الثابت موقع العنصر بالنسبة إلى الجزء المرئي من نافذة العرض، باستثناء حالة واحدة تحدث إن كان أحد العناصر الأسلاف كتلة حاوية ثابتة نظرًا لتطبيق قيمة للخاصية <a href="https://wiki.hsoub.com/CSS/transform" rel="external"><code>transform</code></a> مختلفة عن القيمة الافتراضية <code>none</code>. ويعني ذلك أنه بإمكانك إنشاء عناصر واجهة مستخدم ثابتة في مكانها مثل قوائم التنقل التي تُبقى مرئية دائمًا مهما قمت بتمرير محتوى الصفحة للأسفل.
</p>

<p>
	لنعمل سوية على المثال التالي كي تتوضح الصورة. احذف بداية القاعدتين <code>(p:nth-of-type(1</code> و <code>positioned.</code> من شيفرة CSS. عدّل بعد ذلك القاعدة <code>body</code> واحذف التصريح <code>;position: relative</code> ثم اجعل الارتفاع ثابتًا كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4083_27" style=""><span class="pln">body </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">500px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1400px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سيُمنح الآن العنصر <code>&lt;h1&gt;</code> موضعًا ثابتًا <code>;position: fixed</code> ونضبط هذا الموقع ليكون أعلى نافذة العرض بإضافة الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4083_29" style=""><span class="pln">h1 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> fixed</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">500px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin-top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لا بد من استخدام التصريح <code>;top: 0</code> ليبقى العنصر أعلى الشاشة، كما منحنا العنوان اتساعًا يماثل اتساع محتوى العمود وخلفية بيضاء وبعض الهوامش والحشوات كي يظهر المحتوى تحته.
</p>

<p>
	عند حفظ التغيّرات وإعادة تحميل الصفحة، سترى أن موقع العنوان سيقى ثابتًا، ويظهر المحتوى وكأنه يظهر ويختفي تحته عن تمريره. لكن تجدر الملاحظة أن بعض المحتوى قد اقتُطع تحت العنوان ولم يعد ظاهرًا، ذلك أن العنوان قد انتزع من الانسياب الاعتيادي وارتفع جزء من المحتوى ليحل مكانه. تُحل هذه المشكلة بدفع الفقرة النصية إلى الأسفل بضبط الهامش العلوي لها مثلًا:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4083_31" style=""><span class="kwd">p</span><span class="pun">:</span><span class="pln">nth-of-type</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">margin-top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">60px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	 سترى النتيجة كالتالي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/NWmXJmj?default-tab=result" style="width: 100%;" title="positioning-css5">See the Pen positioning-css5 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h2 id="sticky">
	التموضع اللاصق Sticky
</h2>

<p>
	هنالك قيمة أخرى للخاصية <code>position</code> هي <code>position: sticky</code>، وهي أحدث من القيم الأخرى نوعًا ما. وهي في الواقع خيار هجين بين الوضعين النسبي والثابت. تسمح هذه القيمة للعنصر بالتصرف وكأنه موضّع نسبيًا حتى تُمرر الصفحة إلى حد معين (مثل 10 بكسل عن أعلى نافذة العرض) ليصبح بعدها ثابتًا.
</p>

<h3 id="-3">
	مثال بسيط على Sticky
</h3>

<p>
	يمكن استخدام الوضع اللاصق مثلًا في إنشاء قوائم تنقل يمكن تمريرها إلى حد معين ومن ثم تبقى في أعلى نافذة العرض.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4083_33" style=""><span class="pun">.</span><span class="pln">positioned </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> sticky</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/vYMpPwO?default-tab=result" style="width: 100%;" title="positioning-css6">See the Pen positioning-css6 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h3 id="-4">
	فهرس قابل للتمرير
</h3>

<p>
	من الاستخدامات الشائعة والمهمة للوضع اللاصق هو إنشاء فهرس قابل للتمرير تبقى فيه العناوين ملتصقة بأعلى الصفحة عندما تصل إليها. ولكتابة شيفرة مثال كهذا جرّب ما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4083_35" style=""><span class="tag">&lt;h1&gt;</span><span class="pln">Sticky positioning</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

</span><span class="tag">&lt;dl&gt;</span><span class="pln">
  </span><span class="tag">&lt;dt&gt;</span><span class="pln">A</span><span class="tag">&lt;/dt&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Apple</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Ant</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Altimeter</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Airplane</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dt&gt;</span><span class="pln">B</span><span class="tag">&lt;/dt&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Bird</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Buzzard</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Bee</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Banana</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Beanstalk</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dt&gt;</span><span class="pln">C</span><span class="tag">&lt;/dt&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Calculator</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Cane</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Camera</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Camel</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dt&gt;</span><span class="pln">D</span><span class="tag">&lt;/dt&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Duck</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Dime</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Dipstick</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Drone</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dt&gt;</span><span class="pln">E</span><span class="tag">&lt;/dt&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Egg</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Elephant</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">Egret</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
</span><span class="tag">&lt;/dl&gt;</span></pre>

<p>
	تبدو شيفرة CSS قريبة من التالي: تتحرك العناصر <code>&lt;dt&gt;</code> في الانسياب الاعتيادي مع المحتوى عند تمريره، لكن بإضافة الخاصية <code>position: sticky</code> إلى هذه العناصر بالإضافة إلى الخاصية <code>top</code> ستعمل المتصفحات الحديثة على إبقاء العناوين في أعلى نافذة العرض عندما تبلغ هذا الموقع. سيستبدل كل عنوان لاحق العنوان السابق عندما يصل إليه وهكذا.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4083_37" style=""><span class="pln">dt </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> black</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> sticky</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/MWRrxdG?default-tab=result" style="width: 100%;" title="positioning-css7">See the Pen positioning-css7 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	لاحظ كيف تبقى العناصر اللاصقة لاصقةً بالنسبة إلى أقرب عنصر يمتلك آلية تحدد طريقة تمرير محتواه أي بعبارة أخرى له قيمة مخصصة للخاصية <code>position</code>.
</p>

<h2 id="-5">
	الخلاصة
</h2>

<p>
	تعرّفنا في هذا المقال على الأوضاع المختلفة التي يمكن أن يأخذها العنصر وجرّبنا الكثير من الأوضاع، مع ذلك لا تعد هذه الطريقة مناسبًة لتخطيط الصفحات في الويب الحديث بل لها حالات استخدام مخصصة مفيدة كما رأينا.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Positioning" rel="external nofollow">Positioning</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق:<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AE%D8%A7%D8%B5%D9%8A%D8%A9-float-%D8%AA%D8%B9%D9%88%D9%8A%D9%85-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9-%D9%81%D9%8A-css-r2283/" rel=""> الخاصية float: تعويم عناصر الصفحة في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D8%B6%D8%A8%D8%B7-%D9%85%D8%AD%D8%A7%D8%B0%D8%A7%D8%A9-%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-css-r1050/" rel="">التحكم في تخطيط الصفحة وضبط محاذاة العناصر في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D9%91%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%8E%D9%85%D9%8E%D9%88%D9%92%D8%B6%D9%8F%D8%B9-%D8%B9%D9%84%D9%89-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-css-positioning-101-r46/" rel="">أساسيّات التَمَوْضُع على صفحات الويب (CSS Positioning 101)</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D9%8E%D9%85%D9%88%D8%B6%D9%8F%D8%B9-%D8%A7%D9%84%D8%AE%D9%84%D9%81%D9%8A%D9%91%D8%A9-background-positioning-%D9%81%D9%8A-css-r81/" rel="">مدخل إلى تَموضُع الخلفيّة Background Positioning في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2238/" rel="">مدخل إلى تخطيط صفحات الويب باستخدام CSS</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2292</guid><pubDate>Fri, 05 Apr 2024 12:08:01 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62E;&#x627;&#x635;&#x64A;&#x629; float: &#x62A;&#x639;&#x648;&#x64A;&#x645; &#x639;&#x646;&#x627;&#x635;&#x631; &#x627;&#x644;&#x635;&#x641;&#x62D;&#x629; &#x641;&#x64A; CSS</title><link>https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AE%D8%A7%D8%B5%D9%8A%D8%A9-float-%D8%AA%D8%B9%D9%88%D9%8A%D9%85-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9-%D9%81%D9%8A-css-r2283/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_03/-float-----CSS.png.9e7240d13db274a5fcd418e3454912ea.png" /></p>
<p>
	استُخدمت الخاصية <a href="https://wiki.hsoub.com/CSS/float" rel="external"><code>float</code></a> بشكل أساسي لتعويم الصور ضمن كتل نصية، لكن شاع استخدامها كثيرًا في إنشاء تخطيطات متعددة الأعمدة لصفحات ويب. لكن مع ظهور الخاصيتين <code>flex</code> و <code>Grid</code> عاد استخدام تلك الخاصية إلى الغاية الأساسية منه كما سنوضح في هذا المقال:
</p>

<p>
	عليك قبل البدء في قراءة هذا المقال أن:
</p>

<ol>
	<li>
		تطلع على أساسيات HTML كما شرحناها في سلسلة المقالات <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">مدخل إلى HTML</a>.
	</li>
	<li>
		تتفهم <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-css-r70/" rel="">أساسيات عمل CSS</a>.
	</li>
</ol>

<h2 id="">
	فكرة عن العناصر المعوّمة
</h2>

<p>
	وضعت الخاصية كي تسمح لمطوري الويب إنجاز تخطيطات تتضمن صورًا تعوم داخل عمود نصي، يلتف فيه النص إلى يمين أو يسار هذه الصورة، كما هو الحال في أعمدة الصحف. لكن سرعان ما أدرك مطوري الويب إمكانية تعويم أية عناصر وليس الصور فقط، لهذا توسّع استخدام هذه الخاصية لتشمل تأثيرات جمالية على التخطيط مثل كتابة أحرف استهلالية كبيرة.
</p>

<p>
	لقد شاع استخدام التعويم لإنشاء تخطيطات كاملة لمواقع الويب تعرض محتوى موزعًا على عدة أعمدة محاذية لبعضها (تظهر الأعمدة افتراضيًا تحت بعضها بنفس ترتيب ظهورها في الشيفرة المصدرية). لكن ظهرت حديثًا تقنيات أفضل لتخطيط الصفحات واعتبر استخدام التعويم لإنشاء هذا النوع من التخطيطات قديمًا.
</p>

<p>
	سنركز في مقالنا على الاستخدام الأنسب للعناصر العائمة.
</p>

<h2 id="-1">
	مثال عن التعويم
</h2>

<p>
	نكتشف في هذا المقال استخدامات التعويم وسنبدأ بكتلة نصية عائمة حول عنصر. بإمكانك العمل على هذا المثال بإنشاء ملف يحمل الاسم <code>index.html</code> على جهازك ومن ثم وضع قالب HTML الخاص بمثالنا ضمنه، وبعدها ضع الشيفرة التالية في مكان مناسب ضمن الملف. ستجد في نهاية هذه الفقرة مثالًا حيًا عما تفعله الشيفرة.
</p>

<p>
	سنبدأ أولًا بشيفرة HTML، لذلك أضف الشيفرة التالية ضمن العنصر <code>&lt;body&gt;</code> بعد إزالة أية شيفرة موجودة ضمنه:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8835_9" style=""><span class="tag">&lt;h1&gt;</span><span class="pln">Float example</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

</span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box"</span><span class="tag">&gt;</span><span class="pln">Float</span><span class="tag">&lt;/div&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam
  dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus
  ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus
  laoreet sit amet.
</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet
  orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare
  ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse
  ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis
  ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et
  a urna. Ut id ornare felis, eget fermentum sapien.
</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada
  ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed
  est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus
  tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus
  sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis
  vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque
  penatibus et magnis dis parturient montes, nascetur ridiculus mus.
</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	طبّق الآن شيفرة CSS التالية بوضعها ضمن العنصر <code>&lt;style&gt;</code> أو وضعها ضمن ملف <code>css.</code> واربطها بملف HTML من خلال العنصر <code>&lt;link&gt;</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8835_11" style=""><span class="pln">body </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">90%</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">max-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">900px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">font</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.9em</span><span class="pun">/</span><span class="lit">1.2</span><span class="pln"> Arial</span><span class="pun">,</span><span class="pln"> Helvetica</span><span class="pun">,</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">box </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">150px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">207</span><span class="pun">,</span><span class="pln"> </span><span class="lit">232</span><span class="pun">,</span><span class="pln"> </span><span class="lit">220</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	عندما تحفظ التغييرات التي أجريتها على الملفات ثم تعيد تحميل الصفحة، سترى نتيجة مطابقة لما هو متوقع، فالصندوق فوق النص مباشرة وهذا هو الأمر الطبيعي في تخطيط الانسياب الاعتيادي.
</p>

<h3 id="-2">
	تعويم الصندوق
</h3>

<p>
	لتعويم الصندوق أضف الخاصيتين <a href="https://wiki.hsoub.com/CSS/float" rel="external"><code>float</code></a> و <a href="https://wiki.hsoub.com/CSS/margin-right" rel="external"><code>margin-right</code></a> إلى القاعدة <code>box.</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8835_13" style=""><span class="pun">.</span><span class="pln">box </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin-right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">15px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">150px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">207</span><span class="pun">,</span><span class="pln"> </span><span class="lit">232</span><span class="pun">,</span><span class="pln"> </span><span class="lit">220</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1em</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	احفظ التغييرات التي أجريتها وأعد تحميل الصفحة وسترى النتيجة التالية:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="400" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/VwNPrEq?default-tab=result" style="width: 100%;" title="float1">See the Pen float1 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	لنفكر قليلًا كيف تعمل فكرة التعويم. يأخذ العنصر الذي يحمل الخاصية <code>float</code> خارج الانسياب الاعتيادي (العنصر <code>&lt;div&gt;</code> في مثالنا) ويوضع في الناحية اليُسرى من الحاوية (العنصر <code>&lt;body&gt;</code> في حالتنا). ويحيط المحتوى الذي كان في تخطيط الانسياب الاعتيادي تحت العنصر العائم بهذا العنصر شاغلًا المساحة التي تقع على يمينه ابتداءً من أعلى نقطة من نقاط العنصر العائم.
</p>

<p>
	إن تعويم العنصر إلى اليمين له التأثير نفسه تمامًا، لكن بطريقة معكوسة، فسيتوضع العنصر العائم إلى يمين العنصر الحاوي ويلتف حوله المحتوى شاغلًا المساحة الواقعة إلى يساره. حاول أن تغيّر قيمة الخاصية <code>float</code> إلى <code>right</code> واستبدل الخاصية <a href="https://wiki.hsoub.com/CSS/margin-right" rel="external"><code>margin-right</code></a> بالخاصية <a href="https://wiki.hsoub.com/CSS/margin-left" rel="external"><code>margin-left</code></a> في آخر القاعدة السابقة وراقب ما الذي سيحدث
</p>

<h3 id="-3">
	إظهار التعويم
</h3>

<p>
	بإمكانك أن تضيف الهوامش إلى العنصر العائم كي يدفع النص بعيدًا عنه قليلًا، لكن لا يمكنك إضافة هوامش إلى النص كي يبتعد عن العنصر العائم. يعود السبب في ذلك أن العنصر العائم يخرج من تخطيط الانسياب الاعتيادي وستُعرض العناصر التالية له خلفه مباشرة. لإظهار الأمر سنغيّر قليلًا في الشيفرة السابقة بإضافة صنف جديد <code>special</code> إلى الفقرة النصية الأولى من النص التي تأتي بعد الصندوق العائم مباشرة. أضف الشيفرة التالية إلى شيفرة CSS والتي تمنح الفقرة النصية المستهدفة لونًا للخلفية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8835_15" style=""><span class="pun">.</span><span class="pln">special </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">79</span><span class="pun">,</span><span class="pln"> </span><span class="lit">185</span><span class="pun">,</span><span class="pln"> </span><span class="lit">227</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#fff</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ولكي يبدو التأثير المطلوب أكثر وضوحًا، غير الخاصية <code>margin-right</code> للعنصر العائم لتصبح <code>margin</code> وبالتالي ستحصل على نفس الهوامش لكن من الجوانب الأربعة للعنصر. سترى أن خلفية الفقرة النصية تمتد خلف العنصر العائم كالتالي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="400" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/MWRJOzm?default-tab=result" style="width: 100%;" title="float2">See the Pen float2 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	اختُزلت مساحة صندوق النص للعنصر الذي يلي العنصر العائم حتى يلتف النص حوله، لكن صندوق العنصر ككل يحافظ على اتساعه كاملًا لأن العنصر العائم قد انتزع من الانسياب الاعتيادي.
</p>

<h3 id="-4">
	إخلاء محيط العناصر العائمة
</h3>

<p>
	رأينا كيف يُنتزع العنصر العائم خارج تخطيط الانسياب الاعتيادي، وتُعرض العناصر التالية إلى جانبه. لكن إن أردنا تعويم عنصر دون أن يرتفع محتوى العنصر التالي إلى الأعلى، لا بد من إخلاء محيط العنصر العائم باستخدام الخاصية <a href="https://wiki.hsoub.com/CSS/clear" rel="external"><code>clear</code></a>.
</p>

<p>
	أضف الصنف <code>cleared</code> إلى الفقرة النصية الثانية في ملف HTML السابق وضع ضمنه التصريح التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8835_17" style=""><span class="pun">.</span><span class="pln">cleared </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">clear</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="400" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/qBwRVQy?default-tab=result" style="width: 100%;" title="float3">See the Pen float3 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	سترى أن الفقرة النصية الثانية قد انتقلت إلى أسفل العنصر العائم مخلّية المساحة إلى يمينه. تقبل الخاصية القيم التالية:
</p>

<ul>
	<li>
		<code>left</code>: إخلاء محيط العنصر العائم إلى اليسار.
	</li>
	<li>
		<code>right</code>: إخلاء محيط العنصر العائم إلى اليمين.
	</li>
	<li>
		<code>both</code>: إخلاء محيط العنصر العائم سواءً إلى اليمين أو اليسار.
	</li>
</ul>

<h2 id="-5">
	إخلاء الصناديق الملتفة حول عنصر عائم
</h2>

<p>
	تعلمنا في الفقرة السابقة كيفية إخلاء العناصر التي تلي العنصر العائم، لكن ما الذي سيحدث عندما يكون لدينا عنصر عائم طويل وفقرة نصية قصيرة وكلاهما ضمن نفس الصندوق؟
</p>

<h3 id="-6">
	توضيح المشكلة
</h3>

<p>
	غير ملف HTML كي يصبح العنصر العائم والفقرة النصية الأولى ضمن حاوية <code>&lt;div&gt;</code> واحدة تمتلك الصنف <code>wrapper</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8835_19" style=""><span class="pun">&lt;</span><span class="pln">div class</span><span class="pun">=</span><span class="str">"wrapper"</span><span class="pun">&gt;</span><span class="pln">
  </span><span class="pun">&lt;</span><span class="pln">div class</span><span class="pun">=</span><span class="str">"box"</span><span class="pun">&gt;</span><span class="pln">Float</span><span class="pun">&lt;/</span><span class="pln">div</span><span class="pun">&gt;</span><span class="pln">

  </span><span class="pun">&lt;</span><span class="pln">p</span><span class="pun">&gt;</span><span class="pln">
    Lorem ipsum dolor sit amet</span><span class="pun">,</span><span class="pln"> consectetur adipiscing elit</span><span class="pun">.</span><span class="pln"> Nulla luctus
    aliquam dolor</span><span class="pun">,</span><span class="pln"> eu lacinia lorem placerat vulputate</span><span class="pun">.</span><span class="pln"> Duis felis orci</span><span class="pun">,</span><span class="pln">
    pulvinar id metus ut</span><span class="pun">,</span><span class="pln"> rutrum luctus orci</span><span class="pun">.</span><span class="pln"> Cras porttitor imperdiet nunc</span><span class="pun">,</span><span class="pln"> at
    ultricies tellus laoreet sit amet</span><span class="pun">.</span><span class="pln">
  </span><span class="pun">&lt;/</span><span class="pln">p</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&lt;/</span><span class="pln">div</span><span class="pun">&gt;</span></pre>

<p>
	ضع القواعد التالية ضمن الصنف <code>wrapper.</code> ثم أعد تحميل الصفحة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8835_21" style=""><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">79</span><span class="pun">,</span><span class="pln"> </span><span class="lit">185</span><span class="pun">,</span><span class="pln"> </span><span class="lit">227</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#fff</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أزل أيضًا الصنف <code>cleared.</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8835_23" style=""><span class="pun">.</span><span class="pln">cleared </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">clear</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ كيف عدنا إلى الحالة التي وضعنا فيها خلفية للفقرة النصية الأولى، إذ يمتد الصندوق خلف العنصر العائم:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="400" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/jORyaXM?default-tab=result" style="width: 100%;" title="float4">See the Pen float4 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	نذكر مجددًا أن هذا قد حدث نظرًا لانتزاع العنصر من انسيابه الاعتيادي. قد تتوقع أنك بتغليف العنصر العائم والفقرة النصية في حاوية واحدة سيُخلي العنصر التالي (الفقرة الثانية) المساحة حول العنصر العائم تلقائيًا، لكن هذا لم يحدث. وللتعامل مع الأمر عليك استخدام الأسلوب المعياري المُسمى <strong>سياق تنسيق الكتل</strong> <a href="https://wiki.hsoub.com/Guide/CSS/Block_formatting_context" rel="external">block formatting context</a> واختصارًا (BFC) بالاعتماد على الخاصية <a href="https://wiki.hsoub.com/CSS/display" rel="external"><code>display</code></a>.
</p>

<h3 id="displayflowroot">
	القاعدة <code>display:flow-root</code>
</h3>

<p>
	تُستخدم هذه القاعدة فقط لإنشاء سياق لتنسيق الكتل دون أية مشاكل أو تبعات. لإنجاز الأمر، أزل القاعدة <code>overflow: auto</code> من الصنف <code>wrapper.</code> ثم أضف القاعدة <code>display: flow-root</code> وسترى كيف يخلي العنصر التالي المساحة إلى جوار الصندوق العائم:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8835_25" style=""><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">79</span><span class="pun">,</span><span class="pln"> </span><span class="lit">185</span><span class="pun">,</span><span class="pln"> </span><span class="lit">227</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#fff</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> flow-root</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="500" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/OJGWOdJ?default-tab=result" style="width: 100%;" title="float6">See the Pen float6 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h2 id="-7">
	خلاصة
</h2>

<p>
	تعلمنا في هذا المقال كل ما يلزم معرفته حول تعويم العناصر في تصميمات الويب الحديثة، وسنتابع في مقال لاحق استخدامات قديمة أخرى من المهم أن تطلع عليها إن اضطررت للعمل على مشاريع قديمة.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Floats" rel="external nofollow">Floats</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-grid-%D9%81%D9%8A-css-r2282/" rel="">تخطيط صفحات ويب باستخدام تخطيط الشبكة Grid في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%d9%85%d8%af%d8%ae%d9%84-%d8%a5%d9%84%d9%89-%d8%aa%d8%ae%d8%b7%d9%8a%d8%b7-%d8%b5%d9%81%d8%ad%d8%a7%d8%aa-%d8%a7%d9%84%d9%88%d9%8a%d8%a8-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-css-r2238/" rel="">مدخل إلى تخطيط صفحات الويب باستخدام CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">تعرف على أساسيات CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-css-%D8%A7%D8%AD%D8%AA%D8%B1%D8%A7%D9%81%D9%8A%D8%A9-%D9%88%D8%B3%D9%87%D9%84%D8%A9-%D8%A7%D9%84%D8%B5%D9%91%D9%8A%D8%A7%D9%86%D8%A9-r428/" rel="">تقنيات كتابة شيفرات CSS احترافية وسهلة الصيانة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%AA%D9%85%D9%88%D8%B6%D8%B9-%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-css-r1052/" rel="">التحكم في تموضع العناصر في CSS</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2283</guid><pubDate>Sat, 30 Mar 2024 12:07:01 +0000</pubDate></item><item><title>&#x62A;&#x62E;&#x637;&#x64A;&#x637; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x648;&#x64A;&#x628; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x62A;&#x62E;&#x637;&#x64A;&#x637; &#x627;&#x644;&#x634;&#x628;&#x643;&#x629; Grid &#x641;&#x64A; CSS</title><link>https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-grid-%D9%81%D9%8A-css-r2282/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_03/------Grid--CSS.png.af9e412a3f5bd22073529504a67e4231.png" /></p>
<p>
	تخطيط الشبكة Grid هو أسلوب تخطيط ثنائي الاتجاه يستخدم لترتيب عناصر صفحة الويب، إذ يسمح بتوضع المحتوى ضمن أسطر وأعمدة ويقدم ميزات عدة تسمح بتنفيذ التخطيطات المعقدة بأسلوب مباشر. وسنقدم لك في هذا المقال كل ما تحتاجه لتبدأ العمل على تخطيط الصفحات باستخدامه.
</p>

<p>
	قبل البدء في قراءة هذا المقال يتوجب عليك أن:
</p>

<ol>
	<li>
		تطلع على أساسيات HTML كما شرحناها في سلسلة مقالات <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">مدخل إلى HTML</a>.
	</li>
	<li>
		تتفهم أساسيات عمل <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-css-r70/" rel="">CSS</a>.
	</li>
</ol>

<h2 id="">
	ما هو تخطيط الشبكة Grid Layout؟
</h2>

<p>
	الشبكة هي مجموعة من الخطوط الأفقية والعمودية التي تشكل نموذجًا لترتيب العناصر ضمنه. يمكّننا هذا التخطيط من إنشاء تخطيطات لا تقفز فيها العناصر أو تغير اتساعها عند الانتقال من صفحة إلى أخرى مما يمنح موقع الويب تناسقًا أفضل. وتتكون الشبكة تقليديًا من أعمدة وصفوف، وفراغات بين كل سطر وكل عمود، وتُعرف هذه الفراغات بالأقنية gutters كما في الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="147056" href="https://academy.hsoub.com/uploads/monthly_2024_03/01_grid_gutters.png.bb4c958bcac8f1453634258efa5864e6.png" rel=""><img alt="01 grid gutters" class="ipsImage ipsImage_thumbnailed" data-fileid="147056" data-unique="n4ns9pm6x" style="width: 597px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_03/01_grid_gutters.thumb.png.364f97ee70576e43c553d2737e4ef354.png"> </a>
</p>

<h2 id="css">
	إنشاء شبكة باستخدام CSS
</h2>

<p>
	إن قررت أن تخطيط الشبكة هو ما يحتاجه تصميم صفحة الويب الخاصة بك، يمكنك استخدام لغة <a href="https://wiki.hsoub.com/CSS" rel="external">CSS</a> لإنجاز الأمر. سنلقي نظرة على الميزات الأساسية لتخطيط الشبكة أولًا، ثم نستكشف كيفية إنشاء تخطيط شبكة بسيط لمشروعك.
</p>

<h3 id="-1">
	تحديد الشبكة
</h3>

<p>
	بداية حمًل وافتح <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/grids/0-starting-point.html" rel="external nofollow">هذا الملف</a> الذي سيكون <span ipsnoautolink="true">نقطة الانطلاق</span> للعمل ضمن محرر الكود وضمن المتصفح. يعرض هذا المثال حاوية تضم عدة عناصر أبناء لها تخطيط <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%A7%D9%86%D8%B3%D9%8A%D8%A7%D8%A8-%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D9%8A%D8%A7%D8%AF%D9%8A-normal-flow-%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2269/" rel="">الانسياب الاعتيادي</a> افتراضيًا، إذ تظهر تحت بعضها. سنتعامل مع هذا الملف في القسم الأول من مقالنا، ونطبق بعض التغييرات لاستيعاب سلوك تخطيط الشبكة.
</p>

<p>
	ولتعيين شبكة نستخدم القيمة <code>grid</code> للخاصية <a href="https://wiki.hsoub.com/CSS/display" rel="external"><code>display</code></a>. ستفعّل هذه القيمة تخطيط الشبكة، وستتحول جميع العناصر ضمن هذه الحاوية إلى عناصر شبكة grid item. لهذا ضع التصريح التالي ضمن الملف:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5941_12" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وعلى خلاف الصندوق المرن، لن تجد اختلافًا مباشرًا في توضع العناصر عند تطبيق القاعدة <code>display: grid</code>، لأن هذا التصريح سيضع العناصر ضمن شبكة من عمود واحد وستبقى فوق بعضها البعض كما هو الحال في الانسياب الاعتيادي.
</p>

<p>
	ولترى شيئًا أقرب إلى الشبكة، لا بد من إضافة أعمدة جديدة إليها. لهذا سنضع ثلاث أعمدة لكل منها اتسع مقداره 300 بكسل. يمكنك اختيار أي واحدة طول أو نسبة مئوية لضبط اتساع هذه الأعمدة.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5941_14" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">200px</span><span class="pln"> </span><span class="lit">200px</span><span class="pln"> </span><span class="lit">200px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أضف التصريح الثاني إلى قاعدة CSS ثم أعد تحميل الصفحة وسترى كيف رتبت العناصر نفسها ليحتل كل منها مكانًا في الشبكة.
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="250" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/NWmdwqZ?default-tab=result" style="width: 100%;" title="grid1">See the Pen grid1 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h2 id="fr">
	الشبكات المرنة واستخدام الواحدة <code>fr</code>
</h2>

<p>
	يمكنك تعيين الشبكات بوحدات <code>fr</code> إضافة إلى وحدات الطول والنسب المئوية. وتمثل هذه الوحدة جزءًا من المساحة المتاحة ضمن حاوية الشبكة وتتيح مرونة في تحجيم الأسطر والأعمدة.
</p>

<p>
	غيّر القاعدة السابقة كي ننشئ ثلاث أعمدة اتساع كل منها <code>1fr</code> أي جزء من كل:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5941_16" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تتميز الشبكة الآن بوجود مسارات مرنة، إذ توزع الوحدة <code>fr</code> المساحة المتوفرة بشكل تناسبي. وبإمكانك طبعًا استخدام أية قيم موجبة للمسارات في شبكتك كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5941_18" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	إذ يأخذ المسار (عمود هنا) جزئين <code>2fr</code> من أصل أربعة أجزاء كلية من المساحة المتوفرة بينما يأخذ كل من المسارين التاليين جزءًا واحدًا <code>1fr</code> وبالتالي سيكون العمود الأول أكثر اتساعًا. وبإمكانك المزج بين الوحدة <code>fr</code> ووحدات الأطوال الثابتة، وفي هذه الحالة تحجز المساحة اللازمة للمسارات ثابتة الاتساع ثم يجري توزيع المساحة الباقية على المسارات التي تحمل قيمًا نسبية.
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/PogWONV?default-tab=result" style="width: 100%;" title="grid2">See the Pen grid2 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	<strong>ملاحظة</strong>: تتوزع المساحات المتاحة فقط بين المسارات عند استخدام الوحدة <code>fr</code> وليس كامل المساحة، بمعنى أنه إذا شغل مسار مساحة أكبر لأن محتواه أكبر سيقل الفراغ الذي تتقاسمه المسارات.
</p>

<h3 id="-2">
	الأقنية بين المسارات
</h3>

<p>
	لإنشاء فراغات بين المسارات، نستخدم الخاصيات التالية:
</p>

<ul>
	<li>
		<a href="https://wiki.hsoub.com/CSS/column-gap" rel="external"><code>column-gap</code></a>: للفراغات (الأقنية) بين الأعمدة.
	</li>
	<li>
		<a href="https://wiki.hsoub.com/CSS/row-gap" rel="external"><code>row-gap</code></a>: الفراغات بين الأسطر.
	</li>
	<li>
		<a href="https://wiki.hsoub.com/CSS/gap" rel="external"><code>gap</code></a>: خاصية تختصر الخاصيتين السابقتين.
	</li>
</ul>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5941_20" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن أن تُقدّر أبعاد الأقنية بأي وحدة قياس ثابتة أو نسبة مئوية ما عدا الوحدة التناسبية <code>fr</code>.
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/VwNPrjx?default-tab=result" style="width: 100%;" title="grid3">See the Pen grid3 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	<strong>ملاحظة</strong>: سبُقت الخاصيات السابقة في المواصفات الأقدم بالبادئة <code>-grid</code> لكن المواصفات الجديدة ألغتها. مع ذلك يبقى استخدامها صحيحًا كاسم بديل. لهذا كي تبقى في مأمن من المشاكل وتُبقي شيفرتك منيعة استخدم كلتا النسختين من الخاصية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5941_22" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3 id="-3">
	تكرار المسارات الموجودة
</h3>

<p>
	بإمكانك تكرار جميع مسارات الشبكة أو جزء منها باستخدام الدالة <code>()repeat</code> التي تقدمها CSS. لترى ذلك، غير طريقة جدولة المسارات في التصريح السابق إلى الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5941_24" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ستكون النتيجة ظهور ثلاثة أعمدة متناسبة <code>1fr</code> من حيث الاتساع كما سبق. إذ يشير المعامل الأول من الدالة <code>()repeat</code> إلى عدد مرات التكرار بينما يشير المعامل الثاني إلى عدد المسارات، فقد ترغب بتكرارها أكثر من مسار.
</p>

<h3 id="-4">
	الشبكات الصريحة والمضمنة
</h3>

<p>
	لقد خصصنا في الشبكة أعمدةً فقط حتى اللحظة، بينما ظهرت الأسطر تلقائيًا لتناسب المحتوى وهذا مثال عن الشبكات الصريحة مقابل الشبكات الضمنية. وإليك الفرق:
</p>

<ul>
	<li>
		الشبكات الصريحة: تُنشأ باستخدام الخاصيتين <code>grid-template-columns</code> أو <code>grid-template-rows</code>.
	</li>
	<li>
		الشبكات الضمنية: توسّع الشبكة الصريحة عندما لا تستطيع الشبكة احتواء المحتوى كأن يظهر ضمن أسطر جديدة.
	</li>
</ul>

<p>
	تنشأ المسارات في الشبكات الضمنية بأبعاد تلقائية <code>auto</code> افتراضيًا، وهذا يعني عمومًا بأنه واسعة كفاية لتضم المحتوى. ولمنح الشبكات الضمنية مسارات بأبعاد مخصصة، بإمكانك استخدام الخاصيتين <a href="https://wiki.hsoub.com/CSS/grid-auto-rows" rel="external"><code>grid-auto-rows</code></a> و <a href="https://wiki.hsoub.com/CSS/grid-auto-columns" rel="external"><code>grid-auto-columns</code></a>. فإن خصصت القيمة <code>100px</code> للخاصية <code>grid-auto-rows</code> سترى بأن ارتفاع الصفوف التي تنشأ هو 100 بكسل.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5941_26" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">grid-auto-rows</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="400" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/rNbjYMW?default-tab=result" style="width: 100%;" title="grid4">See the Pen grid4 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h3 id="minmax">
	الدالة <code>()minmax</code>
</h3>

<p>
	لن يكون ارتفاع 100 بكسل كافيًا في حالتنا السابقة إن أردنا وضع محتوى أطول من 100 بكسل، وبالتالي يحدث عندها الطفحان <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%B7%D9%81%D8%AD%D8%A7%D9%86-%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89-%D8%AE%D8%A7%D8%B1%D8%AC-%D8%B5%D9%86%D8%AF%D9%88%D9%82-%D8%A7%D9%84%D8%B9%D9%86%D8%B5%D8%B1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2160/" rel="">overflow</a>. لهذا من الأفضل أن يكون ارتفاع المسارات 100 بكسل على الأقل وتكون قادرة على التوسع أكثر عند إضافة محتوى أكبر. ومن المعروف عمومًا في تصميم الويب أنه من الصعب توقع ارتفاع أي عنصر وخاصة عند إضافة محتوى أو عند تغيير حجم الخط مما قد يسبب مشاكل في التصميمات التي تحاول أن تجعل التصميم مثاليًا من كل النواحي.
</p>

<p>
	تتيح لنا الدالة <a href="https://wiki.hsoub.com/CSS/minmax" rel="external"><code>()minmax</code></a> تحديد الحجم الأدنى والأقصى للمسار، فالصيغة <code>minmax(100px, auto)</code> للدالة تحدد حجمًا أدنى للمسار مقداره 100 بكسل، بينما حددت قيمة الحجم الأقصى ليكون تلقائيًا <code>auto</code> وتعني أن العنصر سيتوسع حتى يستوعب المحتوى. جرّب ضبط قيمة الخاصية <code>grid-auto-rows</code> باستخدام هذه الدالة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5941_29" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">grid-auto-rows</span><span class="pun">:</span><span class="pln"> minmax</span><span class="pun">(</span><span class="lit">100px</span><span class="pun">,</span><span class="pln"> auto</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	فإن أضفت محتوى أكبر سترى كيف يتوسع المسار حتى يستوعب المحتوى الجديد. لاحظ كيف يحدث التوسع أفقيًا مع السطر.
</p>

<h3 id="-5">
	أعمدة بقدر ما تتسع له المساحة
</h3>

<p>
	بإمكاننا تطبيق الأفكار التي تعلمناها سابقًا حول ترتيب المسارات والتكرار والدالة <code>()minmax</code> لإنشاء نماذج مفيدة. فمن الجيد أحيانًا أن تكون الشبكة قادرة على إنشاء أعمدة بقدر ما تتسع لها الحاوية. ولإنجاز ذلك، نضبط قيمة الخاصية<br>
	<code>grid-template-columns</code> باستخدام الدالة <code>()repeat</code> لكن بدل أن نمرر لها المعامل الأول عددًا، نمرر لها القيمة <code>auto-fill</code>. كما نستخدم الدالة <code>()minmax</code> كمعامل ثاني ونحدد فيها قيمة أصغر قياس نريده للأعمدة، ونجعل قيمة أكبر قياس هو <code>1fr</code>.
</p>

<p>
	جرّب ذلك بكتابة الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5941_31" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> repeat</span><span class="pun">(</span><span class="pln">auto-fill</span><span class="pun">,</span><span class="pln"> minmax</span><span class="pun">(</span><span class="lit">200px</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">));</span><span class="pln">
  </span><span class="kwd">grid-auto-rows</span><span class="pun">:</span><span class="pln"> minmax</span><span class="pun">(</span><span class="lit">100px</span><span class="pun">,</span><span class="pln"> auto</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="400" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/ExJZbNX?default-tab=result" style="width: 100%;" title="Untitled">See the Pen Untitled by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	نجح الأمر لأن الشبكة ستنشئ أكبر عدد ممكن من الأعمدة التي اتساعها 200 بكسل يمكن للحاوية استيعابها ومن ثم تقسم المساحات الفارغة الباقية بين جميع الأعمدة من خلال القيمة <code>1fr</code> التي رأينا أنها توزّع المساحة بالتساوي بين المسارات.
</p>

<h2 id="-6">
	توزيع المحتوى وفقًا للأسطر
</h2>

<p>
	ننتقل الآن من إنشاء الشبكات إلى وضع المحتوى ضمنها، وقد رأينا أن للشبكة أسطر، وهذه الأسطر مرقمة ابتداءً من 1 وتتعلق بنمط الكتابة في الصفحة. إذ يُكتب السطر الأول من العمود في الإنكليزية (التي تُكتب من اليسار إلى اليمين) انطلاقًا من الناحية اليسرى للشبكة ويكون هذا السطر في الأعلى، أما في العربية التي تُكتب من اليمين إلى اليسار فستبدأ كتابة المحتوى في العمود من يمين الشبكة.
</p>

<p>
	بإمكاننا ترتيب الأشياء وفقًا لهذه لأسطر الكتابة بتحديد بداية ونهاية السطر من خلال الخاصيات التالية:
</p>

<ul>
	<li>
		<a href="https://wiki.hsoub.com/CSS/grid-column-start" rel="external"><code>grid-column-start</code></a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/CSS/grid-column-end" rel="external"><code>grid-column-end</code></a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/CSS/grid-row-start" rel="external"><code>grid-row-start</code></a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/CSS/grid-row-end" rel="external"><code>grid-row-end</code></a>
	</li>
</ul>

<p>
	يمكن لجميع الخاصيات أن تأخذ رقم السطر كقيمة لها، كما يمكن استخدام الخاصيات المختصرة التالية:
</p>

<ul>
	<li>
		<a href="https://wiki.hsoub.com/CSS/grid-column" rel="external"><code>grid-column</code></a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/CSS/grid-row" rel="external"><code>grid-row</code></a>
	</li>
</ul>

<p>
	التي تتيح لك تحديد بداية ونهاية السطر مباشرة وتفصل بين القيمتين الشرطة المائلة <code>/</code>.
</p>

<p>
	لتجريب الأمر، نزّل الملف الذي يضم <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/grids/8-placement-starting-point.html" rel="external nofollow">شيفرة المثال</a> التالي (يمكنك أيضًا الاطلاع على <a href="https://mdn.github.io/learning-area/css/css-layout/grids/8-placement-starting-point.html" rel="external nofollow">كيفية عملها مباشرة</a> على جيت-هاب). ويضم الملف شبكة ومقال بسيط. لاحظ كيف توضِّع القيمة كل عنصر ضمن خلية مخصصة من الشبكة، ولترتيب جميع العناصر في الشبكة باستخدام أسطر الشبكة، أضف القواعد التالية غلى نهاية شيفرة CSS:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5941_33" style=""><span class="pln">header </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

article </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

aside </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

footer </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="500" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/ExJZbmv?default-tab=result" style="width: 100%;" title="grid6">See the Pen grid6 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	<strong>ملاحظة</strong>: بإمكانك أيضًا استخدام القيمة <code>1-</code> كي تستهدف نهاية العمود أو السطر ثم اعدد ابتداءً من النهاية إلى البداية باستخدام القيم السالبة. وتذكر أن الأسطر تُعدّ دائمًا من حافة الشبكة الصريحة وليست الضمنية.
</p>

<h2 id="gridtemplateareas">
	ترتيب العناصر باستخدام الخاصية <code>grid-template-areas</code>
</h2>

<p>
	توجد طريقة بديلة لترتيب العناصر في الشبكة باستخدام الخاصية <a href="https://wiki.hsoub.com/CSS/grid-template-areas" rel="external"><code>grid-template-areas</code></a> وإعطاء أسماء للعناصر المختلفة في التصميم. لتقف على الأمر، أزل شيفرة ترتيب العناصر وفق الأسطر في المثال السابق ثم أضف الشيفرة التالية بدلًا عنها:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5941_35" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-areas</span><span class="pun">:</span><span class="pln">
    </span><span class="str">"header header"</span><span class="pln">
    </span><span class="str">"sidebar content"</span><span class="pln">
    </span><span class="str">"footer footer"</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">3fr</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">20px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

header </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-area</span><span class="pun">:</span><span class="pln"> header</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

article </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-area</span><span class="pun">:</span><span class="pln"> content</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

aside </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-area</span><span class="pun">:</span><span class="pln"> sidebar</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

footer </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-area</span><span class="pun">:</span><span class="pln"> footer</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أعد تحميل الصفحة وسترى أن العناصر قد رُتبّت بالطريقة السابقة نفسها دون أن تستخدم أية أرقام للأسطر.
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="500" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/yLrgPoJ?default-tab=result" style="width: 100%;" title="grid7">See the Pen grid7 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	إليك قواعد الخاصية <code>grid-template-areas</code>:
</p>

<ul>
	<li>
		عليك ملئ كل خلية من خلايا الشبكة.
	</li>
	<li>
		كرر الاسم لتضم خليتين في خلية واحدة.
	</li>
	<li>
		استخدم النقطة <code>.</code> لتترك الخلية فارغة.
	</li>
	<li>
		لا بد أن تكون مساحة الشبكة مربّعة. فلا يمكنك مثلًا تصميم شبكة على شكل حرف L.
	</li>
	<li>
		لا يمكن تكرار المساحات في أماكن مختلفة.
	</li>
</ul>

<p>
	بإمكانك تجريب عدة خيارات في تخطيط الشبكة بهذه الطريقة، حاول مثلًا وضع التذييل تحت المقالة فقط وأن تجعل الشريط الجانبي يمتد للأسفل. هذا الطريقة في تخطيط الشبكة جميلة جدًا لأنها واضحة، وبمجرد النظر إلى شيفرة CSS ستعرف تمامًا ما الذي سيحدث.
</p>

<h2 id="css-1">
	إطارات العمل مع الشبكة في شبكات CSS
</h2>

<p>
	تميل إطارات العمل مع الشبكات grid frameworks لتكون شبكات مكونة من 12-16 عمود. ولا حاجة بالطبع إلى أدوات أخرى سوى شبكة CSS لتنفيذ إطار العمل هذا، فهي موجودة فعلًا في المواصفات.
</p>

<p>
	<a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/grids/11-grid-system-starting-point.html" rel="external nofollow">نزّل الملف</a> الذي يضم شيفرة المثال التالي وهي عبارة عن حاوية مكونة من شبكة تتكون من 12 عمودًا، وتبقى شيفرة HTML نفسها التي استخدمناها في المثال السابق. بإمكاننا الآن استخدام التوضع المبني على الأسطر لتوزيع المحتوى ضمن شبكتنا ذات 12 عمودًا:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5941_37" style=""><span class="pln">header </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">13</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

article </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">13</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

aside </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

footer </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">13</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="800" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/NWmdwaW?default-tab=result" style="width: 100%;" title="grid8">See the Pen grid8 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	إن استخدمت الأداة <a href="https://firefox-source-docs.mozilla.org/devtools-user/page_inspector/how_to/examine_grid_layouts/index.html" rel="external nofollow">Firefox Grid Inspector</a> لتوضح خطوط الشبكة في تصميمك، سترى كيف تعمل تمامًا شبكتنا ذات 12 عمودًا:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="147057" href="https://academy.hsoub.com/uploads/monthly_2024_03/02_grid_12_column.png.3dfc51e49783521cfd0f2910d5e826b3.png" rel=""><img alt="02 grid 12 column" class="ipsImage ipsImage_thumbnailed" data-fileid="147057" data-unique="kiv7z51w2" style="width: 699px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_03/02_grid_12_column.thumb.png.cac676e3e2194a39f6c2a54384a27481.png"> </a>
</p>

<h2 id="-7">
	الخلاصة
</h2>

<p>
	تجولنا في مقالنا على الميزات التي يقدمها تخطيط الشبكة Grid Layout في لغة CSS، واستعرضنا أمثلة مختلفة على استخدامه في ترتيب عناصر صفحة الويب وتنفيذ التخطيطات المعقدة بسهولة كبيرة، ومن المفترض أن تصبح قادرًا الآن على استخدام الشبكات بفعالية ضمن تصميماتك.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Grids" rel="external nofollow">Grids</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B5%D9%86%D8%AF%D9%88%D9%82-%D8%A7%D9%84%D9%85%D8%B1%D9%86-flexbox-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2279/" rel="">تخطيط الصندوق المرن Flexbox في صفحات الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%d9%85%d8%af%d8%ae%d9%84-%d8%a5%d9%84%d9%89-%d8%aa%d8%ae%d8%b7%d9%8a%d8%b7-%d8%b5%d9%81%d8%ad%d8%a7%d8%aa-%d8%a7%d9%84%d9%88%d9%8a%d8%a8-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-css-r2238/" rel="">مدخل إلى تخطيط صفحات الويب باستخدام CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">تعرف على أساسيات CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-css-%D8%A7%D8%AD%D8%AA%D8%B1%D8%A7%D9%81%D9%8A%D8%A9-%D9%88%D8%B3%D9%87%D9%84%D8%A9-%D8%A7%D9%84%D8%B5%D9%91%D9%8A%D8%A7%D9%86%D8%A9-r428/" rel="">تقنيات كتابة شيفرات CSS احترافية وسهلة الصيانة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%AA%D9%85%D9%88%D8%B6%D8%B9-%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-css-r1052/" rel="">التحكم في تموضع العناصر في CSS</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2282</guid><pubDate>Sat, 23 Mar 2024 12:06:00 +0000</pubDate></item><item><title>&#x62A;&#x62E;&#x637;&#x64A;&#x637; &#x627;&#x644;&#x635;&#x646;&#x62F;&#x648;&#x642; &#x627;&#x644;&#x645;&#x631;&#x646; Flexbox &#x641;&#x64A; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628;</title><link>https://academy.hsoub.com/programming/css/%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B5%D9%86%D8%AF%D9%88%D9%82-%D8%A7%D9%84%D9%85%D8%B1%D9%86-flexbox-%D9%81%D9%8A-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2279/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_03/---Flexbox---.png.5f940bcf5b583db75df973c390c31843.png" /></p>
<p>
	الصندوق المرن Flexbox هو أسلوب تخطيط وحيد الاتجاه لترتيب العناصر في صفحة الويب سواء على سطر واحد أو ضمن عمود واحد. إذ تتمتد العناصر لتشغل مساحة أوسع، أو تتقلص لتتلائم مع مساحة أقل. سنتطرق في هذا المقال إلى جميع الأساسيات التي تغطي هذا المفهوم.
</p>

<p>
	عليك قبل البدء في قراءة هذا المقال أن:
</p>

<ol>
	<li>
		تطلع على أساسيات HTML كما شرحناها في سلسلة مقالات <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">مدخل إلى HTML</a>.
	</li>
	<li>
		تفهم <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-css-r70/" rel="">أساسيات عمل CSS</a>.
	</li>
</ol>

<h2 id="">
	لماذا نستخدم الصندوق المرن؟
</h2>

<p>
	بقيت التخطيطات المعتمدة على خاصيات CSS المتعلقة بتعويم العناصر floats وبتوضعها positioning ولفترة طويلة أكثر التخطيطات موثوقية عبر مختلف المتصفحات، وقد نجح هذا الأمر لكن مع وجود شيء من المحدودية في التنفيذ وشيء من الإحباط أحيانًا. فتخطيطات بسيطة كالتي سنذكرها ستكون إما صعبة التنفيذ أو مستحيلة باستخدام تلك الأدوات وبأسلوب مرن وملائم:
</p>

<ul>
	<li>
		توسيط كتلة من المحتوى عموديًا ضمن العنصر الأب.
	</li>
	<li>
		التوزيع المتساوي لاتساع العنصر الأب بين مختلف العناصر الأبناء ضمن حاوية بغض النظر عن مقدار المساحة المتوفرة.
	</li>
	<li>
		ضبط جميع الأعمدة في التخطيط متعدد الأعمدة على نفس الارتفاع إن ضمت كميات مختلفة من المحتوى.
	</li>
</ul>

<p>
	وكما سنرى، يساعدنا تخطيط الصندوق المرن في تنفيذ الكثير من المهام بسهولة أكبر، وإليك التفاصيل.
</p>

<h2 id="-1">
	مثال تمهيدي بسيط
</h2>

<p>
	سنمر في هذا المقال بسلسلة من التمارين كي نفهم آلية عمل الصندوق المرن. عليك بداية أن تنسخ <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/flexbox/flexbox0.html" rel="external nofollow">ملف التمرين من جيت-هاب</a> إلى جهازك، ثم حمّله ضمن متصفح حديث (كروم أو فايرفوكس) والق نظرة على الشيفرة باستخدام محرر الشيفرة الذي تستخدمه. بإمكان أيضًا الاطلاع على طريقة عمله <a href="https://mdn.github.io/learning-area/css/css-layout/flexbox/flexbox0.html" rel="external nofollow">مباشرة على جيت-هاب</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146799" href="https://academy.hsoub.com/uploads/monthly_2024_03/01_example0_normal_flow.png.f966f66fe5fa6e88d86f6d8bb529bae0.png" rel=""><img alt="01 example0 normal flow" class="ipsImage ipsImage_thumbnailed" data-fileid="146799" data-unique="dp94hgvcl" src="https://academy.hsoub.com/uploads/monthly_2024_03/01_example0_normal_flow.thumb.png.f0acbe1f66a94775fc2c4f96b7f1d34e.png"> </a>
</p>

<p>
	ستلاحظ وجود ترويسة <a href="https://wiki.hsoub.com/HTML/header" rel="external"><code>&lt;header&gt;</code></a> تضم عنوانًا من المستوى الأول، وكذلك العنصر <a href="https://wiki.hsoub.com/HTML/section" rel="external"><code>&lt;section&gt;</code></a> الذي يضم ثلاث عناصر <a href="https://wiki.hsoub.com/HTML/article" rel="external"><code>&lt;article&gt;</code></a>. نستخدم هذه الشيفرة في بناء تخطيط معياري مكون من ثلاث أعمدة.
</p>

<h2 id="-2">
	تحديد العناصر التي ينبغي ترتيبها كصناديق مرنة
</h2>

<p>
	علينا كبداية اختيار العناصر التي سترتب كصناديق مرنة، ولفعل ذلك ضبطنا الخاصية <a href="https://wiki.hsoub,com/CSS/display" rel="external nofollow"><code>display</code></a> للعنصر الأب للعناصر التي تريدها أن تتحول لصناديق مرنة (وهي في حالتنا العناصر <code>&lt;article&gt;</code>) على القيمة <code>flex</code>. وبالطبع فإن العنصر الأب هو <code>&lt;section&gt;</code>.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_7" style=""><span class="pln">section </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> flex</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	هكذا يصبح العنصر حاوية مرنة وتصبح العناصر الأبناء عناصر مرنة. وستكون النتيجة شيئًا من هذا القبيل:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146800" href="https://academy.hsoub.com/uploads/monthly_2024_03/02_example0_flex_columns.png.cddb34bd42f4613d526349c84d824f66.png" rel=""><img alt="02 example0 flex columns" class="ipsImage ipsImage_thumbnailed" data-fileid="146800" data-unique="6ov3r9mpk" src="https://academy.hsoub.com/uploads/monthly_2024_03/02_example0_flex_columns.png.cddb34bd42f4613d526349c84d824f66.png"> </a>
</p>

<p>
	إذًا، منحنا هذا التصريح بمفرده ما نريد، وهذا أمر رائع! إذ عُرض المحتوى ضمن ثلاث أعمدة لها الاتساع ذاته والارتفاع ذاته. والسبب في ذلك أن أن القيمة الافتراضية للعناصر المرنة (العناصر الأبناء ضمن الحاوية المرنة) تحل هذا النوع من المسائل مباشرة.
</p>

<p>
	دعونا نعيد ما حدث حتى يكون كل شيء واضحًا. يعمل العنصر الذي ضبطنا قيمة الخاصية <a href="https://wiki.hsoub,com/CSS/display" rel="external nofollow"><code>display</code></a> له على <code>flex</code> كعنصر كتلي من ناحية الطريقة التي يتفاعل فيها مع بقية أجزاء الصفحة، لكن أبناءه قد رُتِّبت كعناصر مرنة. وسنشرح في القسم التالي بتفاصيل أكبر ما يعنيه هذا الكلام. لا حظ أيضًا إمكانية استخدام القاعدة <code>;display: inline-flex</code> إن أردت توضيع أبناء عنصر معين كعناصر مرنة لكن سيسلك هذا العنصر سلوك العناصر السطرية.
</p>

<h2 id="-3">
	نموذج الصندوق المرن
</h2>

<p>
	عندما تتوضع العناصر بصفتها عناصر مرنة فإنها تتوضع وفق محورين:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146801" href="https://academy.hsoub.com/uploads/monthly_2024_03/03_flexbox_axes.png.2438aa8fd88ebfe5f3808098cb250b7e.png" rel=""><img alt="03 flexbox axes" class="ipsImage ipsImage_thumbnailed" data-fileid="146801" data-unique="99fp80awy" src="https://academy.hsoub.com/uploads/monthly_2024_03/03_flexbox_axes.png.2438aa8fd88ebfe5f3808098cb250b7e.png"> </a>
</p>

<ul>
	<li>
		<strong>المحور الأساسي main axis</strong>: وله الاتجاه الذي تتوضع وفقه العناصر المرنة (أي على شكل سطر عبر الصفحة أو عمود يتجه لأسفل الصفحة) وتُدعى بداية هذا المحور البداية الأساسية main start وتُدعى نهايته بالنهاية الأساسية main end.
	</li>
	<li>
		<strong>المحور القاطع cross axis</strong>: هو المحور العمودي على اتجاه توضع العناصر المرنة وله بداية القاطع cross start ونهاية القاطع cross end.
	</li>
	<li>
		يُدعى العنصر الذي تُطبق عليه القاعدة <code>display: flex</code> (العنصر <code>&lt;section&gt;</code> في مثالنا) بالحاوية المرنة flex container.
	</li>
	<li>
		تُدعى العناصر الموجودة داخل الحاوية المرنة بالعناصر المرنة (العناصر <code>&lt;article&gt;</code> في مثالنا). تذكر هذه المصطلحات دائمًا، وعد إليها إن اختلط عليك الأمر في الأقسام القادمة.
	</li>
</ul>

<h2 id="-4">
	أعمدة وأسطر
</h2>

<p>
	يقدم مخطط الصندوق المرن خاصية تُدعى <a href="https://wiki.hsoub.com/CSS/flex-direction" rel="external"><code>flex-direction</code></a> تحدد اتجاه المحور الأساسي (الاتجاه التي تُترتب وفقه عناصر الصندوق المرن). تأخذ هذه الخاصية القيمة <code>row</code> افتراضيًا والتي ترتب العناصر في صف باتجاه انسياب اللغة الافتراضية للمتصفح (من اليمين إلى اليسار في العربية و العكس في الإنجليزية).
</p>

<p>
	حاول أن تضيف التصريح التالي لقاعدة التنسيق الخاصة بالعنصر <code>&lt;section&gt;</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_718_9" style=""><span class="kwd">flex-direction</span><span class="pun">:</span><span class="pln"> column</span><span class="pun">;</span></pre>

<p>
	سترى أن هذه القاعة ستعيد العناصر إلى تخطيط العمود الواحد كما كان تقريبًا قبل إضافة أية تنسيقات. احذف هذا التصريح من شيفرة مثالنا قبل المتابعة.
</p>

<p>
	<strong>ملاحظة</strong>: بإمكانك إيضًا ترتيب العناصر المرنة عكسيًا باستخدام القيمتين <code>row-reverse</code> و <code>column-reverse</code>.
</p>

<h2 id="-5">
	التفاف العناصر
</h2>

<p>
	من أحد المشاكل التي تظهر عند استخدام تخطيط ثابت الاتساع أو الإرتفاع هو طفحان العناصر في مرحلة ما خارج الحاوية مما يدمر التخطيط. لنلق نظرة على المثال <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/flexbox/flexbox-wrap0.html" rel="external nofollow">wrap0.html</a> الموجود على جيت-هاب (انسخ هذا المثال على جهازك إن كنت ترغب في تطبيق الأكواد الواردة في هذا المقال)
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146802" href="https://academy.hsoub.com/uploads/monthly_2024_03/04_example1_overflow.png.6dfbe0d4f194914175c043fc46c430cc.png" rel=""><img alt="04 example1 overflow" class="ipsImage ipsImage_thumbnailed" data-fileid="146802" data-unique="o73nmet4q" src="https://academy.hsoub.com/uploads/monthly_2024_03/04_example1_overflow.thumb.png.5ba3f40392ea943652d495ff58c86a76.png"> </a>
</p>

<p>
	لاحظ هنا كيف خرجت الأعمدة الأبناء خارج الحاوية، ولحل هذه المشكلة يمكن أن نستخدم التصريح التالي ضمن قاعدة تنسيق الكتلة الحاوية <code>&lt;section&gt;</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_9" style=""><span class="kwd">flex-wrap</span><span class="pun">:</span><span class="pln"> wrap</span><span class="pun">;</span></pre>

<p>
	أضف أيضًا التصريح التالي إلى قاعدة تنسيق العناصر <code>&lt;article&gt;</code>:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_11" style=""><span class="kwd">flex</span><span class="pun">:</span><span class="pln"> </span><span class="lit">200px</span><span class="pun">;</span></pre>

<p>
	حاول استعراض الشيفرة الآن في المتصفح وسترى أن التخطيط قد تحسّن كثيرًا:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146803" href="https://academy.hsoub.com/uploads/monthly_2024_03/05_example1_wrapped.png.2ea66c39820810a51206b9806b9bc44b.png" rel=""><img alt="05 example1 wrapped" class="ipsImage ipsImage_thumbnailed" data-fileid="146803" data-unique="tr9liyiqg" src="https://academy.hsoub.com/uploads/monthly_2024_03/05_example1_wrapped.thumb.png.1c18f89745510a257b788da16be6b4ac.png"> </a>
</p>

<p>
	لدينا الآن عدة أسطر يضم كلًا منها عدة عناصر أبناء مرنة تشغل تمامًا المساحة المتاحة للسطر، وعند حدوث طفحان يُنقل العنصر إلى السطر التالي. واستخدم التصريح <code>flex: 200px</code> في تنسيق العناصر <code>&lt;article&gt;</code> للدلالة إلى أن اتساع كل عنصر يجب أن يكون على الأقل 200 بكسل، وسنناقش هذه الخاصية بالتفصيل لاحقًا. يمكن أن نلاحظ أيضًا أن آخر العناصر الأبناء في السطر الأخير أكثر اتساعًا كي تشغل مساحة السطر بأكمله.
</p>

<p>
	هناك الكثير لنفعله أيضًا! حاول أن تغيّر قيمة الخاصية <a href="https://wiki.hsoub.com/CSS/flex-direction" rel="external"><code>flex-direction</code></a> إلى <code>row-reverse</code> وسترى أن تخطيط الأسطر المتعددة بقي كما هو لكن العناصر قد رتّبت بشكل معكوس ابتداءًا من الزاوية الأخرى للمتصفح.
</p>

<h2 id="flexflow">
	الخاصية المختصرة flex-flow
</h2>

<p>
	تجدر الملاحظة هنا أن الخاصيات المختصرة موجودة للخاصيات <a href="https://wiki.hsoub.com/CSS/flex-direction" rel="external"><code>flex-direction</code></a> و <a href="https://wiki.hsoub.com/CSS/flex-wrap" rel="external"><code>flex-wrap</code></a> و <a href="https://wiki.hsoub.com/CSS/flex-flow" rel="external"><code>flex-flow</code></a>. إذ يمكنك مثلًا استبدال التصريح:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_13" style=""><span class="kwd">flex-direction</span><span class="pun">:</span><span class="pln"> row</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">flex-wrap</span><span class="pun">:</span><span class="pln"> wrap</span><span class="pun">;</span></pre>

<p>
	بالتصريح التالي:
</p>

<pre class="ipsCode">flex-flow: row wrap;
</pre>

<h2 id="-6">
	التحديد المرن لأبعاد العناصر المرنة
</h2>

<p>
	لنعد الآن إلى مثالنا الأول لنرى كيف يمكننا التحكم بحجم المساحة الفارغة التي يمكن أن يشغلها العنصر المرن بالنسبة إلى بقية العناصر المرنة. شغّل الملف <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/flexbox/flexbox0.html" rel="external nofollow">flexbox0.html</a> أو انسخ الملف <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/flexbox/flexbox1.html" rel="external nofollow">flexbox1.html</a> إلى جهازك ليكون نقطة الانطلاق إذا قررت تطبيق ما سنفعله.
</p>

<p>
	أضف بداية القاعدة التالية أسفل تصريحات CSS:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_15" style=""><span class="pln">article </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">flex</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	إن القيمة في التصريح السابق هي قيمة نسبية لا وحدة لها تشير إلى حجم الفراغ المتاح لكل عنصر مرن على امتداد المحور الأساسي موازنة مع غيره من العناصر المرنة. في حالتنا منحنا كل عنصر <code>&lt;article&gt;</code> نفس القيمة وهي <code>1</code> كي تأخذ جميع العناصر نفس الكمية من الفراغ الإضافي الذي قد يبقى (الذي لا يتسع لعنصر بأكمله) بعد أن تُحتسب قيم بعض الخاصيات مثل الهوامش والحشوات. تشترك جميع العناصر المرنة بهذه النسبة وحتى لو وضعنا القيمة <code>40000</code> بدل القيمة <code>1</code> فسيكون لها الأثر ذاته.
</p>

<p>
	أضف الآن القاعدة التالية تحت القاعدة السابقة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_17" style=""><span class="kwd">article</span><span class="pun">:</span><span class="pln">nth-of-type</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">flex</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	عند النقر على زر التحديث في المتصفح، سترى أن العنصر <code>&lt;article&gt;</code> الثالث يشغل ضعفي مساحة العنصرين الباقيين. في هذه الحالة سيكون هناك أربع وحدات تناسبية إجمالًا موزعة على الشكل (4=1+1+2). سيشغل أو عنصرين مرنين ما مقداره وحدة من أصل أربعة أي 1/4 من المساحة المتاحة، وسيشغل العنصر الثالث الربعين الآخرين.
</p>

<p>
	بإمكانك أيضًا أن تخصص حدًا أدنى من الحجم لكل عنصر مرن. لترى ذلك، حاول تعديل قواعد تنسيق العنصر <code>&lt;article&gt;</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_19" style=""><span class="pln">article </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">flex</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="lit">200px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">article</span><span class="pun">:</span><span class="pln">nth-of-type</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">flex</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="lit">200px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تنص هذه القواعد على أن كل عنصر مرن سيعطى اتساعًا قدره 200 بكسل بداية من المساحة المتوفرة، وبعدها تتقاسم العناصر المساحة الباقية بنفس النسبة. جرّب أن تنقر على زر التحديث في المتصفح وسترى اختلافًا في طريقة تقاسم المساحة الفارغة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146804" href="https://academy.hsoub.com/uploads/monthly_2024_03/06_flex_flow.png.78a82f37e35a50859d01d0d1d8ada5ce.png" rel=""><img alt="06 flex flow" class="ipsImage ipsImage_thumbnailed" data-fileid="146804" data-unique="q2pea81ad" src="https://academy.hsoub.com/uploads/monthly_2024_03/06_flex_flow.png.78a82f37e35a50859d01d0d1d8ada5ce.png"> </a>
</p>

<p>
	تتجلى القيمة الحقيقية لتخطيط الصندوق المرن من خلال مرونته وتجاوبه، فإن غيرّت أبعاد المتصفح أو أضفت عنصر <code>&lt;article&gt;</code> جديد سيبقى التخطيط جميلًا.
</p>

<h2 id="flex">
	الخاصية <code>flex</code> المختصرة موازنة بالخاصية المطوّلة
</h2>

<p>
	يمكن استخدام الخاصية المختصرة <a href="https://wiki.hsoub.com/CSS/flex" rel="external"><code>flex</code></a> لتحديد ثلاث قيم على الأكثر:
</p>

<ul>
	<li>
		القيمة النسبية التي ليس لها واحدة وقد ناقشناها في الأعلى. بالإمكان ضبط هذه القيمة بمفردها أيضًا من خلال الخاصية المطولة <a href="https://wiki.hsoub.com/CSS/flex-grow" rel="external"><code>flex-grow</code></a>.
	</li>
	<li>
		قيمة نسبية أخرى ليس لها واحدة تعبر عنها الخاصية المطوّلة <a href="https://wiki.hsoub.com/CSS/flex-shrink" rel="external"><code>flex-shrink</code></a> وتظهر أهميتها عندما يحدث الطفحان في الحاوية المرنة. إذ تحدد هذه القيمة مقدار ما يتقلصه العنصر ليمنع الطفحان. لا تُعد هذه الميزة للصندوق المرن متقدمة ولن نغطيها لاحقًا.
	</li>
	<li>
		القيمة التي تحدد الحد الأدنى لاتساع العنصر المرن والتي ناقشناها سابقًا. بالإمكان أن نضبط هذه القيمة أيضًا باستخدام الخاصية المطوّلة <a href="https://wiki.hsoub.com/CSS/flex-basis" rel="external"><code>flex-basis</code></a>.
	</li>
</ul>

<p>
	لا ننصحك باستخدام الصيغ المطوّلة لخاصيات الصندوق المرن إلا في الحالة التي لا مفر من استخدامها (كأن تلغي قاعدة ما حُدِّدت قيمتها سابقًا). إذ سيزيد استخدام هذه الخاصيات من حجم الشيفرة المكتوبة، وقد تغدو مربكة أحيانًا.
</p>

<h2 id="-7">
	المحاذاة الأفقية والعمودية
</h2>

<p>
	نستطيع أيضًا استخدام خاصيات الصندوق المرن لمحاذاة العناصر المرنة عبر المحور الأساسي أو القاطع. ولتوضيح ذلك، سنلقي نظرة على المثال <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/flexbox/flex-align0.html" rel="external nofollow">flex-align0.html</a> الموجود على جت-هاب (بإمكانك <a href="https://mdn.github.io/learning-area/css/css-layout/flexbox/flex-align0.html" rel="external nofollow">متابعته مباشرة</a>) أيضًا)، وسنحاول تحويل محتواه إلى قائمة من الأزرار المرنة الأنيقة. لاحظ بداية وجود شريط قائمة أفقي يضم عدة أزرار محشورة بجوار بعضها ابتداءً من الزاوية اليمينية العليا.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146805" href="https://academy.hsoub.com/uploads/monthly_2024_03/07_menu_bar_jammed.png.090b44a3d429761f2e56372759c83b35.png" rel=""><img alt="07 menu bar jammed" class="ipsImage ipsImage_thumbnailed" data-fileid="146805" data-unique="9vk7b1wu7" src="https://academy.hsoub.com/uploads/monthly_2024_03/07_menu_bar_jammed.png.090b44a3d429761f2e56372759c83b35.png"> </a>
</p>

<p>
	جهز نسخة عن هذا الملف على جهازك، ثم أضف الشيفرة التالية إلى أسفل شيفرة CSS:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_21" style=""><span class="pln">div </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> flex</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">align-items</span><span class="pun">:</span><span class="pln"> center</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">justify-content</span><span class="pun">:</span><span class="pln"> space-around</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146806" href="https://academy.hsoub.com/uploads/monthly_2024_03/08_aligned_flx_menu_bar.png.fe875dfd4830103faaeb4bc883b95062.png" rel=""><img alt="08 aligned flx menu bar" class="ipsImage ipsImage_thumbnailed" data-fileid="146806" data-unique="b6kk550yq" src="https://academy.hsoub.com/uploads/monthly_2024_03/08_aligned_flx_menu_bar.thumb.png.379e1d052ace3b2534b5f6e57442c3b0.png"> </a>
</p>

<p>
	انقر على زر "تحديث" في المتصفح وسترى أن الأزرار قد ضبطت لتبدو متمركزة في منتصف القائمة عموديًا وأفقيًا، وقد أنجزنا ذلك باستخدام الخاصيتين التاليتين:
</p>

<ol>
	<li>
		<strong>الخاصية <a href="https://wiki.hsoub.com/CSS/align-items" rel="external"><code>align-items</code></a>:</strong> وتتحكم بموضع العناصر المرنة على امتداد المحور القاطع:
	</li>
</ol>

<ul>
	<li>
		<p>
			تأخذ هذه الخاصية القيمة <code>stretch</code> افتراضيًا وتوسّع العناصر المرنة لتشغل المساحة المتاحة للعنصر الأب وفق اتجاه المحور القاطع. فإن لم يكن للعنصر الأب ارتفاع محدد وفق اتجاه المحور القاطع، ستأخذ جميع العناصر الأبناء ارتفاع أطول العناصر المرنة. لهذا كان للأعمدة في مثالنا الأول نفس الارتفاع تلقائيًا.
		</p>
	</li>
	<li>
		<p>
			أما القيمة التي استخدمناها في الشيفرة السابقة، ستُبقي الأبعاد الأصلية للعناصر كما هي لكن ستجعلها تتمركز وفق اتجاه المحور القاطع. لهذا تجد الأزرار متمركزة عموديًا في مثالنا الحالي.
		</p>
	</li>
	<li>
		<p>
			يمكن للخاصية أن تأخذ قيمًا مثل <code>flex-start</code> و <code>flex-end</code> والتي تحاذي العناصر المرنة إلى بداية ونهاية المحور القاطع.
		</p>

		<p>
			بإمكانك إلغاء سلوك الخاصية <a href="https://wiki.hsoub.com/CSS/align-items" rel="external"><code>align-items</code></a> لعنصر مرن محدد بتطبيق الخاصية <a href="https://wiki.hsoub.com/CSS/align-self" rel="external"><code>align-self</code></a> عليه. إليك كيف يكون الأمر:
		</p>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_23" style=""><span class="kwd">button</span><span class="pun">:</span><span class="pln">first-child </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">align-self</span><span class="pun">:</span><span class="pln"> flex-end</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146807" href="https://academy.hsoub.com/uploads/monthly_2024_03/09_override_aligned_flex_item.png.d439f18aa6c3d5b3bae51e348091b1d7.png" rel=""><img alt="09 override aligned flex item" class="ipsImage ipsImage_thumbnailed" data-fileid="146807" data-unique="o48ghg30c" src="https://academy.hsoub.com/uploads/monthly_2024_03/09_override_aligned_flex_item.thumb.png.fb6bf3cd1152165edfe1764e8f514859.png"> </a>
</p>

<p>
	جرب تلك القيم لضبط محاذاة العناصر لترى تأثيرها ثم احذف ما فعلته عندما تنتهي.
</p>

<ol start="2">
	<li>
		<strong>الخاصية <a href="https://wiki.hsoub.com/CSS/justify-content" rel="external"><code>justify-content</code></a>:</strong> وتتحكم بموضع العناصر المرنة على امتداد المحور الأساسي:
	</li>
</ol>

<ul>
	<li>
		تأخذ الخاصية القيمة <code>flex-start</code> افتراضيًا مما يجعل جميع العناصر مرتبة ابتداءً من بداية المحور الأساسي.
	</li>
	<li>
		يمكن أن تأخذ الخاصية القيمة <code>flex-end</code> فترتب حينها العناصر من ناحية النهاية.
	</li>
	<li>
		وترتب العناصر حول مركز الحاوية المرنة إن كانت قيمة هذه الخاصية <code>center</code>.
	</li>
	<li>
		استخدمنا في الشيفرة السابقة القيمة <code>space-around</code> والتي توزّع جميع العناصر المرنة بالتساوي على طول المحور الأساسي مع وجود بعض المساحة الفارغة في كلا الطرفين.
	</li>
	<li>
		هنالك قيمة أخرى للخاصية وهي<code>space-between</code> وهي مشابهة جدًا للقيمة <code>space-around</code> إلا أنها لا تترك أية مسافات فارغة إضافية في البداية والنهاية.
	</li>
</ul>

<p>
	أهملت الخاصية <a href="https://wiki.hsoub.com/CSS/justify-items" rel="external"><code>justify-items</code></a> في تخطيط الصندوق المرن ولن نشير إليها، لكننا ننصحك بتجريب القيم السابقة للخاصيتين المتعلقتين بمحاذاة العناصر المرنة قبل متابعة القراءة.
</p>

<h2 id="-8">
	ترتيب العناصر المرنة
</h2>

<p>
	يمتلك تخطيط الصندوق المرن ميزة تغيير ترتيب العناصر المرنة ضمن التخطيط دون التأثير على الترتيب المصدري. وهذا أمر يستحيل إنجازه باستخدام أساليب التخطيط التقليدي.
</p>

<p>
	إن الشيفرة الموافقة لهذه الميزة بسيطة، حاول أن تضيف الشيفرة التالية إلى شيفرة مثال شريط الأزرار:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_25" style=""><span class="kwd">button</span><span class="pun">:</span><span class="pln">first-child </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">order</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	انقر على زر التحديث في المتصفح وسترى أن الزر "Smile" قد انتقل إلى نهاية المحور الأساسي، وسنشرح قليلًا كيف حدث هذا:
</p>

<ul>
	<li>
		تأخذ الخاصية <a href="https://wiki.hsoub.com/CSS/order" rel="external"><code>order</code></a> القيمة <code>0</code> لجميع العناصر المرنة افتراضيًا.
	</li>
	<li>
		ستظهر جميع العناصر ذات القيمة الأعلى لهذه الخاصية في النهاية موازنة بالعناصر التي تحمل قيمة أقل.
	</li>
	<li>
		تحافظ العناصر التي تحمل نفسة القيمة للخاصية <code>order</code> على ترتيب الشيفرة المصدرية. فإن كان لدينا مثلًا أربعة عناصر تحمل القيم 0،1،1،2 على الترتيب سيكون ترتيب عرضها على الشاشة الرابع ثم الثاني والثالث ثم الأول.
	</li>
	<li>
		سيظهر العنصر الثالث بعد الثاني على الرغم من امتلاكهما نفس قيمة الخاصية <code>order</code> إلا أن الثاني جاء قبل الثالث في ترتيب الشيفرة المصدرية.
	</li>
</ul>

<p>
	يمكن للخاصية أن تأخذ قيمًا سالبة كي تعرض العناصر التي تحمل هذه القيم قبل العنصر الذي يحمل القيمة <code>0</code>. يمكننا مثلًا عرض الزر "Blush" في مثالنا في بداية المحور الأساسي باستخدام <a href="https://academy.hsoub.com/programming/css/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D9%81%D9%87%D9%85-%D9%88%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-css-r1881/" rel="">قاعدة التنسيق</a> التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_27" style=""><span class="kwd">button</span><span class="pun">:</span><span class="pln">last-child </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">order</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="-9">
	صناديق مرنة متداخلة
</h2>

<p>
	بإمكانك إنشاء بعض التخطيطات الجميلة والمعقدة باستخدام الصناديق المرنة. فمن الممكن جدًا أن أجعل عنصرًا مرنًا حاويةً مرنةً أيضًا وأن يكون بعض أبناءه أيضًا حاويات مرنة وهكذا. ألق نظرة الآن على المثال <a href="https://github.com/mdn/learning-area/blob/main/css/css-layout/flexbox/complex-flexbox.html" rel="external nofollow">complex-flexbox.html</a> على جت-هاب (بإمكانك متابعة <a href="https://mdn.github.io/learning-area/css/css-layout/flexbox/complex-flexbox.htm" rel="external nofollow">التنفيذ المباشر</a> له أيضًا).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146808" href="https://academy.hsoub.com/uploads/monthly_2024_03/10_nested_flex_boxes.png.9daa5b6b779144c017e4096339bf0827.png" rel=""><img alt="10 nested flex boxes" class="ipsImage ipsImage_thumbnailed" data-fileid="146808" data-unique="tmsxnddo3" src="https://academy.hsoub.com/uploads/monthly_2024_03/10_nested_flex_boxes.png.9daa5b6b779144c017e4096339bf0827.png"> </a>
</p>

<p>
	إن شيفرة HTML لهذا المثال بسيطة، إذ تحتوي الشيفرة على العنصر <code>&lt;section&gt;</code> وضمنه ثلاثة عناصر <code>&lt;article&gt;</code> يحوي آخرها ثلاث عناصر <code>&lt;div&gt;</code> ويضم أول العناصر <code>&lt;div&gt;</code> خمسة أزرار.
</p>

<pre class="ipsCode">section - article
          article
          article - div - button
                    div   button
                    div   button
                          button
                          button
</pre>

<p>
	لنلق نظرة على الشيفرة المستخدمة لتخطيط الصفحة، وسنرى أن أول ما فعلناه هو ضبط العناصر الأبناء للعنصر <code>&lt;section&gt;</code> لتكون صناديق مرنة.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_29" style=""><span class="pln">section </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> flex</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ثم ضبطنا بعض القيم المرنة للعناصر. وانتبه جيدًا إلى القاعدة الثانية في شيفرة التنسيق والتي جعلت العناصر الأبناء للعنصر <code>&lt;article&gt;</code> الثالث عناصر مرنة أيضًا لكننا رتبناها على هيئة عمود.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_31" style=""><span class="pln">article </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">flex</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="lit">200px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">article</span><span class="pun">:</span><span class="pln">nth-of-type</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">flex</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="lit">200px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> flex</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">flex-flow</span><span class="pun">:</span><span class="pln"> column</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نختار تاليًا أول العناصر <code>&lt;div&gt;</code> ونطبق عليه التنسيق <code>;flex: 1 100px</code> كي نعطيه ارتفاعًا مقداره 100 بكسل كحد أدنى، ثم نرتب العناصر الأبناء له على شكل عناصر مرنة. سنختار أن تتوضع الأزرار ضمن سطر وتكون قابلة للالتفاف والانتقال إلى سطر آخر في حال الطفحان كما اخترنا أن نعطيها محاذاة إلى مركز العنصر الأب كما فعلنا مع مثال قائمة الأزرار سابقًا:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_33" style=""><span class="kwd">article</span><span class="pun">:</span><span class="pln">nth-of-type</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">div</span><span class="pun">:</span><span class="pln">first-child </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">flex</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="lit">100px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> flex</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">flex-flow</span><span class="pun">:</span><span class="pln"> row wrap</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">align-items</span><span class="pun">:</span><span class="pln"> center</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">justify-content</span><span class="pun">:</span><span class="pln"> space-around</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	حاولنا في الخطوة الأخيرة تحديد حجم الأزرار باستخدام القاعدة <code>;flex: 1 auto</code>. ولهذه القاعدة تأثير مهم، فإن حاولت أن تغير حجم نافذة المتصفح، ستشغل الأزرار أوسع مساحة ممكنة من الحيز المتاح وتبقى في السطر ذاته ما لم يحدث طفحان لتنتقل عندها إلى سطر آخر.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4742_35" style=""><span class="pln">button </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">flex</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">18px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">line-height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.5</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="-10">
	توافقية المتصفحات مع تخطيط الصندوق المرن
</h2>

<p>
	تدعم معظم المتصفحات الحديثة تخطيط الصندوق المرن مثل فايرفوكس وكروم وأوبرا ومايكروسوفت إيدج وإكسبلورر 11 والنسخ الجديدة من نظامي التشغيل أندرويد وأي أو إس. لكن عليك أن تدرك أن البعض يستخدم متصفحات قديمة لا تدعم هذا التخطيط (أو تفعل لكن بأسلوب قديم حقًا).
</p>

<p>
	وطالما أنك لا تزال في مرحلة التعلم والتجريب، لا تكترث للأمر كثيرًا. فإن قررت أن تستخدم تخطيط الصندوق المرن في تصميم موقعك، لا بأس إذًا من اختبار شيفرتك وتجريب بعض الحلول حتى تبقى تجربة مستخدمي موقعك مقبولة بأكبر عدد ممكن من المتصفحات.
</p>

<p>
	ويبقى تخطيط الصندوق المرن مربكًا موازنة من بعض ميزات CSS. فإن لم يدعم المتصفح مثلًا الظل حول العنصر فلن تتأثر تجربة المستخدمين كثيرًا لكن إن لم يدعم تخطيط الصنوق المرن فسيكسر المتصفح التخطيط بأكمله ولن يستطيع الزائر استخدام الصفحة أصلًا.
</p>

<h2 id="-11">
	الخلاصة
</h2>

<p>
	حاولنا في هذا المقال الإشارة إلى أساسيات الصندوق المرن، ونتمنى أن تكون المعلومات التي وصلتك مفيدة وتساعدك في خطواتك التالية في رحلة التعلم.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox" rel="external nofollow">Flexbox</a>
</p>

<p>
	اقرأ أيضًا
</p>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%A7%D9%86%D8%B3%D9%8A%D8%A7%D8%A8-%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D9%8A%D8%A7%D8%AF%D9%8A-normal-flow-%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2269/" rel="">الانسياب الاعتيادي Normal Flow لعناصر صفحة الويب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2238" rel="">مدخل إلى تخطيط صفحات الويب باستخدام CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D8%B6%D8%A8%D8%B7-%D9%85%D8%AD%D8%A7%D8%B0%D8%A7%D8%A9-%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-css-r1050/" rel="">التحكم في تخطيط الصفحة وضبط محاذاة العناصر في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%AD%D8%AC%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B4%D9%8A%D8%A7%D8%A1-%D9%81%D9%8A-css-r2162/" rel="">تحجيم الأشياء في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">تعرف على أساسيات لغة CSS</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2279</guid><pubDate>Sun, 17 Mar 2024 12:02:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x627;&#x646;&#x633;&#x64A;&#x627;&#x628; &#x627;&#x644;&#x627;&#x639;&#x62A;&#x64A;&#x627;&#x62F;&#x64A; Normal Flow &#x644;&#x639;&#x646;&#x627;&#x635;&#x631; &#x635;&#x641;&#x62D;&#x629; &#x627;&#x644;&#x648;&#x64A;&#x628;</title><link>https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%A7%D9%86%D8%B3%D9%8A%D8%A7%D8%A8-%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D9%8A%D8%A7%D8%AF%D9%8A-normal-flow-%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%B5%D9%81%D8%AD%D8%A9-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r2269/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_03/-----.png.6cda541ad79df4740519de260b157ba8.png" /></p>
<p>
	يشرح هذا المقال الانسياب الاعتيادي للعناصر أو الطريقة التي تُرتّب فيها تلك العناصر ضمن صفحة الويب أي المواضع التي ستأخذها بشكل تلقائي إن لم يتغير تخطيطها.
</p>

<p>
	عليك قبل البدء في قراءة هذا المقال أن تكون على اطلاع بالمفاهيم التالية:
</p>

<ol>
	<li>
		 <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">أساسيات HTML</a>.
	</li>
	<li>
		 <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%91%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-css-r70/" rel="">أساسيات عمل CSS</a>.
	</li>
</ol>

<p>
	تُرتب العناصر في صفحة الويب كما شرحنا في المقال السابق <a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2238/" rel="">مدخل إلى تخطيط صفحات ويب</a> ضمن تخطيط تلقائي يُعرف بالانسياب الاعتيادي Normal Flow إن لم تُطبق أي تنسيقات CSS لتغيير هذا السلوك. وكما رأينا، يمكننا تغيير سلوك العناصر بتغيير موقعها في الانسياب الاعتيادي أو إزالتها من هذا الانسياب كليًا. وبالطبع فإن البدء بإنشاء مستند HTML متماسك ومهيكل بطريقة متينة وله انسياب اعتيادي واضح هي الطريقة الأنسب لتبدأ العمل على صفحة ويب. ستضمن بهذه الطريقة أن الصفحة مقروءة وواضحة بالنسبة لأي متصفح أو جهاز محدود الإمكانيات مثل قارئات الشاشة التي تقرأ للزائر محتويات الصفحة. إضافة إلى ذلك، فإن العمل مع تصميم الانسياب الاعتيادي الموجّة لإنشاء مستندات سهلة القراءة أفضل بكثير من العمل ضده عندما تبدأ بتعديل التخطيط بالشكل الذي تريده.
</p>

<p>
	لهذا السبب سنستعرض سريعًا في مقال اليوم بعض الأشياء التي مرّت معنا سابقًا والمتعلقة بالانسياب الاعتيادي قبل أن نتعمق في تفاصيل التخطيطات الأخرى.
</p>

<h2 id="">
	كيف تُرتب العناصر افتراضيًا في صفحة ويب؟
</h2>

<p>
	تبدأ عملية ترتيب العناصر التي تضيفها لصفحة الويب بشكل صناديق، وهذا ما يُدعى نموذج الصندوق Box model وهو نموذج يستخدم لتحديد وتصميم ترتيب وتخطيط العناصر في صفحة الويب. ويتكون النموذج من مربع يحيط بكل عنصر في الصفحة بحيث نحدد لكل مربع أربعة مكونات أساسية هي: الهامش Margin، والحاشية Padding، والإطار Border، والمحتوى Content كما تلاحظ في الصورة التوضيحية التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="145965" href="https://academy.hsoub.com/uploads/monthly_2024_03/692182423_.png.119a1ea0bb2a37eaa22b2de791f40cf0.png" rel=""><img alt="النموذج الصندوقي" class="ipsImage ipsImage_thumbnailed" data-fileid="145965" data-unique="s1x075lpq" src="https://academy.hsoub.com/uploads/monthly_2024_03/692182423_.png.119a1ea0bb2a37eaa22b2de791f40cf0.png"> </a>
</p>

<p>
	ولفهم المزيد عن ترتيب عناصر صفحة الويب عليك أن تفهم بشكل جيد ما هي المساحة التي سيشغلها كل عنصر تضيفه على الصفحة، فهناك نوعان مختلفان من عناصر HTML هما العناصر السطرية Inline-level والعناصر الكتلية Block-level، ويشغل كل نوع مساحة محددة من صفحة الويب، ويكمن الفرق الأساسي بين العناصر الكتلية والعناصر السطرية بأن العناصر الكتلية تعرض على أسطر منفصلة وتأخذ مساحة كاملة أفقيًا ورأسيًا، بينما تعرض العناصر السطرية على نفس السطر مع العناصر الأخرى وتأخذ مساحة تبعًا لحجم محتواها.
</p>

<p>
	حيث يملأ محتوى العناصر الكتلية block-level element افتراضيًا الفراغ الموافق لكامل السطر في العنصر الأب، وتنمو أو تتوسع هذه العناصر على طول البعد الرأسي أو ارتفاع الكتلة لاستيعاب محتواها، أما أبعاد العناصر السطرية inline-level elements فتتطابق مع أبعاد المحتوى. بالإمكان ضبط ارتفاع <a href="https://wiki.hsoub.com/CSS/height" rel="external"><code>height</code></a> أو اتساع <a href="https://wiki.hsoub.com/CSS/width" rel="external"><code>width</code></a> العناصر التي تأخذ فيها الخاصية <a href="https://wiki.hsoub.com/CSS/display" rel="external"><code>display</code></a> القيمة <code>inline</code> افتراضيًا مثل <code>&lt;img&gt;</code>، لكن تبقى قيمة <a href="https://wiki.hsoub.com/CSS/display" rel="external"><code>display</code></a> كما هي.
</p>

<p>
	وإن أردت التحكم بقيم الخاصية <code>display</code> للعناصر السطرية بهذه الطريقة، يمكن أن تستخدم CSS لجعلها تسلك سلوك العناصر الكتلية (مثل <code>;display: block</code> أو <code>;display: inline-block</code> التي تمزج ميزات كلا النوعين). ويفسر ذلك كيفية هيكلة العناصر كلًا على حدى، لكن ماذا عن هيكلتها عندما تكون معًا؟
</p>

<p>
	هنا يظهر الانسياب الاعتيادي الذي أشرنا إليه سابقًا الذي يوضّع العناصر ضمن نافذة العرض الخاصة بالمتصفح. إذ ترتب العناصر الكتلية باتجاه الكتلة الذي يرتبط بدوره بنمط الكتابة (عادة أفقي horizontal-tb). يظهر كل عنصر في سطر مستقل تحت العنصر الذي يسبقه وتفصل بينهما الهوامش المخصصة لكل منها. ففي اللغة العربية أو الإنكليزية (أو أية لغة نمط الكتابة فيها أفقي)، سترتب العناصر الكتلية عموديًا.
</p>

<p>
	من ناحية أخرى، تسلك العناصر السطرية inline elements سلوكًا مختلفًا، فلا تظهر في أسطر مستقلة، بل تشغل السطر نفسه مع أي محتوى نصي مجاور أو ضمن عنصر حاوٍ طالما أن هناك فراغًا كافيًا ضمن المساحة الذي يشغلها العنصر الكتلي الأب. وإن لم يكن هناك فراغًا كافيًا فستنتقل العناصر التي تطفح عن السطر إلى سطر جديد.
</p>

<p>
	إن كان لأي عنصرين متجاورين عموديًا قيمة معينة للهامش وتلامس هامشيهما، سيبقى الهامش الأكبر فاصلًا بينهما ويختفي الهامش الأصغر، وهذا ما يُعرف بانكماش الهوامش margin collapsing، ويحدث فقط في الاتجاه العمودي.
</p>

<p>
	لنلق نظرة على المثال البسيط التالي الذي يشرح كل ما ذكرناه:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8511_6" style=""><span class="tag">&lt;h1&gt;</span><span class="pln">Basic document flow</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  I am a basic block level element. My adjacent block level elements sit on new
  lines below me.
</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  By default we span 100% of the width of our parent element, and we are as tall
  as our child content. Our total width and height is our content + padding +
  border width/height.
</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  We are separated by our margins. Because of margin collapsing, we are
  separated by the width of one of our margins, not both.
</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  Inline elements </span><span class="tag">&lt;span&gt;</span><span class="pln">like this one</span><span class="tag">&lt;/span&gt;</span><span class="pln"> and </span><span class="tag">&lt;span&gt;</span><span class="pln">this one</span><span class="tag">&lt;/span&gt;</span><span class="pln"> sit on
  the same line along with adjacent text nodes, if there is space on the same
  line. Overflowing inline elements will
  </span><span class="tag">&lt;span&gt;</span><span class="pln">wrap onto a new line if possible (like this one containing text)</span><span class="tag">&lt;/span&gt;</span><span class="pln">,
  or just go on to a new line if not, much like this image will do:
  </span><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"long.jpg"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"snippet of cloth"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/p&gt;</span></pre>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8511_8" style=""><span class="pln">body </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">500px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

p </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> rgba</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">84</span><span class="pun">,</span><span class="pln"> </span><span class="lit">104</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.3</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> solid </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">84</span><span class="pun">,</span><span class="pln"> </span><span class="lit">104</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

span </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid black</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يوضح الكود السابق الطريقة الأساسية التي تتدفق بها العناصر والمحتوى في صفحة HTML تتضمن عنصر عنوان رئيسي <code>h1</code>، وأربع فقرات نصية <code>p</code> . لاحظ تأثير تطبيق نموذج الصندوق لتوضع هذه العناصر والقيم التي منحناها لتعديل الهامش والحدود والحشو للفقرات الأربعة <code>p</code> باستخدام تنسيقات CSS، سيكون الخرج على النحو التالي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="500" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/BaEjRrz?default-tab=result" style="width: 100%;" title="normal-flow-css">See the Pen normal-flow-css by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعلمنا في هذا المقال أساسيات الانسياب الاعتيادي أو الطبيعي Normal Flow للعناصر على صفحة الويب، وهو تخطيط CSS الافتراضي لترتيب العناصر. وبفهم السلوك الافتراضي للعناصر الكتلية والسطرية والهوامش، سيكون من السهل تعديلها في المستقبل، وسنعرفك في مقالات لاحقة على طرق وتقنيات أخرى لتنظيم العناصر على صفحات الويب مثل طريقة العناصر العائمة Floats والتخطيط الشبكي Grids والصندوق المرن Flexbox التي توفر لك أساليب مختلفة تساعدك على تحقيق تخطيطات منوعة لعناصر صفحات الويب واختيار ما يناسب احتياجات تصميم واجهات موقعك من بينها.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Normal_Flow" rel="external nofollow">Normal flow</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/css/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2238/" rel="">مدخل إلى تخطيط صفحات الويب باستخدام CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D8%B6%D8%A8%D8%B7-%D9%85%D8%AD%D8%A7%D8%B0%D8%A7%D8%A9-%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-css-r1050/" rel="">التحكم في تخطيط الصفحة وضبط محاذاة العناصر في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/%D8%A8%D8%B9%D8%B6-%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%88%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D9%85%D9%87%D9%85%D8%A9-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-html-r1895/" rel="">بعض العناصر والمفاهيم المهمة في لغة HTML</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%B9%D8%B1%D8%B6-%D9%85%D8%AD%D8%AA%D9%88%D9%89-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D9%85%D8%AA%D8%B9%D8%AF%D8%AF%D8%A9-r1517/" rel="">عرض محتوى صفحات الويب بتجاوب على الأجهزة المتعددة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">تعرف على أساسيات لغة CSS</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2269</guid><pubDate>Sat, 09 Mar 2024 12:08:01 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x62A;&#x62E;&#x637;&#x64A;&#x637; &#x635;&#x641;&#x62D;&#x627;&#x62A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; CSS</title><link>https://academy.hsoub.com/programming/css/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2238/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_02/------CSS.png.a02966bee819f8991880282ffd789487.png" /></p>
<p>
	نراجع في هذا المقال بعض ميزات تخطيط الصفحات في CSS مثل القيم المختلفة للخاصية display وبعدها سنتعرف على بعض المفاهيم التي نغطيها تباعًا في سلسلة المقالات هذه، ونستعرض بإيجاز الخطوط العامة لتقنيات تخطيط الصفحات والتي نتوسع فيها مقالاتنا اللاحقة.
</p>

<p>
	عليك قبل البدء في قراءة هذا المقال أن:
</p>

<ol>
	<li>
		تطلع على أساسيات HTML كما شرحناها في سلسلة المقالات <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">أساسيات HTML</a>.
	</li>
	<li>
		تتفهم أساسيات CSS كما شرحناها في سلسلة المقالات <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-css-r2000/" rel="">خطواتك الأولى في CSS</a>.
	</li>
</ol>

<p>
	تتيح لك تقنيات تخطيط الصفحات المعتمدة على CSS احتواء عناصر الصفحة والتحكم في موضعها بالنسبة إلى موقعها الافتراضي في الانسياب الاعتيادي أو التقليدي للعناصر أو بالنسبة إلى موضع بقية العناصر المحيطة بها أو بالنسبة إلى الحاوية الأم أو بالنسبة إلى نافذة العرض الأساسية أو نافذة المتصفح. وسنغطي في هذا المقال التقنيات التالية بشيء من التفصيل:
</p>

<ul>
	<li>
		الانسياب الاعتيادي للعناصر Normal flow
	</li>
	<li>
		الخاصية <a href="https://wiki.hsoub.com/CSS/display" rel="external">Display</a>
	</li>
	<li>
		الصندوق المرن Flexbox
	</li>
	<li>
		تخطيط الشبكة Grid
	</li>
	<li>
		تعويم العناصر Floats
	</li>
	<li>
		توضيع العناصر Positioning
	</li>
	<li>
		تخطيط الجدول Table layout
	</li>
	<li>
		التخطيط متعدد الأعمدة Multiple-column layout
	</li>
</ul>

<p>
	لكل تقنية من هذه التقنيات استخداماتها وإيجابياتها وسلبياتها، ولم تصمم أي تقنية لتعمل بمفردها، وبالتالي حين تفهم سبب تصميم تخطيط معين ستمتلك القدرة على اتخاذ قرار استخدام التخطيط المناسب للمهمة التي تواجهك.
</p>

<h2 id="">
	الانسياب الاعتيادي لعناصر الصفحة
</h2>

<p>
	وهو الأسلوب الذي يستخدمه المتصفح افتراضيًا في ترتيب العناصر في صفحات HTML عندما لا تتخذ أي خطوة لترتيب هذه العناصر. لنلق نظرة على المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7215_7" style=""><span class="tag">&lt;p&gt;</span><span class="pln">I love my cat.</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;ul&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Buy cat food</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Exercise</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Cheer up friend</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">The end!</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	سيرتب المتصفح عناصر الصفحة السابقة افتراضيًا كالتالي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/XWQWKeg?default-tab=" style="width: 100%;" title="css-layout-1">See the Pen css-layout-1 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	لاحظ كيف يعرض المتصفح عناصر HTML وفق ترتيب ظهورها في الشيفرة تمامًا ومتلاصقة عنصرًا فوق الآخر. إذ يعرض أولًا الفقرة النصية ثم القائمة غير المرتبة ومن ثم يعرض الفقرة النصية الثانية.
</p>

<p>
	تُدعى العناصر التي تُرتب فوق بعضها بالعناصر الكتلية <strong>block elements</strong>، بينما تُدعى العناصر التي تظهر إلى جانب بعضها في السطر ذاته -مثل الكلمات الموجودة في الفقرة- بالعناصر السطرية <strong>inline elements</strong>.
</p>

<p>
	<strong>ملاحظة</strong>: يُدعى الاتجاه الذي تُرتب فيه العناصر الكتلية (من الأعلى للأسفل في مثالنا) باتجاه الكتلة والذي قد يكون عموديًا في المحتوى المكتوب باللغة الإنكليزية أو العربية مثلً لأن اتجاه الكتابة فيها أفقي. كما يكون اتجاه الكتلة أفقيًا عندما يُكتب المحتوى بلغة تنساب حروفها من الأعلى للأسفل مثل اليابانية. أما الاتجاه السطري فهو اتجاه انسياب الكلمات في المحتوى.
</p>

<p>
	سيزود الانسياب الاعتيادي التخطيط المناسب للكثير من العناصر بالطريقة ضمن الصفحة، لكن ستحتاج في التخطيطات الأكثر تعقيدًا إلى تغيير هذا السلوك مستخدمًا بعض الأدوات التي تتيحها CSS. مع ذلك، عليك أن تبدأ من صفحة HTML مهيكلة جيدًا كي تكون قادرًا على التعامل مع الطريقة التي تُرتب فيها العناصر افتراضيًا بدلًا من معارضتها.
</p>

<p>
	تُستخدم الأساليب التالية في CSS لتغيير الترتيب الافتراضي للعناصر:
</p>

<ul>
	<li>
		<strong>الخاصية <a href="https://wiki.hsoub.com/CSS/display" rel="external"><code>display</code></a></strong>: تغيّر القيم الأساسية لهذه الخاصية وهي <code>block</code> أو <code>inline</code> أو <code>inline-block</code> كيفية سلوك العناصر في الانسياب الاعتيادي، كأن يجعل عنصرًا كتليًا مثلًا يسلك سلوك عنصر سطري (نموذج الصندوق في CSS وستجد أيضًا أساليب كاملة للتخطيط تُفعّل عند اختيار قيم معينة للخاصية <code>display</code> مثل <code>grid</code> و <code>flexbox</code> أو التي تغيّر توضّع العنصر داخل العنصر الأب).
	</li>
	<li>
		<strong>التعويم floats</strong>: وذلك بتطبيق الخاصية، فاختيار القيمة <code>left</code> لهذه الخاصية مثلًا تدفع العناصر لتلتف نحو الجانب اليساري للعنصر كما في الصور التي يحاذيها نص إلى اليسار في مجلة.
	</li>
	<li>
		<strong>الخاصية <a href="https://wiki.hsoub.com/CSS/position" rel="external"><code>position</code></a></strong>: تتيح لك هذه الخاصية ضبط موقع صندوق العنصر ضمن صناديق أخرى ضبطًا دقيقًا. يُعد الوضع <code>static</code> وضعًا افتراضيًا في الانسياب الاعتيادي، ومن الممكن أيضًا وضع العنصر بشكل مختلف باستخدام القيم الأخرى لهذه الخاصية، كأن يكون موقع العنصر ثابتًا أعلى المتصفح.
	</li>
	<li>
		<strong>تخطيط الجدول</strong>: يمكن استخدام الميزات التي تسمح بتنسيق جداول HTML مع العناصر الأخرى من خلال الخاصية <code>display</code> والقيمة <code>table</code> والخاصيات الأخرى المرتبطة بها.
	</li>
	<li>
		<strong>التخطيط متعدد الأعمدة:</strong> توضّع خاصيات الأعمدة <a href="https://wiki.hsoub.com/CSS/columns" rel="external"><code>-columns</code></a> محتوى الكتلة ضمن أعمدة بشكل مشابه لما تراه في الصحف.
	</li>
</ul>

<h2 id="display">
	الخاصية <code>display</code>
</h2>

<p>
	تعتمد الأساليب الرئيسية في تخطيط الصفحات باستخدام CSS على استخدام قيم الخاصية <code>display</code>، إذ تسمح هذه القيم في تغيير الطريقة الافتراضية التي تُعرض بها الأشياء. ولكل عنصر قيمة افتراضية لهذه الخاصية في الانسياب الاعتيادي، أي الطريقة الاعتيادية التي يسلكها هذا العنصر. فعناصر الفقرة النصية <code>&lt;p&gt;</code> المكتوبة باللغة العربية مثلًا تتوضع فوق بعضها لأن التنسيق الافتراضي للعرض هو <code>display: block</code>. ولو أنشأت رابطًا ضمن فقرة نصية فسيبقى الرابط على نفس السطر مع بقية كلمات الفقرة ولن يقفز إلى السطر الثاني لأن التنسيق الافتراضي لعرض هذا العنصر هو <code>display: inline</code>.
</p>

<p>
	بالإمكان تغيير العرض التقليدي بتغيير قيم الخاصية <code>display</code>. فعنصر القائمة مثلًا <code>&lt;li&gt;</code> يسلك سلوك الكتلة افتراضيًا، أي تظهر هذه العناصر في المحتوى المكتوب بالعربية أو الانجليزية تحت بعضها. وعندما نضبط الخاصية <code>display</code> على <code>inline</code>، ستُعرض العناصر إلى جانب بعضها كفقرة نصية اعتيادية. تظهر أهمية هذه الطريقة في تغيير طريقة عرض أي عنصر من عناصر HTML دون المساس بدلالته (أي الغرض من استخدامه).
</p>

<p>
	بالإضافة إلى إمكانية تغيير طريقة عرض العناصر من كتلية إلى سطرية وبالعكس، ستجد الكثير من أساليب التخطيط التي تبدأ باستخدام الخاصية <code>display</code>. لكن ما يحدث عادة هو الحاجة إلى استخدام قيم أخرى لهذه الخاصية، وأكثرها أهمية في سياق مناقشتنا هما القيمتان <code>display: flex</code> و <code>display: grid</code>.
</p>

<h2 id="flexbox">
	مفهوم الصندوق المرن Flexbox
</h2>

<p>
	يأتي مصطلح الصندوق المرن Flexbox كاسم مختصر لوحدة من وحدات CSS تُعرف بتخطيط الصندوق المرن Flexible Box Layout، وقد صممت هذه الوحدة لتسهيل ترتيب الأشياء في اتجاه واحد كأن تكون في صفٍ أو عمود. ولاستخدام الصندوق المرن لابد من تطبيق الخاصية <code>display:flex</code> على العنصر الأب الذي ترغب في ترتيب العناصر ضمنه بشكل مرن، وبالتالي ستصبح هذه العناصر مرنة. وسنرى ذلك في المثال البسيط التالي:
</p>

<h3 id="displayflex">
	ضبط قيمة الخاصية <code>display</code> على <code>flex</code>
</h3>

<p>
	تعرض شيفرة HTML السابقة عنصرًا حاويًا <code>&lt;div&gt;</code> يمتلك صنف التنسيق <code>wrapper</code> ويضم داخله ثلاث عناصر من نفس النوع. ستُعرض هذه العناصر افتراضيًا كعناصر كتلية تحت بعضها البعض طالما أن لغة الكتابة سطرية مثل الإنكليزية في هذا المثال.
</p>

<p>
	لكن عند إضافة الخاصية <code>display: flex</code> إلى تنسيق العنصر الأب، سترتب العناصر نفسها على شكل أعمدة ثلاث، إذ تصبح هذه العناصر عناصر مرنة وتتأثر ببعض القيم الأساسية التي يطبقها الصندوق المرن على العنصر الأب. وقد ظهرت تلك العناصر ضمن سطر واحد وثلاث أعمدة لأن القيمة الأساسية للخاصية <a href="https://wiki.hsoub.com/CSS/flex-direction" rel="external"><code>flex-direction</code></a> في العنصر الأب هي <code>row</code>. وتمتد هذه العناصر أيضًا من ناحية الارتفاع لأن القيمة الأساسية للخاصية <a href="https://wiki.hsoub.com/CSS/align-items" rel="external"><code>align-items</code></a> للعنصر الأب هي <code>stretch</code>، أي أن العناصر تمتد بالاتجاه العمودي لتشغل ارتفاع العنصر الحاوي (العنصر الأب) والذي يحدده في هذه الحالة ارتفاع العنصر الأطول من بين العناصر الثلاث. تصطف العناصر إلى جانب بعضها بدءًا من طرف الحاوية وتترك أية مساحات فارغة لم يشغلها أي من هذه العناصر لتأتي بعدها وحتى نهاية السطر.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_7215_9" style=""><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> flex</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7215_11" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"wrapper"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box1"</span><span class="tag">&gt;</span><span class="pln">One</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box2"</span><span class="tag">&gt;</span><span class="pln">Two</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box3"</span><span class="tag">&gt;</span><span class="pln">Three</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	سيرتب المتصفح عناصر الصفحة السابقة الآن كالتالي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/ExJxyML?default-tab=result" style="width: 100%;" title="css-layout-2">See the Pen css-layout-2 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h3 id="-1">
	ضبط خاصيات المرونة
</h3>

<p>
	إضافة إلى الخاصيات التي يمكن تطبيقها على الحاوية المرنة، ستجد بعض الخاصيات التي يمكن تطبيقها على العناصر المرنة داخله أيضًا. يمكن لهذه الخاصيات بمشاركة أشياء أخرى أن تغيّر ترتيب العناصر المرنة كي تتمكن من التمدد والتقلص وفقًا للمساحة المتاحة لها.
</p>

<p>
	كمثال على ذلك، يمكن إضافة الخاصية <a href="https://wiki.hsoub.com/CSS/flex" rel="external"><code>flex</code></a> إلى جميع الأبناء وإعطائها القيمة <code>1</code> مما يجعل العناصر تتمدد لتملأ العنصر الأب بدلًا من ترك مساحات فارغة في نهاية السطر. فإن كانت هناك مساحات إضافية ستغدو هذه العناصر أوسع وتتقلص إن لم تكن هناك مساحات كافية. وإن أضفت عناصر إضافية إلى الحاوية سيصغر حجم جميع العناصر لتوفر مكانًا للعنصر الجديد وستشغل العناصر كلها كامل مساحة الحاوية.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3747_7" style=""><span class="pln">.wrapper {
  display: flex;
}

.wrapper &gt; div {
  flex: 1;
}</span></pre>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_3747_9" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"wrapper"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box1"</span><span class="tag">&gt;</span><span class="pln">One</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box2"</span><span class="tag">&gt;</span><span class="pln">Two</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box3"</span><span class="tag">&gt;</span><span class="pln">Three</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	سنحصل على النتيجة التالية:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/yLrLJWX?default-tab=result" style="width: 100%;" title="css-layout-3">See the Pen css-layout-3 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	<strong>ملاحظة</strong>: ما ذكرناه مقدمة مختصرة جدًا عما يمكن فعله في تخطيط الصندوق المرن وسنرى تفاصيل أوفى في مقال قادم.
</p>

<p>
	وكما صُمم تخطيط الصندوق المرن ليرتب العناصر باتجاه واحد، صُمم تخطيط الشبكة لترتيبها باتجاهين أي ضمن صفوف وأعمدة.
</p>

<h3 id="displaygrid">
	ضبط الخاصية <code>display</code> على القيمة <code>grid</code>
</h3>

<p>
	كما هو الحال في الصندوق المرن، نطبّق تخطيط الشبكة بإسناد القيمة الخاصة به إلى خاصية العرض <code>display:grid</code>. يستخدم المثال التالي نفس شيفرة HTML التي استخدمناها في المثال السابق. وإضافة إلى استخدام الخاصية <code>display: grid</code>، سنعرف بعض مسارات الصفوف والأعمدة في العنصر الأب باستخدام الخاصيتين <a href="https://wiki.hsoub.com/CSS/grid-template-rows" rel="external"><code>grid-template-rows</code></a> و <a href="https://wiki.hsoub.com/CSS/grid-template-columns" rel="external"><code>grid-template-columns</code></a> على التوالي. وقد عرفنا ثلاث أعمدة اتساع كل منها <code>1fr</code> (جزء واحد من كل) وصفين ارتفاع كل منهما <code>100px</code>. لا حاجة لوضع أي قواعد تنسيق للعناصر الأبناء لأنها تُرتب تلقائيًا ضمن الشبكة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3747_11" style=""><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-rows</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100px</span><span class="pln"> </span><span class="lit">100px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3747_13" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"wrapper"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box1"</span><span class="tag">&gt;</span><span class="pln">One</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box2"</span><span class="tag">&gt;</span><span class="pln">Two</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box3"</span><span class="tag">&gt;</span><span class="pln">Three</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box4"</span><span class="tag">&gt;</span><span class="pln">Four</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box5"</span><span class="tag">&gt;</span><span class="pln">Five</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box6"</span><span class="tag">&gt;</span><span class="pln">Six</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	ستكون النتيجة كالتالي:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/eYoYzqy?default-tab=result" style="width: 100%;" title="css-layout-4">See the Pen css-layout-4 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h3 id="-2">
	وضع العناصر ضمن الشبكة
</h3>

<p>
	بمجرد أن تبني الشبكة، ستتمكن من وضع عناصر أخرى ضمنها بشكل صريح بدلًا من الاعتماد على سلوك التوضع التلقائي. نعرّف في المثال التالي الشبكة نفسها التي عرفناها سابقًا، لكن بوجود ثلاث عناصر أبناء فقط. وضبطنا سطري البداية و النهاية باستخدام الخاصيتين <a href="https://wiki.hsoub.com/CSS/grid-column" rel="external"><code>grid-column</code></a> و <a href="https://wiki.hsoub.com/CSS/grid-row" rel="external"><code>grid-row</code></a> مما يجعل العنصر يمتد على عدة مسارات.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_7215_16" style=""><span class="pun">.</span><span class="pln">wrapper </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> grid</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-columns</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pln"> </span><span class="lit">1fr</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-template-rows</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100px</span><span class="pln"> </span><span class="lit">100px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">box1 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">box2 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">box3 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">grid-row</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">grid-column</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7215_18" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"wrapper"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box1"</span><span class="tag">&gt;</span><span class="pln">One</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box2"</span><span class="tag">&gt;</span><span class="pln">Two</span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box3"</span><span class="tag">&gt;</span><span class="pln">Three</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	ستظهر النتيجة على هذا النحو:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/mdgdryd?default-tab=result" style="width: 100%;" title="css-layout-4">See the Pen css-layout-4 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	<strong>ملاحظة</strong>: يعرض المثالان السابقان فكرة بسيطة عن قوة تخطيط الشبكة، وسنفصل أكثر في مقال قادم.
</p>

<p>
	لنتابع في بقية هذا المقال بعض التخطيطات الأخرى الأقل أهمية كتخطيطات رئيسية لصفحة الويب، لكنها مفيدة في مهام أخرى. وستجد عند فهم طبيعة المهام التي يؤديها كل تخطيط أن التخطيط الملائم لمكوّن معين من صفحتك سيكون واضحًا أغلب الأحيان.
</p>

<h2 id="float">
	تعويم العنصر: الخاصية <code>float</code>
</h2>

<p>
	يغير تعويم العنصر سلوكه وعناصر الكتلة الأخرى التي تأتي بعده في الانسياب الاعتيادي. تتوضع العناصر المعومة إلى اليمين أو اليسار وتُنقل من مكانها ثم يعوم حولها بقية المحتوى.
</p>

<p>
	للخاصية القيم التالية:
</p>

<ul>
	<li>
		<code>left</code>: تعويم العنصر إلى اليسار.
	</li>
	<li>
		<code>right</code>: تعويم العنصر إلى اليمين.
	</li>
	<li>
		<code>none</code>: لا تسمح بتعويم العنصر وهي القيمة الافتراضية.
	</li>
	<li>
		<code>inherit</code>: قيمة الخاصية <code>float</code> للعنصر هي نفسها قيم هذه الخاصية في العنصر الأب.
	</li>
</ul>

<p>
	نعوّم في المثال التالي عنصر <code>&lt;div&gt;</code> إلى اليسار ونحدد له هامشًا <a href="https://wiki.hsoub.com/CSS/margin" rel="external"><code>margin</code></a> نحو اليمين لدفع المحتوى المحيط به قليلًا. يعطينا هذا التنسيق تأثير التفاف النص حول صندوق العنصر المعوّم، وهذا أهم ما تريد معرفته عن التعويم كما يُستخدم في تصميم الويب المعاصر.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7215_20" style=""><span class="tag">&lt;h1&gt;</span><span class="pln">Simple float example</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

</span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"box"</span><span class="tag">&gt;</span><span class="pln">Float</span><span class="tag">&lt;/div&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam
  dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus
  ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus
  laoreet sit amet. Sed auctor cursus massa at porta. Integer ligula ipsum,
  tristique sit amet orci vel, viverra egestas ligula. Curabitur vehicula tellus
  neque, ac ornare ex malesuada et. In vitae convallis lacus. Aliquam erat
  volutpat. Suspendisse ac imperdiet turpis. Aenean finibus sollicitudin eros
  pharetra congue. Duis ornare egestas augue ut luctus. Proin blandit quam nec
  lacus varius commodo et a urna. Ut id ornare felis, eget fermentum sapien.
</span><span class="tag">&lt;/p&gt;</span></pre>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_7215_22" style=""><span class="pun">.</span><span class="pln">box </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">float</span><span class="pun">:</span><span class="pln"> left</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">150px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">150px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin-right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ستظهر النتيجة على هذا النحو:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/PogoGqP?default-tab=result" style="width: 100%;" title="css-layout-5">See the Pen css-layout-5 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	<strong>ملاحظة</strong>: سنشرح التعويم بشكل كامل في مقال لاحق عن خاصيات التعويم. فقد استخدم تلك الخاصيات قبل ظهور تقنيات الصندوق المرن والشبكة لإنشاء تخطيطات متعددة الأعمدة. وقد تصادف هذه التخطيطات في بعض مواقع الويب لهذا سنغطيها أيضًا في مقال مستقل.
</p>

<h2 id="-3">
	تقنيات ضبط موقع العنصر
</h2>

<p>
	تساعدك هذه التقنيات في نقل عنصر من المكان الذي ينبغي أن يحتله ضمن الانسياب الاعتيادي للعناصر إلى مكان آخر. ولا يُعد تموضع العنصر أسلوبًا في إنشاء تخطيطات رئيسية للصفحة، بل هو أقرب إلى ترتيب وضبط الموقع المخصص لكل عنصر في الصفحة بدقة.
</p>

<p>
	لكنك ستجد تقنيات مفيدة للحصول على أنماط تخطيط مخصصة تعتمد على استخدام الخاصية <a href="https://wiki.hsoub.com/CSS/position" rel="external"><code>position</code></a>. إن فهم فكرة التموضع ستساعدك على فهم الانسياب الاعتيادي للعناصر، وما الذي يعنيه نقل العنصر خارج هذا الانسياب.
</p>

<p>
	يوجد عمومًا خمسة أنواع تجدر معرفتها لتموضع العناصر:
</p>

<ul>
	<li>
		<strong>التوضع الساكن Static positioning</strong>: وهو الوضع الافتراضي لجميع العناصر، ويعني ببساطة وضع العنصر في مكانه الاعتيادي ضمن تخطيط الصفحة.
	</li>
	<li>
		<strong>التوضع النسبي Relative positioning</strong>: يساعدك على تعديل موقع عنصر في الصفحة وذلك بنقله بالنسبة إلى مكانه الاعتيادي، إضافة إلى جعله فوق عناصر أخرى في الصفحة Overlapping.
	</li>
	<li>
		<strong>التوضع المطلق Absolute positioning</strong>: يُخرج العنصر تمامًا من الانسياب العتيادي وكأنه يقع ضمن طبقة خاصة به. وبهذه الطريقة ستتمكن من تثبيت العنصر بالنسبة إلى حواف أقرب عنصر أب ثابت الموقع (وإن لم يكن هناك واحد سيكون هذا العنصر بالطبع <code>&lt;html&gt;</code>). لهذا الوضع أهميته في إنشاء تخطيطات معقدة مثل الصناديق متعددة النوافذ التي تتراكب فيها نوافذ المحتوى فوق بعضها لتُعرض وتختفي عند الطلب، أو لوحات المعلومات التي تضبط لتكون خارج الشاشة ثم تظهر إلى جانب الصفحة بالنقر على زر تحكم مخصص.
	</li>
	<li>
		<strong>التوضع الثابت Fixed positioning</strong>: يشابه الوضع المطلق إلا أنه يُثبِّت موضع العنصر بالنسبة إلى نافذة عرض المتصفح وليس لموقع عنصر آخر. لهذا الوضع فائدته في إنشاء تأثيرات هامة مثل قوائم التنقل التي تبقى دائمًا في نفس المكان على الشاشة بينما يكون المحتوى متحركًا عند تمرير الصفحة.
	</li>
	<li>
		<strong>التوضع اللاصق Sticky positioning</strong>: طريقة جديدة لتوضيع العناصر تجعلها تتصرف وكأنها في الوضع النسبي <code>position: relative</code> حتى تصل إلى حد معين بالنسبة لنافذة العرض عنها تتصرف وكأنها في الوضع الثابت <code>position: fixed</code>.
	</li>
</ul>

<h3 id="-4">
	مثال بسيط عن تموضع العناصر
</h3>

<p>
	كي نألف العمل مع تقنيات التخطيط السابقة، سنعرض مثالين سريعين لكل منهما بنية HTML نفسها (ترويسة تليها ثلاثة فقرات نصية) كالتالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3747_17" style=""><span class="tag">&lt;h1&gt;</span><span class="pln">Positioning</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">I am a basic block level element.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;p</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"positioned"</span><span class="tag">&gt;</span><span class="pln">I am a basic block level element.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;p&gt;</span><span class="pln">I am a basic block level element.</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	تُنسق شيفرة HTML افتراضيًا باستخدام شيفرة CSS التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3747_19" style=""><span class="pln">body </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">500px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

p </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background-color</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">207</span><span class="pun">,</span><span class="pln"> </span><span class="lit">232</span><span class="pun">,</span><span class="pln"> </span><span class="lit">220</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> solid </span><span class="kwd">rgb</span><span class="pun">(</span><span class="lit">79</span><span class="pun">,</span><span class="pln"> </span><span class="lit">185</span><span class="pun">,</span><span class="pln"> </span><span class="lit">227</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">border-radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	إليك خرج الشيفرة السابقة على المتصفح:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/qBwBabg?default-tab=result" style="width: 100%;" title="css-layout-6">See the Pen css-layout-6 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h3 id="-5">
	التموضع النسبي:
</h3>

<p>
	يتيح لنا التوضع النسبي إزاحة العنصر خارج نطاق الانسياب الاعتيادي، بمعنى إمكانية إنجاز مهام مثل تحريك أيقونة قليلًا لتحاذي نص أو عنوان. لفعل ذلك، بالإمكان تطبيق قواعد التنسيق التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3747_21" style=""><span class="pun">.</span><span class="pln">positioned </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> relative</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أعطينا في شيفرة التنسيق السابقة القيمة <code>relative</code> للخاصية <code>position</code> العائدة إلى الفقرة الموجودة في الوسط. بالطبع لن يظهر تأثير ذلك قبل أن نضبط أيضًا قيمًا للخاصيتين <a href="https://wiki.hsoub.com/CSS/top" rel="external"><code>top</code></a> و <a href="https://wiki.hsoub.com/CSS/left" rel="external"><code>left</code></a>، إذ تجعلان العنصر ينزاح إلى الأسفل واليمين. قد ترى أن ما حدث هو عكس ما تتوقعه، لكن فكر بالموضوع على أنك دفعت العنصر من جانبيه العلوي واليساري وبالتالي ستكون النتيجة انزياحه نحو الأسفل واليمين.
</p>

<p>
	إليك نتيجة الشيفرة السابقة:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/jOROMrw?default-tab=result" style="width: 100%;" title="css-layout-7">See the Pen css-layout-7 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h3 id="-6">
	التموضع المطلق
</h3>

<p>
	ويستخدم لإخراج العنصر كليًا من مجرى الانسياب الاعتيادي، وإعادة توضيعه بإزاحته مقدارًا محددًا عن حواف الكتلة التي تحتويه.
</p>

<p>
	بالعودة إلى مثالنا السابق (دون تطبيق التوضع)، سنضيف قواعد التنسيق التالية لإنجاز التوضع المطلق:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3747_23" style=""><span class="pun">.</span><span class="pln">positioned </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أعطينا في شيفرة التنسيق السابقة القيمة <code>absolute</code> للخاصية <code>position</code> العائدة إلى الفقرة الموجودة في الوسط، واستخدمنا الخاصيتين <code>top</code> و <code>left</code><br>
	كما سبق.
</p>

<p>
	إليك النتيجة:
</p>
<iframe height="300" style="width: 100%;" scrolling="no" title="css-layout-8" src="https://codepen.io/HsoubAcademy/embed/wvZvzgo?default-tab=result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href="https://codepen.io/HsoubAcademy/pen/wvZvzgo" rel="external nofollow">
  css-layout-8</a> by Hsoub Academy (<a href="https://codepen.io/HsoubAcademy" rel="external nofollow">@HsoubAcademy</a>)
  on <a href="https://codepen.io" rel="external nofollow">CodePen</a>.
</iframe>

<p>
	كما ترى، الأمر مختلف تمامًا هذه المرة! لقد انفصل العنصر بالكامل عن تخطيط الصفحة وبقي أعلاها، بينما بقيت الفقرتين النصيتين الأخريين في مكانهما دون أن تتأثرا بموقع الفقرة التي غيرنا أسلوب توضعها. وكذلك نجد اختلاف تأثير الخاصيتين <code>top</code> و <code>left</code> على الموقع في حالتي التوضع النسبي والمطلق. إذ تُحسب الإزاحة في حالة التوضع المطلق بالنسبة لأعلى ويسار الصفحة.
</p>

<h3 id="-7">
	التموضع الثابت
</h3>

<p>
	يزيل التموضع الساكن العنصر من مجرى الانسياب الاعتيادي كما يفعل التوضع المطلق، لكن الإزاحة ستُطبق في هذه الحالة بالنسبة غلى نافذة العرض وليس بالنسبة إلى العنصر الأب (الكتلة الحاوية). وطالما أن العنصر يبقى ثابتًا بالنسبة إلى نافذة العرض، يمكن استخدام هذا التموضع لإحداث تأثيرات مميزة كالقوائم التي تبقى في مكانها عند تمرير محتوى الصفحة.
</p>

<p>
	وكمثال عن هذا التوضع، نجد شيفرة HTML تضم ثلاث فقرات نصية يسبقها صندوق <code>&lt;div&gt;</code> نضبط خاصية <code>position</code> له على القيمة <code>fixed</code>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3747_25" style=""><span class="tag">&lt;h1&gt;</span><span class="pln">Fixed positioning</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

</span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"positioned"</span><span class="tag">&gt;</span><span class="pln">Fixed</span><span class="tag">&lt;/div&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam
  dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus
  ut, rutrum luctus orci.
</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  Cras porttitor imperdiet nunc, at ultricies tellus laoreet sit amet. Sed
  auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet orci
  vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare ex
  malesuada et.
</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  In vitae convallis lacus. Aliquam erat volutpat. Suspendisse ac imperdiet
  turpis. Aenean finibus sollicitudin eros pharetra congue. Duis ornare egestas
  augue ut luctus. Proin blandit quam nec lacus varius commodo et a urna. Ut id
  ornare felis, eget fermentum sapien.
</span><span class="tag">&lt;/p&gt;</span></pre>

<pre class="ipsCode">.positioned {
  position: fixed;
  top: 30px;
  left: 30px;
}
</pre>

<p>
	وهذه النتيجة:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/dyLypNx?default-tab=result" style="width: 100%;" title="css-layout-9">See the Pen css-layout-9 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h3 id="-8">
	التموضع اللاصق
</h3>

<p>
	وهي الأسلوب الأخير الذي نناقشه فيما يخص التوضّع. تمزج هذه القيمة بين التوضع النسبي والتوضع الثابت، فعندما نُطبق القاعدة <code>position: sticky</code> على عنصر سيتحرك مع المحتوى عند تمريره حتى يصل إلى إزاحة محددة سلفًا بالنسبة لنافذة العرض وعندها يبقى في هذا الموقع كما لو طبقنا القاعدة<br>
	<code>position: fixed</code>.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_628_7" style=""><span class="pun">.</span><span class="pln">positioned </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> sticky</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">top</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	النتيجة:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/vYMYXmE?default-tab=result" style="width: 100%;" title="css-layout-10">See the Pen css-layout-10 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h2 id="-9">
	تخطيط الجدول
</h2>

<p>
	تُعد جداول HTML طريقة جيدة في عرض البيانات القابلة للجدولة، لكنها استُخدمت قبل سنوات عدة -حين لم تكن CSS مدعومة جيدًا من قبل المتصفحات- من قبل المطورين لتخطيط صفحة ويب بأكملها. إذ استخدمت أسطر وأعمدة الجدول لاحتواء ترويسة الصفحة وتذييلها وأعمدتها، ونفع الأمر حينها مع وجود مشاكل جدية تتعلق بمرونة الجداول وكم الشيفرة الكبير اللازم لصياغتها وصعوبة تنقيحها، ناهيك عن الأخطاء الدلالية في استخدامها، فهي دلاليًا غير مخصصة لاحتواء عناصر أخرى بل لعرض البيانات وبالتالي ستجد قارئات الشاشة صعوبة في تتبع تخطيطات الجداول.
</p>

<p>
	تُعرض جداول HTML ضمن صفحة الويب وفقًا لمجموعة من خاصيات CSS تُعرّف تخطيط الجدول، ويمكن استخدام نفس تلك الخاصيات لترتيب عناصر أخرى غير الجداول بطريقة تُوصف أحيانًا بجداول CSS.
</p>

<p>
	يعرض المثال القادم هذا النمط من الاستخدام، وتجدر الملاحظة هنا أن استخدام تخطيط جداول CSS يُعد طريقة قديمة حاليًا، ولا يجب استخدامه إلا لدعم المتصفحات الأقدم التي لا تدعم تخطيط الشبكة أو الصندوق المرن.
</p>

<p>
	لنلق نظرة على مثالنا المكون من توصيف بسيط لنموذج HTML لكل عنصر إدخال فيه عنوان، كما وضعنا عنوانًا ضمن فقرة نصية، وغلفنا كل زوج (عنصر إدخال/ عنوان) ضمن عنصر <code>&lt;div&gt;</code> لتنسيق التخطيط.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3747_27" style=""><span class="tag">&lt;form&gt;</span><span class="pln">
  </span><span class="tag">&lt;p&gt;</span><span class="pln">First of all, tell us your name and age.</span><span class="tag">&lt;/p&gt;</span><span class="pln">
  </span><span class="tag">&lt;div&gt;</span><span class="pln">
    </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"fname"</span><span class="tag">&gt;</span><span class="pln">First name:</span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"fname"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div&gt;</span><span class="pln">
    </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"lname"</span><span class="tag">&gt;</span><span class="pln">Last name:</span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"lname"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">
  </span><span class="tag">&lt;div&gt;</span><span class="pln">
    </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"age"</span><span class="tag">&gt;</span><span class="pln">Age:</span><span class="tag">&lt;/label&gt;</span><span class="pln">
    </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"age"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
  </span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/form&gt;</span></pre>

<p>
	بالنسبة لشيفرة CSS فمعظمها معروفة ماعدا استخدام الخاصية <a href="https://wiki.hsoub.com/CSS/display" rel="external"><code>display</code></a>. إذ ضبطت طريقة عرض العناصر <code>&lt;form&gt;</code> و <code>&lt;div&gt;</code> و <code>&lt;label&gt;</code> و <code>&lt;input&gt;</code> لتظهر على شكل جدول وصفوف في جدول وخلايا على الترتيب. ستظهر كل العناصر مبدئيًا كما لو أنها ضمن جدول معياري مما يجعل العناوين وعناصر الدخل على نفس السوية تلقائيًا. كل ما علينا فعله بعد ذلك تغيير الأبعاد قليلًا وضبط الهوامش وغير ذلك ليبدو مظهر العناصر أفضل.
</p>

<p>
	لاحظ كيف طبقنا قاعدة التنسيق <code>;display: table-caption</code> على الفقرة النصية التي تمثل العنوان لتبدو وكأنها عنوان جدول، وكذلك القاعدة <code>;caption-side: bottom</code> كي يظهر عنوان الجدول في الأسفل لأجل التنسيق فقط حتى لو كانت الفقرة قبل عناصر الإدخال <code>&lt;input&gt;</code> في الشيفرة المصدرية.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3747_29" style=""><span class="pln">html </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

form </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> table</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

form div </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> table-row</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

form label</span><span class="pun">,</span><span class="pln">
form input </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> table-cell</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin-bottom</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

form label </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">200px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">padding-right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5%</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">text-align</span><span class="pun">:</span><span class="pln"> right</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

form input </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">300px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

form p </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> table-caption</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">caption-side</span><span class="pun">:</span><span class="pln"> bottom</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">300px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#999</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">font-style</span><span class="pun">:</span><span class="pln"> italic</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	إليك نتيجة الشيفرة السابقة:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/poBoEwp?default-tab=result" style="width: 100%;" title="css-layout-11">See the Pen css-layout-11 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<p>
	<strong>ملاحظة</strong>: لن يُغطي موضوع تخطيط الجدول أكثر كونه تقنية تخطيط قديمة.
</p>

<h2 id="-10">
	التخطيط متعدد الجداول
</h2>

<p>
	تزودنا وحدة التخطيط متعدد الجداول في CSS بآلية لترتيب المحتوى ضمن أعمدة كما تُكتب الأعمدة في صحيفة. وعلى الرغم من أن قراءة الأعمدة أقل فائدة في صفحات ويب لأن الزائر يُضطر إلى تمرير المحتوى إلى الأعلى والأسفل باستمرار، لكن تقنية ترتيب المحتوى ضمن أعمدة تبقى مهمة بحد ذاتها.
</p>

<p>
	ولكي نحول كتلة إلى حاوية متعددة الأعمدة، نستخدم الخاصية <a href="https://wiki.hsoub.com/CSS/column-count" rel="external"><code>column-count</code></a> التي تخبر المتصفح كم عدد الأعمدة التي نحتاجها أو الخاصية <a href="https://wiki.hsoub.com/CSS/column-width" rel="external"><code>column-width</code></a> التي تخبر المتصفح أن يملأ الحاوية بأكبر عدد ممكن من الأعمدة ذات الاتساع المحدد.
</p>

<p>
	نبدأ في مثالنا التالي بشيفرة HTML ضمن عنصر الحاوية <code>&lt;div&gt;</code> الذي يمتلك الصنف <code>container</code>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3747_31" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"container"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;h1&gt;</span><span class="pln">Multi-column Layout</span><span class="tag">&lt;/h1&gt;</span><span class="pln">

  </span><span class="tag">&lt;p&gt;</span><span class="pln">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
    aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
    pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at
    ultricies tellus laoreet sit amet. Sed auctor cursus massa at porta.
  </span><span class="tag">&lt;/p&gt;</span><span class="pln">

  </span><span class="tag">&lt;p&gt;</span><span class="pln">
    Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada
    ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed
    est. Nam id risus quis ante semper consectetur eget aliquam lorem.
  </span><span class="tag">&lt;/p&gt;</span><span class="pln">

  </span><span class="tag">&lt;p&gt;</span><span class="pln">
    Vivamus tristique elit dolor, sed pretium metus suscipit vel. Mauris
    ultricies lectus sed lobortis finibus. Vivamus eu urna eget velit cursus
    viverra quis vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum
    sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
    mus.
  </span><span class="tag">&lt;/p&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	أسندنا القيمة <code>200px</code> للخاصية <code>column-width</code> كي ندفع المتصفح إلى إنشاء أكبر عدد ممكن من الأعمدة ذات الاتساع 200 بكسل ضمن الحاوية، وسيجري تقاسم أية مساحات فارغة زائدة بين الأعمدة.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3747_33" style=""><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">column-width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">200px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وإليك نتيجة الكود السابق:
</p>

<p>
	<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/HsoubAcademy/embed/MWRWjvG?default-tab=result" style="width: 100%;" title="css-layout-12">See the Pen css-layout-12 by Hsoub Academy (@HsoubAcademy) on CodePen.</iframe>
</p>

<h2 id="-11">
	الخلاصة
</h2>

<p>
	ناقشنا في هذا المقال جميع تقنيات تخطيط صفحات الويب التي يجدر معرفتها بصورة موجزة، وسنتابع الحديث عن هذه التقنيات بالتفصيل وحالات استخدامها المختلفة مقالات أخرى.
</p>

<p>
	ترجمة -وبتصرف- للمقال: <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Introduction" rel="external nofollow">Introduction to CSS layout</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AE%D8%B7%D9%88%D8%B7-%D8%A7%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%85%D8%B9-css-r2222/" rel="">استخدام خطوط الكتابة في الويب مع CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">تعرف على أساسيات لغة CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%AA%D8%AE%D8%B7%D9%8A%D8%B7-%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D8%B6%D8%A8%D8%B7-%D9%85%D8%AD%D8%A7%D8%B0%D8%A7%D8%A9-%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-css-r1050/" rel="">التحكم في تخطيط الصفحة وضبط محاذاة العناصر في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D9%82%D9%8A%D8%A7%D8%B3-%D9%88%D8%A7%D9%84%D9%82%D9%8A%D9%85-%D9%81%D9%8A-css-r2161/" rel="">وحدات القياس والقيم في CSS</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2238</guid><pubDate>Sat, 02 Mar 2024 12:02:01 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x62E;&#x637;&#x648;&#x637; &#x627;&#x644;&#x643;&#x62A;&#x627;&#x628;&#x629; &#x641;&#x64A; &#x627;&#x644;&#x648;&#x64A;&#x628; &#x645;&#x639; CSS</title><link>https://academy.hsoub.com/programming/css/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AE%D8%B7%D9%88%D8%B7-%D8%A7%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%85%D8%B9-css-r2222/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_01/------CSS.png.45b347093445be06747d15a6eaad2087.png" /></p>
<p>
	تحدثنا في <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%88%D8%AE%D8%B7%D9%88%D8%B7-%D8%A7%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D9%81%D9%8A-css-r2211/" rel="">مقال سابق</a> عن التنسيقات الأساسية للنصوص وخطوط الكتابة في CSS، وسنتعمق في مقالنا هذا في استكشاف خطوط الكتابة المستخدمة في الويب وتفاصيلها، وكيفية استخدام خطوط مخصصة في صفحاتك لتجعلها أكثر تنوعًا وخصوصية.
</p>

<p>
	ننصحك قبل إكمال قراءة المقال أن تطلع على <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">أساسيات لغة HTML</a> ومقال <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%88%D8%AE%D8%B7%D9%88%D8%B7-%D8%A7%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D9%81%D9%8A-css-r2211/" rel="">التنسيقات الأساسية للنصوص وخطوط الكتابة في CSS</a>.
</p>

<h2 id="">
	مراجعة سريعة لعائلات خطوط الكتابة
</h2>

<p>
	يمكن التحكم بالخط المستخدم في كتابة محتوى HTML باستخدام الخاصية <a href="https://wiki.hsoub.com/CSS/font-family" rel="external"><code>font-family</code></a> التي تأخذ اسم عائلة خط واحد أو أكثر كقيم لها. وبهذا يبحث المتصفح عند عرض صفحة الويب ضمن قائمة الخطوط المتوفرة في نظام التشغيل حتى يجد العائلة المطلوبة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_7125_7" style=""><span class="pln">p </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> Helvetica</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Trebuchet MS"</span><span class="pun">,</span><span class="pln"> Verdana</span><span class="pun">,</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تعمل هذه الطريقة دون مشاكل، لكن خيارات المطورين محدودة عادةً؛ فهنالك عدد محدود جدًا من الخطوط التي يمكن أن تضمن وجودها في جميع أنظمة التشغيل والتي تُعرف <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%88%D8%AE%D8%B7%D9%88%D8%B7-%D8%A7%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D9%81%D9%8A-css-r2211/" rel="">بخطوط الويب الآمنة</a>. لهذا بإمكانك وضع قائمة من الخطوط التي تشاء تتبعها بالبدائل الآمنة ومن ثم الخط الافتراضي لنظام التشغيل، لكن سيزيد ذلك طبعًا حمل العمل نظرًا للاختبارات المطلوبة للتأكد من عمل تصميمك وفقًا لكل خط تضعه.
</p>

<h2 id="-1">
	خطوط الويب
</h2>

<p>
	هناك بديلٌ يعمل جيدًا ويعتمد على CSS التي تسمح بتخصيص ملفات لخطوط كتابة تجدها على الويب، بحيث يمكنك تنزيلها واستخدامها مع موقعك، ويعني ذلك أن جميع المتصفحات التي تدعم ميزة CSS هذه ستعرض المحتوى بالخط الذي اخترته تمامًا.
</p>

<p>
	نستخدم أولًا الخاصية <a href="https://wiki.hsoub.com/CSS/@font-face" rel="external"><code>@font-face</code></a> في بداية ملف CSS، وتحدد ملف أو ملفات الخطوط التي ينبغي تنزيلها:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3946_10" style=""><span class="pun">@</span><span class="pln">font-face </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> </span><span class="str">"myFont"</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">src</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">url</span><span class="pun">(</span><span class="str">"myFont.woff2"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ثم نستخدم بعد ذلك اسم عائلة الخط التي خصصناها ضمن <code>font-face@</code> كي نطبق الخط المخصص أينما نشاء وبالطريقة التقليدية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3946_12" style=""><span class="pln">html </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> </span><span class="str">"myFont"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Bitstream Vera Serif"</span><span class="pun">,</span><span class="pln"> serif</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	قد تغدو هذه الطريقة أعقد قليلًا، وهذا ما سنناقشه تاليًا.
</p>

<p>
	إليك بعض النقاط المهمة التي ينبغي تذكرها جيدًا:
</p>

<ol>
	<li>
		لا تكون ملفات الخطوط مجانية غالبًا، وعليك أن تدفع ثمنها أو أن تخضع لشروط رخصة الاستخدام كأن تشير إلى صاحب الخط في شيفرتك أو موقعك، لهذا لا تحاول سرقة الخطوط واستخدامها دون الإشارة الواضحة إلى مصدرها.
	</li>
	<li>
		تدعم كل المتصفحات الرئيسية ملفات الخطوط من نوع WOFF/WOFF2 (خطوط ويب مفتوحة التنسيق بنسختيها الأولى والثانية)، وتدعم كذلك المتصفحات الأقدم مثل IE9 (المنتشر منذ عام 20111) ملفات الخطوط WOFF.
	</li>
	<li>
		تدعم خطوط WOFF2 مواصفات TrueType و OpenType كاملةً بما في ذلك الخطوط المتغيرة variable fonts والخطوط الملونة chromatic fonts ومجموعات الخطوط font collections.
	</li>
	<li>
		طريقة ترتيب ملفات الخطوط مهمة، فلو زوّدت المتصفح بعدة ملفات للخطوط كي ينزّلها، سيختار المتصفح أول ملف قادر على تفسيره، لهذا لا بُد من وضع الخطوط التنسيقات المفضّلة في البداية -أي WOFF2- تليها التنسيقات الأقدم. فعندما لا يفهم المتصفح تنسيقًا، سينتقل إلى التنسيق الذي يليه في القائمة.
	</li>
	<li>
		إذا أردت العمل مع المتصفحات القديمة، عليك تضمين التنسيق EOT (النمط المفتوح المضمّن Embedded Opentype) أو التنسيق TrueType Font<br>
		-أو اختصارًا TTF- أو تنسيق SVG. وسنتعلم في هذا المقال استخدام Fontsquirrel Webfont Generator للحصول على الملفات المطلوبة.
	</li>
</ol>

<p>
	<strong>ملاحظة</strong> يمكنك استخدام محرّر خطوط فايرفوكس <a href="https://firefox-source-docs.mozilla.org/devtools-user/page_inspector/how_to/edit_fonts/index.htm" rel="external nofollow">Firefox Font Editor</a> لفحص وتغيير الخطوط المستخدمة في صفحتك فيما ومعرفة إن كانت خطوط ويب صالحة أم لا.
</p>

<h2 id="-2">
	تطبيق عملي: مثال عن استخدام خطوط ويب
</h2>

<p>
	سنحاول بناء مثال توضيحي عن استخدام خطوط ويب. من الصعب طبعًا توضيح ذلك من خلال مثال تفاعلي مدمج، لهذا نطلب منك اتباع الخطوات التي نوردها تاليًا كي تفهم فكرة العملية.
</p>

<p>
	حمّل الملفين <a href="https://github.com/mdn/learning-area/blob/main/css/styling-text/web-fonts/web-font-start.html" rel="external nofollow">web-font-start.html</a> و <a href="https://github.com/mdn/learning-area/blob/main/css/styling-text/web-fonts/web-font-start.css" rel="external nofollow">web-font-start.css</a> واستخدمهما بمثابة نقطة انطلاق، ثم ضِف شيفرتك ضمنها (اطلع على <a href="https://mdn.github.io/learning-area/css/styling-text/web-fonts/web-font-start.html" rel="external nofollow">المثال المباشر</a>). انسخ الملفين السابقين إلى مجلد جديد على حاسوبك. ستجد في الملف بعض قواعد CSS التي تنسّق التخطيط الأساسي وتنسيق الكتابة في المثال.
</p>

<h3 id="-3">
	إيجاد خطوط للكتابة
</h3>

<p>
	نستخدم في مثالنا خطين من خطوط الويب، أولهما للعناوين والآخر لمتن الصفحة، وعلينا بدايةً إيجاد الملفات التي تضم هذه الخطوط. تُصنع الخطوط من قبل مختصين وتُخزّن ضمن ملفات بتنسيقات مختلفة، وستجد الخطوط ضمن المواقع التالية عمومًا:
</p>

<ul>
	<li>
		موزعي الخطوط المجانية: وهي مواقع تتيح للمستخدمين تنزيل خطوط مجانية (مع وجود بعض شروط لترخيص الاستخدام أحيانًا، كأن تشير إلى مصمم الخط). من هذه المواقع نجد: <a href="https://www.fontsquirrel.com/" rel="external nofollow">Font Squirrel</a>, [dafont و <a href="https://everythingfonts.com/" rel="external nofollow">Everything Fonts</a>.
	</li>
	<li>
		موزعي الخطوط المدفوعة: وهي مواقع تقدم خطوطًا مدفوعة الثمن مثل <a href="https://www.fonts.com/" rel="external nofollow">fonts.com</a> أو <a href="https://www.myfonts.com/" rel="external nofollow">myfonts.com </a>، ويمكنك أيضًا شراء الخطوط من منتجيها مباشرةً، مثل <a href="https://www.linotype.com/" rel="external nofollow">Linotype</a>، أو <a href="https://www.monotype.com/" rel="external nofollow">Monotype</a>، أو <a href="https://www.exljbris.com/" rel="external nofollow">Exljbris</a>.
	</li>
	<li>
		خدمات خطوط الكتابة عبر الإنترنت: وهي مواقع تخزّن الخطوط وتسمح لك باستخدامها، مما يسهل العملية برمتها.
	</li>
</ul>

<p>
	ابحث الآن عن بعض الخطوط في موقع <a href="https://www.fontsquirrel.com/" rel="external nofollow">Font Squirrel</a> وانتقي خطين الأول للعناوين (لا بأس بالخطين nice display أو slab serif font) والآخر أقل لمعانًا وأوضح قراءةً للفقرات. انقر على زر التنزيل عندما تجد الخطوط المناسبة وخزّن الملفات ضمن المجلد نفسه الذي وضعت فيه ملفات الشيفرة. لا تكترث إذا كانت الملفات بتنسيق TTF أو تنسيق Open Type Fonts -أو اختصارًا OTF.
</p>

<p>
	فُكَّ ضغط الملفات من حزمتي الخطوط، إذ توزّع ملفات الخطوط عادةً مثل ملفات مضغوطة ZIP تضم ملفات الخطوط ومعلومات الترخيص. وقد تجد ضمن الحزمة أكثر من خط، إذ توزّع بعض الخطوط مثل عائلة واحدة مع عدة توزيعات، مثل الخط الرفيع أو النحيف thin والمتوسط medium والغامق bold والمائل italic والمائل النحيف thin italic وهكذا. ولا نريد منك في هذا التطبيق سوى اختيار خطين مناسبين.
</p>

<p>
	<strong>ملاحظة</strong>: يمكنك في موقع Font Squirrel أن تختار الخطوط من خلال الفئات المتوفرة تحت قسم "إيجاد الخطوط Find fonts" كي تقلل عدد الخيارات المتاحة.
</p>

<h3 id="-4">
	توليد الشيفرة المطلوبة
</h3>

<p>
	نحتاج الآن إلى توليد الشيفرة اللازمة وتنسيقات الخط، لهذا اتبع التعليمات التالية لكل خط:
</p>

<ol>
	<li>
		تأكد من أنك حققت متطلبات الترخيص، إذا كنت ستستخدم الخط في مشروع تجاري أو مشروع ويب.
	</li>
	<li>
		انتقل إلى موّلد خطوط الويب <a href="https://www.fontsquirrel.com/tools/webfont-generator" rel="external nofollow">Webfont Generator</a> من Fontsquirrel.
	</li>
	<li>
		ارفع ملفات الخطوط باستخدام زر "Upload Fonts".
	</li>
	<li>
		فعّل زر التحقق الذي يحمل العنوان "Yes, the fonts I'm uploading are legally eligible for web embedding".
	</li>
	<li>
		انقر زر "Download your kit" لتنزّل مجموعتك.
	</li>
</ol>

<p>
	بعد إكمال المولّد معالجة الملفات، ينبغي أن تكون الملفات جاهزة للتنزيل بتنسيق ZIP، نزّلها في نفس مجلد CSS و HTML، وإذا أردت دعم المتصفحات القديمة، اختر النمط "خبير Expert" في موّلد خطوط ويب، ثم اختر التنسيقات SVG و EOT و TTF قبل تنزيل المجموعة.
</p>

<p>
	تحدد خدمات ويب التي تولّد الخطوط حجمًا محددًا للملفات، لهذا فكّر باستخدام أحد الأدوات التالية:
</p>

<ol>
	<li>
		<a href="https://github.com/bramstein/sfnt2woff-zopfli" rel="external nofollow">sfnt2woff-zopfli</a> للتحويل من ttf إلى woff.
	</li>
	<li>
		<a href="https://fontforge.org/" rel="external nofollow">fontforge</a> للتحويل من ttf إلى svg.
	</li>
	<li>
		<a href="https://people.apache.org/~clay/batik/ttf2svg.html" rel="external nofollow">batik ttf2svf</a> للتحويل من ttf إلى svg.
	</li>
	<li>
		<a href="https://github.com/google/woff2" rel="external nofollow">woff2</a> للتحويل من ttf إلى woff2.
	</li>
</ol>

<h3 id="-5">
	استخدام الشيفرة في مثالنا
</h3>

<p>
	استخرج الملفات من الملف المضغوط الذي نزّلته، وستجد ضمن المجلد الناتج العناصر المفيدة التالية:
</p>

<ul>
	<li>
		نسختين من كل خط على شكل ملفين يحملان اللاحقتين <code>woff.</code> و <code>woff2.</code>
	</li>
	<li>
		ملف HTML تجريبي لكل خط. حمّل هذه الملفات في متصفحك لترى كيف سيبدو الخط في السياقات المختلفة.
	</li>
	<li>
		ملف تنسيق <code>stylesheet.css</code> يضم شيفرة <code>font-face@</code> الموّلدة والتي تحتاجها.
	</li>
</ul>

<p>
	لاستخدام الخطوط في مثالك، اتبع الخطوات التالية:
</p>

<ol>
	<li>
		أعد تسمية المجلد المستخرج من الملف المضغوط باسم بسيط سهل التذكر مثل "fonts".
	</li>
	<li>
		افتح الملف "stylesheet.css" وانسخ القاعدة <code>font-face@</code> إلى ملف التنسيق "web-font-start.css" الذي أنشأته، وتذكر أن تكون في أعلى الملف وقبل أي قاعدة CSS أخرى، إذ لا بد من إدراج الخطوط قبل أن تتمكن من استخدامها في موقعك.
	</li>
	<li>
		تشير كل دالة من الدوال <code>()url</code> إلى ملف خط نريد إدراجه ضمن ملف CSS، ولا بد من التأكد من صحة المسار إلى ملف الخط المطلوب، لهذا أضِف العبارة <code>/fonts</code> قبل بداية كل مسار (عدّل ما تراه مناسبًا).
	</li>
	<li>
		يمكنك الآن استخدام هذه الخطوط مثل أي خط ويب آمن أو خط من خطوط نظام التشغيل. إليك مثالًا:
	</li>
</ol>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3946_14" style=""><span class="pun">@</span><span class="pln">font-face </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> </span><span class="str">"zantrokeregular"</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">src</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">url</span><span class="pun">(</span><span class="str">"fonts/zantroke-webfont.woff2"</span><span class="pun">)</span><span class="pln"> format</span><span class="pun">(</span><span class="str">"woff2"</span><span class="pun">),</span><span class="pln">
    </span><span class="kwd">url</span><span class="pun">(</span><span class="str">"fonts/zantroke-webfont.woff"</span><span class="pun">)</span><span class="pln"> format</span><span class="pun">(</span><span class="str">"woff"</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">font-weight</span><span class="pun">:</span><span class="pln"> normal</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">font-style</span><span class="pun">:</span><span class="pln"> normal</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<pre class="ipsCode">font-family: "zantrokeregular", serif;
</pre>

<p>
	ينبغي أن ينتهي بك المطاف إلى صفحة تجريبية تعرض بعض الخطوط الجميلة، ولأن الخطوط المختلفة قد صُممت بقياسات مختلفة، قد يكون عليك تعديل حجمها والفراغات فيما بين الأحرف والكلمات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="141459" href="https://academy.hsoub.com/uploads/monthly_2024_01/01_cust_fonts.png.483336e681fac602e552f8e035235593.png" rel=""><img alt="01 cust fonts" class="ipsImage ipsImage_thumbnailed" data-fileid="141459" data-ratio="64.80" data-unique="dkc2bd9i3" style="width: 500px; height: auto;" width="500" src="https://academy.hsoub.com/uploads/monthly_2024_01/01_cust_fonts.png.483336e681fac602e552f8e035235593.png"> </a>
</p>

<p>
	<strong>ملاحظة</strong>: إذا واجهتك أية مشاكل في تنفيذ الأمر بالشكل الصحيح، قارن بين نسختك مع ملفاتنا المكتملة <a href="https://github.com/mdn/learning-area/blob/main/css/styling-text/web-fonts/web-font-finished.html" rel="external nofollow">web-font-finished.html</a> و <a href="https://github.com/mdn/learning-area/blob/main/css/styling-text/web-fonts/web-font-finished.css" rel="external nofollow">web-font-finished.css</a>. كما يمكنك <a href="https://github.com/mdn/learning-area/tree/main/css/styling-text/web-fonts" rel="external nofollow">تحميل الشيفرة من غيت هب GitHub</a> أو <a href="https://mdn.github.io/learning-area/css/styling-text/web-fonts/web-font-finished.html" rel="external nofollow">تشغيل المثال المنتهي مباشرةً</a>.
</p>

<h2 id="-6">
	استخدام خدمات خطوط الكتابة عبر الإنترنت
</h2>

<p>
	تخزّن خطوط الكتابة عبر الإنترنت خطوط الكتابة وتقدمها لك دون الحاجة إلى استخدام شيفرة <code>font-face@</code> فكل ما يتطلبه الأمر عادةً هو إدراج سطر بسيط أو اثنين من الشيفرة ضمن موقعك حتى يعمل كل شيء على ما يرام. من الأمثلة على هذه الخدمات نجد <a href="https://fonts.adobe.com/" rel="external nofollow">Adobe Fonts</a> و <a href="https://www.typography.com/webfonts" rel="external nofollow">Cloud.typography</a>. تعتمد معظم هذه الخدمات على مبدأ الاشتراك ما عدا <a href="https://fonts.google.com/" rel="external nofollow">Google Fonts</a> فهو استثناء عنها كونه خدمة مجانية وخاصة لأعمال الاختبارات السريعة وكتابة الأمثلة التوضيحية Demos.
</p>

<p>
	من السهل استخدام معظم هذه الخدمات، لهذا لن نتحدث عنها مطوّلًا، بل سنلقي نظرة على خدمة Google Fonts كي تفهم الفكرة. استخدم لهذا الغرض الملفين "web-font-start.html" و "web-font-start.css" أيضًا بمثابة نقطة انطلاق.
</p>

<ol>
	<li>
		انتقل موقع <a href="https://fonts.google.com/" rel="external nofollow">Google Fonts</a>.
	</li>
	<li>
		ابحث عن خط الكتابة الذي تفضله، أو استخدم المرشحات filters أعلى الصفحة لعرض أنواع الخطوط التي ترغب في انتقاء بعضها، ثم اختر خطين منها.
	</li>
	<li>
		لاختيار عائلة خط، انقر على زر العرض ثم انقر على الزر ⊕ إلى جانب الخط.
	</li>
	<li>
		عندما تختار عائلات الخطوط، انقر على زر عرض عائلات الخطوط المختارة "View your selected families" في أعلى يمين الصفحة.
	</li>
	<li>
		انسخ سطر HTML الذي يظهر على الشاشة ثم الصقه في ترويسة ملف HTML. ضعه فوق العنصر <a href="https://wiki.hsoub.com/HTML/link" rel="external"><code>&lt;link&gt;</code></a> الموجود أصلًا كي يجري إدراج الخط قبل أن تستخدمه بواسطة CSS.
	</li>
	<li>
		عليك الآن نسخ تصريحات CSS الموجودة ضمن ملف CSS كما تراه ملائمًا حتى تُطبّق الخط على عناصر HTML.
	</li>
</ol>

<p>
	<strong>ملاحظة</strong>: ستجد نسخةً مكتملةً على <a href="https://github.com/mdn/learning-area/blob/main/css/styling-text/web-fonts/google-font.html" rel="external nofollow">google-font.html</a> و <a href="https://github.com/mdn/learning-area/blob/main/css/styling-text/web-fonts/google-font.css" rel="external nofollow">google-font.css</a> إذا أردت التحقق من نسختك بالمقارنة مع نسختنا (<a href="https://mdn.github.io/learning-area/css/styling-text/web-fonts/google-font.html" rel="external nofollow">ألق نظرةً على عملها</a>).
</p>

<h2 id="fontface">
	تفاصيل أكثر عن قاعدة font-face@
</h2>

<p>
	لنستكشف صياغة <code>font-face@</code> التى ولّدها موقع Fontsquirrel، ستبدو إحدى مجموعات القواعد على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3946_17" style=""><span class="pun">@</span><span class="pln">font-face </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> </span><span class="str">"zantrokeregular"</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">src</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">url</span><span class="pun">(</span><span class="str">"zantroke-webfont.woff2"</span><span class="pun">)</span><span class="pln"> format</span><span class="pun">(</span><span class="str">"woff2"</span><span class="pun">),</span><span class="pln">
    </span><span class="kwd">url</span><span class="pun">(</span><span class="str">"zantroke-webfont.woff"</span><span class="pun">)</span><span class="pln"> format</span><span class="pun">(</span><span class="str">"woff"</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">font-weight</span><span class="pun">:</span><span class="pln"> normal</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">font-style</span><span class="pun">:</span><span class="pln"> normal</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لنرى ما هو دور كل تصريح:
</p>

<ul>
	<li>
		<code>font-family</code>: يُخصّص هذا التصريح لاختيار اسم مناسب يشير إلى الخط، وقد يكون أي شيء تريده طالما أنك تستخدمه بنفس الطريقة ضمن ملف CSS.
	</li>
	<li>
		<code>src</code>: يُخصص هذا التصريح لتحديد المسار إلى موقع ملف الخط الذي تريد إدراجه ضمن شيفرة CSS (الجزء <code>url</code> منه)، ولتحديد تنسيق ملف الخط (الجزء <code>format</code> منه)، أما الجزء الأخر في كل حالة فهو اختياري لكنه تصريح مفيد لأنه يسمح للمتصفحات أن تحدد بسرعة أي خط يمكنها استخدامه. يمكن أن نبني أيضًا قائمةً من التصريحات تفصل بينها الفاصلة <code>,</code>، ومن المفيد ترتيب هذه التصريحات ابتداءً من التنسيق الأكثر تفضيلًا مثل WOFF2، لأن المتصفح سيحاول تطبيق التصريحات على نحوٍ متسلسل ابتداءً من التصريح الأول.
	</li>
	<li>
		<a href="https://wiki.hsoub.com/CSS/font-weight" rel="external"><code>font-weight</code></a>/<a href="https://wiki.hsoub.com/CSS/font-style" rel="external"><code>font-style</code></a>: يخصص هذان التصريحان سماكة الخط إضافةً إلى كونه مائلًا أو لا؛ فإذا أدرجت عدة سماكات للخط نفسه، يمكنك حينها تخصيص سماكة ونمط محددين ثم استخدام الخاصيتين
	</li>
	<li>
		<code>font-weight</code>/<code>font-style</code> للتبديل بين السماكات والأنماط المختلفة الأخرى.
	</li>
</ul>

<p>
	<strong>ملاحظة</strong>: يمكنك تخصيص قيم محددة للخاصيتين <a href="https://wiki.hsoub.com/CSS/font-variant" rel="external"><code>font-variant</code></a> و <a href="https://wiki.hsoub.com/CSS/font-stretch" rel="external"><code>font-stretch</code></a> من أجل خطوط الويب، كما يمكنك -في المتصفحات الحديثة- تخصيص قيمة للخاصية <a href="https://wiki.hsoub.com/CSS/@font-face/unicode-range" rel="external"><code>unicode-range</code></a> وهي مجال محدد من المحارف التي ترغب في استخدامها خارج مجموعة محارف خط الويب وذلك في المتصفحات التي تدعم ذلك، وستُنزّل حينها هذه المحارف فقط تحاشيًا لتنزيل ما لا حاجة له.
</p>

<h2 id="-7">
	الخطوط المتغيرة
</h2>

<p>
	توجد تقنية جديدة للخطوط تدعمها المتصفحات وتُدعى <a href="https://academy.hsoub.com/programming/css/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%84%D9%84%D8%AE%D8%B7%D9%88%D8%B7-%D8%A7%D9%84%D9%82%D8%A7%D8%A8%D9%84%D8%A9-%D9%84%D9%84%D8%AA%D8%BA%D9%8A%D9%8A%D8%B1-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r1506/" rel="">الخطوط المتغيرة variable fonts</a>، وهي خطوط تسمح بتشارك عدة توزيعات لواجهة خط الكتابة في ملف واحد بدلًا من وجود ملف مستقل لكل اتساع أو سماكة أو نمط. هذا الموضوع متقدم ولن نناقشه في مقالنا.
</p>

<h2 id="-8">
	الخلاصة
</h2>

<p>
	بهذا المقال نكون قد أنهينا سلسلة المقالات التي تتعلق بأساسيات تنسيق النصوص باستخدام CSS. لا تتردد في المشاركة وطرح الأسئلة حول النقاط التي تعتقد أنها غامضة في قسم التعليقات أسفل كل مقال من مقالات السلسلة.
</p>

<p>
	ترجمة -وبتصرف- لمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/Styling_text/Web_fonts" rel="external nofollow">Web fonts</a>.
</p>

<h2 id="-9">
	اقرأ المزيد
</h2>

<ul>
	<li>
		المقال السابق <a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2221/" rel="">تنسيق الروابط باستخدام CSS</a>.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D9%86%D8%B5%D9%88%D8%B5-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r251/" rel="">تنسيق نصوص صفحات الويب باستخدام CSS</a>.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%81%D9%8A-css-r1054/" rel="">التنسيقات الأساسية للعناصر في CSS</a>.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">أساسيات لغة CSS</a>.
	</li>
</ul>
]]></description><guid isPermaLink="false">2222</guid><pubDate>Mon, 22 Jan 2024 12:09:02 +0000</pubDate></item><item><title>&#x62A;&#x646;&#x633;&#x64A;&#x642; &#x627;&#x644;&#x631;&#x648;&#x627;&#x628;&#x637; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; CSS</title><link>https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2221/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_01/---CSS.png.541fe688fb5cfe3f428ca4f5b8c9ab5c.png" /></p>
<p>
	نناقش في هذا المقال طريقة تنسيق الروابط في لغة CSS ونعرفك على طرق مختلفة لتحسين مظهرها على موقع الويب الخاص بك، ونعرفك على الحالات المختلفة للروابط وطريقة تنسيقها بفعالية أكبر بالاستفادة من آلية استخدام <a href="https://academy.hsoub.com/programming/css/5-%D9%81%D8%A6%D8%A7%D8%AA-%D8%B2%D8%A7%D8%A6%D9%81%D8%A9-pseudo-class-%D9%8A%D8%AC%D8%A8-%D8%B9%D9%84%D9%8A%D9%83-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87%D8%A7-%D9%81%D9%8A-css-r189/" rel="">الأصناف الزائفة pseudo classes</a> في CSS، ونناقش تنسيق الروابط في المواضع المألوفة المختلفة مثل روابط قوائم التنقل، والتبويبات الفرعية tabs.
</p>

<p>
	ننصحك قبل إكمال قراءة المقال أن تطلع على <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">أساسيات لغة HTML</a> ومقال <a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%A6%D9%85-%D9%81%D9%8A-css-r2220/" rel="">التنسيقات الأساسية للنصوص وخطوط الكتابة في CSS</a>.
</p>

<h2 id="">
	لنلق نظرة على بعض الروابط التشعبية
</h2>

<p>
	اطلعنا في <a href="https://academy.hsoub.com/programming/html/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A7%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D8%A7%D9%84%D8%AA%D8%B4%D8%B9%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-html-r1755/" rel="">مقال سابق</a> على أفضل الطرق المتبعة في إنشاء وإضافة الروابط التشعبية إلى صفحات HTML، وسنتابع في هذا المقال استعراض أفضل الممارسات المتبعة في تنسيق هذه الروابط.
</p>

<h3 id="-1">
	حالة الرابط
</h3>

<p>
	لا بد قبل كل شيء من فهم مصطلح "حالة الرابط link state" والذي يدل على الحالات المختلفة التي يكون عليها الرابط. إذ يجري تنسيق الرابط وفقًا لحالته باستخدام <a href="https://academy.hsoub.com/programming/css/5-%D9%81%D8%A6%D8%A7%D8%AA-%D8%B2%D8%A7%D8%A6%D9%81%D8%A9-pseudo-class-%D9%8A%D8%AC%D8%A8-%D8%B9%D9%84%D9%8A%D9%83-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87%D8%A7-%D9%81%D9%8A-css-r189/" rel="">الأصناف الزائفة</a>:
</p>

<ul>
	<li>
		حالة الرابط <strong>Link</strong>: وهي الحالة التي يكون فيها للرابط وجهة (وليس مجرد مربط anchor باسم محدد). تُنسّق هذه الحالة من خلال الصنف الزائف <a href="https://wiki.hsoub.com/CSS/:link" rel="external"><code>link:</code></a>.
	</li>
	<li>
		حالة رابط جرت زيارته <strong>Visited</strong>: وهي الحالة التي نُقر فيها على الرابط وخزّن ذلك في ذاكرة المتصفح. تُنسّق هذه الحالة باستخدام الصنف الزائف <a href="https://wiki.hsoub.com/CSS/:visited" rel="external"><code>visited:</code></a>.
	</li>
	<li>
		حالة رابط عند مرور مؤشر الفأرة <strong>Hover</strong>: تُنسّق هذه الحالة باستخدام الصنف الزائف <a href="https://wiki.hsoub.com/CSS/:hover" rel="external"><code>hover:</code></a>.
	</li>
	<li>
		إضافة أيقونات إلى الروابط حالة تركيز الدخول إلى الرابط <strong>Focus</strong>: وذلك من خلال الانتقال إليه عبر الضغط المتكرر على زر Tab في لوحة المفاتيح أو برمجيًا باستخدام <code>()HTMLElement.focus</code> وتُنسّق هذه الحالة باستخدام الصنف الزائف <a href="https://wiki.hsoub.com/CSS/:focus" rel="external"><code>focus:</code></a>.
	</li>
	<li>
		حالة الرابط الفعّال <strong>Active</strong>: وهي الحالة التي يُنقر فيها على الرابط وتُنسّق باستخدام الصنف الزائف <a href="https://wiki.hsoub.com/CSS/:active" rel="external"><code>:active</code></a>.
	</li>
</ul>

<h3 id="-2">
	التنسيقات الافتراضية
</h3>

<p>
	يعرض المثال التالي الطريقة التي يبدو عليها الرابط وطريقة سلوكه الافتراضي، إذ تقوم لغة CSS بتكبير حجم النص وتجعله في المنتصف كي يبرز ويصبح أكثر وضوحًا. ستتمكن في هذا المثال من مقارنة السلوك أو المظهر الافتراضي لروابطك مع سلوك ومظهر الروابط الأخرى المنسّقة باستخدام خاصيات CSS إضافية، إذ يكون للروابط ذات التنسيق الافتراضي الخصائص التالية:
</p>

<ul>
	<li>
		تحتوي خطوطًا أسفلها.
	</li>
	<li>
		تكون الروابط التي لم تُزر بعد زرقاء اللون.
	</li>
	<li>
		تكون الروابط التي جرت زيارتها بنفسجية اللون.
	</li>
	<li>
		يغيّر تحريك مؤشر الفأرة فوق الرابط أيقونة الفأرة إلى أيقونة على شكل يد.
	</li>
	<li>
		يحيط إطار بالروابط التي اكتسبت تركيز الدخل. يمكنك نقل التركيز على رابط في الصفحة بالضغط المتكرر على زر Tab (في نظام ماك لا بد من الضغط على زري Option و Tab معًا).
	</li>
	<li>
		تكون الروابط الفعالّة حمراء اللون. حاول أن تنقر وتستمر بالضغط على الرابط.
	</li>
</ul>

<p>
	تكون شيفرة HTML للرابط كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6259_7" style=""><span class="tag">&lt;p&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">A simple link</span><span class="tag">&lt;/a&gt;&lt;/p&gt;</span></pre>

<p>
	أما شيفرة CSS فهي كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_6259_9" style=""><span class="pln">p </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2rem</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">text-align</span><span class="pun">:</span><span class="pln"> center</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لتعطي النتيجة التالية:
</p>

<p style="text-align: center;">
	<img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="182015" data-ratio="33.02" data-unique="h2gco6mna" width="321" src="https://academy.hsoub.com/uploads/monthly_2026_04/image.png.3acfc3624758e50861fd5596dfba9bd7.png">
</p>

<p>
	<strong>ملاحظة</strong>: تنقلك جميع روابط الأمثلة إلى أعلى الصفحات التي تضمها، وتُستخدم الأجزاء الفارغة <code>"#"=href</code> لإنشاء أمثلة بسيطة والتأكد أن الأمثلة المعروضة والمحتواة ضمن إطار <code>&lt;iframe&gt;</code> تعمل جيدًا.
</p>

<p>
	بقيت هذه التنسيقات كما هي منذ الأيام الأولى للمتصفحات خلال تسعينات القرن الماضي، إذ يتوقع المستخدمون سلوك هذه الروابط بناءً على تلك الألوان وسيؤدي تغييرها إلى إرباك الكثيرين. ولا يعني هذا طبعًا التخلي عن تنسيق الروابط نهائيًا، بل عدم المغالاة في تنسيقها إلى درجة بعيدة عما هو متوقع، فعليك على الأقل أن:
</p>

<ul>
	<li>
		تستخدم خط أسفل الرابط فقط للرابط وليس لأية أغراض أخرى، وإن لم تشأ وضع هذا الخط حاول تظليل الرابط بطريقة أخرى.
	</li>
	<li>
		تمنح الرابط طريقةً يتفاعل فيها مع تمرير مؤشر الفأرة فوقه أو عندما ينتقل تركيز الدخل إليه، وأن تجد طريقةً مشابهةً ليتفاعل الرابط عند تفعيله.
	</li>
</ul>

<p>
	يمكنك تغيير أو إلغاء هذه التنسيقات باستخدام خاصيات CSS التالية:
</p>

<ul>
	<li>
		<a href="https://wiki.hsoub.com/CSS/color" rel="external"><code>color</code></a>: لتلوين نص الرابط.
	</li>
	<li>
		<a href="https://wiki.hsoub.com/CSS/cursor" rel="external"><code>cursor</code></a>: لتنسيق مؤشر الفأرة، ولا تحاول إلغاء هذا التنسيق ما لم يكن السبب وجيهًا.
	</li>
	<li>
		<a href="https://wiki.hsoub.com/CSS/outline" rel="external"><code>outline</code></a>: لتنسيق الإطار المحيط بالكتابة. والإطار أمر مشابهة للحواف <a href="https://wiki.hsoub.com/CSS/border" rel="external">borders</a>، إلا أن الحواف ستشغل مساحة من صندوق العنصر على عكس الإطار الذي يتوضّع فوق الخلفية فقط، وللإطار فائدة في تحسين شمولية الوصول، ولا ينبغي إلغاؤه ما لم تجد طريقة أخرى لتدل على رابط تركيز focused link.
	</li>
</ul>

<p>
	<strong>ملاحظة</strong>: لست مضطرًا إلى التقيد بالخاصيات السابقة فقط، بل يمكنك استخدام أية خاصيات تجدها مناسبة لتنسيق الروابط.
</p>

<h3 id="-3">
	تنسيق بعض الروابط
</h3>

<p>
	بعد أن اطلعنا على التنسيقات الافتراضية بشيء من التفصيل، سنلقي نظرةً على مجموعة من التنسيقات النمطية التي نتخذها بمثابة قاعدة انطلاق ثم نملؤها بالقواعد التي نريد:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3043_10" style=""><span class="pln">a </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">link </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">visited </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">focus </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">hover </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">active </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لترتيب القواعد في الشيفرة السابقة أهميته لأن تنسيقات الروابط تُبنى فوق بعضها بعضًا؛ إذ ستُطبّق مثلًا التنسيقات ضمن القاعدة الأولى على كل القواعد التي تليها، وعندما يُفعّل الرابط، يستجيب غالبًا إلى تمرير مؤشر الفأرة. لهذا، لو وضعت القواعد بترتيب خاطئ وحاولت تغيير نفس الخاصيات في كل قاعدة، فلن يعمل التنسيق كما تتوقع. إليك هذه العبارة لتتذكر الترتيب الصحيح لكتابة القواعد "<strong>L</strong>o<strong>V</strong>e <strong>F</strong>ears <strong>HA</strong>te" حيث يشير حرف L إلى حالة الرابط Link وحرف V إلى الحالة Visited …إلخ.
</p>

<p>
	لنضع الآن بعض التنسيقات ضمن القواعد التي رتبناها قبل قليل:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3043_12" style=""><span class="pln">body </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">300px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.2rem</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

p </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">line-height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.4</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

a </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">outline</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">link </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#6900ff</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">visited </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#a5c300</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">focus </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">text-decoration</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#bae498</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">hover </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">text-decoration</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#cdfeaa</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">active </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#6900ff</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> </span><span class="lit">#cdfeaa</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	إليك شيفرة HTML البسيطة التالية كي نطبّق عليها التنسيقات:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3043_14" style=""><span class="tag">&lt;p&gt;</span><span class="pln">
  There are several browsers available, such as </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">Mozilla Firefox</span><span class="tag">&lt;/a&gt;</span><span class="pln">,
  </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">Google Chrome</span><span class="tag">&lt;/a&gt;</span><span class="pln">, and </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">Microsoft Edge</span><span class="tag">&lt;/a&gt;</span><span class="pln">.
</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	ستكون النتيجة على النحو التالي:
</p>

<p style="text-align: center;">
	<img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="182016" data-ratio="39.94" data-unique="cmptl9baw" width="353" src="https://academy.hsoub.com/uploads/monthly_2026_04/image.png.da1947154a61e49be1f3fd5ce2a59141.png">
</p>

<p>
	ما الذي فعلناه إذًا؟ يبدو مظهر الروابط مختلفًا عن التنسيق النمطي، لكنه يقدّم تجربةً مماثلة يفهم من خلالها الزائر ما الذي يحدث:
</p>

<ul>
	<li>
		لن نناقش أول قاعدتين فهما واضحتان تمامًا.
	</li>
	<li>
		تستخدم القاعدة الثالثة المحدد <code>a</code> للتخلص من إطار الرابط، والذي يختلف التعامل معه من متصفح لآخر.
	</li>
	<li>
		استخدمنا بعد ذلك المحددين <code>a:link</code> و <code>a:visited</code> لضبط بعض التغييرات اللونية للروابط التي زارها المستخدم والتي لم يزرها بعد ليستطيع التمييز بينهما.
	</li>
	<li>
		استخدمنا في القاعدتين التاليتين المحددين <code>a:focus</code> و <code>a:hover</code> كي لا يظهر خط أسفل الروابط التي يتحرك مؤشر الفأرة فوقها أو تكتسب تركيز الدخل مع تغيير لون الخلفية.
	</li>
	<li>
		استخدمنا أخيرًا المحدد <code>a:active</code> لمنح الرابط لونًا معاكسًا عند تفعيله كي يظهر أن أمرًا مهمًا قد حدث.
	</li>
</ul>

<h2 id="-5">
	إضافة أيقونات إلى الروابط
</h2>

<p>
	من الممارسات الشائعة عند إنشاء الروابط تزويدها بأيقونة تشير إلى طبيعة المحتوى الذي يقود إليه كل رابط، لهذا سنلقي نظرةً على مثال بسيط يضيف أيقونة إلى رابط خارجي (يقود إلى موقع آخر). يبدو شكل هذه الأيقونة عادةً مثل سهم يشير إلى خارج الصندوق، وسنستخدم أيقونة من موقع <a href="https://icons8.com/icon/741/external-link" rel="external nofollow">icon8.com</a>.
</p>

<p>
	إليك شيفرة HTML و CSS التي ستساعدنا على عرض الفكرة:
</p>

<ul>
	<li>
		شيفرة HTML:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6259_12" style=""><span class="tag">&lt;p&gt;</span><span class="pln">
  For more information on the weather, visit our </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">weather page</span><span class="tag">&lt;/a&gt;</span><span class="pln">,
  look at </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://en.wikipedia.org/"</span><span class="tag">&gt;</span><span class="pln">weather on Wikipedia</span><span class="tag">&lt;/a&gt;</span><span class="pln">, or check
  out
  </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"https://www.nationalgeographic.org/topics/resource-library-weather/"</span><span class="tag">&gt;</span><span class="pln">
    weather on National Geographic</span><span class="tag">&lt;/a&gt;</span><span class="pln">.
</span><span class="tag">&lt;/p&gt;</span></pre>

<ul>
	<li>
		شيفرة CSS:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3043_18" style=""><span class="pln">body </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">300px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> auto</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

p </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">line-height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.4</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

a </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">outline</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">text-decoration</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">link </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> blue</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">visited </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> purple</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">focus</span><span class="pun">,</span><span class="pln">
</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">hover </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">border-bottom</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> solid</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">active </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> red</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

a</span><span class="pun">[</span><span class="pln">href</span><span class="pun">^=</span><span class="str">"http"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">url</span><span class="pun">(</span><span class="str">"external-link-52.png"</span><span class="pun">)</span><span class="pln"> no-repeat </span><span class="lit">100%</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">16px</span><span class="pln"> </span><span class="lit">16px</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">padding-right</span><span class="pun">:</span><span class="pln"> </span><span class="lit">19px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ما الذي حدث إذًا؟ سنتجاوز توضيح أغلب شيفرة التنسيقات لأننا تحدثنا عنها قبل قليل وننتقل إلى القاعدة الأخيرة المهمة. لقد وضعنا صورة خلفية مخصصة للرابط وهي أيقونة الموقع الخارجي، وبنفس الطريقة التي اتبعناها في <a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%A6%D9%85-%D9%81%D9%8A-css-r2220/" rel="">إضافة نقاط مخصصة إلى القوائم</a> في المقال السابق. لكننا استخدمنا هنا الخاصية المختصرة <a href="https://wiki.hsoub.com/CSS/background" rel="external"><code>background</code></a> بدلًا من ضبط كل خاصية على حدى، كما ضبطنا مسار الصورة واستخدمنا القيمة <code>no-repeat</code> كي لا تظهر سوى نسخة واحدة من الصورة. ضبطنا كذلك موقع الصورة كي يكون 100% إلى يمين النص دون أن يكون لها هامش علوي <code>0px</code>.
</p>

<p>
	استخدمنا أيضًا الخاصية <a href="https://wiki.hsoub.com/CSS/background-size" rel="external"><code>background-size</code></a> لتحديد أبعاد الصورة. ومن الأفضل عمليًا أن نختار صورة أكبر ثم نعيد ضبط أبعادها كما يتطلبه صفحات ويب المتجاوبة. لن تعمل هذه الطريقة طبعًا على المتصفحات الأقدم من IE9، لهذا عليك أن تغير أبعاد الصورة بنفسك ثم تستخدمها، إذا أردت دعم تلك المتصفحات.
</p>

<p>
	ضبطنا أخيرًا قيمة الحاشية من جهة اليمين باستخدام الخاصية <a href="https://wiki.hsoub.com/CSS/padding-right" rel="external"><code>padding-right</code></a> كي نعطي صورة الخلفية مساحة كافية لتظهر دون أن تتداخل مع النص.
</p>

<p>
	كلمة أخيرة: كيف لنا أن تختار فقط الروابط الخارجية لتنسيقها بهذا الشكل مع وجود روابط داخلية؟ إذا كتبت عناوين <a href="https://academy.hsoub.com/programming/html/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A7%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D8%A7%D9%84%D8%AA%D8%B4%D8%B9%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-html-r1755/" rel="">روابط HTML</a> بالشكل الصحيح، عليك في هذه الحالة استخدام عناوين URL المطلقة للروابط الخارجية، وسيكون من المفيد استخدام العناوين النسبية للروابط الداخلية (كما في الرابط الأول في المثال السابق). لهذا السبب ستظهر العبارة "http" في العناوين الخارجية فقط (كما في العنوانين الثاني والثالث في المثال السابق)، وعندها يمكننا استخدام <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D9%85%D8%AD%D8%AF%D8%AF%D8%A7%D8%AA-selectors-%D9%81%D9%8A-css-r249/" rel="">محدد الخواص</a> التالي <code>["a[href^="http</code> الذي يحدّد عن عناصر <code>&lt;a&gt;</code> ولكن فقط التي تمتلك الخاصية <code>href</code> مع قيمة تبدأ بالكلمة <code>http</code>، وهذا كل مافي الأمر. حاول أن تعود إلى التطبيق العملي السابق وأن تطبق هذه التقنية.
</p>

<p>
	<strong>ملاحظة</strong>: قد تبدو قيمة الخاصية <code>href</code> في مثالنا غريبة فقد استخدمنا روابط وهمية لا تنقلك إلى أي مكان، والسبب في ذلك أنك ستتمكن من تحميل هذه الروابط ضمن المحرر التفاعلي لو كانت حقيقية وبالتالي ستفقد الشيفرة الموجودة.
</p>

<p>
	<strong>ملاحظة</strong>: لا تقلق إن لم تكن لديك معرفة <a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D8%AE%D9%84%D9%81%D9%8A%D8%A7%D8%AA-%D9%88%D8%AD%D9%88%D8%A7%D9%81-%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2158/" rel="">بالخلفيات</a> أو <a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D9%85%D8%AA%D8%AC%D8%A7%D9%88%D8%A8-r1499/" rel="">بتصميم الويب المتجاوب</a> فقد شرحناها في مقالات أخرى يمكنك الاطلاع عليها.
</p>

<h2 id="-6">
	تنسيق الروابط على هيئة أزرار
</h2>

<p>
	يمكنك استخدام الأساليب التي خبرتها حتى الآن في مقالنا بطرق أخرى، حيث يمكنك استخدام حالة تمرير مؤشر الفأرة مع عناصر أخرى مثلًا وليس بالضرورة مع الروابط، وقد ترغب أن تتفاعل الفقرات وعناصر القوائم وغيرها مع مرور مؤشر الفأرة فوقها.
</p>

<p>
	ومن الشائع أيضًا تنسيق الروابط لتبدو مثل الأزرار في بعض الحالات، كما في قائمة التنقل ضمن الموقع، إذ تُوصّف عناصر القائمة على هيئة روابط وتُنسّق بعدها لتبدو مثل مجموعة من أزرار التحكم التي تنقل المستخدم من صفحة إلى أخرى في الموقع نفسه.
</p>

<p>
	لنرى كيف نفعل ذلك. إليك شيفرة HTML:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6259_14" style=""><span class="tag">&lt;nav</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"container"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">Home</span><span class="tag">&lt;/a&gt;</span><span class="pln">
  </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">Pizza</span><span class="tag">&lt;/a&gt;</span><span class="pln">
  </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">Music</span><span class="tag">&lt;/a&gt;</span><span class="pln">
  </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">Wombats</span><span class="tag">&lt;/a&gt;</span><span class="pln">
  </span><span class="tag">&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#"</span><span class="tag">&gt;</span><span class="pln">Finland</span><span class="tag">&lt;/a&gt;</span><span class="pln">
</span><span class="tag">&lt;/nav&gt;</span></pre>

<p>
	وشيفرة CSS:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3043_22" style=""><span class="pln">body</span><span class="pun">,</span><span class="pln">
html </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">margin</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="pun">.</span><span class="pln">container </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">display</span><span class="pun">:</span><span class="pln"> flex</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">gap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.625%</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

a </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">flex</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">text-decoration</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">outline</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">text-align</span><span class="pun">:</span><span class="pln"> center</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">line-height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> black</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">link</span><span class="pun">,</span><span class="pln">
</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">visited</span><span class="pun">,</span><span class="pln">
</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">focus </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> palegoldenrod</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> black</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">hover </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> orange</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">a</span><span class="pun">:</span><span class="pln">active </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">background</span><span class="pun">:</span><span class="pln"> darkred</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">color</span><span class="pun">:</span><span class="pln"> white</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ستكون النتيجة على النحو التالي:
</p>

<p style="text-align: center;">
	<img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="182018" data-ratio="9.04" data-unique="5inmba92p" width="863" src="https://academy.hsoub.com/uploads/monthly_2026_04/image.png.92db7d54d4723a581b38912de5734626.png">
</p>

<p>
	نُعرّف في شيفرة HTML عنصر قائمة التنقل <a href="https://wiki.hsoub.com/HTML/nav" rel="external"><code>&lt;nav&gt;</code></a> التي تمتلك صنف التنسيق <code>"container"</code>. تضم هذه القائمة الروابط المطلوبة، بينما تُنسق شيفرة CSS القائمة والروابط معًا.
</p>

<ul>
	<li>
		تنص القاعدة الثانية على ما يلي:
		<ul>
			<li>
				الحاوية هي <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-css-flexbox-%D9%88%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84%D9%87-%D9%84%D9%87%D9%8A%D9%83%D9%84%D8%A9-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r118/" rel="">Flexbox</a>: أي أن العناصر ضمنها مرنة، وتتوضع على نحوٍ متجاور حتى تملأ المساحة المخصصة لها.
			</li>
			<li>
				ستكون المسافة بين العناصر <code>0.625%</code> من اتساع القائمة.
			</li>
		</ul>
	</li>
	<li>
		تُنسِّق القاعدة الثالثة الروابط:
		<ul>
			<li>
				يعني التصريح <code>flex: 1</code> أن اتساع العناصر سيكون مضبوطًا كي تشغل جميعها المساحة المخصصة للحاوية.
			</li>
			<li>
				ألغينا الخط أسفل الرابط <a href="https://wiki.hsoub.com/CSS/text-decoration" rel="external"><code>text-decoration</code></a> والإطار الذي يحيط به <a href="https://wiki.hsoub.com/CSS/outline" rel="external"><code>outline</code></a> عند انتقال التركيز إليه، كي لا يفسدا مظهر الأزرار.
			</li>
			<li>
				تُستخدم التصريحات الثلاثة الأخيرة لتوسيط النص ضمن الرابط، وضبط ارتفاع العنصر على القيمة <code>3</code> عبر الخاصية <a href="https://wiki.hsoub.com/CSS/line-height" rel="external"><code>line-height</code></a> لمنح الرابط بعض الارتفاع والمساعدة على توسيط النص عموديًا، وأخيرًا ضبط لون النص ليكون أسودًا.
			</li>
		</ul>
	</li>
</ul>

<h2 id="-7">
	الخلاصة
</h2>

<p>
	نأمل أن تكون المعلومات التي قدمناها في مقالنا قد لامست فعلًا ما تحتاجه في تنسيق الروابط، وسننتقل في المقال التالي إلى تفصيل طريقة استخدام خطوط الكتابة المخصصة (أو خطوط الويب كما هو شائع) ضمن موقعك.
</p>

<p>
	ترجمة -وبتصرف- للمقال- <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/Styling_text/Styling_links" rel="external nofollow">Styling Links</a>
</p>

<h2 id="-8">
	اقرأ المزيد
</h2>

<ul>
	<li>
		المقال السابق <a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%A6%D9%85-%D9%81%D9%8A-css-r2220/" rel="">تنسيق القوائم في CSS</a>.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/html/html-%D9%88-css-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-css-r272/" rel="">HTML و CSS للمبتدئين: مقدمة إلى تنسيقات CSS</a>.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">أساسيات لغة CSS</a>.
	</li>
	<li>
		 <a href="https://academy.hsoub.com/programming/css/%D8%AA%D8%A3%D8%AB%D9%8A%D8%B1%D8%A7%D8%AA-%D8%AD%D8%B1%D9%83%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%82%D9%88%D8%A7%D8%A6%D9%85-html-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r94/" rel="">تأثيرات حركية على عناصر قوائم HTML باستخدام CSS</a>
	</li>
</ul>

<p>
	 
</p>
]]></description><guid isPermaLink="false">2221</guid><pubDate>Wed, 17 Jan 2024 12:04:00 +0000</pubDate></item><item><title>&#x62A;&#x646;&#x633;&#x64A;&#x642; &#x627;&#x644;&#x642;&#x648;&#x627;&#x626;&#x645; &#x641;&#x64A; CSS</title><link>https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%A6%D9%85-%D9%81%D9%8A-css-r2220/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_01/---CSS.png.bc7a6c16d05808e9ea34437c5c91738e.png" /></p>
<p>
	لا تختلف القوائم lists في سلوكها عن النصوص في المجمل، لكنك ستجد بعض خاصيات CSS مخصصة للقوائم لا بد من الإطلاع عليها، والاطلاع على أفضل الممارسات في تنسيقها وهذا ما سيعرضه هذا المقال.
</p>

<p>
	ننصحك قبل إكمال قراءة المقال أن تطلع على <a href="https://academy.hsoub.com/programming/html/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-html-r1687/" rel="">أساسيات لغة HTML</a> ومقال <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%88%D8%AE%D8%B7%D9%88%D8%B7-%D8%A7%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D9%81%D9%8A-css-r2211/" rel="">التنسيقات الأساسية للنصوص وخطوط الكتابة في CSS</a>.
</p>

<h2 id="">
	مثال عن قائمة بسيطة
</h2>

<p>
	حتى نبدأ العمل سنعرض مثالًا عن قائمة بسيطة، وخلال تقدم المقال سنلقي نظرةً على القوائم المرتبة وغير المرتبة وقوائم الوصف التي تتمتع بميزات تنسيقية متشابهة إضافةً إلى ميزات مخصصة لكل منها. يمكنك الوصول إلى <a href="https://mdn.github.io/learning-area/css/styling-text/styling-lists/unstyled-list.html" rel="external nofollow">المثال بشكله الأصلي</a> غير المنسّق عبر <a href="https://mdn.github.io/learning-area/css/styling-text/styling-lists/unstyled-list.html" rel="external nofollow">غيت هب GitHub</a> والحصول على <a href="https://github.com/mdn/learning-area/blob/main/css/styling-text/styling-lists/unstyled-list.html" rel="external nofollow">الشيفرة المصدرية</a>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5837_6" style=""><span class="tag">&lt;h2&gt;</span><span class="pln">Shopping (unordered) list</span><span class="tag">&lt;/h2&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  Paragraph for reference, paragraph for reference, paragraph for reference,
  paragraph for reference, paragraph for reference, paragraph for reference.
</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;ul&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Hummus</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Pita</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Green salad</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Halloumi</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ul&gt;</span><span class="pln">

</span><span class="tag">&lt;h2&gt;</span><span class="pln">Recipe (ordered) list</span><span class="tag">&lt;/h2&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  Paragraph for reference, paragraph for reference, paragraph for reference,
  paragraph for reference, paragraph for reference, paragraph for reference.
</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;ol&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Toast pita, leave to cool, then slice down the edge.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">
    Fry the halloumi in a shallow, non-stick pan, until browned on both sides.
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Wash and chop the salad.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Fill pita with salad, hummus, and fried halloumi.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ol&gt;</span><span class="pln">

</span><span class="tag">&lt;h2&gt;</span><span class="pln">Ingredient description list</span><span class="tag">&lt;/h2&gt;</span><span class="pln">

</span><span class="tag">&lt;p&gt;</span><span class="pln">
  Paragraph for reference, paragraph for reference, paragraph for reference,
  paragraph for reference, paragraph for reference, paragraph for reference.
</span><span class="tag">&lt;/p&gt;</span><span class="pln">

</span><span class="tag">&lt;dl&gt;</span><span class="pln">
  </span><span class="tag">&lt;dt&gt;</span><span class="pln">Hummus</span><span class="tag">&lt;/dt&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">
    A thick dip/sauce generally made from chick peas blended with tahini, lemon
    juice, salt, garlic, and other ingredients.
  </span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dt&gt;</span><span class="pln">Pita</span><span class="tag">&lt;/dt&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">A soft, slightly leavened flatbread.</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dt&gt;</span><span class="pln">Halloumi</span><span class="tag">&lt;/dt&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">
    A semi-hard, unripened, brined cheese with a higher-than-usual melting
    point, usually made from goat/sheep milk.
  </span><span class="tag">&lt;/dd&gt;</span><span class="pln">
  </span><span class="tag">&lt;dt&gt;</span><span class="pln">Green salad</span><span class="tag">&lt;/dt&gt;</span><span class="pln">
  </span><span class="tag">&lt;dd&gt;</span><span class="pln">That green healthy stuff that many of us just use to garnish kebabs.</span><span class="tag">&lt;/dd&gt;</span><span class="pln">
</span><span class="tag">&lt;/dl&gt;</span></pre>

<p>
	إذا عرضت الشيفرة ضمن متصفح، ثم تصفّحت قائمة العناصر باستخدام <a href="https://academy.hsoub.com/programming/workflow/%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D8%B7%D9%88%D8%B1%D9%8A-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D9%85%D8%AF%D9%85%D8%AC%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-r1439/" rel="">أدوات مطوري ويب</a> ستلاحظ بعض التنسيقات الافتراضية المطبّقة:
</p>

<ul>
	<li>
		للقائمة غير المرتبة <a href="https://wiki.hsoub.com/HTML/ul" rel="external"><code>&lt;ul&gt;</code></a> والمرتبة <a href="https://wiki.hsoub.com/HTML/ol" rel="external"><code>&lt;ol&gt;</code></a> هوامش علوية وسفلية بحجم <code>16px</code> (أو <code>1em</code>)، وحاشية يسارية <a href="https://wiki.hsoub.com/CSS/padding-left" rel="external"><code>padding-left</code></a> بحجم <code>40px</code> (أو <code>2.5em</code>). في حال ضُبطت الخاصية <a href="https://wiki.hsoub.com/CSS/direction" rel="external"><code>dir</code></a> من اليمين إلى اليسار right-to-left أو <code>rtl</code> للعناصر <code>ul</code> و <code>ol</code>، سيظهر تأثير الحاشية اليمنية <a href="https://wiki.hsoub.com/CSS/padding-right" rel="external"><code>padding-right</code></a> والتي لها القيمة الافتراضية <code>40px</code> (أو <code>2.5em</code>).
	</li>
	<li>
		لا تملك عناصر القائمة <a href="https://wiki.hsoub.com/HTML/li" rel="external"><code>&lt;li&gt;</code></a> مجموعة تنسيقات افتراضية.
	</li>
	<li>
		للعنصر <a href="https://wiki.hsoub.com/HTML/dl" rel="external"><code>&lt;dl&gt;</code></a> هوامش علوية وسفلية بحجم <code>16px</code> (أو <code>1em</code>) لكن دون حواشي.
	</li>
	<li>
		للعنصر <a href="https://wiki.hsoub.com/HTML/dd" rel="external"><code>&lt;dd&gt;</code></a> هامش يساري <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/margin-left" rel="external nofollow"><code>margin-left</code></a> حجمه <code>40px</code> (أو <code>2.5em</code>).
	</li>
	<li>
		للعنصر <a href="https://wiki.hsoub.com/HTML/p" rel="external"><code>&lt;p&gt;</code></a> الذي أضفناه على سبيل الموازنة هوامش علوية وسفلية بحجم <code>16px</code> كما هو حال الأنواع المختلفة للقوائم.
	</li>
</ul>

<h2 id="-1">
	التعامل مع التباعد في القوائم
</h2>

<p>
	لا بد من ضبط تنسيق القوائم بطريقة تحافظ على نفس التباعد مع العناصر المحيطة بها مثل الفقرات والصور، وهو ما يُعرف بالتناسق العمودي vertical rhythm، وتحافظ على نفس التباعد الأفقي مع بعضها. يمكنك الاطلاع على <a href="https://mdn.github.io/learning-area/css/styling-text/styling-lists/" rel="external nofollow">المثال الجاهز</a> على <a href="https://mdn.github.io/learning-area/css/styling-text/styling-lists/" rel="external nofollow">غيت هب</a> وتنزيل <a href="https://github.com/mdn/learning-area/blob/main/css/styling-text/styling-lists/index.html" rel="external nofollow">الشيفرة المصدرية</a>.
</p>

<p>
	إليك شيفرة CSS المستخدمة في تنسيق النص وتنسيق التباعد:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5837_10" style=""><span class="com">/* General styles */</span><span class="pln">

html </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-family</span><span class="pun">:</span><span class="pln"> Helvetica</span><span class="pun">,</span><span class="pln"> Arial</span><span class="pun">,</span><span class="pln"> sans-serif</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

h2 </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2rem</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

ul</span><span class="pun">,</span><span class="pln">
ol</span><span class="pun">,</span><span class="pln">
dl</span><span class="pun">,</span><span class="pln">
p </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.5rem</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

li</span><span class="pun">,</span><span class="pln">
p </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">line-height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.5</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/* Description list styles */</span><span class="pln">

dd</span><span class="pun">,</span><span class="pln">
dt </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">line-height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.5</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

dt </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">font-weight</span><span class="pun">:</span><span class="pln"> bold</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<ul>
	<li>
		تعرِّف القاعدة الأولى خط كتابة لكامل الموقع حجمه الأساسي <code>10px</code>، وترث هذه القاعدة جميع عناصر الصفحة.
	</li>
	<li>
		تعرّف القاعدتين الثانية والثالثة حجم خط نسبي (مقاس بواحدة <code>em</code>) مخصص للعناوين <code>&lt;h&gt;</code> ولأنواع القوائم المختلفة (يرثها أبناء عناصر القائمة) والفقرات. أي سيكون لكل قائمة وفقرة حجم الخط نفسه ونفس التباعد من الأعلى والأسفل مما يحافظ على التناسق العمودي.
	</li>
	<li>
		تخصص القاعدة الرابعة نفس ارتفاع السطر <a href="https://wiki.hsoub.com/CSS/line-height" rel="external"><code>line-height</code></a> في الفقرات وعناصر القوائم أي سيكون التباعد نفسه بين أسطر الفقرات وعناصر القوائم، ويساعد ذلك في الحفاظ على التناسق العمودي.
	</li>
	<li>
		تُطبَّق القاعدتان الخامسة والسادسة على قوائم الوصف وتعطي نفس ارتفاع السطر بين عناصر القائمة والوصف كما هو الحال بين عناصر القوائم السابقة والفقرات. كما جعلنا الخط سميكًا في الوصف ليتميز عن عناصر القائمة.
	</li>
</ul>

<h2 id="-2">
	خاصيات التنسيق المخصصة للقوائم
</h2>

<p>
	بعد أن ألقينا نظرة على التقنيات المتبعة في تحديد التباعد في القوائم، ننتقل إلى استكشاف بعض الخاصيات التي خصصت لتنسيق القوائم. هناك ثلاث خاصيات لا بد من الاطلاع عليها بدايةً ويمكن أن تُطبّق على القوائم المرتبة <code>&lt;ol&gt;</code> أو غير المرتبة <code>&lt;ul&gt;</code>:
</p>

<ul>
	<li>
		<a href="https://wiki.hsoub.com/CSS/list-style-type" rel="external"><code>list-style-type</code></a>: تضبط نوع النقاط المستخدمة في القائمة كأن تكون دائرية أو مربعة مثلًا في القوائم غير المرتبة، أو أن تكون أرقامًا أو أحرفًا في القوائم المرتبة.
	</li>
	<li>
		<a href="https://wiki.hsoub.com/CSS/list-style-position" rel="external"><code>list-style-position</code></a>: تضبط موضع النقاط في عناصر القائمة إن كانت ستظهر داخل القائمة أو خارجها.
	</li>
	<li>
		<a href="https://wiki.hsoub.com/CSS/list-style-image" rel="external"><code>list-style-image</code></a>: تسمح باستخدام صورة مخصصة في قوائم التعداد النقطي بدلًا من المربع أو الدائرة النمطية.
	</li>
</ul>

<h3 id="-3">
	تنسيق قوائم التعداد النقطي
</h3>

<p>
	تُستخدم الخاصية <a href="https://wiki.hsoub.com/CSS/list-style-type" rel="external"><code>list-style-type</code></a> كما أشرنا سابقًا لضبط نمط النقاط المستخدمة في القوائم النقطية. وفي مثالنا، سنضبط القائمة المرتبة لتعرض ترقيمًا رومانيًا بأحرف كبيرة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5837_12" style=""><span class="pln">ol </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">list-style-type</span><span class="pun">:</span><span class="pln"> upper-roman</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ستكون النتيجة على النحو التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="141455" href="https://academy.hsoub.com/uploads/monthly_2024_01/01_bullets_list.png.cee1bdd097fb2e1f146b221dccc06a94.png" rel=""><img alt="01 bullets list" class="ipsImage ipsImage_thumbnailed" data-fileid="141455" data-unique="o830b6h3h" src="https://academy.hsoub.com/uploads/monthly_2024_01/01_bullets_list.png.cee1bdd097fb2e1f146b221dccc06a94.png"> </a>
</p>

<p>
	بإمكانك إيجاد خيارات أكثر من خلال الاطلاع على صفحة الخاصية <a href="https://wiki.hsoub.com/CSS/list-style-type" rel="external"><code>list-style-type</code></a> على <a href="https://wiki.hsoub.com/CSS/list-style-type" rel="external">موسوعة حسوب</a>.
</p>

<h3 id="-4">
	موضع النقاط
</h3>

<p>
	تحدد الخاصية <a href="https://wiki.hsoub.com/CSS/list-style-position" rel="external"><code>list-style-position</code></a> إن كانت النقاط ستظهر داخل عناصر القائمة أو خارجها قبل بداية كل عنصر. تأخذ الخاصية القيمة الافتراضية <code>outside</code> التي تجعل النقاط خارج عناصر القائمة كما في الصورة السابقة، لكن إن ضبطنا قيمة الخاصية على <code>inside</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5837_14" style=""><span class="pln">ol </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">list-style-type</span><span class="pun">:</span><span class="pln"> upper-roman</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">list-style-position</span><span class="pun">:</span><span class="pln"> inside</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ستكون النتيجة مشابهة للشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="141456" href="https://academy.hsoub.com/uploads/monthly_2024_01/02_inside_bullets-list.png.81c0a02d2f8feeade494ae2b1bf60ecc.png" rel=""><img alt="02 inside bullets list" class="ipsImage ipsImage_thumbnailed" data-fileid="141456" data-unique="kp4u3puxk" src="https://academy.hsoub.com/uploads/monthly_2024_01/02_inside_bullets-list.png.81c0a02d2f8feeade494ae2b1bf60ecc.png"> </a>
</p>

<h3 id="-5">
	استخدام صور مخصصة للنقاط
</h3>

<p>
	تسمح الخاصية <a href="https://wiki.hsoub.com/CSS/list-style-image" rel="external"><code>list-style-image</code></a> باستخدام صور مخصصة لنقاط القائمة، وبطريقة بسيطة جدًا:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5837_16" style=""><span class="pln">ul </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">list-style-image</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">url</span><span class="pun">(</span><span class="str">star.svg</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لكن هناك محدودية في استخدام هذه الخاصية من ناحية التحكم بموقع النقاط وحجمها وغيرها، لهذا ننصحك باستخدام مجموعة الخاصيات المتعلقة بالخلفية <a href="https://wiki.hsoub.com/CSS/background" rel="external"><code>background</code></a> والتي تعرفنا عليها في <a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D8%AE%D9%84%D9%81%D9%8A%D8%A7%D8%AA-%D9%88%D8%AD%D9%88%D8%A7%D9%81-%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-css-r2158/" rel="">مقال سابق</a>، وإليك كيفية استخدامها:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5837_18" style=""><span class="pln">ul </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">padding-left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2rem</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">list-style-type</span><span class="pun">:</span><span class="pln"> none</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

ul li </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">padding-left</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2rem</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background-image</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">url</span><span class="pun">(</span><span class="str">star.svg</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">background-position</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background-size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.6rem</span><span class="pln"> </span><span class="lit">1.6rem</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">background-repeat</span><span class="pun">:</span><span class="pln"> no-repeat</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ما فعلناه في الشيفرة السابقة هو كالتالي:
</p>

<ul>
	<li>
		ضبطنا قيمة الحاشية اليسارية <code>padding-left</code> للعنصر <code>&lt;ul&gt;</code> على <code>20px</code> بدلًا من القيمة الافتراضية <code>40px</code>، وطبقنا نفس الحاشية على عناصر القائمة غير المرتبة كي تبقى بمحاذاة عناصر القائمة المرتبة وقائمة الوصف على الرغم من وجود حاشية لصور الخلفية ضمن كل عنصر، ولو لم نفعل ذلك، ستتداخل صور الخلفية مع نص العنصر ويبدو الأمر فوضويًا.
	</li>
	<li>
		ضبطنا الخاصية <code>list-style-type</code> على القيمة <code>none</code> كي لا تظهر النقاط بشكلها الافتراضي لأننا سنستخدم خاصيات الخلفية <code>background</code> للتعامل معها.
	</li>
	<li>
		وضعنا نقطة مخصصة قبل كل عنصر في القائمة غير المرتبة، وإليك الخاصيات التي استخدمناها لتخصيص هذه النقطة:
		<ul>
			<li>
				<a href="https://wiki.hsoub.com/CSS/background-image" rel="external"><code>background-image</code></a>: تعطي مرجعًا إلى مسار ملف الصورة التي نستخدمها بصفتها نقطة.
			</li>
			<li>
				<a href="https://wiki.hsoub.com/CSS/background-position" rel="external"><code>background-position</code></a>: تضبط مكان ظهور الخلفية ضمن العنصر وقد جعلناها في حالتنا <code>0 0</code> مما يعني أن النقطة ستظهر أعلى يسار العنصر.
			</li>
			<li>
				<a href="https://wiki.hsoub.com/CSS/background-size" rel="external"><code>background-size</code></a>: تضبط حجم صورة الخلفية، ومن الناحية العملية لا بد أن يكون حجم صورة الخلفية بحجم عنصر القائمة (أو أكبر أو أصغر بشيء بسيط)؛ وطالما أننا نستخدم الحجم <code>1.6rem</code> (أو <code>16px</code>) والذي يتناسب تمامًا مع حجم حاشية مقدارها <code>20px</code> يمكن أن نضع النقاط ضمن عنصر القائمة دون مشاكل، سيجعل مجموع 16 بكسل مع 4 بكسل من الفراغ الذي يحيط بالنقطة الأمر مناسبًا.
			</li>
			<li>
				<a href="https://wiki.hsoub.com/CSS/CSS/background-repeat" rel="external"><code>background-repeat</code></a>: تتكرر الصورة افتراضيًا حتى يمتلئ الفراغ المتاح لها، وطالما أننا نحتاج إلى نسخة واحدة من الصورة التي تمثل النقطة، ضبطنا قيمة الخاصية على <code>no-repeat</code>.
			</li>
		</ul>
	</li>
</ul>

<p>
	ستكون نتائج عملنا كما في الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="141457" href="https://academy.hsoub.com/uploads/monthly_2024_01/03_image_bullets.png.ad65101629926157f287244025614c9e.png" rel=""><img alt="03 image bullets" class="ipsImage ipsImage_thumbnailed" data-fileid="141457" data-unique="pkkx1inae" src="https://academy.hsoub.com/uploads/monthly_2024_01/03_image_bullets.png.ad65101629926157f287244025614c9e.png"> </a>
</p>

<h3 id="liststyle">
	الخاصة المختصرة list-style
</h3>

<p>
	يمكنك ضبط الخاصيات الثلاث السابقة باستخدام الخاصية المختصرة <a href="https://wiki.hsoub.com/CSS/list-style" rel="external"><code>list-style</code></a>، إذ تستطيع مثلًا أن تستبدل الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5837_20" style=""><span class="pln">ul </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">list-style-type</span><span class="pun">:</span><span class="pln"> square</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">list-style-image</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">url</span><span class="pun">(</span><span class="str">example.png</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">list-style-position</span><span class="pun">:</span><span class="pln"> inside</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بالشيفرة المختصرة التالية:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5837_22" style=""><span class="pln">ul </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">list-style</span><span class="pun">:</span><span class="pln"> square </span><span class="kwd">url</span><span class="pun">(</span><span class="str">example.png</span><span class="pun">)</span><span class="pln"> inside</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن أن ترتب القيم الثلاث بأية طريقة، كما يمكنك استخدام إحداها أو اثنتين منها أو ثلاثتها. توضع القيم الافتراضية التالية: <code>disc</code> و <code>none</code> و <code>outside</code> في حال لم تُحدد قيمتها صراحة. إذا استُخدمت الخاصية <code>type</code> مع الخاصية <code>image</code>، سيُستخدم النوع <code>type</code> إن لم ينجح تحميل الصورة المحددة.
</p>

<h2 id="-6">
	التحكم بطريقة ترقيم القوائم
</h2>

<p>
	قد تحتاج أحيانًا إلى تطبيق طريقة تعداد مختلفة للقوائم المرتبة المختلفة، كأن تبدأ الترقيم بالرقم 3 مثلًا أو أن تعد مثنى مثنى، لهذا تتيح لك HTML و CSS بعض الطرق لتنفيذ ذلك.
</p>

<h3 id="start">
	الخاصية start
</h3>

<p>
	تتيح لك الخاصية <a href="https://wiki.hsoub.com/HTML/ol#start" rel="external"><code>start</code></a> الخاصة بعنصر القائمة المرتبة <code>&lt;ol&gt;</code> أن تحدد الرقم الذي تبدأ منه التعداد. إليك مثالًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5837_24" style=""><span class="tag">&lt;ol</span><span class="pln"> </span><span class="atn">start</span><span class="pun">=</span><span class="atv">"4"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Toast pita, leave to cool, then slice down the edge.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">
    Fry the halloumi in a shallow, non-stick pan, until browned on both sides.
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Wash and chop the salad.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Fill pita with salad, hummus, and fried halloumi.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ol&gt;</span></pre>

<p>
	ستكون النتيجة على النحو التالي:
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="182012" data-ratio="19.06" data-unique="os24kfao8" width="551" alt="image.png" src="https://academy.hsoub.com/uploads/monthly_2026_04/image.png.57ec9a5c5abeffbf865b77f75775b9c7.png">
</p>

<h3 id="reversed">
	الخاصية reversed
</h3>

<p>
	تجعل الخاصية <a href="https://wiki.hsoub.com/HTML/ol#reversed" rel="external"><code>reversed</code></a> التعداد عكسيًا ابتداءً من قيمة محددة. إليك مثالًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5837_26" style=""><span class="tag">&lt;ol</span><span class="pln"> </span><span class="atn">start</span><span class="pun">=</span><span class="atv">"4"</span><span class="pln"> </span><span class="atn">reversed</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Toast pita, leave to cool, then slice down the edge.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">
    Fry the halloumi in a shallow, non-stick pan, until browned on both sides.
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Wash and chop the salad.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">Fill pita with salad, hummus, and fried halloumi.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ol&gt;</span></pre>

<p>
	ستكون النتيجة على النحو التالي:
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="182013" data-ratio="19.93" data-unique="wl8ivmjfp" width="562" alt="image.png" src="https://academy.hsoub.com/uploads/monthly_2026_04/image.png.47b9c85fb9b9d6f91de0376d0990a928.png">
</p>

<p>
	<strong>ملاحظة</strong>: إن كان عدد عناصر القائمة أكبر من القيمة التي تحددها الخاصية <code>start</code> عند استخدام التعداد العكسي، فسيستمر التعداد نحو الصفر ومنه إلى القيم السالبة.
</p>

<h3 id="value">
	الخاصية value
</h3>

<p>
	تسمح لك الخاصية<code>value</code> بتخصيص رقم لكل عنصر من عناصر القائمة. إليك مثالًا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5837_28" style=""><span class="tag">&lt;ol&gt;</span><span class="pln">
  </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"2"</span><span class="tag">&gt;</span><span class="pln">Toast pita, leave to cool, then slice down the edge.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"4"</span><span class="tag">&gt;</span><span class="pln">
    Fry the halloumi in a shallow, non-stick pan, until browned on both sides.
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"6"</span><span class="tag">&gt;</span><span class="pln">Wash and chop the salad.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
  </span><span class="tag">&lt;li</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"8"</span><span class="tag">&gt;</span><span class="pln">Fill pita with salad, hummus, and fried halloumi.</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="tag">&lt;/ol&gt;</span></pre>

<p>
	ستكون النتيجة على النحو التالي:
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="182014" data-ratio="18.78" data-unique="mgb1ezex8" width="575" alt="image.png" src="https://academy.hsoub.com/uploads/monthly_2026_04/image.png.8062e7d42b04481b513a93dfeea22349.png">
</p>

<p>
	<strong>ملاحظة</strong>: حتى لو استخدمت تعدادًا ليس رقميًا للخاصية <code>list-style-type</code>، ستحتاج إلى استخدام القيم الرقمية المكافئة ضمن الخاصية <code>value</code>.
</p>

<h2 id="-8">
	الخلاصة
</h2>

<p>
	من السهل تنسيق القوائم إن اعتدت التعامل مع أساسياتها وخاصياتها المميزة، وسننتقل في المقال التالي إلى شرح طريقة تنسيق الروابط التشعبية.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/Styling_text/Styling_lists" rel="external nofollow">Styling lists</a>.
</p>

<h2 id="-9">
	اقرأ المزيد
</h2>

<ul>
	<li>
		المقال السابق <a href="https://academy.hsoub.com/programming/css/%D8%A7%D9%84%D8%AA%D9%86%D8%B3%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%88%D8%AE%D8%B7%D9%88%D8%B7-%D8%A7%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D9%81%D9%8A-css-r2211/" rel="">التنسيقات الأساسية للنصوص وخطوط الكتابة في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%AA%D9%86%D8%B3%D9%8A%D9%82-%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%A6%D9%85-lists-%D9%81%D9%8A-css-r259/" rel="">تنسيق القوائم (Lists) في CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-css/" rel="">تعرف على أساسيات لغة CSS</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/css/%D9%87%D9%8A%D9%83%D9%84%D9%8A%D8%A9-%D9%84%D8%BA%D8%A9-css-r2002/" rel="">هيكلية لغة CSS</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2220</guid><pubDate>Wed, 10 Jan 2024 12:04:00 +0000</pubDate></item></channel></rss>
