اذهب إلى المحتوى

لوحة المتصدرين

  1. Mustafa Suleiman

    Mustafa Suleiman

    الأعضاء


    • نقاط

      10

    • المساهمات

      13209


  2. Khaled Osama3

    Khaled Osama3

    الأعضاء


    • نقاط

      8

    • المساهمات

      1580


  3. Abdelrahman Mostafa10

    Abdelrahman Mostafa10

    الأعضاء


    • نقاط

      3

    • المساهمات

      106


  4. محمد سعد شحرور

    • نقاط

      2

    • المساهمات

      152


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 12/25/23 في كل الموقع

  1. كنت احاول تصميم بعض صفحات الهبوط فواجهة مشكلة في مقاسات الصور ليس تعديل المقاسات بلغة css بل المشكلة اني لا اجد على الانترنت مقاسات صور مناسبة لمواقع الويب فمثلا نحن نعلم ان مقاس صورة الانستغرام هي 1:1 هل هناك مقاسات معينة لمواقع الويب وكيف اجعل الصورة نفسها متجاوبة مع جميع الشاشات
    2 نقاط
  2. حاليًا أواجه مشكلة محيرة قليلاً، استخدم مكتبة react-datepicker وreact-tailwindcss-datepicker لكن عند الاستيراد كالتالي: import DatePicker from "react-datepicker"; import Datepicker from "react-tailwindcss-datepicker"; يحدث مشكلة حيث أن الاستيراد الثاني يلغي الاستيراد الأول بطبيعة الحال، فكيف أقوم بحل تلك المشكلة؟ قمت بالاستيراد كما هو مشروح في المستند الرسمي لكل مكتبة. قم بتجربة الحل التالي لكن لم يجدي نفعًا: import Datepicker as TDatepicker from "react-tailwindcss-datepicker"; في حال توفير حال أرجو شرح الحل لكي أتمكن من فهمه.
    1 نقطة
  3. لما لا تستخدم برامج مثل الفوتشوب لإنجاز الأمر أو تنفيذ ذلك من خلال CSS بتعيين طول وحجم للصورة ثم تحريك الصورة داخل العنصر لعرضها كما تريد بالجزء الذي تريده، لكن يجب تقليص حجم الصورة وحجمها أيضًا قبل استخدامها في موقعك افعل ذلك بعد أن تستقر على الصورة، وهناك أداة مثل Squoosh توفر ذلك بدلاً من استخدام الفوتوشوب. وهناك العديد من المواقع التي توفر صور مجانية مثل freepik وغيرها: وبخصوص تجاوب الصور: ادارة الصور والفيديوهات في صفحات الويب
    1 نقطة
  4. هذا يعتمد على الصورة التي تحاول التعامل معها فمثلاً إذا كانت الصورة هي صورة خلفية فالأفضل ان تستخدم معها اسلوب (اخذ طول وعرض العنصر الاب وان تأخذ طريقة العرض cover) مثل : #myImg { height: 100%; width: 100%; object-fit: cover; } وتتحكم بالطول والعرض للاب حتى تحصل على النتيجة التي تريده وهذه هي الطريقة التي استخدمها شخصياً في اغلب الحالات. واذا كانت الصور هي عبارة عن بطاقات فيمكنك استخدام صور بقياسات ثابتة أو قص الصور التي تحصل عليها من المستخدمين في حال كانت ديناميكية للحصول على صور بأبعاد ثابتة وتثبيت هذه الابعاد على 280px عرض (اصغر قياس شاشة) والطول الذي تريده. او يمكنك استخدام اكثر من صورة لكل من الشاشات المختلفة. وحتى مع القيام بكل الخطوات السابقة فلن تكون الصورة كما تريدها بالضبط دائماً على كل الشاشات وستحتاج للكثير من التعديلات حتى تحصل على النتيجة التي تريدها تماماً وانت بحاجة للقيام بذلك اكثر من مرة حتى تحصل على المهارة اللازمة. وبالعودة لسؤالك فإن كان بإمكانك مشاركة المشكلة التي تواجهها تحديداً فقط استطيع مساعدتك بشكل افضل.
    1 نقطة
  5. السلام عليكم، لقد أنهيت 6 مسارات من دورة علوم الحاسوب و أنوي إجتياز الإختبار هل أستطيع أو هل تنصحني بإجتياز الإختبار الآن أم إتمام الدورة كاملة
    1 نقطة
  6. يمكنك القيام بكلا الامرين (اكمال الدروة بالكامل أو تقديم الامتحان مباشرةً) والامر يعتمد على كونك قد حصلت ما تريد تعلمه من الدورة فإن كنت كذلك فالأفضل هو تقديم الامتحان والانتقال للاختصاص في المجال الذي تريده وإلا فالأفضل هو ان تكمل الدورة بالكامل. وإذا لم تكن قد حددت المجال الافضل للاختصاص فيه فالأفضل هو انهاء الدورة بالكامل قبل تقديم الامتحان النهائية. إذا اردت التقدم للامتحان النهائي فيمكنك التواصل مع الدعم من هنا وهم سيعطونك موعد للامتحان ويعطوك المزيد من النصائح والشرح عن كيفية التقدم للامتحان
    1 نقطة
  7. بالإضافة للشرح في التعليق السابق سأحاول توضيح السؤال الأول بالتفصيل حيث يمكن استخدام عدة طرق لتحديث البيانات من API بشكل لحظي. إليك بعض الطرق الشائعة: يمكنك استخدام عملية ال Polling لجلب البيانات من الAPI بشكل دوري. يمكنك استخدام دالة مؤقتة لتنفيذ طلب للحصول على البيانات بانتظام بناءً على الجدول الزمني الذي تحدده. على سبيل المثال، يمكنك استخدام وحدة زمنية مثل time.sleep() لتنفيذ طلب كل فترة زمنية محددة. بدلاً من ال Polling ، يمكنك استخدام ال Webhooks لتلقي التحديثات الفورية من الAPI. في هذه الحالة، يجب أن يدعم الAPI نظام ال Webhooks وتحديد عنوان URL لتلقي التحديثات. عندما يحدث تحديث في البيانات، يتم إرسال طلب POST إلى عنوان URL الذي تحدده لإعلام التطبيق الخاص بك بالتغييرات الجديدة. بعض الAPI توفر بروتوكولات مثل WebSocket لتلقي التحديثات فور حدوثها. يمكنك استخدام مكتبة مثل websockets في Python لإنشاء اتصال WebSocket وتلقي التحديثات بشكل فوري.
    1 نقطة
  8. السلام عليكم ورحمة الله وبركاته أين الخطأ في في كتابة هذا الكود وماهي أسهل طريقة لتتبع الكود ومعرفة الخطأ import customtkinter class Frame1(customtkinter.CTkFrame): def __init__(self, master): super().__init__(master) self.checkbox_1 = customtkinter.CTkCheckBox(self, text="checkbox 1") self.checkbox_1.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="w") self.checkbox_2 = customtkinter.CTkCheckBox(self, text="checkbox 2") self.checkbox_2.grid(row=1, column=0, padx=10, pady=(10, 0), sticky="w") self.optionmenu = customtkinter.CTkOptionMenu(self, values=["option 1", "option 2"]) self.optionmenu.grid(row=2, column=0, padx=10, pady=(10, 0), sticky="w") class Frame2(customtkinter.CTkFrame): def __init__(self, master): super().__init__(master) self.button = customtkinter.CTkButton(self, text="فتح ملف", command=button_event) self.button.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="w") class App(customtkinter.CTk): def __init__(self): super().__init__() self.title("my app") self.geometry("400x180") self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure(0, weight=1) self.Frame_A = Frame1(self) self.Frame_A.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="nsw") self.Frame_B = Frame2(self) self.Frame_B.grid(row=0, column=1, padx=10, pady=(10, 0), sticky="nsw") def button_event(Frame2): print("button_event") app = App() app.mainloop()
    1 نقطة
  9. قم بكتابة دالة button_event كالتالي: class Frame2(customtkinter.CTkFrame): def __init__(self, master): super().__init__(master) def button_event(): print("button pressed") self.button = customtkinter.CTkButton( self, text="فتح ملف", command=button_event) self.button.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="w")
    1 نقطة
  10. هذا ما ذكرته لك في الإجابة أول مرة قم بقراءة التعليق مرة أخرى
    1 نقطة
  11. سبب المشكلة هو أنه عند استيراد مكتبتين أو أكثر يحتويان على مكون (Component) بنفس الاسم، فإن ذلك يؤدي إلى تضارب (Conflict) بين المكونات. والسبب في ذلك هو: - في كل مكتبة يتم تصدير/تعريف المكونات تحت أسمائها الأصلية في المستند الرسمي. - لكن عند استيراد المكتبتين مع بعض فإنه يحدث تداخل بين الأسماء. - فالمترجم (Compiler) لن يستطيع التمييز بين المكون الأول والثاني لأنهما يحملان نفس الاسم. - لذلك يحدث خطأ أثناء التجميع. أما عند استخدام أسماء مختلفة عند الاستيراد فإن ذلك يجعل المترجم قادراً على التمييز بين كل مكون على حدة، فلا يحدث تداخل. وبالتالي فإن تغيير الأسماء عند الاستيراد هو الحل لتفادي المشكلة، على الرغم من أن الأسماء الأصلية في المستندات ستظل كما هي.
    1 نقطة
  12. ما الخطأ الذي ظهر لك؟ الكود لديك لا يوجد به أي دالة باسم button_event
    1 نقطة
  13. ولكن ما زلت لم أفهم ما سبب المشكلة لماذا نستطيع كتابة اسمين مختلفين بينما يوجد في المستند الرسمي اسم واحد للمكتبتين
    1 نقطة
  14. رسالة الخطأ التي تظهر عند تشغيل الكود هي NameError: name 'button_event' is not defined وبالتالي هي تخبرك أن لديك متغير غير معرف. وبالرجوع للمستند الرسمي الخاص بـ customtkinter وبالتحديد CTkButton نجد مثال يخبرك بالطريقة الصحيحة: https://customtkinter.tomschimansky.com/documentation/widgets/button def button_event(): print("button pressed") button = customtkinter.CTkButton(app, text="CTkButton", command=button_event) لاحظ أنه قام بتعريف دالة بنفس الاسم الذي يتم تمريره في command وبالتالي يتم تنفيذ ما بداخل الدالة عند الضغط على الزر. عليك كتابة تلك الدالة
    1 نقطة
  15. المشكلة هنا تظهر عند استخدام استيرادين يحتويان على نفس اسم المكتبة (`DatePicker`)، مما يؤدي إلى تداخل في أسماء المكونات عند الاستخدام. لحل هذه المشكلة يمكنك استخدام الاستيراد بطريقة التسمية المختلفة لكل مكتبة يمكنك تجربه الحل التالي: import DatePicker from "react-datepicker"; import { Datepicker } from "react-tailwindcss-datepicker"; بهذه الطريقة ستقوم باستيراد كل مكتبة تحت اسم مختلف، حيث: - DatePicker سيكون اسم المكون من مكتبة react-datepicker - {Datepicker} سيكون اسم المكون من مكتبة react-tailwindcss-datepicker هذا سيمنع حدوث أي تداخل بين الاسمين داخل المشروع. يمكنك بعدها استخدام كل مكون باسمه الجديد دون مشاكل.
    1 نقطة
  16. لم أتمكن من معرفة سبب حصول على الخطأ التالي: MongoDB connection error: Error: querySrv ENOTFOUND _mongodb._tcp.login.wuun2e8.mongodb.net أيضًا أحيانًا أحصل على الخطأ: querySrv ECONNREFUSED _mongodb._tcp.cluster0.abcde.mongodb.net ما المشكلة؟ وما هي الطريقة الصحيحة لاستخدام MonogoDB Atlas؟
    1 نقطة
  17. استخدمي Vercel استضافة جيدة وسهلة الاستخدام، وتستطيعي البحث على اليوتيوب عن how to deploy react project on vercel.
    1 نقطة
  18. كيف يمكنني حذف سؤال او تعليق هنا في المنصة؟
    1 نقطة
  19. مرحبا صديقي. هل يمكنك شرح ماتريد تغييره أكثر؟ وأي قاعدة بيانات تقصد؟ بالتوفيق.
    1 نقطة
  20. مكتبة numpy تستخدم للتعامل مع الأرقام والعمليات الحسابية وتطبيق التوابع من البسيطة الى المعقدة بلغة بايثون، لذلك عليك تعلم بايثون في البداية، وهنا دورة تدريبية عن لغة البايثون من أكاديمية حسوب. أما numpy فانه يمكنك تعلمها من المقالات لسهولتها وبساطتها ويمكنك أن تبدأ من هنا. بالتوفيق.
    1 نقطة
  21. 1 نقطة
  22. في الاغلب يكون هذا هو الكود ولكن من الممكن ان يختلف من شخص لاخر $servername = "localhost"; $username = "root"; $password = ""; $dbname = "Legacy"; // اسم قاعدة البيانات يمكنك تجربه مره اخري
    1 نقطة
  23. سأجيب على أسئلتك بالترتيب: 1- كيف يتم تحديث الـ API بشكل لحظي؟ - بعض الـ APIs تقوم بتحديث البيانات بشكل تلقائي باستخدام تقنيات مثل webhooks أو WebSockets . فمثلاً API للطقس عادة ما تستقبل البيانات بشكل مستمر من مراكز الأرصاد الجوية وتقوم بتحديثها لحظياً عبر الـ API. 2- الأدوات اللازمة لربط الـ API بواجهة مستخدم: - يمكن استخدام مكتبة Python مثل Requests لجلب البيانات من الـ API عبر طلبات HTTP. أما لبناء واجهة المستخدم فيمكن استخدام Flask أو Django لبناء صفحات ويب تعرض البيانات, بالنسبة لـ Streamlit، نعم، يمكنك استخدامها أيضًا لإنشاء واجهة المستخدم بشكل سريع وسهل. 3- هل يمكن ربط موقع بـ AdSense مباشرة؟ - نعم يمكن ربط موقع الـ API بـ AdSense مباشرة إذا كان الموقع مطابق لسياساتهم. لكن عادة ما يستغرق الموافقة على الطلب بضعة أسابيع. ولتحسين الـ SEO يمكن استخدام كلمات بحثية ذات صلة بخدمة الـ API مثل : 1. الكلمات الرئيسية (Keywords): استخدم كلمات رئيسية ذات صلة بالمحتوى الخاص بك. 2. عناوين الصفحات (Page Titles): جعلها واضحة ووصفية. 3. الوصف الخاص بالصفحة (Meta Description): كتابة وصف موجز وجذاب للصفحة. 4. الروابط الداخلية (Internal Links): ربط صفحات موقعك الداخلية ببعضها البعض. 5. صور متناسقة (Optimized Images): ضغط الصور واستخدام النص البديل (Alt Text). 6. روابط ذات جودة (Quality Backlinks): الحصول على روابط من مواقع ذات سمعة جيدة. 7. تحسين سرعة التحميل (Page Speed): استخدام صور مضغوطة وتقنيات تحسين الأداء. 8. محتوى فريد وجودة عالية (High-Quality Content): إنشاء محتوى جذاب ومفيد للزوار. https://io.hsoub.com/programming/22454/comment/104409
    1 نقطة
  24. يبدو انه يوجد لديك خطأ انه لا يتصل بقاعده البيانات يرجي التاكد من انك غيرت هذه البيانات وكتبت بيانات صحيحه للاتصال بقاعده البيانات $servername = "اسم_الخادم"; $username = "اسم_المستخدم"; $password = "كلمة_المرور"; $dbname = "Legacy"; // اسم قاعدة البيانات
    1 نقطة
  25. يمكنك تجربه هذا الكود <!DOCTYPE html> <html lang="ar"> <head> <link rel="icon" href="https://c0.klipartz.com/pngpicture/573/614/gratis-png-ng%C5%A9-hanh-s%C6%A1n-distrito-casa-apartamento-inmobiliaria-volta-redonda-venta-de-logotipos-de-bienes-raices.png" /> <title>موقع العقارات</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Tajawal:wght@300&display=swap" rel="stylesheet"> <meta charset="utf-8" /> <link rel="stylesheet" type="text/css" media="screen" href="home.css"> </head> <body> <header> <div> <img src="a.png" alt="نظام العقارات من كمال تجريبي"> </div> <center> <div> <button>نقاط البيع</button> <button>أدارة المخزون</button> <button>الإراضي</button> <button>الشيكات</button> <button>الأستاذ العام</button> <button>إدارة النظام</button> </div> </center> </header> <?php // اتصال بقاعدة البيانات $servername = "اسم_الخادم"; $username = "اسم_المستخدم"; $password = "كلمة_المرور"; $dbname = "Legacy"; // اسم قاعدة البيانات $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("فشل الاتصال: " . $conn->connect_error); } // استعلام SQL $sql = "SELECT * FROM Problemss"; $result = $conn->query($sql); ?> <table border="1" width="100%"> <tr> <th>تم</th> <th>الحلول</th> <th>المشكلة</th> <th>م</th> <th>الرقم</th> </tr> <?php if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { echo "<tr> <td>" . $row["تم"] . "</td> <td>" . $row["الحلول"] . "</td> <td>" . $row["المشكله"] . "</td> <td>" . $row["م"] . "</td> <td>" . $row["الرقم"] . "</td> </tr>"; } } else { echo "<tr><td colspan='5'>لا توجد نتائج</td></tr>"; } // إغلاق الاتصال بقاعدة البيانات $conn->close(); ?> </table> </body> </html> ولكن لا تنسي ان تغير ال extension الملف من html ل php (home.php)
    1 نقطة
  26. يمكنك ان تضغط ع هذا الجدول نقره يمني بالماوس ستظهر لك قائمه يمكنك ان تختار منها هذا الخيار "Select Top 1000 Rows" هذا الخيار سيعرض لك 1000 صف من الجدول
    1 نقطة
  27. تأكدي من أن وضع الطيران Airplane mode قيد الإيقاف كالتالي: بعد ذلك تفقدي هل يظهر لك أي شبكات للواي فاي وعند الإتصال بها ما الذي يحدث؟ في حال استمرت المشكلة ابحثي بشريط البحث بالأسفل عن Network Reset ثم اضغطي عليها: سيظهر لك زر باسم Reset Now اضغطي عليه ثم وافقي Yes ثم أعيدي تشغيل الحاسوب.
    1 نقطة
  28. لا يوجد شرح من البداية لمكتبة NumPy لذا أنت بحاجة إلى مصدر آخر ويوجد على اليوتيوب الكثير من الشروحات، ثم تستطيع العودة وقراءة الدروس المتقدمة الخاص بالمكتبة في أكاديمية حسوب وستجدها هنا: https://academy.hsoub.com/tags/numpy/ أيضًا قد يفيدك النقاش التالي:
    1 نقطة
  29. الـ arr في NumPy هو نوع بيانات خاص يسمى ndarray، أي أنه يحتوي على مجموعة من الميزات والعمليات التي لا تتوفر في قائمة Python العادية. والميزات هي: ndarrays أسرع من القوائم في العمليات الرياضية مثل الضرب والجمع. أكثر كفاءة في استخدام الذاكرة من القوائم. توفر مجموعة واسعة من العمليات المدمجة التي يمكن استخدامها لمعالجة البيانات بسرعة وسهولة. أيضًا numpy array تحتوي على عناصر من نفس النوع، و يستخدم نوع بيانات متقدم (مثل int32 أو float64) لتخزين البيانات، مما يسمح بتحسين أداء العمليات الرياضية. بينما يمكن لـ Python list أن تحتوي على عناصر من أنواع مختلفة، وهي أكثر سهولة في الاستخدام للحالات البسيطة والتي لا تتطلب عمليات رياضية معقدة. في حين numpy قد تبدو أكثر تعقيدًا في البداية، ولكنها تقدم ميزات قوية وفعالية للتعامل مع البيانات الكبيرة والعمليات المتقدمة.
    1 نقطة
  30. heroku لم تعد تتيح باقة مجانية بعد الآن، لذا من الأفضل استخدام منصات استضافة أخرى مثل: Vercel Netlify Render وبخصوص المشكلة لديك في Atlas، فقومي بالضغط على الثلاث نقاط أعلى اليسار ثم اختاري Project Settings ثم تفعيل Data Explorer:
    1 نقطة
  31. ما هي الخطوات او الطريق او المسار الصحيح لتعلم الريأكت
    1 نقطة
  32. بعد أن تعلمنا أساسيات التعامل مع الجداول في HTML في المقال السابق، نلقي الضوء في هذا المقال على بعض الميزات المتقدمة لجداول HTML مثل الشروحات captions والملخصات summaries وتجميع الصفوف لتشكيل ترويسة أو جسم أو تذييل، كما يمر المقال على مفهوم سهولة الوصول accessibility لذوي المشاكل البصرية إلى محتوى الجداول. إضافة شرح إلى الجدول يمكنك إضافة شروحات إلى الجداول باستخدام العنصر <caption> بعد وضعه تحت وَسم البداية للعنصر <table> مباشرةً: <table> <caption>Dinosaurs in the Jurassic period</caption> ... </table> يُستخدَم الشرح -كما يوحي المثال السابق- لإضافة وصف لمحتوى الجدول، إذ يساعد القراء على تقدير فائدة هذا المحتوى عندما يتصفحون الموقع وخاصة للمستخدِمين المكفوفين، فبدلًا من قراءة خلايا عديدة لمعرفة الغاية من الجدول، فسيعتمد المستخدِم على شرح الجدول ليقرر الاستمرار في القراءة أم لا. ملاحظة: يمكن استخدام السمة summary التي يملكها العنصر <table> لإضافة وصف يمكن لقارئات الشاشة الوصول إليه وقراءته، لكننا نفضِّل استخدام العنصر <caption> بدلًا منها لأنها أُلغيَت في مواصفات HTML5، ولا يمكن رؤيتها من قبل المستخدِمين صحيحِي البصر لأنها لن تعرض على الصفحة. تطبيق: إضافة شرح إلى جدول لنلق نظرةً ثانيةً إلى مثال برنامج التدريس اليومي الذي طرحناه في المقال السابق: عُد إلى البرنامج اليومي لمدرّسة اللغات الذي ستجده على جيت-هاب واحفظ نسخًا منه على حاسوبك الشخصي. أضف شرحًا مناسبًا إلى محتوى الجدول. احفظ التعديلات التي أجريتها ثم حمِّل الملف ضمن المتصفح لترى النتيجة. ملاحظة: يمكن إيجاد الملف بصورته النهائية على جيت-هاب. إضافة هيكلية للجدول باستخدام <thead> و <tfoot> و <tbody> عندما تتعقد هيكلية الجداول نوعًا ما، فلا بدّ من تحديد هذه الهيكلية بصورة أوضح، ولتنفيذ ذلك تُستخدَم العناصر <thead> و <tfoot> و <tbody> التي تسمح لك بتوصيف ترويسة وتذييل وجسم للجدول. لن تحسّن هذه العناصر إمكانية الوصول السهل لمستخدِمي قارئات الشاشة، ولن تحسّن في المظهر المرئي للجدول أيضًا، ولكنها مفيدة جدًا لتخطيط الجدول وتنسيقه، إذ تعمل هذه العناصر على أساس خطافات لإضافة تنسيقات CSS إلى الجداول، ففي حالة الجداول الطويلة التي تمتد على صفحات مثلًا يمكنك تكرار الترويسة والتذييل في كل صفحة تطبعها، كما يمكنك عرض جسم الجدول بأكمله على صفحة واحدة ومن ثم تصفح محتوياته باستخدام شريط تمرير للأعلى والأسفل، ولتفعل ذلك اتبع ما يلي: استخدِم العنصر <thead> لتغليف الجزء الذي يمثّل ترويسة الجدول، وهو عادةً الصف الأول الذي يضم ترويسات جميع الأعمدة لكن ليس دائمًا، فإذا كنت تستخدِم عنصرَي تجميع خلايا العمود <colgroup> و <col>، فضع ترويسة الجدول بعدها مباشرةً. استخدِم العنصر <tfoot> لتغليف الجزء الذي يمثل تذييل الجدول، فقد يكون هذا الجزء هو الصف الأخير من الجدول وقد جمعت فيه قيم الأسطر السابقة مثلًا، وبإمكانك وضع عنصر التذييل في آخر الجدول كما تتوقع أو تحت ترويسة الجدول مباشرةً لأن المتصفح سيصيّره في المكان الصحيح. استخدِم العنصر <tbody> لتغليف بقية الأجزاء، فقد يأتي جسم الجدول تحت الترويسة أو تحت التذييل تبعًا للطريقة التي تنويها في تنظيم الجدول. ملاحظة: إن العنصر <tbody> هو دائمًا جزء من الجدول سواءً صرَّحت عن ذلك أم لا، ولكي تتحقق من ذلك افتح أيًا من أمثلة الجداول التي لا تحتوي على <tbody> ثم تفحص شيفرة باستخدام أدوات مطوري ويب وستجد أنّ المتصفح قد أضاف هذا العنصر تلقائيًا، وقد تتساءل إذًا لِمَ عليّ إضافته أصلًا، والجواب هو أنه سيمنحك تحكمًا أكبر بهيكلية الجدول وتنسيقه. تطبيق: هيكلة جدول لنحاول تجربة العناصر التي تهيكل الجدول: ابدأ بحفظ نسخ عن الملفين spending-record.html وminimal-table.css في مجلد جديد على حاسوبك. افتح ملف HTML في المتصفح وسترى أنّ الجدول واضح مع إمكانية لتحسينه قليلًا، إذ يبدو الصف "SUM" الذي يضم مجموع النفقات في المكان الخاطئ، كما قد تلاحظ بعض التفاصيل المفقودة في الشيفرة. ضع الصف الذي يمثّل الترويسة داخل عنصر <thead> والصف "SUM" ضمن عنصر <tfoot> وبقية الجدول ضمن عنصر <tbody>. احفظ التعديلات وحمّل الملف من جديد، ثم لاحظ كيف انتقل الصف إلى أسفل الجدول. استخدِم السمة colspan لتمتد الخلية "SUM" على الأعمدة الأربعة الأولى كي يظهر المبلغ تحت العمود "Cost". أضف بعض التنسيقات البسيطة إلى الجدول لترى فائدة تطبيق تنسيق CSS، لذا ضع الشيفرة التالية داخل العنصر <style> الموجود داخل العنصر <head> في ملف HTML: tbody { font-size: 95%; font-style: italic; } tfoot { font-weight: bold; } احفظ التعديلات ثم حمّل الملف من جديد وشاهد نتيجة عملك، فإذا لم يكن العنصران <tbody> و <tfoot> في مكانهما الصحيح، لكان عليك كتابة شيفرة تنسيق أكثر تعقيدًا للحصول على النتيجة ذاتها. ستبدو نتيجة العمل كما يلي: ملاحظة: يمكنك الاطلاع على النسخة النهائية من المثال على جيت-هاب. الجداول المتداخلة يمكن وضع جدول ضمن آخر شرط أن تكون هيكلية الجدول مكتملة بما في ذلك العنصر <table>، ولا ننصح عادةً بمثل هذا التداخل لأنه سيعقد من توصيف الجداول ويصعّب وصول قارئات الشاشة إلى محتوياتها، كما يُعَدّ إدراج خلايا أو صفوف أو أعمدة جديدة إلى الجدول المطلوب هو الأجدى في كثير من الحالات، لكنك قد تضطر أحيانًا إلى إدراج جدول ضمن آخر خاصةً إذا أردت إدراج محتوى من مصدر خارجي دون تعقيدات إضافية على سبيل المثال، وتعرض الشيفرة التالية جدولين بسيطين متداخلين: <table id="table1"> <tr> <th>title1</th> <th>title2</th> <th>title3</th> </tr> <tr> <td id="nested"> <table id="table2"> <tr> <td>cell1</td> <td>cell2</td> <td>cell3</td> </tr> </table> </td> <td>cell2</td> <td>cell3</td> </tr> <tr> <td>cell4</td> <td>cell5</td> <td>cell6</td> </tr> </table> ستبدو نتيجة تنفيذ الشيفرة كما يلي: جداول خاصة بذوي المشاكل البصرية لنراجع باختصار استخدامات الجداول، إذ تُعَدّ الجداول أداةً مفيدةً تساعدنا في الوصول السريع إلى البيانات والبحث عن القيم المختلفة فيها، وبنظرة سريعة مثلًا على الجدول الذي نعرضه تاليًا ستتمكن من معرفة عدد الخواتم Rings التي بيعت في جينت Gent شهر 8 عام 2016، إذ نربط بصريًا بين المعلومات الواردة في الجدول مع ترويسة الصف والعمود لنجد المطلوب. table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } Clothes Accessories Trousers Skirts Dresses Bracelets Rings Belgium Antwerp 56 22 43 72 23 Gent 46 18 50 61 15 Brussels 51 27 38 69 28 The Netherlands Amsterdam 89 34 69 85 38 Utrecht 80 12 43 36 19 لكن ما الحل إذا لم تتمكن من رؤية الجدول؟ كيف ستتمكن من قراءته؟ يستخدِم أصحاب المشاكل البصرية قارئات الشاشة التي تقرأ المعلومات الواردة في صفحات الويب، إذ ستعمل هذه التقنية بسهولة عند قراءة نص صرف، لكن يُعَدّ تفسير محتوى جدول أمرًا مختلفًا ويمثِّل تحديًا للمكفوفين، ومع ذلك يمكننا الاستغناء عن الارتباطات البصرية والاستعاضة عنها بارتباطات برمجية عند استخدام العناصر الصحيحة، وسنعرض تاليًا بعض التقنيات التي تسهّل الوصول إلى الجداول قدر المستطاع. ملاحظة: يوجد حوالي 253 مليون شخص كفيف أو يعاني من مشاكل بصرية وفقًا لمنظمة الصحة العالمية WHO في عام 2017. استخدام ترويسات الأعمدة والصفوف تستخدِم قارئات الشاشة الترويسات في الارتباطات البرمجية بينها وبين الخلايا المتعلقة بها، إذ يعرِّف ويفسر ضمّ ترويسات الصفوف والأعمدة بيانات كل خلية وبذلك ستتمكن القارئات من إيصال هذا التفسير إلى المكفوف. استخدام السمة scope تُضاف هذه السمة إلى العنصر <th> -أي ترويسة جدول- لتدل قارئات الشاشة على الخلايا التي تمثلها ترويسة معينة (هل هي ترويسة صف أم عمود مثلًا؟)، وبالعودة إلى مثال التطبيق السابق الذي طرحناه سابقًا، سترى كيف تُميَّز ترويسة العمود لأنها ستبدو على الصورة التالية: <thead> <tr> <th scope="col">Purchase</th> <th scope="col">Location</th> <th scope="col">Date</th> <th scope="col">Evaluation</th> <th scope="col">Cost (€)</th> </tr> </thead> وترويسة كل صف ستبدو أيضًا كما يلي إذا أضفنا ترويسات صفوف بالإضافة إلى ترويسات الأعمدة: <tr> <th scope="row">Haircut</th> <td>Hairdresser</td> <td>12/09</td> <td>Great idea</td> <td>30</td> </tr> تستطيع قارئات الشاشة التعرُّف على هذا التوصيف، وبالتالي ستقرأ كامل الصف أو العمود مباشرةً على سبيل المثال. تأخذ السمة scope أيضًا القيمتين colgroup و rowgroup وتستخدمان لتوصيف الترويسات التي تقع فوق عدة أعمدة أو صفوف، فإذا عدت إلى الجدول السابق "حول مبيعات شهر 8 عام 2016"، فستجد أنّ الخلية "Clothes" هي ترويسة للخلايا "Trousers" و "Skirts" و "Dresses"، وينبغي الإشارة إلى جميع هذه الخلايا على أنها ترويسات (<th>)، ولهذا لا بدّ من أن نزوّد الخلية "Clothes" بالسمة "scope="colgroup، في حين ستأخذ بقية الترويسات التي تقع تحتها مباشرة السمة "scope="col. استخدام السمتين id و headers يمكننا استخدام السمتين id و headers على أساس بديل عن scope في الارتباطات بين الترويسات والخلايا، ويجري الأمر كما يلي: زوّد كل عنصر <th> (عنصر الترويسة) بسِمة id تحمل قيمة فريدة. زوّد كل عنصر <td> (عنصر الخلية) بسِمة headers تضم قائمةً بمعرِّفات جميع الترويسات التي تُعَدّ ترويسةً مباشرةً لهذه الخلية تفصل بينها مسافةً فارغةً. يعطي هذا الأسلوب جدوّل HTML تعريفًا صريحًا لموقع كل خلية بترويسة (أو ترويسات) العمود والصف الذي تشكل جزءًا منه، ولا بدّ من الإشارة إلى ضرورة استخدام ترويسات للصفوف والأعمدة معًا إذا أردت استخدام هذه الطريقة. لاحظ طريقة تطبيق هذا الأسلوب على مثال التطبيق السابق السابق: <thead> <tr> <th id="purchase">Purchase</th> <th id="location">Location</th> <th id="date">Date</th> <th id="evaluation">Evaluation</th> <th id="cost">Cost (€)</th> </tr> </thead> <tbody> <tr> <th id="haircut">Haircut</th> <td headers="location haircut">Hairdresser</td> <td headers="date haircut">12/09</td> <td headers="evaluation haircut">Great idea</td> <td headers="cost haircut">30</td> </tr> ... </tbody> ملاحظة: تُعَدّ هذه الطريقة دقيقةً جدًا في ارتباط خلايا البيانات مع الترويسات، لكنها تتطلب عملًا أكثر لا يحتمل أية أخطاء، ولهذا يُعَدّ استخدام السمة scope كافيًا لمعظم الجداول. تطبيق: استخدام السمتين scope و headers احفظ نسخةً عن الملفين items-sold.html و minimal-table.css في مجلد جديد على جهازك. حاول استخدام السمة scope لتحسين طريقة عرض هذا الجدول. حاول حفظ نسخة أخرى عن الملفين السابقين في مجلد آخر على جهازك ثم استخدم السمتين scope و headers لدعم فكرة سهولة الوصول إلى الجدول. ملاحظة: يمكنك التحقق من صحة عملك بموازنته مع النسخة النهائية باستخدام scope وباستخدام headers على جيت-هاب. خلاصة على الرغم من وجود بعض الأفكار الأخرى التي يمكنك تعلمها عن الجداول في HTML، إلا أننا زودناك بكل ما تحتاجه حاليًا، ولا بدّ الآن من التوجه نحو تعلّم طريقة تنسيق ملفات HTML باستخدام لغة التوصيف CSS. للمزيد من التفاصيل، ارجع إلى توثيق الجداول في موسوعة حسوب. ترجمة -وبتصرُّف- للمقال HTML table advanced features and accessibility. اقرأ أيضًا أساسيات بناء الجداول في HTML كيفية إنشاء جدول أنيق بـ HTML و CSS جداول html ذات رأسية وأعمدة ثابتة باستخدام jQuery الجداول (Tables) في CSS
    1 نقطة
×
×
  • أضف...