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

Adnane Kadri

الأعضاء
  • المساهمات

    5129
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    51

كل منشورات العضو Adnane Kadri

  1. لا يمكن حصر الموضوع في بضعة طرق فالمواقع الشخصية تعبر عن أشخاص او شركات او مؤسسات ولكل منها ما يميزها بشكل يتطلب الاشارة اليه بها في هاته المواقع، قم بالبحث بشكل اكثر تخصيصا. فبدل البحث عن portfolio websites examples قم بالبحث عن portfolio websites for front end developers examples او web designer portfolio website . بعد استلهام افكار منها يمكنك الانطلاق في بناء موقع شخصي، إما بمحتوى مشابه او هيكلة او تصميمين مشابهين. وبالطبع يمكنك اضافة لمساتك الخاصة التي تظن انها تميزك دون غيرك. فيما يلي بعض الخطوات التي قد تساعدك: قم بتحديد المحتوى الذي تريد الاشارة اليه في موقعك. (مثال: نبذة عامة، الخبرات، الدراسة، الأعمال السابقة، شهادات عملاء، قسم للمراسلة) استلهم افكارا بخصوص التصميم والهيلكة بخصوص كل جزئية بدل استلهام الشكل العام للموقع فقط. سيعطي هذا لمسة خاصة تميز كل مكون دون ان يخرج عن نمط البقية. (مثال: ابحث عن امثلة عن نماذج اتصل بنا في الانترنت، او عن امثلة عن قسم شهادة العملاء) لا تتكلف كثيرا وركز على تجربة الاستخدام، فالزوار او العملاء غالبا لن يقوموا بقراءة كامل ما ستشير إليه. ركز على دلالية العناصر والألوان وتموضعها. وعلى ما قل ودل من النصوص والكلام.
  2. ان كنت تنوي تطبيق الخاصية scroll-behavior على كامل العقد الفرعية لعنصر body فيجب اضافة ذلك في عنصري body,html وسيتم التقاطها من قبل كامل العناصر: body , html { scroll-behavior: smooth; } تأثيرات التمرير في صفحات الويب باستخدام Javascript وCSS
  3. لما لا تستعمل querySelectorAll مرفقة بذات المحدد *؟ var nodes = document.querySelectorAll('*'); nodes.forEach(node => { console.log(node) }) Document.querySelectorAll()‎
  4. توجد هنالك واجهة برمجية كاملة تخص السحب والافلات في جافاسكربت، تأتي بمجموعة من الأحداث يمكن بناءا عليها تحريك العناصر وفق شكل ما. نذكر: drag: حدث سحب العنصر. dragend: حدث نهاية سحب العنصر. dragstart: حدث بداية السحب drop: حدث افلات العنصر مثلما يوجد الأحداث dragenter، dragleave و dragover يجب اولا تعريف الخاصية draggable واسناد القيمة true لها في html . مثال عملي: نقوم بتعريف متغير dragItem يحدد العنصر الذي يتم سحبه كل مرة. فعند سحب العنصر نقوم بتحديده عن طريق الجافاسكربت ولنعطه الصنف invisible حيث يتم تطبيق display:none على هذا العنصر، ننشئ الدالة dragStart: function dragStart() { dragItem = this; setTimeout(() => this.className = 'invisible', 0) } تعبر this عن العنصر المسحوب. عند نهاية السحب يفترض ان تعود القيمة dragItem الى قيمتها الافتراضية. نلخص ذلك في الوظيفة dragEnd: function dragEnd() { this.className = 'item' dragItem = null; } تعبر this عن العنصر المسحوب. عند الافلات يفترض ان يستقبل الحاوي الذي تم الافلات فيه العنصر المسحوب ويضيفه اليه، نلخص ذلك: function dragDrop() { this.append(dragItem); } تعبر this عن الحاوي الذي تم الافلات فيه. تعبر dragItem عن العنصر الذي يتم سحبه. كخطوة اضافية نقوم بتعطيل الحدث dragOver لأنه يتم تشغيل هذا الحدث عند سحب الماوس فوق العنصر. وغالبا ما تكون العملية التي تحدث مماثلة لحدث السحب ونحن نستهدفها بالفعل. لنعطلها: function dragOver(e) { e.preventDefault() } لنعرف الهيكلية التالية في HTML: <div class="container"> <div class="column"> <h1>اسحب من هنا</h1> <div class="item" draggable="true">عنصر 1</div> <div class="item" draggable="true">عنصر 2</div> <div class="item" draggable="true">عنصر 3</div> <div class="item" draggable="true">عنصر 4</div> </div> <div class="column"> <h1>افلت هنا</h1> </div> </div> نطبق التنسيقات التالية: .container{ display: flex; gap: 30px; } .column{ flex-basis: 20%; background: #ddd; min-height: 90vh; padding: 20px; border-radius: 10px; } .column h1{ text-align: center; font-size: 22px; } .item{ background: #fff; margin: 20px; padding: 20px; border-radius: 3px; cursor: pointer; } .invisible{ display: none; } نسند الأحداث الى الحاويات والعناصر كـ: const items = document.querySelectorAll('.item') const columns = document.querySelectorAll('.column') items.forEach(item => { item.addEventListener('dragstart', dragStart) item.addEventListener('dragend', dragEnd) }); columns.forEach(column => { column.addEventListener('dragover', dragOver); column.addEventListener('drop', dragDrop); }); يفترض ان يقدم هذا مقاربة بسيطة لعملية السحب والافلات عن طريق الجافاسكربت مباشرة. اختبر النتيجة هنا.
  5. يستحسن ان يتم بواسطة الواجهة الخلفية، لأن هذا يخدم مفهوم التصيير على الخادم وهو الآخر يخدم الـ SEO. ونعم، يمكن ايضا استعمال الجافاسكربت لانشاء موقع متعدد اللغات.
  6. في jQuery يمكنك استعمال التابع isEmptyObject للتحقق من ما ان كان الكائن فارغا، إذ يتحقق هذا التابع من الخصائص الموجودة على الكائن نفسه ومن الخصائص الموروثة من النماذج الأولية. يستقبل هذا التابع معاملا يعبر عن الكائن المشار اليه. يكون الاستعمال العام لها كـ: jQuery.isEmptyObject({}); // true jQuery.isEmptyObject({ foo: "bar" }); // false
  7. لاحظ ان الصور التي لديك تظهر وبشكل عادي على: https://site.com/public/storage/logo1.png في حين انها غير متوفرة على: https://site.com/storage/logo1.png يعني هذا ان لا مشكلة في تكوين الرابط الرمزي symlink فهو يعمل وبشكل عادي تماما. الفكرة هنا هي في ان هنالك مشكلة في تكوين روابط ملفات الاصول مثل الصور. اعد ارفاق مسارات صحيحة الى خصائص src الخاصة بهاته الصور.
  8. هل يمكنك الاشارة الى لغة البرمجة التي تعتمدينها؟ عموما، يتم ذلك عن طريق تصيير الصفحات على مستوى الخادم وحقن الترجمات بما يوافق لغة معينة. فعلى سبيل المثال في PHP، لا نصف عنوان الموقع كـ: <title> عنوان الموقع </title> بل يكون ضمن صفحة بامتداد PHP كـ: <title> <?php echo translate('page title'); ?> </title> حيث ان هنالك وظيفة translate تستقبل معاملا يعبر عن الكلمة المراد ترجمتها والبحث ضمن مصفوفة او ملف ترجمات. مثال: function translate($key) { $language = 'ar'; if($language == 'fr'){ return [ 'page title' => 'titre de la page' ][$key]; }elseif($language == 'en'){ return [ 'page title' => 'page title' ][$key]; }else{ return [ 'page title' => 'عنوان الصفحة' ][$key]; } } يمكن التوسع في الفكرة اكثر وفصل كل مكون على حدة. مثال: يمكن جلب وقراءة اللغة المستهدفة كمعامل في الرابط او كترويسة في الطلب. يمكن ايضا فصل ملف الترجمات الخاص بكل لغة وتحميل الملف المناسب بحسب اللغة المطلوبة. فالفكرة واحدة، يمكن تطبيقها وفق اي منطق ما ووفق اي لغة ما. ف PHP هنا هي مثال لا أكثر.
  9. ما المشكلة اذن؟ هل تواجه مشكلة باستعراض الصور في المتصفح او الوصول اليها؟
  10. يفترض ان يبقى على نفس مستوى ملف index.php بالنسبة لـلرابط الرمزي، قد لا يعمل بشكل صحيح ان كنت تحاول تنفيذ الامر php artisan storage:link بعد التعديل على هيكلة الملفات. وبما انه لم يكن هنالك مشكلة في انشاء رابط رمزي اول مرة، فيمكنك على كل حال انشاءه بشكل مخصص. يوجد الدالة symlink في php لفعل ذلك قم بـ: انشاء ملف وليكن symlink.php على نفس مستوى index.php يحتوي هذا الملف السطر التالي: <?php symlink('/home/username/folder_name/storage/app/public' ,'/home/username/public_html/storage'); حيث ان المعامل الاول يعبر عن الملف الاصل الذي ستشير اليه الوصلة. في حين ان المعامل الثاني يشير الى اسم الوصلة ووجهتها. قم بتعديله وفق ما هو لديك. لتنفيذ هذا الملف قم بفتحه على المتصفح وانتظر الى حد توقف الصفحة عن التحميل. هل قام هذا بحل مشكلتك؟ من المهم حذف الملف symlink بعد انشاء الوصلة او الرابط الرمزي. الدالة symlink()‎ في PHP
  11. هل يتم انشاء الرابط الرمزي symlink بشكل عادي ثم لا تعمل الصفحات؟ هل يمكنك ارفاق محتويات ملف htaccess لديك؟ ايضا يرجى الاشارة ان كنت تمتلك ملف htaccess آخر ضمن مجلد المشروع
  12. هو لا يخص لارافيل على وجه الخصوص، وانما يخص خوادم Apache. فملف htaccess هو ملف اعداد من قبل خوادم Apache يحدد كيفية تقديم أشكال مختلفة من البيانات والتعامل مع طلبيات HTTP. ويتم ذلك عن طريق وصف مجموعة من الموجهات Directives. هاته الموجهات تحدد كيفية الترخيص والتوثيق، تخصيص رسائل الاخطاء واكوادها، تجاوز واعادة كتابة الروابط، اعداد الكاش وغيرها.. يمكن تعميم هاته الكيفيات على كامل الانماط والمجلدات والملفات الفرعية، كما يمكن تخصيص طرق للتعامل مع كل مجلد او ملف بشكل مستقل. وهذا هو سبب تسميته بملف التكوينات الموزعة او distributed configuration files حسب التوثيق الرسمي له. هذا المنطق يفرض عليه الكيفية التي هو عليها في كتابته. ورغم انه مكتوب بلغة Apache إلا انه لا يجب عليك معرفة الا ما تحتاجه منه بالضبط. لنأخذ كلا من الأمثلة: Header add Sample-Header "My Value" يقوم هذا باضافة ترويسة Sample-Header بالقيمة My Value لكامل الطلبيات. وهذا تعليق: # Header add Sample-Header "My Value" اي قواعد هنا سيتم تطبيقها في نمط mod_expires: <IfModule mod_expires.c> # fff </IfModule> استعن بالتوثيق الرسمي لخادم Apache لفهم محتوى ملف ما لديك. ستجد مجموعة موجهات متعلق بكل نمط على حدى. اعرف اكثر عن تلك التي تخصك. ملف htaccess معد بشكل جيد في لارافيل. لا أظن انك تحتاج اعادة تجاوزه. مرفق.
  13. دورة تطوير التطبيقات باستخدام python تتضمن كلا من المسارات التالية: أساسيات لغة بايثون Python تطبيقات عملية باستخدام بايثون Python أساسيات إطار العمل جانغو Django تطوير متجر إلكتروني باستخدام جانغو Django تطوير واجهة برمجية لتعديل الصور باستخدام فلاسك Flask ولا يشمل اي من ذلك التعامل مع الذكاء الاصطناعي، يمكنك الاستفادة من مجموعة المقالات المنشورة ضمن هذا التصنيف في أكاديمية حسوب.
  14. استعمل querySelectorAll ومرر ذات المحدد مباشرة: var allButLastOne = document.querySelectorAll('div a:not(:last-child)');
  15. يمكنك الاستعانة بالمحدد الزائف not: div a:not(:last-child) { opacity: 0.3; } يحدد هذا كامل العناصر a داخل العنصر div باستثناء العنصر الأخير. اعرف اكثر عن المحددات (Selectors) في CSS
  16. هل جربت انشاء دالة مخصصة لذلك؟ لنسميها sleep ايضا! تقوم هاته الدالة بجلب الوقت time الذي تم فيه استدعاءها ثم تنفيذ حلقة while مقيدة بشرط ان يكون وقت تنفيذ التكرارة الواحدة من الحلقة اقل من الوقت الذي تم فيه استدعاء الدالة مضافا اليه الوقت الذي نريد تمريره الى الدالة sleep. تطبيق عملي لها: function sleep(duration){ // جلب الوقت time الذي تم فيه استدعاءها var now = new Date().getTime(); // تنفيذ حلقة while مقيدة بشرط ان يكون وقت تنفيذ التكرارة الواحدة من الحلقة اقل من الوقت الذي تم فيه استدعاء الدالة مضافا اليه الوقت الذي نريد تمريره الى الدالة sleep while(new Date().getTime() < now + duration){ /* لا شيء */ } } function exampleFunc(){ sleep(2000); console.log("Hello"); } exampleFunc() لاحظ ان القيمة المسندة لـ now يتم تنفيذها مرة واحدة. وبالتالي فهي تخزن مرة واحدة في التخزين المحلي. في حين ان تلك التي استعمالها في شرط الحلقة while يتم تحديثها كل حلقة من التكرار الى حد انتفاء الشرط.
  17. يمكنك ايضا عن طريق الجافاسكربت جلب قيمتي الازاحتين: الأفقية والعمودية للصفحة او الوثيقة. ثم الاستماع الى الحدث onscroll لإعادة المستخدم الى هاتين الازاحتين كل مرة يتم فيها محاولة عمل تمرير. يعني هذا: منع المستخدم من التمرير. يكون ذلك كـ: // جلب الازاحتين الافقية والعمودية لصفحة الويب let TopScroll = window.pageYOffset || document.documentElement.scrollTop; let LeftScroll = window.pageXOffset || document.documentElement.scrollLeft, // اعادة المستخدم الى الموضع المحدد بهاتين الازاحتين window.onscroll = function() { window.scrollTo(LeftScroll, TopScroll); }; فهم الأحداث في جافاسكربت
  18. هل حاولت الاطلاع على دورات الأكاديمية؟
  19. يمكنك ايضا استعمال التابع entries عن الكائن Object لطباعة كل مفتاح وقيمة على التوالي، يكون ذلك كـ: Object.entries(obj) يعيد هذا التابع مصفوفة ثنائية البعد Two-dimensional Arrays ذات ثنائيات مفتاح قيمة كـ: [["p1", "value1"], ["p2", "value2"], ["p3", "value3"]] يمكنك المرور عليها عن طريق اي تكرار، وليكن for in : for (const [key, value] of result) { console.log(key, value); } فتكون كاملة الشيفرة: const myObj = { a: 1, b: 2, c: 3 }; let i = Object.entries(myObj); for (const [key, value] of i) { console.log(key, value); } الناتج: "a", 1 "b", 2 "c", 3 الكائن Object في JavaScript التابع Object/entries في جافاسكربت
  20. يمكنك انشاء دالة مخصصة تقوم بالأمر عليك، فيما يلي منطق عمل الدالة: تقوم هاته الدالة باستقبال العدد المراد اضافة بادئة صفرية اليه num وعدد الاصفار المراد اضافتها اليه num_of_zeros. تقوم الدالة بتكرار السلسلة النصية "0" عدد num_of_zeros مرة. وتخزنها في متغير محلي. في حالة ما كان العدد موجبا فإن الدالة ستقوم مباشرة باضافة الاصفار الى بدايته. في حالة ما كان العدد سالبا فان الدالة ستقوم بحقن الاصفار بعد علامة ال -. مثال عملي: /** * اضافة بادئة اصفار الى عدد * * @param num * @param num_of_zeros * @return string */ function padZeros(num, num_of_zeros) { var zeros = ('0').repeat(num_of_zeros); return num >= 0 ? zeros + num : String(num).substr(0, 1) + zeros + String(num).substr(1) ; } مثال عن الاستعمال: console.log(padZeros(-4, 10)) // "-00000000004" console.log(padZeros(1, 4)) // "00001" الكائن String في JavaScript التابع Repeat في جافاسكربت التابع substring في جافاسكربت
  21. هل يمكنك طباعة ناتج الرد بدل حقنه في الوثيقة؟ success:function(data){ //$(this).parents('.inputEditTex').nextAll('.p-comment-homepage').html(data); console.log(data); } هلا قمت باطلاعي على نتيجة الطباعة. يحتمل ايضا ان هنالك مشكل بتحديد الحقل الذي سيتم فيه حقن التعليق.
  22. بداية، قم بتثبيت tailwindcss وملحقاتها: npm install -D tailwindcss postcss autoprefixer قم بتكوين ملف اعداد tailwindcss: npx tailwindcss init -p قم بتوصيف امتدادات الملفات المراد التعامل معها في ملف tailwind.config.js: module.exports = { content: [ "./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}", ], theme: { extend: {}, }, plugins: [], } اضف موجهات tailwindcss الى ملف التنسيقات الرئيسي لديك: @tailwind base; @tailwind components; @tailwind utilities; قم بتضمين ملف التنسيقات بملف الجافاسكربت الرئيسي لديك: import './css/style.css'; قد تحتاج كخطوة اضافية تضمين tailwindcss و autoprefixer ضمن اضافات postcss في ملف اعداد postcss.config.js: module.exports = { plugins: [ // ... require('tailwindcss'), require('autoprefixer'), // ... ] } وأخيرا تشغيل الامر npm run dev والبدء في استعمال tailwindcss ضمن مشروعك.
  23. لا مشكلة بشيفرة الـجافاسكربت او الـ HTML. ولكن كون شيفرة الجافاسكربت لا تطبع شيئا بعد نجاح تقديم طلب الاجاكس يعني انها لا تلتقط قيمة معادة من الواجهة الخلفية الاصلية. جرب اعادة قيمة من شيفرة الـ PHP كـ: if (isset($_GET['ed']) && isset($_GET['text'])) { $comNum=$_GET['ed']; $text=$_GET['text']; $stmt=$conn->prepare(" UPDATE comments set c_text=? where c_id=? "); $stmt->execute(array($text,$comNum)); if ($stmt) { $stmt=$conn->prepare(" SELECT * from comments where c_id=? "); $stmt->execute(array($comNum)); $com=$stmt->fetch(); if (!empty($com)) { return "<span>". $com['c_text'] ."</span>"; } } }
  24. مبدئيا، هي صور تحوي يتم التحكم في حدودها وزواياها بشكل يجعلها تظهر بالشكل الذي هو عليه. ولكن يمكنك ايضا اضافة المزيد من الصور والطبقات والعناصر فوق الصورة والتأكد من جعلها تتموضع بشكل صحيح. قد تمتلك هاته الصور اجزاء شفافة بشكل ما يجعل ظهور الصورة الاخرى يظهر بشكل منحني او مائل او دائري. فعلى سبيل المثال: ليكن المكون banner على الشكل: <div class="banner"> <img width="200px" src="my-img.png" alt="text" /> </div> لنضف طبقة جزء منها شفاف كـ: <div class="banner"> <img class="my-img" src="path/to/img" alt="text" /> <img class="layer" src="path/to/layer"> </div> ولنطبق التنسيقات التالية عليهما: .banner{ position: relative; } .banner .layer{ position: absolute; /*جعل الطبقة تتموضع بشكل مطلق*/ top: 0; right: 0; width: 100%; } تفحص المثال. ابحث عن layers png وستجد الكثير من الاشكال التي يمكن وضعها فوق صورة ما لتعطي ناتجا يظهر بشكل جميل.
  25. بداية، يمكنك اختصار الشيفرات التالية: function toggleOn(){ if(toggleBtn.classList.contains('toggle-on')){ toggleBtn.classList.remove('toggle-on'); toggleBtn.classList.add('toggle-off'); navMenu.classList.remove('w-[75px]'); navMenu.classList.remove('rounded-[40px]'); navMenu.classList.add('w-[250px]'); navMenu.classList.add('rounded-[20px]'); container.classList.remove('left-[70px]'); container.classList.add('left-[250px]'); }else{ toggleBtn.classList.remove('toggle-off'); toggleBtn.classList.add('toggle-on'); navMenu.classList.remove('w-[250px]'); navMenu.classList.add('w-[75px]'); navMenu.classList.remove('rounded-[20px]'); navMenu.classList.add('rounded-[40px]'); container.classList.remove('left-[250px]'); container.classList.add('left-[70px]'); } لتصبح: function toggleOn(){ if(toggleBtn.classList.contains('toggle-on')){ toggleBtn.classList.remove('toggle-on'); toggleBtn.classList.add('toggle-off'); navMenu.classList.remove('w-[75px]' ,'rounded-[40px]'); navMenu.classList.add('w-[250px]' ,'rounded-[20px]'); container.classList.remove('left-[70px]'); container.classList.add('left-[250px]'); }else{ toggleBtn.classList.remove('toggle-off'); toggleBtn.classList.add('toggle-on'); navMenu.classList.remove('w-[250px]' ,'rounded-[20px]'); navMenu.classList.add('w-[75px]' ,'rounded-[40px]'); container.classList.remove('left-[250px]'); container.classList.add('left-[70px]'); } ثم ما الحاجة من كل هاته التلاعبات بشجرة الوثيقة؟ لما لا يكفي تغيير صنف واحد وليكن هو حاوي قائمة التصفح. قم بتبديل صنف واحد مثلا وليكن is-enabled function toggleOn(){ if(toggleBtn.classList.contains('toggle-on')){ navMenu.classList.add('is-enabled') }else{ navMenu.classList.remove('is-enabled') } أو حتى: function toggleOn(){ navMenu.classList.toggle('is-enabled') ثم تعامل مع الباقي عن طريق الـ css و tailwindCSS: .nav-menu { // اي تنسيقات } .nav-menu .toggle-btn{ // اي تنسيقات } .nav-menu .container{ // اي تنسيقات } .nav-menu.is-enabled { // اي تنسيقات } .nav-menu.is-enabled .toggle-btn{ // اي تنسيقات } .nav-menu.is-enabled .container{ // اي تنسيقات } او عن طريق sass: .nav-menu { // اي تنسيقات .toggle-btn{ // اي تنسيقات } .container{ // اي تنسيقات } &.is-enabled { // اي تنسيقات .toggle-btn{ // اي تنسيقات } .container{ // اي تنسيقات } } } يوجد قاعدة تسعى لتحسين تجربة الاستخدام تسمى Less Javascript, more HTML and CSS أي "اقل جافاسكربت ، اكثر HTML و CSS". حاول التقليل من الاعتماد على جافاسكربت كليا في اشياء يمكن القيام بها عن طريق css (رغم انها قادرة).
×
×
  • أضف...