محمد بغات

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

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

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

  • Days Won

    1

السُّمعة بالموقع

8 Neutral

2 متابعين

  1. بايثون هي لغةٌ سهلة القراءة ومتنوعة ومتعددة الاستخدامات، وغالبًا ما تُستخدم في كتابة السكربتات (scripting) والأتمتة وتحليل البيانات وتعلم الآلة (machine learning) والتطوير الخلفي (back-end development). ظهرت بايثون سنة 1991، واستوحي اسمها من مجموعة كوميدية بريطانية باسم «Monty Python»، وكان أحد الأهداف الأساسية لفريق تطوير بايثون هو جعل اللغة مرحةً وسهلة الاستخدام، وبسيطة الإعداد، وجعل طريقة كتابتها مباشرة، مع توفير تقرير مباشر عند حدوث أخطاء. وهي خيارٌ ممتازٌ للمبتدئين والوافدين الجدد على البرمجة. إصدار بايثون 3 هو الإصدار الحالي من اللغة ويُعدُّ مستقبل بايثون. سيُرشِدُك هذا الدرس خطوةً بخطوة إلى كيفية تثبيت بايثون 3 على CentOS 7، وتثبيت بيئة برمجة عبر سطر الأوامر. المتطلبات المسبقة لمتابعة هذه المقالة، يجب أن تملك صلاحيات مستخدم أساسي غير جذري (non-root superuser) على نظام CentOS 7 متصل بالشبكة. إذا لم تكن لك خبرة في التعامل مع بيئة النافذة الطرفية، فيمكنك مطالعة المقالة "مدخل إلى طرفيّة لينكس Linux Terminal". الخطوة الأولى: تحضير النظام سنُثبِّت ونضبط بايثون عبر سطر الأوامر، إن كان نظام CentOS 7 يبدأ بسطح مكتب ذي واجهة مستخدم رسومية (GUI)، فيمكنك الدخول إلى سطر الأوامر بفتح القائمة، والدخول إلى Applications ثم Utilities ثم النقر على Terminal. هنالك مقالات في أكاديمية حسوب (كدرس مدخل إلى طرفيّة لينكس Linux Terminal) ستعلمك أساسيات سطر الأوامر، وهنالك كتاب «سطر أوامر لينكس» الذي يُعدُّ مرجعًا لطريقة التعامل مع سطر الأوامر. سنستخدم أداة إدارة الحزم مفتوحة المصدر yum (اختصار للعبارة Yellowdog Updater Modified). هذه أداة شائعة الاستخدام لإدارة الحزم على أنظمة لينكس المستندة إلى Red Hat، مثل CentOS. ستتيح لك هذه الأداة تثبيت الحزم وتحديثها بسهولة، وكذلك إزالة الحزم من الجهاز. قبل أن نبدأ التثبيت، دعنا نتأكد من أنّ لدينا أحدث إصدار من yum عبر تنفيذ الأمر التالي: sudo yum -y update الخيار ‎-y يعني أنَّك تدرك أنّك تحدث تغييرات، وذلك لمنع الطرفية من طلب تأكيد قبل تنفيذ الأمر. سنثبّت الآن yum-utils، وهي حزمة من الأدوات والإضافات التي توسّع yum وتكمّلها: sudo yum -y install yum-utils أخيرًا، سنثبّت أدوات التطوير الخاصة بنظام CentOS، والتي تُستخدم لإنشاء وتصريف (compile) البرامج من الشيفرة المصدرية: sudo yum -y groupinstall development بمجرد تثبيت كل شيء، فنحن جاهزون لتثبيت بايثون 3. المرحلة الثانية: تثبيت وإعداد بايثون 3 نظام CentOS مشتق من RHEL (اختصار للجملة Red Hat Enterprise Linux) ، والذي يركز على الثبات والاستقرار. ولهذا السبب، فلن تجد في هذا النظام إلا الإصدارات المستقرة والمُختبرة من التطبيقات والحزم القابلة للتنزيل، لذلك لن تجد على CentOS إلا الإصدار بايثون 2. نظرًا لأننا نرغب في تثبيت أحدث إصدار مستقر من بايثون 3، فسنحتاج إلى تثبيت IUS (اختصار للعبارة Inline with Upstream Stable)، وهو مشروع مفتوح المصدر. يوفر IUS حزم Red Hat Package Manager ‏(RPM) لبعض الإصدارات الحديثة من البرامج المحددة. سنثبت IUS عبر yum: sudo yum -y install https://centos7.iuscommunity.org/ius-release.rpm بعد الانتهاء من تثبيت IUS، يمكننا تثبيت أحدث إصدار من بايثون: sudo yum -y install python36u بعد إكمال العملية، يمكننا التحقق من نجاح عملية التثبيت بطلب إصدار بايثون بكتابة: python3.6 -V ستحصل على مخرجات في نافذة الطرفية والتي ستريك إصدار بايثون المثبّت. قد يختلف الرقم بناءً على النسخة المثبتة في توزيعتك، لكن يجب أن يكون شبيهًا بما يلي: Python 3.6.1 لإدارة الحزم البرمجية الخاصة ببايثون، سنثبّت pip، وهي أداةٌ تعمل مع لغة بايثون تُثَبِّت وتدير الحزم البرمجية التي قد نحتاج إلى استخدامها في تطوير مشاريعنا. يمكنك تعلم المزيد عن الوحدات والحزم التي يمكنك تثبيتها بالأداة pip بقراءة المقالة كيفية استيراد الوحدات في بايثون 3 من هذه السلسلة: sudo yum -y install python36u-pip يمكن تثبيت حزم بايثون بكتابة ما يلي: sudo pip3.6 install package_name حيث عليك وضع اسم الحزمة أو المكتبة التابعة لبايثون مكان package_name مثل Django لتطوير الويب، أو NumPy لإجراء الحسابات العلمية. لذا، إن شئتَ تنزيل NumPy فيمكنك تنفيذ الأمر pip3.6 install numpy. أخيرًا، سنحتاج إلى تثبيت الحزمة python36u-devel الخاصة بـ IUS، والتي توفر لنا مكتبات وملفات ترويسية (header files) ضرورية للتطوير على بايثون 3: sudo yum -y install python36u-devel سنستخدم الوحدة venv لإعداد «بيئة افتراضية» (virtual environment) لمشاريعنا. الخطوة الثالثة: إعداد بيئة افتراضية الآن بعد أن ثبّتنا بايثون وأعددنا النظام، يمكننا المضي قدمًا لإنشاء بيئة البرمجة التي سنعمل فيها باستخدام venv. تُمكِّنك البيئات الافتراضية من إنشاء مساحة معزولة في حاسوبك مخصصة لمشاريع بايثون، مما يعني أنَّ كل مشروع تعمل عليه ستكون له اعتماديّاته (dependencies) الخاصة به، والتي لن تؤثِّر على غيره من المشاريع. يوفِّر لنا ضبط بيئةٍ برمجيةٍ تحكمًا أكبر بمشاريع بايثون، وإمكانية التعامل مع إصداراتٍ مختلفةٍ من حزم بايثون. وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية. يمكنك ضبط أيّ عددٍ تشاء من البيئات الافتراضية، وكل بيئة ستكون ممثلة بمجلد في حاسوبك يحتوي على عدد من السكربتات. بعد إتمام التثبيت، فنحن جاهزون لإنشاء البيئات الافتراضية، يمكننا الآن إما اختيار مجلد نضع فيه بيئات بايثون، أو إنشاء مجلد جديد باستخدام الأمر mkdir كما يلي: mkdir environments cd environments بعد أن انتقلتَ إلى المجلد الذي تريد احتواء البيئات فيه، تستطيع الآن إنشاء بيئة جديدة بتنفيذ الأمر الآتي: python3.6 -m venv my_env سيُنشِئ الأمر pyvenv مجلدًا جديدًا فيه بعض الملفات التي يمكن عرضها باستخدام الأمر ls: ls my_env ستظهر لك مخرجات شبيهة بالمخرجات التالية: bin include lib lib64 pyvenv.cfg تعمل هذه الملفات مع بعضها لضمان أنَ تكون مشاريعك معزولةٌ عن سياق الآلة المحلية، لكي لا تختلط ملفات النظام مع ملفات المشاريع. وهذا أمرٌ حسنٌ لإدارة الإصدارات ولضمان أنَّ كل مشروع يملك وصولًا إلى الحزمٍ التي يحتاجها. عليك تفعيل البيئة لاستخدامها، وذلك بكتابة الأمر التالي الذي سيُنفِّذ سكربت التفعيل: source my_env/bin/activate يجب أن تظهر الآن سابقةٌ (prefix) في المِحث (prompt) والتي هي اسم البيئة المستخدمة، وفي حالتنا هذه يكون اسمها my_env: (my_env) sammy@locahost:~/environments$ ستسمح لك السابقة بمعرفة أنَّ البيئة my_env مفعلة حاليًا، وهذا يعني أننا سنستخدم إعدادات وحزم هذه البيئة عند إنشاء مشاريع جديدة. ملاحظة: يمكنك داخل البيئة الافتراضية أن تستخدم الأمر python بدلًا من python3.6 والأمر pip بدلًا من pip3.6 إن شئتَ. أما إذا كنتَ تستخدم بايثون 3 خارج البيئة الافتراضية، فيجب عليك حينها استخدام python3.6 و pip3.6 حصرًا. يجب أن تكون بيئتك الافتراضية جاهزةً للاستخدام بعد اتباعك للخطوات السابقة. الخطوة الرابعة: إنشاء برنامج بسيط بعد أن أكملنا ضبط بيئتنا الافتراضية، لننشِئ برنامجًا بسيطًا يعرض العبارة «مرحبا بالعالم!»، وبهذا سنتحقق من أنَّ البيئة تعمل بالشكل الصحيح، ولكي تتعوّد على إنشاء برامج بايثون إن كنتَ وافدًا جديدًا على اللغة. علينا أولًا تشغيل محرر ملفات نصية لإنشاء ملف جديد، وليكن المحرر vim: (my_env) sammy@localhost:~/environments$ nano hello.py بعد فتح الملف في نافذة الطرفية، اكتب الحرف i للدخول إلى وضع الإدراج (insert mode)، بعدها يمكننا كتابة البرنامج: print("مرحبا بالعالم!") الآن اضغط على الزر ESC للخروج من وضع الإدراج. بعد ذلك ، اكتب ‎ ثم ENTER لحفظ الملف وإغلاقه. نحن جاهزون الآن لتنفيذ البرنامج: (my_env) sammy@localhost:~/environments$ python hello.py سيؤدي برنامج hello.py الذي أنشأتَه إلى طباعة الناتج التالي في الطرفية: مرحبا بالعالم! للخروج من البيئة، اكتب الأمر deactivate وستعود إلى مجلدك الأصلي. الخلاصة تهانينا! لقد ضبطتَ الآن بيئة تطويرٍ للغة بايثون 3 في CentOS 7، حان الآن الوقت للتعمق بلغة بايثون وإنشاء برامج رائعة! بالتوفيق. ترجمة -وبتصرّف- للمقال How To Install Python 3 and Set Up a Local Programming Environment on CentOS 7‎ لصاحبته Lisa Tagliaferri
  2. بايثون هي لغةٌ سهلة القراءة ومتنوعة ومتعددة الاستخدامات، وغالبًا ما تُستخدم في كتابة السكربتات (scripting) والأتمتة وتحليل البيانات وتعلم الآلة (machine learning) والتطوير الخلفي (back-end development). ظهرت بايثون سنة 1991، واستوحي اسمها من مجموعة كوميدية بريطانية باسم «Monty Python»، وكان أحد الأهداف الأساسية لفريق تطوير بايثون هو جعل اللغة مرحةً وسهلة الاستخدام، وبسيطة الإعداد، وجعل طريقة كتابتها مباشرة، مع توفير تقرير مباشر عند حدوث أخطاء. وهي خيارٌ ممتازٌ للمبتدئين والوافدين الجدد على البرمجة. إصدار بايثون 3 هو الإصدار الحالي من اللغة ويُعدُّ مستقبل بايثون. سيُرشِدُك هذا الدرس خطوةً بخطوة إلى كيفية تثبيت بايثون 3 في ويندوز 10، وتثبيت بيئة برمجة عبر سطر الأوامر. المتطلبات المسبقة لمتابعة هذه المقالة، يجب أن تملك جهازًا عليه نظام ويندوز 10 متصل بالشبكة مع صلاحيات مدير (administrative access). الخطوة الأولى: فتح وإعداد PowerShell سنجري معظم أطوار التثبيت والإعدادات عبر سطر الأوامر، والذي هو طريقةٌ غيرُ رسوميةٍ للتعامل مع الحاسوب، فبدلًا من الضغط على الأزرار، ستكتب نصًّا وتعطيه للحاسوب لينفذه، وسيُظهِر لك ناتجًا نصيًا أيضًا. يمكن أن يساعدك سطر الأوامر على تعديل أو أتمتة مختلف المهام التي تنجزها على الحاسوب يوميًا، وهو أداةٌ أساسيةٌ لمطوري البرمجيات. PowerShell هي برنامج من ميكروسوفت يوفر واجهة سطر الأوامر. يمكن إجراء المهام الإدارية عبر تنفيذ الأصناف cmdlets، والتي تُنطَق "command-lets"، وهي أصناف متخصصة من الإطار ‎.NET يمكنها تنفيذ العمليات. جُعِلت PowerShell مفتوحة المصدر منذ أغسطس 2016، وصارت متوفرة الآن عبر ويندوز و أنظمة يونكس (بما في ذلك ماك ولينكس). ستعثر على PowerShell بالنقر الأيمن على أيقونة Start في الركن الأيسر السفلي من الشاشة. عندما تنبثق القائمة، انقر على "Search"، ثم اكتب "PowerShell" في شريط البحث. عند تقديم خيارات لك، انقر بالزر الأيمن على تطبيق سطح المكتب "Windows PowerShell". اختر "Run as Administrator". عندما يظهر مربع حوار يسألك "Do you want to allow this app to make changes to your PC?"، انقر على "Yes". بمجرد إتمام ذلك، سترى واجهة نصية تبدو كما يلي: يمكننا تبديل مجلد النظام عن طريق كتابة الأمر التالي: cd ~ بعد ذلك سننتقل إلى المجلد PS C:\Users\Sammy. لمتابعة عملية التثبيت، سنعدّ بعض الأذونات من خلال PowerShell. تم إعداد PowerShell لتعمل في الوضع الأكثر أمانًا بشكل افتراضي، هناك عدة مستويات للأذونات، والتي يمكنك إعدادها باعتبارك مديرًا (administrator): Restricted: تمثل سياسة التنفيذ الافتراضية، وبموجب هذا الوضع، لن تتمكن من تنفيذ السكربتات، وستعمل PowerShell كصدفة تفاعلية (interactive shell) وحسب. AllSigned: ستمكّنك من تنفيذ جميع السكربتات وملفات الإعداد المُوقّعة من قبل جهة موثوقة، مما يعني أنه من المحتمل أن تعرّض جهازك لخطر تنفيذ سكربتات ضارة إن كانت موقعة من قبل جهة موثوقة. RemoteSigned: ستمكّنك من تنفيذ السكربتات وملفات الإعداد المُنزّلة من الشبكة، والمُوقعة من قبل جهة موثوقة، مما يعني أنه من المحتمل أن تعرّض جهازك لخطر تنفيذ سكربتات ضارة إن كانت تلك السكربتات الموثوقة ضارة. Unrestricted: تسمح بتنفيذ جميع السكربتات وملفات الإعداد المُنزّلة من الشبكة بمجرد أن تؤكد أنك تدرك أنّ الملف مُنزّل من الشبكة. في هذه الحالة، التوقيعات الرقمية غير لازمة، مما يعني أنه من المحتمل أن تعرّض جهازك لخطر تنفيذ سكربتات غير موثوقة منزلة من الشبكة قد تكون ضارة. سنستخدم سياسة التنفيذ RemoteSigned لتعيين الإذن للمستخدم الحالي، وهكذا سنسمح لبرنامج PowerShell بقبول السكربتات المُنزّلة التي نثق بها، ودون خفض كل دفاعاتنا وجعل الأذونات هشة كما هو الحال مع سياسة التنفيذ Unrestricted. سنكتب في PowerShell: Set-ExecutionPolicy -Scope CurrentUser ستطالبك PowerShell بتحديد سياسة التنفيذ، وبما أننا نريد استخدام RemoteSigned، فسنكتب: RemoteSigned بمجرد الضغط على الزر enter، ستُسأل عما إن كنت نريد تغيير سياسة التنفيذ. اكتب الحرف y لاختيار "نعم"، واعتماد التغييرات. يمكننا التحقق من نجاح العملية عن طريق طلب الأذونات الحالية في الجهاز عبر كتابة: Get-ExecutionPolicy -List ستحصل على مخرجات مشابهة لما يلي: Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Undefined CurrentUser RemoteSigned LocalMachine Undefined هذا يؤكد أنّ المستخدم الحالي يمكنه تنفيذ السكربتات الموثوقة التي تم تنزيلها من الشبكة. يمكننا الآن تنزيل الملفات التي سنحتاج إليها لإعداد بيئة برمجة بايثون. الخطوة الثانية: تثبيت Chocolatey مدير الحزم (package manager) هو مجموعة من أدوات البرمجيات التي تعمل على أتمتة عمليات التثبيت، بما في ذلك التثبيت الأولي للبرامج، وترقيتها، وإعدادها، وإزالتها عند الحاجة. تحفظ هذه الأدوات التثبيتات في موقع مركزي، ويمكنها صيانة جميع حزم البرامج على النظام وفق تنسيقات (formats) معروفة. Chocolatey هي مدير حزم تعمل من سطر الأوامر، تم تصميمها لنظام ويندوز، وتحاكي apt-get الخاصة بلينكس. متوفرة كإصدار مفتوح المصدر، ويمكنها مساعدتك Chocolatey على تثبيت التطبيقات والأدوات بسرعة. سنستخدمها لتنزيل ما نحتاج إليه لبيئتنا التطويرية. قبل تثبيت السكربت، دعنا نقرأه للتأكد من أنّ التغييرات التي سيجريها على الجهاز مقبولة. سنستخدم إطار العمل ‎.NET لتنزيل وعرض السكربت Chocolatey في نافذة الطرفية. سننشئ كائنًا WebClient يُسمى ‎$script‎‎ (يمكنك تسميته كما تريد طالما ستستخدم المحرف $ في البداية)، والذي يشارك إعدادات الاتصال بالشبكة مع المتصفح Internet Explorer: $script = New-Object Net.WebClient دعنا نلقي نظرة على الخيارات المتاحة لنا من خلال توصيل الكائن إلى الصنف Get-Member لإعادة جميع الأعضاء (الخاصيات والتوابع) الخاصة بكائن WebClient: $script | Get-Member سنحصل على المخرجات التالية: . . . DownloadFileAsync Method void DownloadFileAsync(uri address, string fileName), void DownloadFileAsync(ur... DownloadFileTaskAsync Method System.Threading.Tasks.Task DownloadFileTaskAsync(string address, string fileNa... DownloadString Method string DownloadString(string address), string DownloadString(uri address) # التابع الذي سنستخدمه DownloadStringAsync Method void DownloadStringAsync(uri address), void DownloadStringAsync(uri address, Sy... DownloadStringTaskAsync Method System.Threading.Tasks.Task[string] DownloadStringTaskAsync(string address), Sy… . . . عند النظر إلى المخرجات، يمكننا تحديد التابع DownloadString الذي يمكننا استخدامه لعرض محتوى السكربت والتوقيع في نافذة PowerShell كما يلي: $script.DownloadString("https://chocolatey.org/install.ps1") بعد مطالعة السكربت، يمكننا تثبيت Chocolatey عن طريق كتابة ما يلي في PowerShell: iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex تسمح لنا iwr أو Invoke-WebRequest التي تخص cmdlet باستخراج البيانات من الشبكة. سيؤدي هذا إلى تمرير السكربت إلى iex أو Invoke-Expression، والذي سينفذ محتويات السكربت، وتنفيذ سكربت التثبيت لمدير الحزم Chocolatey. اسمح لبرنامج PowerShell بتثبيت Chocolatey. بمجرد تثبيته بالكامل، يمكننا البدء في تثبيت أدوات إضافية باستخدام الأمر choco. إن احتجت إلى ترقية Chocolatey مستقبلًا، يمكنك تنفيذ الأمر التالي: choco upgrade chocolatey بعد تثبيت مدير الحزم، يمكننا متابعة تثبيت ما نحتاجه لبيئة البرمجة خاصتنا. المرحلة الثالثة: تثبيت محرر النصوص nano (اختياري) سنثبّت الآن nano، وهو محرر نصوص يستخدم واجهة سطر الأوامر، والذي يمكننا استخدامه لكتابة البرامج مباشرة داخل PowerShell. هذه ليست خطوة إلزامية، إذ يمكنك بدلاً من ذلك استخدام محرر نصوص بواجهة مستخدم رسومية مثل Notepad، لكن ميزة nano أنه سيُعوِّدك على استخدام PowerShell. دعنا نستخدم Chocolatey لتثبيت nano: choco install -y nano الخيار ‎-y يعني أنَّك توافق على تنفيذ السكربت تلقائيًا دون الحاجة إلى تأكيد. بعد تثبيت nano، سنكون قادرين على استخدام الأمر nano لإنشاء ملفات نصية جديدة، وسنستخدمه بعد حين لكتابة أول برامجنا في بايثون. المرحلة الرابعة: تثبيت بايثون 3 مثلما فعلنا مع nano أعلاه، سنستخدم Chocolatey لتثبيت بايثون 3: choco install -y python3 ستثبّت PowerShell الآن بايثون 3، مع عرض بعض المخرجات أثناء العملية. بعد اكتمال العملية، سترى المخرجات التالية: Environment Vars (like PATH) have changed. Close/reopen your shell to See the changes (or in powershell/cmd.exe just type 'refreshenv'). The install of python3 was successful. Software installed as 'EXE', install location is likely default. Chocolatey installed 1/1 packages. 0 packages failed. See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log). بعد الانتهاء من التثبيت، ستحتاج إلى التحقق من أنّ بايثون مثبّتة وجاهزة للعمل. لرؤية التغييرات، استخدم الأمر refreshenv أو أغلق PowerShell ثم أعد فتحها بصلاحيات مدير النظام، ثم تحقق من إصدار بايثون على جهازك: python -V ستحصل على مخرجات في نافذة الطرفية والتي ستريك إصدار بايثون المثبّت. Python 3.7.0 سيتم تثبيت، إلى جانب بايثون، الأداة pip، وهي أداةٌ تعمل مع لغة بايثون تُثَبِّت وتدير الحزم البرمجية التي قد نحتاج إلى استخدامها في تطوير مشاريعنا. يمكنك تعلم المزيد عن الوحدات والحزم التي يمكنك تثبيتها بالأداة pip بقراءة المقالة كيفية استيراد الوحدات في بايثون 3 من هذه السلسلة. سنحدّث pip عبر الأمر التالي: python -m pip install --upgrade pip يمكننا استدعاء بايثون من Chocolatey عبر الأمر python. سنستخدم الراية ‎-m لتنفيذ الوحدة كأنها سكربت، وإنهاء قائمة الخيارات، ومن ثمّ نستخدم pip لتثبيت الإصدار الأحدث. بعد تثبيت بايثون وتحديث pip، فنحن جاهزون لإعداد بيئة افتراضية لمشاريع التطوير خاصتنا. الخطوة الخامسة: إعداد بيئة افتراضية الآن بعد تثبيت Chocolatey و nano وبايثون، يمكننا المضي قدمًا لإنشاء بيئة البرمجة خاصتنا عبر الوحدة venv. تُمكِّنك البيئات الافتراضية من إنشاء مساحة معزولة في حاسوبك مخصصة لمشاريع بايثون، مما يعني أنَّ كل مشروع تعمل عليه ستكون له اعتماديّاته (dependencies) الخاصة به، والتي لن تؤثِّر على غيره من المشاريع. يوفِّر لنا ضبط بيئةٍ برمجيةٍ تحكمًا أكبر بمشاريع بايثون، وإمكانية التعامل مع إصداراتٍ مختلفةٍ من حزم بايثون. وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية. يمكنك ضبط أيّ عددٍ تشاء من البيئات الافتراضية، وكل بيئة ستكون ممثلة بمجلد في حاسوبك يحتوي على عدد من السكربتات. اختر المجلد الذي تريد أن تضع فيه بيئات بايثون، أو يمكنك إنشاء مجلد جديد باستخدام الأمر mkdir كما يلي: mkdir environments cd environments بعد أن انتقلتَ إلى المجلد الذي تريد احتواء البيئات فيه، تستطيع الآن إنشاء بيئة جديدة بتنفيذ الأمر التالي: python -m venv my_env باستخدام الأمر python، سننفّذ الوحدة venv لإنشاء البيئة الافتراضية التي أطلقنا عليها في هذه الحالة my_env. ستنشئ venv مجلدًا جديدًا يحتوي على بعض العناصر التي يمكن عرضها باستخدام الأمر ls: ls my_env سنحصل على المخرجات التالية: Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 8/22/2016 2:20 PM Include d----- 8/22/2016 2:20 PM Lib d----- 8/22/2016 2:20 PM Scripts -a---- 8/22/2016 2:20 PM 107 pyvenv.cfg تعمل هذه الملفات مع بعضها لضمان أنَ تكون مشاريعك معزولةٌ عن سياق الآلة المحلية، لكي لا تختلط ملفات النظام مع ملفات المشاريع. وهذا أمرٌ حسنٌ لإدارة الإصدارات ولضمان أنَّ كل مشروع يملك وصولًا إلى الحزمٍ التي يحتاجها. عليك تفعيل البيئة لاستخدامها، وذلك بكتابة الأمر التالي الذي سيُنفِّذ سكربت التفعيل في المجلد Scripts: my_env\Scripts\activate يجب أن تظهر الآن سابقةٌ (prefix) في المِحث (prompt) والتي هي اسم البيئة المستخدمة، وفي حالتنا هذه يكون اسمها my_env. (my_env) PS C:\Users\Sammy\Environments> تتيح لنا هذه البادئة معرفة أنّ البيئة my_env مفعّلة حاليًا، وهذا يعني أننا لن سنستخدم إلا إعدادات وحزم هذه البيئة عند إنشاء مشاريع جديدة. الخطوة الثالثة: إنشاء برنامج بسيط بعد أن أكملنا ضبط بيئتنا الافتراضية، لننشِئ برنامجًا بسيطًا يعرض العبارة «مرحبا بالعالم!»، وبهذا سنتحقق من أنَّ البيئة تعمل بالشكل الصحيح، ولكي تتعوّد على إنشاء برامج بايثون إن كنتَ وافدًا جديدًا على اللغة. علينا أولًا تشغيل المحرر nano وإنشاء ملف جديد: (my_env) PS C:\Users\Sammy> nano hello.py بعد فتح الملف في نافذة الطرفية، سنكتب البرنامج الخاص بنا: print("مرحبا بالعالم!") أغلق محرر nano بالضغط على Ctrl+x ثم اضغط على y عندما يسألك عن حفظ الملف. بعد أن يُغلَق المحرر nano وتعود إلى سطر الأوامر، حاول تنفيذ البرنامج: (my_env) PS C:\Users\Sammy> python hello.py سيؤدي برنامج hello.py الذي أنشأتَه إلى طباعة الناتج التالي في الطرفية: مرحبا بالعالم! للخروج من البيئة، اكتب الأمر deactivate وستعود إلى مجلدك الأصلي. الخلاصة تهانينا! لقد ضبطتَ الآن بيئة تطويرٍ للغة بايثون 3 في نظام ويندوز 10، حان الآن الوقت للتعمق بلغة بايثون وإنشاء برامج رائعة! بالتوفيق. ترجمة -وبتصرّف- للمقال How To Install Python 3 and Set Up a Local Programming Environment on windows 10 لصاحبته Lisa Tagliaferri
  3. التحريك في css

    سنطبق ما تعلّمناه في المقالات السابقة، وسنصنع تحريكًا متجِهيًّا (SVG) مرحًا. سنبني عنوان فيلم حرب النجوم من إعلان "The Force Awakens". المصدر: https://www.youtube.com/watch?v=ngElkyQ6Rhs يجمع هذا المثال بين التحريك وبين بعض خاصيات CSS الأخرى، خصوصًا الخاصية transform ودوال تحويلها scale و translate و rotate. هذه المقالة جزء من سلسلة من المقالات حول التحريك في CSS: هذه المقالة جزء من سلسلة من المقالات حول التحريك في CSS: ما هي استخدامات الحركات؟ تجهيز بيئة العمل لإنشاء الحركات مدخل إلى الانتقالات: التنقل بين الحالات مدخل إلى الحركات: مفهوم الحركة تطبيق عملي: الانتقالات خاصيات الانتقالات دوال التوقيت الانتقالات المتعددة الانتقالات وجافاسكربت تطبيق عملي: التحريكات خاصيات الحركات تطبيق عملي: الإطارات المفتاحية الحركات المتعددة المتزامنة موجز الحركات رواية القصص عبر الحركات حرب النجوم إظهار المحتوى أثناء التمرير سهولة الوصول نهاية الرحلة transform: ليست من خاصيات الحركات رغم أنها تبدو وكأنها من خاصيات الحركات، إلا أنّ الخاصية transform تُستخدَم في تحديد موضع، أو انحراف، أو حجم عنصر ما. يمكننا استخدام هذه الخاصية لإنشاء تأثيرات رائعة، ولكن للقيام بذلك، نحتاج إلى تحويل (transform) خاص لكل إطار مفتاحي أو حالة نحركها. الخاصية transform ودوالها‏ scale()‎ و translateZ()‎ و rotateY()‎ بإمكاننا تصغير العناصر أو تكبيرها باستخدام scale. وباستخدام translateZ، يمكننا نقل العناصر على المحور Z، وهو المحور الذي يمثله رسم خط ينطلق منك، ويتجه إلى الشاشة. في هذا المثال، سنستخدم scale و translateZ معًا لخلق شعور بأنّ الكلمات تطير في الفضاء. بعد ذلك، سنستخدم rotateY لتدوير أحرف سطر الوصف. سيتطلب الدوران حول المحور Y قيام المتصفح بالرسم ثلاثي الأبعاد. SVG و HTML و CSS استعدادًا لهذا المثال، قمت بإنشاء ملفين من النوع SVG لأجل الجزئين Star و Wars من الشعار. لا تتردد في تحميلهما واستخدامهما. إليك شيفرة HTML الخاصة بالمثال: <div class="starwars-demo"> <img src="//cssanimation.rocks/demo/starwars/images/star.svg" alt="Star" class="star"> <img src="//cssanimation.rocks/demo/starwars/images/wars.svg" alt="Wars" class="wars"> <h2 class="byline" id="byline">The Force Awakens</h2> </div> لقد استخدمنا صورة ثابتة للنجوم في الخلفية. لم أتمكن من العثور على الخط الذي استُخدِم في الإعلان الأصلي، لذلك استخدمت الخط "Lato". استخدمت التموضع المطلق (absolute positioning) لوضع المحتوى في منتصف الشاشة. سنحصل في البداية على الصورة التالية: تحريك الكلمتين Star و Wars نريد أن يظهر النص الكبير تدريجيًا، إذ يبدأ بحجم كبير، ثمَّ يصغر بمرور الوقت. وهذه فرصة جيدة لاستخدام الدالة scale()‎. سنستخدمها على الكلمة "Star" في الإطارات المفتاحية التالية: @keyframes star { 0% { opacity: 0; transform: scale(1.5) translateY(-0.75em); 20% { opacity: 1; 89% { opacity: 1; transform: scale(1); 100% { opacity: 0; transform: translateZ(-1000em); } هناك خاصيتان تتغيران خلال مسار هذه الحركة وهما opacity و transform. إنّ تغيير العتامة (opacity) يجعل النص يبدأ شفافًا، ثم يتلاشى في النهاية لكي نتمكن من إعادة تنفيذ التحريك. يبدأ التحويل عن طريق تحديد الحجم عند القيمة 1.5. هذا يعني أنّ الحجم الأولي للنص سيكون أكبر بنسبة 150٪ من الحجم العادي. عند النقطة 89٪، سنعيّن الخاصية transform عند القيمة scale(1)‎. هذا يعني أنه بين اللحظتين 0٪ و 89٪، سينتقل الحجم من 150٪ إلى 100٪. التحويل transformZ الأخير يؤدي إلى تكبير الكلمتين بسرعة. بشكل مماثل، يمكننا تطبيق الإطارات المفتاحية على الكلمة "Star": .star { animation: star 10s ease-out infinite; } تم استخدام مجموعة مماثلة من الإطارات المفتاحية مع الكلمة "Wars". لنجعلها ثلاثية الأبعاد يتطلب استخدام التحويلات ثلاثية الأبعاد في CSS، سواء كانت بالتحويل على المحور Z، أو الدوران حول المحورين Y و Z، أن نضع مرحلة ثلاثية الأبعاد. وهذا يعني، في اصطلاح HTML، إنشاء حاوية (container)، وإخبار المتصفح بالحاجة إلى إنشاء بعض التحريكات ثلاثية الأبعاد. يمكننا فعل ذلك عن طريق إضافة الشيفرة التالية إلى العنصر div ذي الصنف ‎.starwars-demo: .starwars-demo { perspective: 800px; transform-style: preserve3d; } تخبر هاتان الخاصيتان المتصفحَ بأنّ أبناء الحاوية (container`s children) ينبغي أن يتموضعوا وفق شكل ثلاثي الأبعاد، بدلًا من وضعهم في مستوى مسطح. يمكنك أن تجد المزيد من التفاصيل عن هذه الخاصية في موقع CSS Tricks. ثانياً، تخبر الخاصية persective المتصفحَ بمدى «عمق» المشهد. في هذا المثال، جعلناها تساوي 800px. تخلق القيم الأصغر تأثيرات «متطرفة» لأنّ المشهد سيكون أقصر. سننسق الآن سطر الوصف. تحريك الشعار "The Force Awakens" تدور أحرف الشعار "The Force Awakens" في مكانها. يمكننا خلق هذا التأثير باستخدام التحويل rotateY. في هذا المثال، قمنا بوضع كل حرف داخل عنصر من النوع span حتى نتمكن من تطبيق التحريك على كل حرف على حدة. إحدى المشكلات التي اكتشفتها سريعًا هي أنه لا توجد طريقة مباشرة لتحريك كل حرف في السطر. الحل الذي بدا لي هو وضع كل حرف يدويًا داخل وسم span. وقد نجح ذلك، ولكنه جعل شيفرة HTML فوضوية قليلا. لذلك استعضت عنها ببعض شيفرات JavaScript التي تضع كل حرف داخل عنصر span تلقائيًا. سنُطبِّق التحريك على كل حرف على حدة. أولًا، الإطارات المفتاحية: @keyframes spin-letters { 0%, 10% { opacity: 0; transform: rotateY(90deg); 30% { opacity: 1; 70%, 86% { transform: rotateY(0); opacity: 1; 95%, 100% { opacity: 0; } في البداية، تكون الحروف مُدوّرة بزاوية 90 درجة، ثم بزاوية 70٪ خلال التحريك، إذ يتم تحريكها لمواجهة المشاهد. يمكننا تطبيق مجموعة الإطارات المفتاحية هذه على كل عناصر span على النحو التالي: .byline span { animation: spin-letters 10s linear infinite; } والنتيجة هي أنّ كل عناصر span التي تحتوي الحروف سوف تظهر تدريجيًا وتدور ببطء في مكانها، قبل أن تتلاشى في نهاية التحريك. بجمع كل ذلك معًا، سنحصل على المشهد التالي: المصدر: http://codepen.io/donovanh/pen/pJzwEw?editors=110 تمرين إذا كان لديك الوقت، أشجعك على إلقاء نظرة على قسم CSS في نسخة CodePen. قد تلاحظ وجود بعض استعلامات الوسائط media في CSS. نستخدم هذه الاستعلامات لتحجيم المثال في الأجهزة الصغيرة. حاول تغيير بعض إطارات التحريك المفتاحية، أو قيم الخاصية transform لمعرفة ما سيحدث. المصادر ترجمة وبتصرف للفصل star wars من كتاب CSS Animation 101 لمؤلفه Donovan Hutchinson. اقرأ أيضًا المقالة التالية: إظهار المحتوى عند التمرير المقالة السابقة: رواية القصص عبر الحركات
  4. بايثون هي لغةٌ سهلة القراءة ومتنوعة ومتعددة الاستخدامات، وغالبًا ما تُستخدم في كتابة السكربتات (scripting) والأتمتة وتحليل البيانات وتعلم الآلة (machine learning) والتطوير الخلفي (back-end development). ظهرت بايثون سنة 1991، واستوحي اسمها من مجموعة كوميدية بريطانية باسم «Monty Python»، وكان أحد الأهداف الأساسية لفريق تطوير بايثون هو جعل اللغة مرحةً وسهلة الاستخدام، وبسيطة الإعداد، وجعل طريقة كتابتها مباشرة، مع توفير تقرير مباشر عند حدوث أخطاء. وهي خيارٌ ممتازٌ للمبتدئين والوافدين الجدد على البرمجة. إصدار بايثون 3 هو الإصدار الحالي من اللغة ويُعدُّ مستقبل بايثون. سيُرشِدُك هذا الدرس خطوةً بخطوة إلى كيفية تثبيت بايثون 3 على خادم أوبنتو 18.04، البرمجة على الخوادم لها العديد من الميزات، كما تدعم المشاريع التعاونية. صحيحٌ أنَّ هذا الدرس يشرح عملية التثبيت على خادم أوبنتو 18.04، إلا أنَّ المفاهيم الأساسية فيه تنطبق على جميع توزيعات دبيان لينيكس (Debian Linux). المتطلبات المسبقة لمتابعة هذه المقالة، يجب أن تملك صلاحيات مستخدم غير جذري (non-root user ) مع امتيازات sudo على خادم أوبنتو 18.04. إذا لم تكن لك خبرة في التعامل مع بيئة النافذة الطرفية، فيمكنك مطالعة المقالة "مدخل إلى طرفيّة لينكس Linux Terminal". الخطوة الأولى: إعداد بايثون 3 في أوبنتو 18.04 والإصدارات الأخرى من دبيان لينكس، ستجد كلًا من بايثون 3 وبايثون 2 مثبتين مسبقًا. للتأكد من أنّ إصدارات بايثون حديثة، سنحدّث النظام ونرقّيه باستخدام الأمر apt للعمل مع أداة التحزيم المتقدمة من أوبنتو (Ubuntu’s Advanced Packaging Tool): sudo apt update sudo apt -y upgrade الخيار ‎-y يعني أنَّك توافق على تثبيت جميع الحزم القابلة للتحديث، لكن قد تحتاج إلى تأكيد ذلك عند تحديث النظام وذلك اعتمادًا على الحزم التي ستُحدَّث، ونسخة نظامك. بعد إكمال العملية، يمكننا التحقق من إصدار بايثون 3 المُثبّت في النظام بكتابة: python3 -V ستحصل على مخرجات في نافذة الطرفية والتي ستريك إصدار بايثون المثبّت. قد يختلف الرقم بناءً على النسخة المثبتة في توزيعتك، لكن يجب أن يكون شبيهًا بما يلي: Python 3.5.2 لإدارة الحزم البرمجية الخاصة ببايثون، سنثبّت pip، وهي أداةٌ تعمل مع لغة بايثون تُثَبِّت وتدير الحزم البرمجية التي قد نحتاج إلى استخدامها في تطوير مشاريعنا. يمكنك تعلم المزيد عن الوحدات والحزم التي يمكنك تثبيتها بالأداة pip بقراءة المقالة كيفية استيراد الوحدات في بايثون 3 من هذه السلسلة: sudo apt install -y python3-pip يمكن تثبيت حزم بايثون بكتابة ما يلي: pip3 install package_name حيث عليك وضع اسم الحزمة أو المكتبة التابعة لبايثون مكان package_name مثل Django لتطوير الويب، أو NumPy لإجراء الحسابات العلمية. لذا، إن شئتَ تنزيل NumPy فيمكنك تنفيذ الأمر pip3 install numpy. هناك عدة حزم وأدوات تطوير أخرى يجب تثبيتها للتأكد من أنّ بيئة البرمجة جاهزة: sudo apt install build-essential libssl-dev libffi-dev python3-dev بعد أن انتهينا من ضبط بايثون وتثبيت pip، يمكننا الآن إنشاء «بيئة افتراضية» (virtual environment) لمشاريعنا. الخطوة الثانية: إعداد بيئة افتراضية تُمكِّنك البيئات الافتراضية من إنشاء مساحة معزولة في خادمك مخصصة لمشاريع بايثون، مما يعني أنَّ كل مشروع تعمل عليه ستكون له اعتماديّاته (dependencies) الخاصة به، والتي لن تؤثِّر على غيره من المشاريع. يوفِّر لنا ضبط بيئةٍ برمجيةٍ تحكمًا أكبر بمشاريع بايثون، وإمكانية التعامل مع إصداراتٍ مختلفةٍ من حزم بايثون. وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية. يمكنك ضبط أيُّ عددٍ تشاء من البيئات الافتراضية، وكل بيئة ستكون ممثلة بمجلد في خادمك يحتوي على عدد من السكربتات. هناك عدة طرق لإعداد بيئة برمجية في بايثون، لكننا سنستخدم وحدة (module) برمجية باسم venv، وهي جزءٌ من مكتبة بايثون 3 القياسية. سنثبّت venv على نظامنا بكتابة: sudo apt-get install -y python3-venv بعد إتمام التثبيت، فنحن جاهزون لإنشاء البيئات الافتراضية، يمكننا الآن إما اختيار مجلد نضع فيه بيئات بايثون، أو إنشاء مجلد جديد باستخدام الأمر mkdir كما يلي: mkdir environments cd environments بعد أن انتقلتَ إلى المجلد الذي تريد احتواء البيئات فيه، تستطيع الآن إنشاء بيئة جديدة بتنفيذ الأمر الآتي: python3.6 -m venv my_env سيُنشِئ الأمر pyvenv مجلدًا جديدًا فيه بعض الملفات التي يمكن عرضها باستخدام الأمر ls: ls my_env ستظهر لك مخرجات شبيهة بالمخرجات التالية: bin include lib lib64 pyvenv.cfg share تعمل هذه الملفات مع بعضها لضمان أنَ تكون مشاريعك معزولةٌ عن سياق الآلة المحلية، لكي لا تختلط ملفات النظام مع ملفات المشاريع. وهذا أمرٌ حسنٌ لإدارة الإصدارات ولضمان أنَّ كل مشروع يملك وصولًا إلى الحزمٍ التي يحتاجها. تتوافر أيضًا Python Wheels، والتي هي صيغة حزمٍ مبنية (built-package format) لبايثون، والتي يمكن أن تُسرِّع من تطوير البرامج بتقليل عدد المرات التي تحتاج فيها إلى تصريف (compile) المشروع، وهي موجودةٌ في المجلد share في توزيعة أوبنتو 18.04. عليك تفعيل البيئة لاستخدامها، وذلك بكتابة الأمر التالي الذي سيُنفِّذ سكربت التفعيل: source my_env/bin/activate يجب أن تظهر الآن سابقةٌ (prefix) في المِحث (prompt) والتي هي اسم البيئة المستخدمة، وفي حالتنا هذه يكون اسمها my_env، وقد يكون مظهر المِحَث مختلفًا في توزيعة دبيان، وذلك اعتمادًا على الإصدار المستخدم؛ لكن يجب أن تشاهد اسم البيئة بين قوسين في بداية السطر: (my_env) sammy@ubuntu:~/environments$ ستسمح لك السابقة بمعرفة أنَّ البيئة my_env مفعلة حاليًا، وهذا يعني أننا سنستخدم إعدادات وحزم هذه البيئة عند إنشاء مشاريع جديدة. ملاحظة: يمكنك داخل البيئة الافتراضية أن تستخدم الأمر python بدلًا من python3 والأمر pip بدلًا من pip3 إن شئتَ. أما إذا كنتَ تستخدم بايثون 3 خارج البيئة الافتراضية، فيجب عليك حينها استخدام python3 و pip3 حصرًا. يجب أن تكون بيئتك الافتراضية جاهزةً للاستخدام بعد اتباعك للخطوات السابقة. الخطوة الثالثة: إنشاء برنامج بسيط بعد أن أكملنا ضبط بيئتنا الافتراضية، لننشِئ برنامجًا بسيطًا يعرض العبارة «Hello World!‎»، وبهذا سنتحقق من أنَّ البيئة تعمل بالشكل الصحيح، ولكي تتعوّد على إنشاء برامج بايثون إن كنتَ وافدًا جديدًا على اللغة. علينا أولًا تشغيل محرر ملفات نصية لإنشاء ملف جديد، وليكن المحرر nano الذي يعمل من سطر الأوامر: (my_env) sammy@ubuntu:~/environments$ nano hello.py بعد فتح الملف في نافذة الطرفية، سنكتب البرنامج الخاص بنا: print("Hello, World!") أغلق محرر nano بالضغط على Ctrl+x ثم اضغط على y عندما يسألك عن حفظ الملف. بعد أن يُغلَق المحرر nano وتعود إلى سطر الأوامر، حاول تنفيذ البرنامج: (my_env) sammy@ubuntu:~/environments$ python hello.py سيؤدي برنامج hello.py الذي أنشأتَه إلى طباعة الناتج الآتي في الطرفية: Hello, World! للخروج من البيئة، اكتب الأمر deactivate وستعود إلى مجلدك الأصلي. الخلاصة تهانينا! لقد ضبطتَ الآن بيئة تطويرٍ للغة بايثون 3 في خادم لينيكس ديبيان، حان الآن الوقت للتعمق بلغة بايثون وإنشاء برامج رائعة! بالتوفيق. ترجمة -وبتصرّف- للمقال How To Install Python 3 and Set Up a Programming Environment on an Ubuntu 18.04 Server لصاحبته Lisa Tagliaferri
  5. تحدثنا في المقالات الماضية عن الخاصيتين transition و animation. سندمجها مع هذه المقالة في عملية التحريك لخلق تأثير التحويم (hover effect). هذه المقالة جزء من سلسلة من المقالات حول التحريك في CSS: ما هي استخدامات الحركات؟ تجهيز بيئة العمل لإنشاء الحركات مدخل إلى الانتقالات: التنقل بين الحالات مدخل إلى الحركات: مفهوم الحركة تطبيق عملي: الانتقالات خاصيات الانتقالات دوال التوقيت الانتقالات المتعددة الانتقالات وجافاسكربت تطبيق عملي: التحريكات خاصيات الحركات تطبيق عملي: الإطارات المفتاحية الحركات المتعددة المتزامنة موجز الحركات رواية القصص عبر الحركات حرب النجوم إظهار المحتوى أثناء التمرير سهولة الوصول نهاية الرحلة الصور الرئيسية تُفضّل العديد من المواقع عرض صورة كبيرة تجذب الانتباه في أعلى الصفحة الرئيسية. تسمى أحيانًا الصورة الرئيسية، أو الصورة البطلة (hero image)، وعادةً ما تسع كاملَ عرض الصفحة. من الأمثلة الجيدة التي وجدتها مؤخرًا هي صفحة الهبوط الخاصة بموقع إطار العمل Fabric، إذ توضِّح عبر حركة بسيطة في CSS وظيفة Fabric كإطار عمل تركيبي (modular). المصدر: https://get.fabric.io/ مثال آخر جيد نجده في الصفحة الرئيسية لموقع Mailchimp إذ تحكي الصورة الرئيسية قصةً توضح كيفية إنشاء رسائل البريد الإلكتروني. المصدر: http://mailchimp.com نجد في هذين المثالين وغيرهما من الأمثلة أنَّه جرى استخدام الحركات لتمثيل خدمات الموقع ببساطة. مثال: تمرير الخلفية سننشئ مثالًا خاصًّا بنا مشابه لما رأيته آنفًا. في هذا المثال، قمت بتصميم رسومات على الصفحة تتحرك لأعلى وأسفل الشاشة. المصدر: http://codepen.io/donovanh/pen/LEwedW?editors=110 لإضفاء طابع التفاعلية، تتوقف الحركة مؤقتًا، وتظهر رسالة عندما يحوم مؤشر الفأرة فوق الشاشة. وقد قمت باستخدام كل من الحركات والانتقالات لتحقيق هذا التأثير. يمكنك الاطلاع على هذا المثال من هنا. الجزء 1: تحريك الخلفية لإعداد هذا المثال، سنبدأ بعنصر HTML حاوي: <div class="screen"></div> يمكننا أن نجعل العنصر screen يبدو وكأنه شاشة أو iPad باستخدام التنسيقات التالية: .screen { background: #e25865 url(//cssanimation.rocks/screen/images/screen_bg.png) no-repeat top center; background-size: 100% auto; border: 2em solid #fff; border-radius: 1em; width: 40em; height: 30em; } لقد أعددنا بعض التنسيقات التي تحدد الحجم والحدود، وتعيّن صورة الخلفية. يعتمد التأثير الذي نريد إنشاءه على تحريك صورة الخلفية. صورة الخلفية أطول من الشاشة، وقيمة خاصيتها background-size تساوي ‎100% auto. هذا يعني أنّ الخلفية ستُناسب عرض الحاوية، ولكنها ستكون أطول منها. بتحديد صورة الخلفية المراد تحريكها، يمكننا الآن كتابة الإطارات المفتاحية التي ستجعلها تبدو وكأنّ شخصًا ما يمرّر (scroll) صفحة الويب: @keyframes scroll { 0%, 10% { background-position: 0 0; } 20%, 30% { background-position: 0 -22em; } 50%, 60% { background-position: 0 -44em; } 90%, 100% { background-position: 0 0; } } الخاصية التي نحركها هي background-position. يمكننا عبر هذه الخاصية تحريك الخلفية لأعلى ولأسفل. إذا تبدأ من الموضع 0 0، ما يعني أنّ المسافة من اليسار، ومن الأعلى ستُساويان الصفر. في الإطارات التالية، جعلنا الخلفية تتحرك إلى أعلى بمقدار ‎22em، ثم ‎44em لأعلى، ثم العودة إلى أعلى الصفحة. سنستخدم الخاصية animation لتطبيق هذا على العنصر screen. .screen { animation: scroll 5s infinite cubic-bezier(.52,-0.39,.3,1.43); } في المثال أعلاه طبقنا مجموعة من الإطارات المفتاحية التي تسمى scroll، وطلبنا منها أن تستمر 5 ثوان، وتتكرر باستمرار، وتستخدم دالة توقيت cubic-bezier. في هذه الحالة، تعطي الدالة cubic-bezier للحركة اهتزازًا، وستبدو الحركة بدونها أقل واقعية. يمكنك أن تجد دالةَ cubic-bezier المستخدمة في المثالِ في الموقع cubic-bezier.com. إذا لم تزر هذا الموقع حتى الآن، فإني أوصي به بشدة! الجزء 2: إضافة انتقال التحويم من المستحسن إيقاف أو تجميد الحركة عند انتهائها، أو عندما تريد أن يركز القارئ على محتوى آخر. التحريك المستمر يمكن أن يتسبب في تشتيت القارئ، لذلك دعنا نستفيد من الخاصية animation-play-state لإيقاف الحركة مؤقتًا عند التحويم على العنصر. .screen:hover { animation-play-state: paused; } هذا يعني أنه عندما يحوم مؤشر الفأٍرة فوق موضع الحركة، سيتوقف مؤقتًا. وعندما يبتعد المؤشر، سوف تُستأنف الحركة وتعود الخاصية animation-play-state لقيمتها الافتراضية playing. يمكنك تحقيق ذلك باستخدام JavaScript أيضًا. يمكن أيضًا استخدام JavaScript لتعطيل الحركة عندما يتفاعل المستخدم مع جزء آخر من الصفحة، أو عندما يمرّر (scroll) الصفحة بعيدًا. سنلقي نظرة على كيفية تمكين الحركة عند التمرير لاحقًا. الجزء 3: إضافة رسالة يمكننا أن نضيف المزيد ونعرض رسالة خاصة بالانتقال عندما يُحوِّم المستخدم فوق العنصر. للقيام بذلك سنحتاج إلى كتابة بعض شيفرات HTML: <div class="screen"> <div class="message">Hover message!</div> </div> في قسم CSS من CodePen، وضعنا هذه الرسالة في منتصف العنصر screen، وجعلناها غير مرئية. .message { /*... positioning styles ...*/ opacity: 0; transition: all 0.4s ease-out; } يمكننا بعد ذلك إظهارها عند التحويم باستخدام الانتقال: .screen:hover .message { opacity: 1; } نظرًا لأننا أضفنا الخاصية transition إلى تنسيق العنصر message، فستحدث الحركة عندما يحوم مؤشر الفأرة فوق العنصر، وكذلك عندما يغادرها. تبدو تأثيرات الحركة والانتقال عند تجميدها كما يلي: المصدر: http://codepen.io/donovanh/pen/LEwedW?editors=110 ملخص في هذه المقالة، قمنا بدمج الحركة والانتقال معًا لإنشاء تأثير يمكن أن يكون مفيدًا في تصميم صفحات الهبوط، أو قصص المنتجات أو إخبار الزائر الغرض من موقعك أو كيفية استخدامه. استخدمنا الخاصية animation-play-state للتأكد من توقف الحركة عندما نريد. تمرين توقف لحظة، وفكّر في كل ما تعلمناه حتى الآن. لقد غطينا الكثير من المواضيع. يُعد الجمع بين الحركة والانتقال وسيلة ممتازة لإضفاء الحيوية على الصفحات. عند التفكير في كيفية تطبيق هذه التقنيات في مشاريعك، فكر في كيفية التحكم فيها أيضًا. حاول أن تعرف متى تكون الحركة مفيدةً للمستخدمين، ومتى تكون عائقًا أو مصدر إزعاج لهم. من الجيد أن تعرف كيف تنشئ الحركة جيدًا، ولكن أفضلُ من ذلك أن تعلم متى تتجنبها. المصادر ترجمة وبتصرف للفصل storytelling من كتاب CSS Animation 101 لمؤلفه Donovan Hutchinson. اقرأ أيضًا المقالة التالية: حرب النجوم المقالة السابقة: موجز الحركات
  6. التحريك في css

    لقد غطينا الكثير من التفاصيل في المقالات السابقة وأرجو أن يكون كل شيء واضحًا الآن. عندما بدأت تعلم إنشاء الحركات في CSS، لم تكن مفاهيم التحريك والإطارات المفتاحية (keyframes) واضحة لي. إذا شعرتَ أنّ مفاهيم التحريك غير واضحة حتى الآن، فلا تقلق. استمر في الدراسة والتعلم والتجريب، وستتضح شيئًا فشيئًا حيل ومفاهيم التحريكات في HTML و CSS. هذه المقالة جزء من سلسلة من المقالات حول التحريك في CSS: ما هي استخدامات الحركات؟ تجهيز بيئة العمل لإنشاء الحركات مدخل إلى الانتقالات: التنقل بين الحالات مدخل إلى الحركات: مفهوم الحركة تطبيق عملي: الانتقالات خاصيات الانتقالات دوال التوقيت الانتقالات المتعددة الانتقالات وجافاسكربت تطبيق عملي: التحريكات خاصيات الحركات تطبيق عملي: الإطارات المفتاحية الحركات المتعددة المتزامنة موجز الحركات رواية القصص عبر الحركات حرب النجوم إظهار المحتوى أثناء التمرير سهولة الوصول نهاية الرحلة سنلخّص في هذه المقالة ما تعلمناه في المقالات السابقة. لكن سنعود أولًا إلى التمرين الذي رأيناه في المقالة الماضية. تمرين: إشارات المرور يُفترض أن يكون التمرين سهلًا. طبعًا على افتراض أنك تعرف كيف تحلّه. لقد أنشأت نسخة محدّثة من مثال إشارات المرور وفق نموذج المملكة المتحدة، إذ غيَّرت التسلسل هذه المرة لإزالة مرحلة "الأحمر + البرتقالي" ليوافق نظام إشارات المرور الأمريكية. يمكنك الاطلاع عليه من هنا. لقد جعلت نظام الألوان يطابق شكل إشارات المرور الأمريكية. موجز: الحركات في هذا القسم، سنلقي نظرة على الخاصية animation، وكيف تعمل مع الإطارات المفتاحية (keyframes). الخاصية transition رغم أنَّ الخاصية animation تعمل بطريقة مشابهة للخاصية transition، إلا أنَّها تختلف عنها قليلًا. ففي حين أنّ الانتقال (transition) لن يحدث الا عند تغيُّر العنصر، فإنّ الحركات (animations) يمكن أن تبدأ مباشرةً. باستخدام مختلف الخاصيات، يمكن تكرار الحركات عددًا معينًا من المرات (أو إلى الأبد)، كما يمكن أن تبدأ بتأخير سالب، وهذا سيبدأ الحركة بعد أن تكون قد بدأت معالجتُها. افتراضيًا، تحدث الحركات من البداية إلى النهاية، ثم تقفز إلى حالتها الافتراضية. يمكننا تجميد الحركة في حالتها النهائية بإعطاء الخاصية animation-direction القيمةَ forwards. تستخدم الحركات دوال التوقيت مثلها مثل الانتقالات. بيْد أنّ دوال التوقيت تنطبق على كل إطار رئيسي على حدة، وليس على كامل مجموعة الإطارات المفتاحية. يمكنك أيضًا تحديد قيمة animation-timing-function داخل الإطار المفتاحي لتتحكم بشكل أدق في الحركة. أخيرًا، يمكن صياغة الحركات بشكل مختصر كما هو الحال مع الانتقالات: animation: keyframe-name 2s forwards linear; الإطارات المفتاحية من الضروري أن تشير كل حركة إلى مجموعة من الإطارات المفتاحية (keyframes). هذه الإطارات هي عبارة عن سلسلة من النسب المئوية التي تصف كل "مرحلة" من مراحل الحركة. سيملأ المتصفح الفجوات تلقائيًا. الإطارات المفتاحية لها اختصاراتها الخاصة (to و from)، والتي يمكنك استخدامها عندما تريد الاكتفاء بالانتقال من حالة إلى أخرى. يمكن أن يؤدي سرد النسب المئوية بجانب بعضها بعضًا إلى "توقف" الحركة في تلك المرحلة. أخيرًا، من الممكن حذف الإطار المفتاحي ‎0%، وسوف يفترض المتصفح حينها أنّ تنسيق العنصر هو الحالة الابتدائية. على سبيل المثال، لجعل عنصر ما يتلاشى (fade away)، لا يلزم بالضرورة أن تكون قيمة عتَامته (opacity) مساوية لـ 1 في البداية (على افتراض أنّ العنصر مرئي): @keyframes name { 100% { opacity: 0; } } تجميع الحركة عندما نريد استخدام الحركة، سيكون لدينا دائمًا الجزءان التاليان: .element { animation: keyframe-name ... } @keyframes keyframe-name { ... } تمرين في هذه المرحلة، يجب أن تكون قادرًا على التفريق بين خاصيتي الحركة (animation) والانتقال (transition). ألق نظرة على أمثلة Principles of Animation for the Web. كل تلك الأمثلة مصنوعة حصرًا باستخدام HTML و CSS، وذلك باستخدام إطارات الحركة المفتاحية. حاول أن تنسخها، وقُم بالتجريب والتعديل عليها. المصادر ترجمة وبتصرف للفصل animation recap من كتاب CSS Animation 101 لمؤلفه Donovan Hutchinson. اقرأ أيضًا المقالة التالية: رواية القصص عبر الحركات المقالة السابقة: الحركات المتعددة المتزامنة
  7. سنتحدث في هذه المقالة عن كيفية استخدام عدة مجموعات من الإطارات المفتاحية (keyframes) تعمل بشكل متزامن لتوليد حركة معقدة مؤلفة من عدة حركات. هذه المقالة جزء من سلسلة من المقالات حول التحريك في CSS: ما هي استخدامات الحركات؟ تجهيز بيئة العمل لإنشاء الحركات مدخل إلى الانتقالات: التنقل بين الحالات مدخل إلى الحركات: مفهوم الحركة تطبيق عملي: الانتقالات خاصيات الانتقالات دوال التوقيت الانتقالات المتعددة الانتقالات وجافاسكربت تطبيق عملي: التحريكات خاصيات الحركات تطبيق عملي: الإطارات المفتاحية الحركات المتعددة المتزامنة موجز الحركات رواية القصص عبر الحركات حرب النجوم إظهار المحتوى أثناء التمرير سهولة الوصول نهاية الرحلة إشارة المرور في بعض الأحيان، قد نرغب في مزامنة عدة حركات، بشكل يكون لكل حركة توقيتها الخاص. من الأمثلة الجيدة على هذا إشارة المرور. لدينا هنا نموذج بسيط لإشارة المرور (في المملكة المتحدة): المصدر: http://codepen.io/donovanh/pen/ogRRdR?editors=010 لدينا ثلاثة مصابيح، وكل منها يضيء وينطفئ بنمط خاص به. يمكننا إنشاء هذا عن طريق إعطاء كل مصباح حركةً خاصَّةً به. .red { animation: red 10s linear infinite; } .amber { animation: amber 10s linear infinite; } .green { animation: green 10s linear infinite; } لدينا ثلاثة حركات، واحدة لكل مصباح. مدة كل حركة متساوية للجميع، لذلك ستبقى الحركات متزامنة أثناء تكرارها الدوري. لأجل المتابعة سنحتاج إلى تحديد الإطارات المفتاحية. أثناء إنشاء هذا المثال، وجدت أنه من المفيد النظر إلى المصابيح كشبكة (grid). تحدث الحركات من اليسار إلى اليمين، إذ أنّ كل مصباح سيكون إما في حالة انطفاء أو إضاءة في كل لحظة. مخطط يوضح زمن تشغيل وإطفاء كل ضوء من أضواء إشارة المرور. تنقسم الشبكة إلى 5 أعمدة. هذا يعني أنه يمكننا التعامل مع "أخماس" كل منها تستغرق ‎20% من مدة الحركة، وإنشاء مجموعات الإطارات المفتاحية من تلك الأخماس. بأخذ كل مصباح على حدة، يمكننا أن نبدأ بالمصباح الأحمر. حيث سيكون مضيئًا في الخُمس الأول والثاني، ثم سينطفئ في بقية مراحل الحركة. الإطارات المفتاحية الناتجة هي كالتالي: @keyframes red { 0% { background: black; } 2%, 40% { background-color: red; } 42%, 100% { background: black; } } لقد أضفت فجوة بقيمة ‎2% في البداية، وجعلت الجزء الثالث من الحركات يبدأ عند اللحظة 42%، لأنّ هذا سيضيف تأثير التلاشي على إشارة المرور. مثل هذه الأشياء الدقيقة هي التي تصنع فرقًا :). مع إضاءة المصباح الأحمر، يُنتظر أن يضيء المصباح البرتقالي على الشبكة. المصباح البرتقالي سيكون منطفئًا في البداية، ثم سيضيء خلال الخمس الثاني، ثم ينطفئ خلال الخُمسَين التاليين، ثم يضيء في الخمس الأخير. الإطارات المفتاحية لهذا المصباح هي: @keyframes amber { 0%, 20% { background: black; } 22%, 40% { background: #FF7E00; } 42%, 80% { background: black; } 82%, 100% { background: #FF7E00; } } أما المصباح الأخضر، فسيكون منطفئًا خلال الخُمسَين الأوليَين، ثم يضيء خلال الخُمسَين التاليين، ثم ينطفئ في الخُمس الأخير. @keyframes green { 0%, 40% { background: black; } 42%, 80% { background: green; } 82%, 100% { background: black; } } يمكنك مطالعة المثال كاملًا من هنا. مراجع أخرى لمعرفة المزيد عن صياغة الإطارات المفتاحية، راجع المقال «صياغة الإطارات المفتاحية للحركات». تمرين قد يبدو مثال إشارة المرور غريبًا بالنسبة لك لأنه يتبع نموذج المملكة المتحدة. هل يمكنك تعديله ليتناسب مع نموذج إشارات المرور في بلدك؟ حسنًا، ليكن ذلك تمرين هذا القسم. المصادر ترجمة وبتصرف للفصل multiple animations من كتاب CSS Animation 101 لمؤلفه Donovan Hutchinson. اقرأ أيضًا المقالة التالية: موجز الحركات المقالة السابقة: تطبيق عملي: الإطارات المفتاحية
  8. أساسيات التعريف والاستخدام @-webkit-keyframes NAME-YOUR-ANIMATION { 0% { opacity: 0; } 100% { opacity: 1; } } @-moz-keyframes NAME-YOUR-ANIMATION { 0% { opacity: 0; } 100% { opacity: 1; } } @-o-keyframes NAME-YOUR-ANIMATION { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes NAME-YOUR-ANIMATION { 0% { opacity: 0; } 100% { opacity: 1; } } #box { -webkit-animation: NAME-YOUR-ANIMATION 5s infinite; /* Safari 4+ */ -moz-animation: NAME-YOUR-ANIMATION 5s infinite; /* Fx 5+ */ -o-animation: NAME-YOUR-ANIMATION 5s infinite; /* Opera 12+ */ animation: NAME-YOUR-ANIMATION 5s infinite; /* IE 10+, Fx 29+ */ } تنبيه: لتجنب الإطالة، لن نستخدم في بقية الشيفرات البرمجية في هذه الصفحة أي بادئات، ولكن تذكَّر استخدامها في الشيفرات النهائية. الخطوات المتعددة @keyframes fontbulger { 0% { font-size: 10px; } 30% { font-size: 15px; } 100% { font-size: 12px; } } #box { animation: fontbulger 2s infinite; } إن كان للحركة خاصيتي البداية والنهاية نفسهما، فيمكنك صياغة ذلك بوضع فاصلة بين القيمتين 0% و ‏100%‏: @keyframes fontbulger { 0%, 100% { font-size: 10px; } 50% { font-size: 12px; } } أو يمكنك جعل الحركة تحدث مرتين (أو أيّ عدد زوجي من المرات)، وإعطاء الخاصية animation-direction القيمة alternate. استدعاء إطارات الحركة المفتاحية عبر خاصيات منفصلة .box { animation-name: bounce; animation-duration: 4s; /* Xms :أو */ animation-iteration-count: 10; animation-direction: alternate; /* normal :أو */ animation-timing-function: ease-out; /* ease, ease-in, ease-in-out, linear, cubic-bezier(x1, y1, x2, y2) :أو */ animation-fill-mode: forwards; /* backwards, both, none :أو */ animation-delay: 2s; /* Xms :أو */ } الصياغة المختصرة للحركات في الصياغة المختصرة، ضع فاصلة بين كل القيم. لا يهم ترتيب القيم إلا في حال استخدام كل من المدة (duration) والتأخير (delay)، إذ يجب أن يكونا بهذا الترتيب. في المثال أدناه: 1s = المدة، 2s = التأخير، 3 = التكرار. animation: test 1s 2s 3 alternate backwards الجمع بين الخاصيتين transform و animation @keyframes infinite-spinning { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } الحركات المتعددة يمكنك الفصل بين القيم بفواصل للتصريح بحركات متعددة على مُحدّد (selector) معيّن: .animate-this { animation: first-animation 2s infinite, another-animation 1s; } الدالة‏ Steps()‎ تتحكم الدالة Steps()‎ بعدد الإطارات المفتاحية (keyframes) التي ستُصَيَّر في الإطار الزمني للحركة. في المثال التالي: @keyframes move { from { top: 0; left: 0; } to { top: 100px; left: 100px; } } إذا استخدمت Steps(10)‎ في الخاصية animation، فلن تُعرَض إلا 10 إطارات مفتاحية في الوقت المخصص. الحساب متسق هنا. ففي كل ثانية، سيتحرك العنصر بمقدار 10 بكسل (10px) إلى اليسار، و 10 بكسل إلى أسفل، حتى تنقضي مدة الحركة، ثم يحدث الأمر نفسه مرة أخرى في الاتجاه المعاكس، وهكذا دواليك. يمكن أن يكون هذا مناسبًا للحركات التي تعتمد على تمرير الصور (spritesheet animation)، مثل هذا المثال. دعم المتصفحات جلبنا بيانات دعم المتصفحات المعروضة هنا من الموقع Caniuse، يمكنك أن تجد تفاصيل أكثر عليه. يشير الرقم الموجود إلى جوار اسم المتصفح إلى أنّ ذلك المتصفح يدعم الميزة منذ ذلك الإصدار وما فوق. المصادر ترجمة وبتصرف للمقالة Keyframe Animation Syntax لصاحبها Chris Coyier.
  9. اطّلعنا في المقالة السابقة على خاصيات الحركات، ورأينا كيف أنَّها تعتمد على الإطارات المفتاحية (keyframes). سنلقي في هذه المقالة نظرة أعمق على الإطارات المفتاحية. هذه المقالة جزء من سلسلة من المقالات حول التحريك في CSS: ما هي استخدامات الحركات؟ تجهيز بيئة العمل لإنشاء الحركات مدخل إلى الانتقالات: التنقل بين الحالات مدخل إلى الحركات: مفهوم الحركة تطبيق عملي: الانتقالات خاصيات الانتقالات دوال التوقيت الانتقالات المتعددة الانتقالات وجافاسكربت تطبيق عملي: التحريكات خاصيات الحركات تطبيق عملي: الإطارات المفتاحية الحركات المتعددة المتزامنة موجز الحركات رواية القصص عبر الحركات حرب النجوم إظهار المحتوى أثناء التمرير سهولة الوصول نهاية الرحلة أساسيات قبل أن نخوض في مثال عملي، هناك بعض الأشياء التي أود تغطيتها بخصوص الإطارات المفتاحية. الأول، هو صياغة بديلة قد تراها في بعض الشيفرات، وتستخدم الكلمات from و to. @keyframes name { from { ... } to { ... } } هذه الطريقة البسيطة يمكن أن تكون بديلًا عن كتابة ‏0% و ‏100%، وقد تكون أسهل للفهم، ومناسبة للحركات البسيطة. قد تلاحظ أحيانًا استخدام أكثر من نسبة مئوية واحدة على نفس السطر. هذه الصياغة تجعل الحركة تتوقف لفترة من الزمن، أو تستقر على حالة معينة. مثلا: @keyframes name { 0%, 20% { opacity: 0; } 100% { opacity: 1; } } في هذا المثال، سيبدأ العنصر بتعتيمٍ (opacity) يساوي 0، وسيظل غير مرئي حتى انقضاء 20٪ من توقيت الحركة، ثم ستبدأ قيمة العتامة بالتحرُّك تُجاه القيمة 1. سنستخدم هذا في المقالة اللاحقة لمزامنة الحركات. مثال: تأثير اهتزاز الزر Save هل تذكر مثال الزر "Save" من المقالة الأولى؟ دعنا نعيد النظر في هذا المثال، وننظر في كيفية استخدام الإطارات المفتاحية keyframes إلى جانب الخاصية animation لإنشاء تأثير الاهتزاز. المصدر: http://codepen.io/donovanh/pen/KwEQdQ قبل إضافة أي حركة، فقد نسّقتُ الزر لجعله يبدو مثل زر CodePen. حيث جعلت له حدًّا برتقاليًا في الأعلى، وتدرّجًا داكنًا، وجلعت لون النص فيه أبيضًا. وقد استخدمت التموضع المطلق (absolute positioning) في المثال للتأكد من أنّ الزر سيكون في منتصف الشاشة. أول ما أفعله عمومًا هو تطبيق الخاصية animation على العنصر على النحو التالي: button { animation: wiggle 2s linear infinite; } في هذه الحالة، سنطبّق مجموعة من الإطارات المفتاحية تحمل الاسم wiggle، وستمتد الحركة لمدة ثانيتين باستخدام دالة التوقيت linear. كما سنستخدم أيضًا قيمة جديدة، وهي infinite. القيمة infinite هنا تخص الخاصية animation-iteration-count. افتراضيًا، ستتكرر الحركة مرة واحدة فقط، ولكن يمكننا أن نجعلها تتكرر عددًا محددًا من المرات أو تتكرر إلى الأبد. في مثالنا هذا، سوف تتكرر الحركة عددًا غير محدود من المرات. بعد ذلك، سنحدد الإطارات المفتاحية الخاصة بحركة "الاهتزاز". وها هي النتيجة: @keyframes wiggle { 0%, 7% { transform: rotateZ(0); } 15% { transform: rotateZ(-15deg); } 20% { transform: rotateZ(10deg); } 25% { transform: rotateZ(-10deg); } 30% { transform: rotateZ(6deg); } 35% { transform: rotateZ(-4deg); } 40%, 100% { transform: rotateZ(0); } } لقد أعطينا المتصفح سلسلة من النقاط المرحلية (waypoints) ليُحرِّك العنصر بينها. يُدوَّر الزر "Save" عند كل نقطة على المحور z. تبدأ الزوايا واسعةً، ثم تصغُر خلال الحركة. إليك كيف تميل الحركة الزر للخلف وللأمام مع مرور الوقت: المصدر: http://codepen.io/donovanh/pen/pvXJqp يمكننا أن نرى أنّ المتصفح ينشئ الخطوات الفاصلة بين الإطارات المفتاحية. وبدون الاعتماد على دوال التوقيت المعقدة، نجحت هذه الحركة في إضافة الكثير من التميز إلى الزر. يمكنك مطالعة مثال زر "Save" على CodePen. تمرين لقد أنشأت مشروع CodePen جديد يتضمن عنصرًا متحركًا واحدًا. حيث يستخدم animation-timing-function داخل الإطارات المفتاحية، مع سلسلة من الإطارات المفتاحية التي تخلق حركة معقدة نسبيًا. ما الذي سيحدث عند حذف بعض الإطارات؟ أو عند تغيير النسب المئوية؟ هل يمكنك جعل المكعب يتحرّك بشكل مختلف؟ اختر شكلًا بسيطًا، وحاول إضفاء صبغة من الحيوية عليه! المصادر ترجمة وبتصرف للفصل keyframes in action من كتاب CSS Animation 101 لمؤلفه Donovan Hutchinson. اقرأ أيضًا المقالة التالية: الحركات المتعددة المتزامنة المقالة السابقة: خاصيات الحركات
  10. التحريك في css

    قبل إعطاء المزيد من أمثلة التحريك، دعونا نلقي نظرة على خاصيات التحريك أولًا. هذه المقالة جزء من سلسلة من المقالات حول التحريك في CSS: ما هي استخدامات الحركات؟ تجهيز بيئة العمل لإنشاء الحركات مدخل إلى الانتقالات: التنقل بين الحالات مدخل إلى الحركات: مفهوم الحركة تطبيق عملي: الانتقالات خاصيات الانتقالات دوال التوقيت الانتقالات المتعددة الانتقالات وجافاسكربت تطبيق عملي: التحريكات خاصيات الحركات تطبيق عملي: الإطارات المفتاحية الحركات المتعددة المتزامنة موجز الحركات رواية القصص عبر الحركات حرب النجوم إظهار المحتوى أثناء التمرير سهولة الوصول نهاية الرحلة على غرار الخاصية transition، يمكن كتابة الخاصية animation باستخدام الصياغة المختزلة، أو يمكن تحديد أي من هذه الخاصيات بشكل منفرد. الخاصية animation-delay بشكل مشابه للخاصية transition-delay، يمكننا استخدام هذه الخاصية لجعل الحركة تنتظر قبل البدء. قد يكون ذلك مفيدًا في المواقف التي تحدث فيها عدة حركات. إذا كانت الحركات تتكرر بشكل دوري، فلن ينطبق التأخير إلا على المرة الأولى. كما لن ينطبق التأخير سوى عند تطبيق الحركة على العنصر. من الممكن إعطاء هذه الخاصية قيمة سالبة، مثل ‎-1s. سيؤدي ذلك إلى بدء الحركة كما لو أنّه قد مرّت ثانية من الزمن سلفًا. الخاصية animation-direction الحركات عادة ما تبدأ من 0٪ وتنتهي عند 100٪، حيث تمثل 0٪ نقطة بداية الحركة، وتمثل 100٪ نقطة النهاية. تأخذ الخاصية animation-direction القيم normal و reverse و alternate و alternate-reverse ، وتُستخدم للتحكم في اتجاه الحركة. تؤدي القيمة reverse إلى جعل الحركة تحدث (وتدور) بشكل معكوس، أي من 100٪ إلى 0٪، بينما تجعل القيمة alternate الحركةَ تحدث من 0٪ إلى 100٪، وتعود مرة أخرى إلى 0٪. الخاصية animation-duration تمثل هذه الخاصية طول الحركة. على غرار transition-duration، تأخذ هذه الخاصية قيمة مثل 1s، التي تمثل ثانية واحدة، أو 200ms، التي تمثل مئتي ميلي ثانية. الخاصية animation-fill-mode بشكل افتراضي، بعد انتهاء التحريك سيعود العنصر إلى حالته الطبيعية. باستخدام animation-fill-mode يمكننا جعل الحركة تتجمد إما على الحالة النهائية، أو على حالة البداية. يؤدي استخدام القيمة forwards إلى جعل الحركة تنتهي وتتوقف عند الإطار الرئيسي الأخير. فيما تعود القيمة backwards إلى الإطار الرئيسي الأول عندما تنتهي الحركة. يمكنك مطالعة هذا المثال على Hop.ie. تحدث الحركة مرة واحدة، وتنتهي عند الإطار الأخير. وذلك بسبب استخدام القيمة forwards. الخاصية animation-iteration-count تمثل هذه الخاصية عدد مرات إجراء الحركة. افتراضيًا، ستُنفَّذ الحركة مرة واحدة. يمكنك تحديد رقم معيّن، أو استخدام القيمة infinite لتكرار تنفيذ الحركة إلى الأبد. الخاصية animation-name تشير الخاصية animation-name إلى الإطارات المفتاحية المرتبطة بالحركة. على سبيل المثال، إذا تم تعيين animation-name عند القيمة foo، فسيتم استخدام مجموعة الإطارات المفتاحية ذات الاسم foo المُعرّفة على النحو التالي: @keyframes foo { ... } الخاصية animation-play-state إذا احتجت إلى إيقاف الحركة مؤقتًا أو استئنافها، تتيح لك هذه الخاصية القيام بذلك. تأخذ هذه الخاصية إحدى القيمتين running (القيمة الافتراضية) أو paused. يمكن تعيين قيمة هذه الخاصية باستخدام JavaScript. الخاصية animation-timing-function تأخذ هذه الخاصية نفس القيمة التي تأخذها الخاصية transition-timing-function، ولكن مع اختلاف طفيف. فبينما تنطبق دوال التوقيت، مثل ease-out، على عملية الانتقال (transition) بأكملها، تنطبق دالة التوقيت الخاصة بالتحريك (animation) بين الإطارات المفتاحية. هذا يعني أنّ الإطارات المفتاحية التالية ستشهد بداية سريعة للحركة ثم تتباطأ الحركة مع الاقتراب من 50٪، ثم تُسرَّع من جديد قبل أن تتباطأ مع الاقتراب من 100٪. @keyframes foo { 0% { /* ease-out التحريك يبدأ بسرعة ثم تجعله الدالة % يتباطأ مع الاقتراب من 50 */ } 50% { /* مجددا يبدأ بسرعة ثم يتباطأ مع الاقتراب من %100 */ } 100% { /* النهاية*/ } } هذا يمكن أن يكون مربكًا. أُفضّل عند إنشاء الحركات عبر الإطارات المفتاحية العمل بدالة التوقيت linear، ثم أتحكم في وتيرة الحركة باستخدام الإطارات المفتاحية. رغم ذلك، فإنّ دوال التوقيت cubic-bezier يمكن أن تخلق بعض التأثيرات الرائعة عند استخدامها مع الحركات، لذلك جرّبها. استخدام دوال التوقيت ضمن الإطارات المفتاحية تجدر الإشارة إلى أنه عند تحديد دالة التوقيت الخاصة بالحركة، فستنطبق دالة التوقيت على كل إطارات الحركة المفتاحية. هذا يعني أنه إذا أردت تحديد أربع إطارات مفتاحية، فستطُبّق دالة التوقيت على كلٍّ منها. فمثلًا، سوف تبطِّئ دالة التوقيت ease-out الحركة عند الاقتراب من نهاية كل إطار مفتاحي. لهذا السبب، عادةً ما يُفضل استخدام دالة التوقيت linear، والتحكم في السرعة على أساس كل إطار على حدة: @keyframes my-animation { 0% { ... animation-timing-function: linear; } 50% { ... animation-timing-function: ease-out; } } في هذه الحالة، سيكون النصف الأول من الحركة خطيًا، بينما يستخدم النصف الثاني دالة التوقيت ease-out. تمرين لقد أنشأت مثالًا توضيحيًّا على CodePen. الخاصيات مُدرجة في CSS. حاول تغيير بعض هذه الخاصيات لمعرفة ما سيحدث. المصادر ترجمة وبتصرف للفصل animation properties من كتاب CSS Animation 101 لمؤلفه Donovan Hutchinson. اقرأ أيضًا المقالة التالية: تطبيق عملي: الإطارات المفتاحية المقالة السابقة: تطبيق عملي: التحريكات
  11. التحريك في css

    ألقينا في المقالات الماضية نظرة على الخاصية transition، وسنلقي في هذه المقالة نظرة أعمق على الخاصية animation. هذه المقالة جزء من سلسلة من المقالات حول التحريك في CSS: ما هي استخدامات الحركات؟ تجهيز بيئة العمل لإنشاء الحركات مدخل إلى الانتقالات: التنقل بين الحالات مدخل إلى الحركات: مفهوم الحركة تطبيق عملي: الانتقالات خاصيات الانتقالات دوال التوقيت الانتقالات المتعددة الانتقالات وجافاسكربت تطبيق عملي: التحريكات خاصيات الحركات تطبيق عملي: الإطارات المفتاحية الحركات المتعددة المتزامنة موجز الحركات رواية القصص عبر الحركات حرب النجوم إظهار المحتوى أثناء التمرير سهولة الوصول نهاية الرحلة علاقة تكاملية تُطبّق الخاصية animation على العناصر بشكل مشابه للخاصية transition. كما أنها تحتاج إلى جزء ثانٍ، يسمى الإطارات المفتاحية (keyframes). .element { animation: ... } @keyframes animation-name { /* تُكتَب هنا النقاط المرجعية لهذا الإطار المفتاحي */ } تتمثل إحدى فوائد تعريف الإطارات المفتاحية keyframes بشكل منفصل في أنها تتيح لنا إنشاء تحريكات قابلة لإعادة الاستخدام. الخاصية animation تُطبّق الإطارات المفتاحية على العناصر باستخدام الخاصية animation. وهي تشبه transition إلى حد بعيد، ولكنّها تتميز عنها ببعض الخاصيات الإضافية. يمكن كتابة التحريكات بالشكل المختصر التالي: animation: change-background 4s linear infinite; في حال كتابتها كخاصيات منفردة، فستبدو الصياغة كما يلي: animation-name: change-background; animation-duration: 4s; animation-timing-function: linear; animation-repeat: infinite; القيم المعطاة لـ transition هي عبارة عن خاصيات (properties)، مثل background أو all، أما الخاصية animation فتُعطى اسم مجموعة الإطارات المفتاحية التي تؤلف تسلسل الحركة. تتميز التحريكات ببعض الخاصيات التي ليست لدى الانتقالات. على سبيل المثال، يمكننا برمجة التحريكات لكي تتراوح ذهابًا وإيابًا، بدلًا من تكرار الحركة من البداية كل مرة. الإطارات المفتاحية مجموعة الإطارات المفتاحية keyframes في CSS هي عبارة عن سلسلة من النقاط المرجعية على طول مسار التحريك. ويُكتب كل إطار مفتاحي كنسبة مئوية. أفضل طريقة لوصف هذا المفهوم هي باستخدام مثال توضيحي. لنبدأ بعنصر div على صفحة، والذي تتغير خلفيته بمرور الوقت. فهو يبدأ بخلفية زرقاء، ثم تتغير إلى خلفية برتقالية، ثم خلفية خضراء في النهاية. إذا حاولنا أن نوضح لشخص ما كيف يحدث هذا التغيير في ألوان الخلفية بمرور الوقت، فقد نصف الأمر هكذا: "البدء بخلفية زرقاء، ثم خلفية برتقالية في منتصف الطريق، ثم الانتهاء بخلفية خضراء" أو إذا أردنا أن نكون أكثر دقة، فيمكننا استخدام النسب المئوية لشرح توقيت التغييرات: "عند قطع 0٪ من الطريق (البداية)، فإنّ الخلفية ستكون زرقاء، ثم عند الوصول إلى نسبة 50٪ من الوقت، فستصير الخلفية برتقالية، وعند الوصول إلى نسبة 100٪، ستصير الخلفية خضراء" يمكننا تلخيص ذلك على النحو التالي: 0% Blue 50% Green 100% Orange من خلال تحديد هذه النسب المئوية، فقد أنشأنا سلسلة من "النقاط المرجعية" التي ينبغي أن تمر بها التحريكات. كل ما نحتاج إليه الآن هو إخبار المتصفح بأنّ هذه النسب هي في الواقع إطارات مفتاحية keyframes، مع إعطاء التحريك اسمًا. والنتيجة هي هذه: @keyframes change-background { 0% { background: blue; } 50% { background: orange; } 100% { background: green; } } لقد سمّينا عملية التحريك change-background. سنستخدمها لاحقًا عندما نريد تطبيق الإطارات المفتاحية على عنصر ما. بقراءة الشيفرة من أعلى إلى أسفل، تصف النسب المئوية موضع الإطارات الرئيسية في مسار التحريك. يمكننا أن نرى ذلك بشكل عملي في الصورة أسفله: المصدر http://codepen.io/donovanh/pen/WbqNwd?editors=110 أثناء حدوث الحركة، ينشئ المتصفح الإطارات المفتاحية الوسطية اللازمة للانتقال من كل لون من ألوان الخلفية إلى اللون التالي. بإخبار المتصفح أننا أردنا أن يبدأ العنصر div بلون معيّن، وأنّ عليه أن يأخذ لونًا آخر في منتصف الطريق، ثم ينتهي بلون ثالث، فإنّ المتصفح يتولى إنشاء التحريكات اللازمة بين كل نقطة من تلك النقاط. يمكنك مراجعة هذا المثال على CodePen. لقد ذكرت في وقت سابق إمكانية استخدام الخاصية animation-direction كخيار بديل لإنشاء التحريك. إليك كيف يبدو ذلك: في هذه الحالة، قمت بتغيير قيمة الخاصية animation-direction إلى alternate. يمكنك الاطلاع على ذلك في موقع CodePen. البادئات في الوقت الحالي، لا يزال من الضروري استخدام البادئة -webkit- في الخاصية animation. لن أضيفها إلى الأمثلة، ولكنها ضرورية لتعمل التحريكات في بعض المتصفحات، مثل Safari. في CodePen، يمكنك استخدام خيار "Autoprefixer" الموجود ضمن إعدادات CSS. بالنسبة للتطوير المحلي، فأنا أستخدم أداة Autoprefixer الخاصة بأداة Gulp. (يشرح القسم «تحسين دعم المتصفحات لخاصيات CSS وشيفرة JavaScript» في المقال دليلك الشامل إلى أداة البناء Gulp كيفية أتمتة هذه العملية تلقائيًا.) أداة Prefix Free هي بديل جيد أيضًا. تمرين افتح مثال الإطارات المفتاحية هذا، وحاول تغيير الشيفرة. قم بالتجريب عليه، وحاول تعطيله، ثم إصلاحه. وإن ابتكرت تحريكات خاصة بك، فأخبرنا في التعليقات. المصادر ترجمة وبتصرف للفصل animations in action من كتاب CSS Animation 101 لمؤلفه Donovan Hutchinson. اقرأ أيضًا المقالة التالية: خاصيات الحركات المقالة السابقة: الانتقالات وجافاسكربت
  12. استخدمنا في المقالات السابقة الخاصية transition للقيام بالتحريك بين حالتين، حالة عدم التحويم (non-hover state) وحالة التحويم (hover state). تحدُث تلك الانتقالات عند التحويم (تمرير مؤشر الفأرة) فوق العنصر. بيْد أنّ هذه ليست الطريقة الوحيدة لبدء التحريك، سنغطي في هذه المقالة طريقتين لفعل ذلك عبر استخدام JavaScript. هذه المقالة جزء من سلسلة من المقالات حول التحريك في CSS: ما هي استخدامات الحركات؟ تجهيز بيئة العمل لإنشاء الحركات مدخل إلى الانتقالات: التنقل بين الحالات مدخل إلى الحركات: مفهوم الحركة تطبيق عملي: الانتقالات خاصيات الانتقالات دوال التوقيت الانتقالات المتعددة الانتقالات وجافاسكربت تطبيق عملي: التحريكات خاصيات الحركات تطبيق عملي: الإطارات المفتاحية الحركات المتعددة المتزامنة موجز الحركات رواية القصص عبر الحركات حرب النجوم إظهار المحتوى أثناء التمرير سهولة الوصول نهاية الرحلة إضافة أو إزالة الأصناف أهم ما يميّز الانتقالات هي قدرتها على التحريك بين حالتين، لذا يمكننا إنشاء تلك الحالات على هيئة أصناف (classes) منفصلة ثم نضيف أو نزيل تلك الأصناف باستخدام JavaScript. المصدر: http://codepen.io/donovanh/pen/YPbxqa يتألف هذا المثال من زر ومحتوى مُتضمَّن في عنصر div. في البداية سيكون لحاوية المحتوى صنف hide. في CSS، الصنف hide له الخاصية opacity: 0;‎. لدينا أيضًا صنف ثانٍ في CSS يُسمى show. هذه الصنف لديه عتامة (opacity) مساوية للقيمة 1. عند النقر فوق الزر، يتراوح صنف العنصر div بين hide وshow. ولأجل تحريكه، فنحن نطبق عملية انتقال على العنصر div أيضًا. يمكنك مطالعة هذا على CodePen. إذا كنت ترغب في التعمق أكثر في الموضوع، فأنصحك بقراءة المقال Adding Appeal to Your Animations on the Web. في نهاية هذا الدرس، سنتعلم كيفية إجراء الانتقالات والتحريكات أثناء التمرير (scrolling). التحكم في الانتقالات عبر جافاسكربت يمكننا القيام بأكثر من إضافة أو إزالة الأصناف. فيمكننا باستخدام JavaScript، ضبط خاصيات CSS مباشرة على النحو التالي: element.style.transition = `opacity 1s ease-out`; في هذه الحالة، يمثل element عنصرًا حددناه. على سبيل المثال، إذا كان لعنصر ما المُعرّف js-show، فيمكنك تطبيق الانتقال عليه باستخدام getElementById: document.getElementById(`js-show`).style.transition = `opacity 1s ease-out`; عندما تفعل ذلك، يجب ألا تنسَ تضمين بادئات المتصفحات (vendor prefixes) أيضًا. سيُكتب ما سبق على النحو التالي: document.getElementById(`js-show`).style.webkitTransition = `opacity 1s ease-out`; document.getElementById(`js-show`).style.transition = `opacity 1s ease-out`; في هذا المثال، ستُطبّق webkitTransition على كل المتصفحات ذات البادئة -webkit- في CSS. ملخص درسنا في المقالات السابقة الخاصية transition، وتعلّمنا كيفية استخدامها لجعل المتصفح يحرِّك عنصرًا من حالة إلى أخرى. نقل عنصر من حالة إلى أخرى وقد تعلمنا في ثنيّات الطريق عدَّة خاصيات، مثل: المدة (duration) والتأخير (delay) ودوال التوقيت (timing functions). من خلال الجمع بينها، يمكننا تصميم تأثيرات جذابة، بل وتطبيق عدة انتقالات على نفس العنصر. وأخيرًا، في هذه المقالة توّجنا ما سبق بتعلم كيفية تطبيق هذه الانتقالات باستخدام JavaScript. الانتقالات ليست سوى جزء بسيط من التحريك في CSS. سنغطي في المقالات اللاحقة الخاصية animation. تمرين قبل أن ننتقل إلى الخاصية animation، خذ بعض الوقت للتفكير في كيفية استخدام الانتقالات. هل يمكنك التفكير في طرق يمكن أن تساعد بها الانتقالات على تسهيل التفاعلات، أو تغييرات الحالة على صفحاتك؟ كيف يمكنها أن تضيف جاذبية إلى تصميمك؟ المصادر ترجمة وبتصرف للفصل transitions and javascript من كتاب CSS Animation 101 لمؤلفه Donovan Hutchinson. اقرأ أيضًا المقالة التالية: تطبيق عملي: التحريكات المقالة السابقة: الانتقالات المتعددة
  13. التحريك في css

    لقد ناقشنا في المقالات السابقة كيف يخلق الانتقال (transition) الحركة عبر الانتقال من حالة إلى أخرى. في هذه المقالة سنرى ما يحدث عندما نطبق عملية انتقال واحدة على عنصر واحد تحدث له عدة تغييرات، وكيفية استخدام عدة انتقالات معًا لتحسين التحريكات. هذه المقالة جزء من سلسلة من المقالات حول التحريك في CSS: ما هي استخدامات الحركات؟ تجهيز بيئة العمل لإنشاء الحركات مدخل إلى الانتقالات: التنقل بين الحالات مدخل إلى الحركات: مفهوم الحركة تطبيق عملي: الانتقالات خاصيات الانتقالات دوال التوقيت الانتقالات المتعددة الانتقالات وجافاسكربت تطبيق عملي: التحريكات خاصيات الحركات تطبيق عملي: الإطارات المفتاحية الحركات المتعددة المتزامنة موجز الحركات رواية القصص عبر الحركات حرب النجوم إظهار المحتوى أثناء التمرير سهولة الوصول نهاية الرحلة المثال الأول: زر فني رأينا في المقالات السابقة تأثيرًا بسيطًا للتحويم على الأزرار (button hover)، يمكننا دمج عدة انتقالات على نفس الزر للحصول على تأثير أكثر تعقيدًا. المصدر: http://codepen.io/donovanh/pen/YPMGpJ في هذا المثال، يجمع تأثير التحويم بين عدة تغييرات للحالة، ولكنها مُحدّدة جميعًا عبر انتقال واحد: transition: transform 0.4s cubic-bezier(.72,-0.61,.25,1.51); إليك كيف يعمل هذا المثال. يتألف الزر من أيقونتين ونصّين. في الحالة الأولية (حالة غير التحويم non-hover state) يوضع النص "Follow me" وأيقونة Twitter داخل الزر. نضع الرمز @ والنص "cssanimation" خارج الزر على النحو التالي: ثم نضيف حالة تحويم، حيث يتم وضع العناصر الموجودة خارج الزر داخله، كما يلي: يمكننا فعل هذا باستخدام انتقالات CSS. على سبيل المثال، يُحدَّد موضع أيقونة Twitter باستخدام التموضع المطلق (absolute positioning). عند إعداد الأيقونة، يمكن تحديد موضعها في المكان الذي نريد باستخدام القيم left و top: .icon { position: absolute; left: 0.75em; top: 0.75em; } ثم نضيف حالة تحويم للزر، ونضع أيقونة Twitter خارج الزر عبر الخاصية transform: a:hover .icon { transform: translateY(3em); } إضافة overflow: hidden إلى الحاوية (container) يعني أنّ العناصر الموجودة خارج الزر لن تظهر. في غياب الانتقال ستختفي الأيقونة فجأة. نظرًا لأنّ كل عنصر من العناصر الموجودة داخل الزر من النوع span، فيمكننا تطبيق الانتقال عليها جميعًا دفعة واحدة: span { transition: transform 0.4s cubic-bezier(.72,-0.61,.25,1.51); } هذا يعني أنه سيحدث انتقال كل عناصر span إذا تغيرت حالتها، مثلًا، عند التحويم عليها. يتم تطبيق نفس الحيلة على الأجزاء الأخرى من الزر. يمكنك مشاهدة هذا المثال بالكامل على CodePen. المثال الثاني: كشف الخلفية في هذا المثال، قمت بإعداد بطاقة تحتوي نصًّا، مع عرض نص عند التحويم عليها. المصدر: http://codepen.io/donovanh/pen/LEvjJg الحالة الأولية (حالة غير التحويم) للبطاقة تُظهر عنوانًا، ولكنّ عتامة (opacity) نص الفقرة تساوي الصفر. عند التحويم، نقوم بتغيير ذلك إلى القيمة 1 لإظهار النص، مع تغيير ارتفاع حاوية النص. في غياب الانتقال، سيبدو هكذا. عندما نمرّر مؤشر الفأرة (نحوّم) فوق البطاقة، فسيكون التغيير مفاجئًا. مع إضافة انتقالين، سيتغيّر الانطباع تمامًا. وها هي النتيجة. يبدو الانتقال الأول (المكتوب بالصياغة المختزلة هذه المرة) كما يلي: transition: all 0.5s cubic-bezier(.48,-0.28,.41,1.4); يخبر هذا المتصفحَ بأنّ عليه تحريك جميع الخاصيات على مدى 0.5 ثانية، مع استخدام انتقال cubic-bezier لجعله يرتد. وفي هذه الحالة، فهو يؤثر على ارتفاع حاوية النص. الانتقال الثاني يجعل النص يتحرك. سنستخدم هنا دالة التوقيت ease-out: transition: all 0.4s ease-out; يمكننا تحقيق الكثير من التأثيرات من خلال تغيير الحالات في وضع التحويم. في هذا المثال، يُعطَى لارتفاع العنصر div ذو الصنف info وللفقرة الموجودة داخله عندما يكونان في الحالة ‎.card: hover. استخدمنا في هذا المثال، انتقالين، بحيث يتحرك كل جزء بطريقة مختلفة. وجود عناصر تتحرك بسرعات مختلفة يمكن أن يضيف جاذبية لعملية الانتقال. يمكنك مشاهدة هذا المثال على CodePen. انتقالات متعددة على عنصر واحد بالإضافة إلى استخدام عدة انتقالات على عدة عناصر، يمكننا أيضًا استخدام عدة عمليات انتقال على عنصر واحد. يمكن استخدام ذلك عندما تحتاج إلى تغيير خلفية عنصر ما بشكل منفصل عن حدوده. إذ قد يكون تطبيق انتقال واحد على جميع الخاصيات غير مناسب. يمكننا تحقيق ذلك من خلال الجمع بين عدة انتقالات في نفس التعليمة، حيث يتم فصل الانتقالات بفواصل. مثلًا: transition: background 1s ease-out, border 0.5s linear; ينطبق الانتقال الأول هنا على الخلفية فقط، أما الثاني (بعد الفاصلة) فينطبق فقط على الحدود. هذا يعني أنّ حالة التحويم التي تغيّر الخلفية ستستغرق ثانية واحدة، فيما سيستغرق انتقال الحدود 0.5 ثانية. تمرين في هذه المقالة درسنا كيف يمكن التعامل مع عدة تأثيرات عبر انتقال واحد، وكيف يمكن استخدام عدة انتقالات معًا. يجدر بك إلقاء نظرة على الأمثلة في CodePen: مثال 1: زر فني مثال 2: بطاقة Cat Hover هل يمكنك استخدام هذه الأنواع من الانتقالات في مشروع تعمل عليه حاليًا؟ لقد غطينا الكثير حتى الآن. سوف نلقي في المقالة التالية نظرة على كيفية تطبيق هذه الانتقالات باستخدام JavaScript. المصادر ترجمة وبتصرف للفصل multiple transitions من كتاب CSS Animation 101 لمؤلفه Donovan Hutchinson. اقرأ أيضا المقالة التالية: الانتقالات وجافاسكربت المقالة السابقة: دوال التوقيت
  14. التحريك في css

    دالة التوقيت (timing function) تتحكم في وتيرة وسرعة التغيرات التي تحدث إبّان الانتقال (transition). باستخدام دوال التوقيت، يمكن جعل الانتقالات أكثر حيوية. هذه المقالة جزء من سلسلة من المقالات حول التحريك في CSS: ما هي استخدامات الحركات؟ تجهيز بيئة العمل لإنشاء الحركات مدخل إلى الانتقالات: التنقل بين الحالات مدخل إلى الحركات: مفهوم الحركة تطبيق عملي: الانتقالات خاصيات الانتقالات دوال التوقيت الانتقالات المتعددة الانتقالات وجافاسكربت تطبيق عملي: التحريكات خاصيات الحركات تطبيق عملي: الإطارات المفتاحية الحركات المتعددة المتزامنة موجز الحركات رواية القصص عبر الحركات حرب النجوم إظهار المحتوى أثناء التمرير سهولة الوصول نهاية الرحلة فيما يلي مثال للانتقال باستخدام دالة توقيت خطية، إذ تتحرك جيئةً وذهابًا بوتيرة ثابتة. قارن هذا بهذا المثال الذي يستخدم دوال التوقيت المسماة cubic-bezier. سترى فرقًا كبيرًا في وتيرة الحركة. في هذا المثال، سنستخدم دالة cubic-bezier مخصصة: دالة توقيت cubic-bezier تجعل مقاربة cubic-bezier في هذا المثال التحريكات تتراجع إلى الوراء قليلاً قبل التحول بسرعة إلى الحالة الثانية، حيث تتجاوزها فعليًا، ثم تعود إليها. أمثلة CSS التي أعطيناها في البداية، وحالة التحويم (hover state) في كل الأمثلة تعتمد على دالة التوقيت. سنلقي نظرة على كل تلك الدوال، ونتعرف على كيفية تأثيرها على الطريقة التي تتحرك بها العناصر. إذا كنت ترغب بالتجريب على هذه الأمثلة، فقد أعددت مشروعًا على CodePen يمكنك الدخول إليه والتعديل عليه. Linear دالة التسارع الخطي Linear يتغير التسارع الخطي (linear transition) بمعدل ثابت من البداية إلى النهاية. ونظرًا لعدم وجود منحنى في الانتقال، فهو لا يتسارع أو يتباطأ. يمكن أن يكون هذا مفيدًا إن كنت تريد إنشاء تحريك يحتاج إلى حركة ثابتة، مثل مشهد خلفية نافذة قطار متحرك، أو الدوران الثابت. Ease-in التسارع المتباطئ عند الانطلاق ease-in تبدأ دالة التسارع المتباطئ عند الانطلاق (ease-in timing function) ببطء وتتسارع في نهاية الانتقال. بشكل مشابه لكرة تتدحرج من أعلى التل، حيث تبدأ ببطئ، وتنتهي بسرعة كبيرة في الأسفل. Ease-out التسارع المتباطئ عند التوقف ease-out دالة التسارع المتباطئ عند التوقف (ease-out timing function) تتصرف بشكل معاكس لدالة التسريع الداخلي. إذ تبدأ بسرعة، ثم تتباطئ في نهاية الانتقال. هذا مفيد في الحالات التي تحتاج فيها إلى إعطاء الزائر شعورًا بأنّ شيئًا ما يندفع من خارج الشاشة ثم يبطئ للتوقف. Ease-in-out دالة التسارع المتباطئ عند الانطلاق والتوقف Ease-in-out دالة التسارع المتباطئ عند الانطلاق والتوقف (ease-in-out timing function)، هي مزيج من دالتي التسريع الداخلي والخارجي. إذ تبدأ ببطء، وتتسارع خلال الجزء الأوسط من الانتقال، ثم تتباطأ عند النهاية. يمكن أن تمثّل سيارة تبدأ من حالة توقف تام، ثم تتسارع، ثم تبطئ قبل التوقف. كما قد تكون مفيدة لإنشاء تحريك يمثل عملية التحميل. Cubic-bezier دالة التسارع المخصص Cubic-bezier جميع دوال التوقيت التي رأيناها حتى الآن هي أمثلة لمنحنى cubic bezier. وهو منحنى يصف "شكل" دالة التوقيت. وهكذا، فإنّ تحديد دالة توقيت cubic-bezier يكافئ إنشاء دالة توقيت خاصة بنا. تتألف دوال توقيت cubic-bezier من 4 قيم، تمثل إحداثيتين (co-ordinates). صياغة cubic-bezier قد تبدو على الشكل التالي: transition-timing-function: cubic-bezier(1,-0.49,.13,1.09); الإحداثيتان هنا هما (‎1, -0.49) و (‎.13, 1.09). على الرسم البياني تبدو كما يلي: المصدر: http://cubic-bezier.com/#1,-0.49,.13,1.09 بدلاً من إنشاء المنحنيات يدويًا، فأنا أستخدم موقع cubic-bezier.com. سيمكّنك هذا الموقع من إنشاء بعض التأثيرات الرائعة. تصبح منحنيات cubic-bezier ممتعة عند استخدام قيم أكبر من 1، إذ من الممكن إنشاء انتقالات تتخطى الحدود وترتد. Steps دالة الانتقال الخطوي Steps في حين تعتمد معظم دوال التوقيت على المنحنيات، فإنّ الدالة steps تُقسّم عملية الانتقال إلى مجموعة من المراحل، وتقفز من مرحلة إلى التي تليها. ‎على سبيل المثال، إذا حددت القيمة steps(4)‎، فإنّ مدة الانتقال ستقُسّم إلى 4 قفزات منفصلة (انظر الصورة أعلاه). هذا مفيد للتحريكات المفاجئة. على سبيل المثال، دوّار التحميل (loading spinner)، أو شخصية متحركة للعبة فيديو. من خلال تعيين موضع الخلفية في بداية سلسلة الإطارات (frames)، يمكن استخدام دالة التوقيت steps للقفز من إطار لآخر، وإحداث شعور بالحركة. لمشاهدة مثال على ذلك، شاهد التحريك Twitter fave button. يمكنك أيضًا تحديد ما إذا كان الانتقال سيحتفظ بالإطار الأول لجزء من مدة الانتقال، أم أنه سيحتفظ بالإطار النهائي. الوضع الافتراضي هو الإطار النهائي، على أساس أنّ الإطار الأول قد ظهر بالفعل قبل أن يبدأ التحريك. يمكننا تحديد الخيار المناسب عند تحديد الخطوات: transition: all 2s steps(10, start); transition: all 2s steps(10, end); تمرين تتمة للتمرين السابق: حاول تغيير قيمة transition-timing-function، وشاهد كيف يغير ذلك الطريقة التي يظهر بها الانتقال. يمكنك أيضًا محاولة تغيير القيم في هذا المثال التوضيحي. من الناحية الفنية، فهي تحريك (animation) وليست انتقالًا (transition)، لكنّ دالة التوقيت تنطبق بنفس الطريقة. المصادر ترجمة وبتصرف للفصل timing functions من كتاب CSS Animation 101 لمؤلفه Donovan Hutchinson. اقرأ أيضًا المقالة التالية: الانتقالات المتعددة المقالة السابقة: خاصيات الانتقالات
  15. التحريك في css

    تعلّمنا في المقالة الماضية كيفية عمل الخاصية transition، وسنلقي في هذه المقالة نظرة على خاصيات الانتقالات. هذه المقالة جزء من سلسلة من المقالات حول التحريك في CSS: ما هي استخدامات الحركات؟ تجهيز بيئة العمل لإنشاء الحركات مدخل إلى الانتقالات: التنقل بين الحالات مدخل إلى الحركات: مفهوم الحركة تطبيق عملي: الانتقالات خاصيات الانتقالات دوال التوقيت الانتقالات المتعددة الانتقالات وجافاسكربت تطبيق عملي: التحريكات خاصيات الحركات تطبيق عملي: الإطارات المفتاحية الحركات المتعددة المتزامنة موجز الحركات رواية القصص عبر الحركات حرب النجوم إظهار المحتوى أثناء التمرير سهولة الوصول نهاية الرحلة الصياغة المختزلة مقابل الصياغة المطولة عند كتابة شيفرة CSS، يمكننا في كثير من الأحيان اختزال عدة خاصيات في خاصية واحدة مختزلة. على سبيل المثال، الصياغة المختزلة للخاصية padding تُكتب على النحو التالي: padding: 10px 20px 15px 25px; وهذا يكافئ: padding-top: 10px; padding-right: 20px; padding-bottom: 15px; padding-left: 25px; يمكننا بالطريقة نفسها كتابة الخاصية transition بشكل مختزل: transition: all 0.5s 1s linear; وهذا هو الشكل العام: transition: [property] [duration] [delay] [timing-function]; يمكن كتابة كل واحدة من هذه الخاصيات بشكل منفرد: transition-property: all; transition-duration: 0.5s; transition-delay: 1s; transition-timing-function: linear; لنلق نظرة على هذه الخاصيات. الخاصية transition-property عادةً ما ترد في بداية الصياغة المختزلة، وتمثلُ الخاصيةَ التي سيقوم المتصفح بتحريكها. لتغيير الخلفية على سبيل المثال، يمكن استخدام القيمة background. من الممكن أيضًا استخدام القيمة all، والتي تمثل جميع خاصيات CSS التي ينطبق عليها الانتقال. الخاصية transition-duration تمثل قيمةُ الخاصية transition-duration المدةَ التي يستغرقها الانتقال. فترة انتقال تساوي 3s (ثلاث ثوانٍ) ستكون أطول بثلاث مرات من فترة انتقال تساوي 1000ms. الخاصية transition-delay تخبر الخاصية transition-delay المتصفح بالانتظار قبل تطبيق الانتقال. هذه قيمة زمنية، ويمكن تحديدها بالثانية أو الميلي ثانية(ms). على سبيل المثال، 3s تكافئ ثلاث ثوان، و100ms تكافئ مئة ميلي ثانية. بشكل مكافئ، يمكنك كتابة تلك القيمة على شكل 0.1s. الأمر متروك لك. الخاصية transition-timing-function تستخدِم كل من الانتقالات (transitions) والتحريكات (animations) دوال التوقيت (timing functions). تحتاج دوال التوقيت إلى فقرة خاصة بها، لذا سنؤجل الحديث عنها إلى المقالة التالية. لكن بإيجاز، دوال التوقيت تعطي للتحريكات حيوية. الأشياء التي لا يطبّق الانتقال عليها رغم أنه يمكن استخدام الانتقالات على الخاصيات size و colour و border و background-position وغيرها، إلا أنّ هناك بعض الخاصيات التي لا يمكن تطبيق الانتقال عليها. فمثلًا، لا يمكن تطبيق الانتقال على عائلة الخطوط font-family، لأنّ هذا يعني أنّ على المتصفح إنشاء إطارات مفتاحية (keyframes) بين صورتين مختلفتين تمامًا من الخطوط. صور الخلفية المُنشأة باستخدام CSS، مثل التدرجات (generated gradients)، لا يمكن تطبيق التحريك على خاصياتها. لأنّ ذلك يعني أنّ المتصفح سيكون عليه استبدال صورة الخلفية بكل الإطارات المفتاحية للتحريك، لذلك فهو غير مدعوم. لكن يمكن تحريك خاصيات من قبيل opacity و background-position. وعن طريق تحريك صور الخلفية أو إخفائها، يمكنك إنشاء تأثيرات جذابة. يمكنك مشاهدة مثال Baymax، حيث يتم تحريك صورة الخلفية لإنشاء حركة. المصدر: http://[CSS](https://wiki.hsoub.com/CSS)animation.rocks/baymax يتم استخدام تأثير مماثل لإحداث تأثير اللمعان على الأزرار، حيث يتم تحريك تدرج الخلفية في مقدمة الزر. المصدر: https://[CSS](https://wiki.hsoub.com/CSS)animation.rocks/pseudo-elements/ تمرين لقد أنشأت مثالًا على Codepen لتجربة الانتقالات. المثال يقوم بالانتقال من شكل الماس (diamond shape) إلى شكل الدائرة. حاول تغيير بعض الخاصيات لمعرفة ما سيحدث. إذا كنت ترغب في التعمق أكثر في هذا الموضوع، فاضغط على الزر "Fork" لإنشاء نسختك الخاصة، ويمكنك بعد ذلك حفظ عملك في حساب Codepen الخاص بك. المصادر ترجمة وبتصرف للفصل transitions-properties من كتاب CSS Animation 101 لمؤلفه Donovan Hutchinson. اقرأ أيضًا المقالة التالية: دوال التوقيت المقال السابقة: تطبيق عملي: الانتقالات