تصميم عنصر الزر القديم الجيد

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



تم تطبيق الأنماط على الأزرار الافتراضية


ربما يبدو أن الحديث عن "الأنماط القياسية" هو مناقشة بعض الأشياء الأولية ، ولكن في الواقع ، الحديث عنها أمر مثير للاهتمام. إليك ورقة الأنماط القياسية للأزرار من وكيل مستخدم Google Chrome.

.c-button {
    -webkit-writing-mode: horizontal-tb !important;
    -webkit-appearance: button;
    border-color: rgb(216, 216, 216) rgb(209, 209, 209) rgb(186, 186, 186);
    border-style: solid;
    border-width: 1px;
    padding: 1px 7px 2px;
    text-rendering: auto;
    color: initial;
    display: inline-block;
    text-align: start;
    margin: 0em;
    font: 400 11px system-ui;
}

وهذا هو شكل الزر القياسي عندما لا يغير مخرجاته الأنماط الافتراضية.


زر بسيط يتم تطبيق الأنماط القياسية عليه.

أولاً ، قم بإعادة تعريف الخاصيةappearance. يتم استخدامه للتصميم الخاص بمنصة معينة. يعتمد مظهر الزر باستخدام هذا الأسلوب على الأنماط المستخدمة في نظام تشغيل المستخدم.

.c-button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
}

الآن ، بعد إعادة تعيين الخاصية appearance، ألق نظرة على كيفية ظهور الأزرار في متصفحات مختلفة.


تم تعيين خاصية المظهر لهذه الأزرار على لا شيء.

بعد ذلك ، قبل الانتقال إلى النمط ، نحتاج إلى إعادة تعيين بعض الخصائص الأخرى. هذا -border،border-radius،background.

.c-button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  border: 0;
  border-radius: 0;
  background: #ccc;
}


الزر بعد إعادة تعيين الخصائص

الآن بعد أن قمنا بإعادة تعيين أنماط الأزرار القياسية ، فقد حان الوقت للمضي قدمًا. وبالتحديد ، أريد أن أتحدث عن كيفية تصميم الأزرار بناءً على متطلبات تصميمها.

تصفيف الأزرار العادية


لنبدأ بمثال أساسي ، نتحدث عن تصميم الأزرار العادية التي تعرض النص فقط. يوضح الشكل التالي "تشريح" الزر العادي.


لون النص (لون النص) ، حجم الخط (حجم الخط) ، الخلفية (الخلفية) ، الزوايا الدائرية (الاستدارة) ، المسافة البادئة (الحشو)

.c-button {
  appearance: none;
  border: 0;
  border-radius: 5px;
  background: #4676D7;
  color: #fff;
  padding: 8px 16px;
  font-size: 16px;
}

باستخدام رمز CSS أعلاه ، يمكننا الحصول على زر مشابه للزر الموضح في الشكل السابق. بعد تعيين النمط الأساسي للزر ، تحتاج إلى الاهتمام بمظهر الزر في حالات مختلفة.


الحالة الطبيعية للزر (عادي) ، التركيز (التركيز) ، تمرير الماوس فوق الزر (التمرير) ، تعطيل الزر (معطل)

appliedتم تطبيق الأنماط على الأزرار عند تحريك الماوس عليها وعندما يتم التركيز عليها


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

هذه المادة إلى أنه من المهم إضافة الأنماط المطبقة على الزر عند التمرير فوقه ( hover) وعندما يتلقى التركيز ( focus).

عند إضافة نمط hoverقبل النمط focus، تعمل جميع الأنماط بشكل صحيح. تظهر المشكلة عند focusإضافة النمط قبل النمط hover. عند النقر فوق عنصر باستخدام الماوس ، focusلا يظهر النمط نفسه بأي شكل من الأشكال ؛ فقط تمثيل الزر الذي يحدده النمط هو المرئي hover.


حسنًا ، إذا ظهر أولاً نمط التمرير ، ثم نمط التركيز.

فإليك ما يبدو عليه وصف النمط الصحيح:

.c-button:hover {
  background: #1d49aa;
}

.c-button:focus {
  outline: none;
  box-shadow: 0 0 0 4px #cbd6ee;
}

Button عرض الزر الأدنى


لكي يبدو الزر جيدًا ، يجب أن يكون له عرض معين. من المهم أن تفكر في ذلك مسبقًا وأن تأخذ في الاعتبار التسميات الطويلة والقصيرة التي قد تظهر على الأزرار. بسبب الخاصية ، min-widthيمكنك تعيين الحد الأدنى لعرض الزر. هنا مقالتي حيث تتم مناقشة هذه الخاصية وخصائص أخرى مماثلة بالتفصيل.

نلقي نظرة على الشكل التالي. هناك يمكنك رؤية عدة أزرار تحتوي على ملصقات بأطوال مختلفة باللغتين الإنجليزية والعربية. إذا لم تقم بتعيين الحد الأدنى لعرض الزر ، فسيكون الزر ، عندما يكون النقش عليه قصيرًا ، صغيرًا جدًا. من الأفضل عدم السماح بذلك واستخدام الملكية min-width.


يجدر تعيين خاصية زر الحد الأدنى للعرض

.c-button {
    min-width: 100px;
    /*  */
}

▍ مسافة بادئة


قد تبدو الفكرة جذابة حيث لا يتم تعيين مسافة بادئة أفقية للأزرار. بعد كل شيء ، الأزرار لها عرض معين ، مما يعني أنه سيكون هناك مساحة كافية بين حواف الأزرار والنقوش الموجودة عليها. وبالتالي؟ لا ليس هكذا. يمكن أن يكون لتطبيق هذه الفكرة نتائج سلبية في الحالات التي يتغير فيها النقش على الزر.

نلقي نظرة على الشكل التالي.


يوصى بتعيين المسافات البادئة الداخلية للأزرار.

لاحظ أنه إذا لم يتم تعيين المسافات البادئة للزر الداخلي ، فإن النقش الموجود عليه يمكن أن يكون قريبًا جدًا من الحواف. حتى لو كان الزر له خاصيةmin-width. في الجزء السفلي من الصورة ،paddingيتم استخدامكل من الخاصيةوالملكيةmin-width. وهذا يعطي مزيدًا من الثقة في أن الزر سيبدو جيدًا في حالة لا يُعرف فيها طول النقش المعروض عليه مسبقًا.

ontFont تستخدم الأسرة للنقوش الموجودة على الأزرار


عناصر النموذج ، بشكل افتراضي ، لا ترث عائلة الخطوط المعينة لـ <html>أو <body>. من المثير للاهتمام ملاحظة أنني كتبت 70 ٪ من هذه المقالة وأدركت ، أولاً ، أنني لم أغير خط الزر المستخدم لأغراض العرض التوضيحي ، وثانيًا ، لم أكتب أي شيء عنه.

لحل هذه المشكلة ، font-familyيجب تعيين الخاصية إلى inherit.

.c-button {
    font-family: inherit;
    /*   */
}

buttons أزرار تعطيل التصميم


للإشارة إلى أن الزر معطل ، يمكنك إضافة سمة إليه disabledوتصميم الزر باستخدام CSS.

إليك HTML الذي يصف الزر المعطل:

<button disabled></button>

إليك كود CSS لتصميم مثل هذا الزر:

.c-button[disabled] {
    color: #d2d5db;
    background: #6c7589;
    cursor: not-allowed;
}

عندما يتم تعطيل الزر ، لا يمكن الحصول على التركيز من لوحة المفاتيح ويتم إزالته من شجرة إمكانية الوصول لعناصر الصفحة.

view عرض خارجي لمؤشر الماوس عند تحريكه فوق الزر


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

من أجل تجاوز السلوك المعتاد للمؤشر ، يوصى بتغيير سهم المؤشر القياسي إلى مؤشر على شكل يد.


مؤشر سهم قياسي ومؤشر يد محسن.

الآن بعد أن ناقشنا القضايا الأساسية لتصميم الأزرار ، إليك رمز CSS الكامل الذي يتضمن كل ما تطرقنا إليه أعلاه:

.c-button {
  min-width: 100px;
  font-family: inherit;
  appearance: none;
  border: 0;
  border-radius: 5px;
  background: #4676d7;
  color: #fff;
  padding: 8px 16px;
  font-size: 1rem;
  cursor: pointer;
}

.c-button:hover {
  background: #1d49aa;
}

.c-button:focus {
  outline: none;
  box-shadow: 0 0 0 4px #cbd6ee;
}

في الأقسام التالية ، سنتحدث عن أنماط وأنواع الأزرار المختلفة التي يمكنك استخدامها في مشاريعك.

أزرار الرمز


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


أمثلة على

أزرار الرموز في الصورة السابقة ، توجد أزرار الرموز. يعرض الرمز أدناه السمة المضافة إلى الرمزaria-hidden، والتي تسمح لك بإزالتها من شجرة إمكانية الوصول. أضفت أيضًا سمةfocusable="false"لمنع الرمز من التركيز في IE.

يرجى ملاحظة أنني استخدمت النمطvertical-align: middleلمحاذاة الأيقونة ومحتويات الزر عموديا.

إليك رمز HTML للزر المعني:

<button class="c-button">
    <svg aria-hidden="true" focusable="false" width="24" height="24" viewBox="0 0 24 24"><!--    --></svg>
    Add to fav
  </button>

إليك رمز النمط:

.c-button svg {
    display: inline-block;
    vertical-align: middle;
    fill: #fff;
    width: 20px;
    height: 20px;
    margin-right: 0.25rem;
}

ما قمنا بفحصه للتو يمكن أن يعمل حتى نقرر إخفاء نص الزر وجعله الزر الذي يوجد عليه الرمز فقط. كيف افعلها؟ تحتاج أولاً إلى لف النص ، على سبيل المثال ، في عنصر span. ثم يمكنك القيام بمزيد من التحسين في مظهر الزر. هنا وصف HTML للزر:

<button class="c-button c-button--icon">
    <svg aria-hidden="true" focusable="false" width="24" height="24" viewBox="0 0 24 24"><!--    --></svg>
    <span>Add to fav</span>
  </button>

قد يبدو أنه يكفي الآن فقط إخفاء العنصر spanوسيتم تنفيذ المهمة:

.c-button--icon span {
    display: none;
}

على الرغم من هذا النهج ، يختفي النص ويظل الرمز ، إلا أن هذا سيئ جدًا من حيث إمكانية الوصول إلى المحتوى. لم يعد الزر "مرئيًا" لقراء الشاشة. على سبيل المثال ، تفيد ميزة VoiceOver على نظام macOS أن هذا الزر هو ببساطة "زر" ، دون أي تفاصيل عنه. هناك عدة حلول لهذه المشكلة.

consاستخدام أيقونات SVG


أفضل استخدام أيقونات SVG. يوصى بتجميع كل أوصاف SVG للعناصر الرسومية في ملف واحد وتضمين كل رمز في العلامة <svg>باستخدام العنصر <use>. هنا مثال:

<svg class="c-icon" width="32" height="32" viewBox="0 0 20 20">
    <use xlink:href="icons.svg#facebook"></use>
</svg>

إليك رمز رمز SVG ، الذي يتم تخزين وصفه في ملف icons.svgولديه معرف #facebook. يقلل هذا النهج من تكرار التعليمات البرمجية.

زر ▍Size مع رمز


نظرًا لأن نص الزر لم يعد مرئيًا ، وتم تعيين خاصية CSS للزر min-width، فلن يتوافق عرض الزر مع حجم الرمز. من أجل أخذ هذه الميزة في الاعتبار ، من الأفضل تعيين عرض زر الرمز بشكل صريح.


زر يحتوي على مجموعة خصائص CSS ذات العرض الأدنى وزرًا ليس له مجموعة الخصائص هذه

.c-button--icon {
  min-width: initial;
  text-align: center;
  padding: 10px 14px;
}

text نص إخفاء بصري


.sr-onlyيمكن إخفاء عنصر ما ، باستخدام الفئة الشائعة ، بشكل مرئي عن طريق إزالته من الشاشة ، مع تركه في متناول قارئي الشاشة.

إليك كود HTML:

<button class="c-button c-button--icon">
    <svg aria-hidden="true" focusable="false" width="24" height="24" viewBox="0 0 24 24"><!--    --></svg>
    <span class="sr-only">Add to fav</span>
  </button>

هنا الأنماط:

.sr-only {
  border: 0; 
  clip: rect(0 0 0 0); 
  -webkit-clip-path: polygon(0px 0px, 0px 0px, 0px 0px);
  clip-path: polygon(0px 0px, 0px 0px, 0px 0px);
  height: 1px; 
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute;
  width: 1px;
  white-space: nowrap;
}

▍ ضبط حجم الخط على 0


إذا قمت بتعيين الخاصية font-sizeإلى قيمة 0، spanفلن يشغل العنصر أي مساحة شاشة على الإطلاق. أي أنها سوف تكون مخفية.

.c-button--icon span {
    font-size: 0;
}

ولكني هنا أميل إلى حل ينطوي على استخدام فئة .sr-only. من وجهة نظري ، يبدو أكثر منطقية. يبدو لي أن طريقة إخفاء النص عن طريق تعيين حجم الخط على 0 نوع من الاختراق.

▍ استخدام سمة تسمية الأغنية


إذا لم يكن هناك عنصر في الزر <span>، فيجب أن تكون هناك طريقة للاستغناء عنه. إحدى هذه الطرق هي استخدام السمة aria-label. يتم تعيين السمة للعنصر نفسه <button>، أو للعنصر <svg>.

<button class="c-button c-button--icon" aria-label="Add to fav">
    <svg aria-hidden="true" focusable="false" width="24" height="24" viewBox="0 0 24 24"><!--    --></svg>
  </button>

إذا كنت تريد معرفة المزيد عن الأزرار ذات الرموز ، فألق نظرة على هذه المادة.

أزرار تحتوي على أسطر نصية متعددة


في بعض الحالات ، قد يكون من الضروري أن يحتوي الزر على سطرين من النص. يتم عرض مثال لهذا الزر أدناه.


زر يحتوي على سطرين من النص

هنا زر لنموذج اشتراك يحتوي على النص الرئيسي والإضافي. كيفية جعل هذا الزر وفي نفس الوقت لا ننسى إمكانية وصول الأشخاص ذوي الإعاقة إليه؟ إليك HTML ذات الصلة:

<button class="c-button">
    <span>Subscribe to our newsletter</span>
    <span>240K+ subscribers</span>
</button>

سيقوم قارئ الشاشة "بصوت" هذا الزر على أنه "اشترك في نشرتنا الإخبارية 240 ألف مشترك +". عندما يسمع المستخدم هذا ، يمكن أن يربكه ، حيث لا شيء سيفصل بين سطري النص المعروض على الزر. ألق نظرة على لقطة شاشة أداة Chrome لفحص مدى توفر العناصر.


استكشاف مدى توفر العناصر في Chrome

حتى لا نربك المستخدمين ، أفضل إخفاء السطر الثاني من النص من قارئات الشاشة. يمكنك القيام بذلك باستخدام السمةaria-hiddenفي العنصر المقابل<span>:

<button class="c-button">
    <span>Subscribe to our newsletter</span>
    <span aria-hidden="true">240K+ subscribers</span>
</button>

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

.c-button--multiple span:after {
    content: "240K+ subscribers";
    display: block;
    font-weight: 400;
    margin-top: 0.25rem;
}

روابط (<a>) أو أزرار (<button>)؟


متى تستخدم الروابط ومتى - باستخدام الأزرار؟ في البداية ، لنتحدث عن اختلافهما عن بعضهما البعض.

روابط


العلامة <a>هي ارتباط تشعبي يسمح لك بالانتقال إلى صفحة أخرى من موقع الويب أو الانتقال إلى قسم معين من الصفحة التي شاهدها المستخدم. جنبا إلى جنب مع العلامة <a>، يمكنك استخدام الزائفة أربعة: :hover، :focus، :activeو :visited. إذا نظرنا إلى الروابط من وجهة نظر إمكانية الوصول ، فيجب أن نقول أنه يمكنك التفاعل معها باستخدام المفتاح Enterعلى لوحة المفاتيح. يتم التعبير عن الروابط وقراء الشاشة.

uttأزرار


عنصر <button type="button">بمفرده ، بدون ربط كود JavaScript به ، لا يقوم بأي إجراءات. يمكنك استخدام فئات زائفة معها :hover، :focusو :active. إذا تحدثنا عن إمكانية الوصول ، فيمكنك التفاعل مع الزر باستخدام مفاتيح لوحة المفاتيح Enterو . قارئات الشاشة "تقرأ" محتويات الأزرار.

إذا تذكرنا التصميم ، يحدث أن تحتوي صفحة الويب على أزرار من نفس النمط ، تختلف من حيث شفرة HTML المستخدمة لوصفها. مع وضع ذلك في الاعتبار ، .c-buttonيجب كتابة كود CSS لتصميم فئة بحيث يمكن استخدامه لكل من العناصر <button>والعناصر <a>. خذ بعين الاعتبار المثال التالي.


استخدام الروابط والأزرار

لاحظ أن "الأزرار" الموجودة في الصفحة مصممة بنفس الطريقة. ومع ذلك ، فإن الأول منهم هو في الواقع عنصر<a>، والثاني هو عنصر<button>. هذا يعني أن الزر لا يبدو بالضرورة كعنصر في HTML<button>.

هناك نوعان من الإضافات للأسلوب.c-button. هذه هي خصائصtext-decoration: none;وtext-align: center;. بشكل افتراضي ، يتم تمييز خط الروابط ، لذا نريد تغيير ذلك عن طريق تصميم الفئة المستخدمة. بالإضافة إلى ذلك ، من المهم بالنسبة لنا توسيط محتويات الزر في الحالات التي يتم فيها استخدام عنصر HTML بخلاف استخدام الزر لوصف الزر<button>.

.c-button {
    /*   */
    /*     */
    text-decoration: none;
    text-align: center;
}

have ليس من الضروري أن يبدو عنصر <button> كزر


يعجبني هذا المثال ، مع مراعاة متطلبات إمكانية الوصول إلى المحتوى ، يتم تنفيذ لوحة "الأكورديون". في البداية ، بافتراض عدم توفر JavaScript ، تبدو نتيجة عرض الترميز مثل النتيجة أدناه.


مواد الصفحة

عند عدم توفر جافا سكريبت في ما يلي شفرة HTML لجزء من مثل هذا الترميز:

<div class="accordion" data-aria-accordion>
  <h2 data-aria-accordion-heading>Heading of my panel</font></h2>
  <div data-aria-accordion-panel>
    <p>Content goes here</p>
  </div>
</div>

إذا كان JavaScript متاحًا ، فسيصف الترميز أعلاه العناصر التي يمكن طيها وتوسيعها. يتم تحقيق ذلك عن طريق إنشاء زر وإضافته إلى العنصر <h2>.


مواد الصفحة في الظروف التي تكون فيها وظيفة JavaScript متاحة

في هذه الحالة ، يمكننا القول أن استخدام العنصر<button>هو الاختيار الصحيح ، حيث أن الزر يحل مشكلة توسيع وطي كتل النص.

oot زر التشغيل


افترض أن لدينا وثيقة. نحتاج لوصف رابط لتنزيله. ما العنصر الذي يجب استخدامه لحل هذه المشكلة؟ هنا سيأتي رابط لمساعدتنا! إذا قمت بإضافة سمة للرابط download، فسيؤدي النقر عليها إلى بدء تنزيل المواد ذات الصلة.


رابط لتحميل الوثيقة ، مصمم كزر

هنا رمز هذا الرابط:

<a href="rtl-101.pdf" download>Download PDF</a>

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

أزرار السكتة الدماغية



زر عادي عند التمرير فوقه يصبح زرًا بجلطة ،

ويوضح الشكل السابق زرًا يصبح زرًا بجلطة عند التمرير فوقه. ما هي الطريقة الأفضل لتطبيق تغيير مماثل في مظهر الزر؟ بالنسبة للمبتدئين ، يجب أن يتضمن نمط الزر خاصيةborderتستخدم افتراضيًا لونًا شفافًا. من خلال توفير هذه الخاصية ، نتأكد من أن حدود الزر ، عند المرور فوقها ، لا تعيد رسمها.

.c-button {
    border: 2px solid transparent;
    /*   */
}

.c-button:hover {
    background: transparent;
    color: #222;
    border-color: #4676d7;
}

بفضل هذا النهج ، لدينا تحت تصرفنا زرًا يتم عرض حدوده عند تمرير الماوس فوقه. في هذه الحالة ، تصبح خلفية الزر شفافة.

أزرار التدرج


عندما كنت أعمل على مقال عن عناصر تحديد المواقع ، كنت بحاجة إلى زر مع تعبئة متدرجة.

كنت بحاجة إلى شيء مشابه للرقم التالي.


زر التدرج ومتغيره مع حد

هناك خياران للزر - زر التدرج وزر مع حد. من أجل تحقيق هذا المظهر للزر ، كنت بحاجة إلى الزر الأساسي (التدرج) للحصول على حد شفاف. سيتم عرض هذا الحد فقط لزر مع حد.

.c-button {
      display: inline-block;
      color: #fff;
      background: linear-gradient(to bottom, #00acee, #0072e0);
      font-size: 18px;
      font-weight: 500;
      padding: 12px 26px;
      border-radius: 100px;
      /*  ,          */
      border: 3px solid transparent;
      text-decoration: none;
}

.c-button--outline {
  background: transparent;
  color: var(--color-brand-primary);
  border-color: var(--color-brand-primary);
}

يبدو أن كل شيء معقول هنا ، لكنني واجهت مشكلة غريبة أثناء العمل. حتى أنني حاولت حلها عن طريق طلب المساعدة من مستخدمي تويتر. يتم عرض هذه المشكلة في الشكل التالي.


زر عادي وزر مع التدرج (الحدود شفافة بالفعل ؛ يتم عرضها للألوان فقط) ، زر ذو حواف غريبة

الآن بعد أن اكتشفنا كيف يبدو زر التدرج مع حدود شفافة ، دعني أخبرك عن أسباب الشذوذ أعلاه .

يحتوي كل عنصر على خاصيةbackground-originتحدد منطقة تحديد موضع خلفية الشاشة ، والتي يتم تعيينها على القيمة الافتراضيةpadding-box. باستخدام هذا النهج ، يتم تحديد حجم التدرج بحيث يتطابق مع حجم العنصر ، مع مراعاة سمك الحد.

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


الزر ذو الحدود العريضة والتدرج.

لحل هذه المشكلة ، يجب تعيين منطقة تحديد الموقع لصورة الخلفية باستخدام النمطbackground-origin: border-box;، وتغيير القيمة الافتراضيةpadding-boxإلىborder-box:

.c-button {
      /*   */
      background-origin: border-box;
}

الآن ، إذا كنت ترغب في التجربة ، مثال على CodePen.

أيهما أفضل - الارتفاع أم الحشو؟


كل زر له ارتفاع. يمكنك التحكم في ارتفاع الزر إما عن طريق تعيين خصائصه بشكل صريح heightأو عن طريق تعيين خاصية paddingللجانبين العلوي والسفلي من الزر. يرجى ملاحظة أن المشاكل التي سنناقشها أدناه هي بشكل أساسي للعناصر <a>.

height ارتفاع ثابت


لنفترض أن لدينا زرًا على النحو التالي:

.c-button {
    /*   */
    min-width: 120px;
    height: 45px;
}

مع هذا النهج ، لا يتم توسيط النص. يبدو كل ذلك مثل أدناه.


زر ، لا يتم محاذاة نصه في المركز

لإصلاح هذا ومحاذاة النص ، يمكنك إما استخدام الخاصيةpadding، أو - الخاصيةline-height. من خلال تعيينهline-heightعلى قيمة مساوية أو قريبة من ارتفاع الزر ، يمكننا محاذاة النص في المنتصف.

.c-button {
    /*   */
    min-width: 120px;
    height: 45px;
    line-height: 45px;
}

لكن هذه الطريقة لها عيوب:

  • ليس من المضمون أن يتم توسيط نص الزر دائمًا بشكل صحيح. إذا قمت بتغيير الخط ، فقد يتم كسر محاذاة.
  • عند زيادة القيمة المحددة بواسطة الخاصية font-size، يجب تحديد قيمة جديدة للخاصية line-height.
  • line-height قد تعمل الخاصية بشكل مختلف للنصوص المعروضة بلغات مختلفة. هذا صحيح بالنسبة للمواقع متعددة اللغات.
  • إذا كان هناك زر يحتوي على سطرين من النص ، فإن هذه الطريقة غير مناسبة لمحاذاة محتويات الزر.

ent مسافة بادئة عمودية


إذا قمت بتعيين نفس قيم padding-topو خصائص padding-bottom، ثم نتوقع محتويات الزر لأن تتركز. على ما هو عليه؟ في الواقع ، هذا يعتمد على الوضع المحدد.

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


محاولة نص الزر الأوسط

إليك رمز CSS لتصميم هذا الزر:

.c-button {
    /*   */
    min-width: 120px;
    padding: 16px 14px;
}

في هذه الحالة ، يبدو محتوى الزر متحيزًا قليلاً. يجب تقليل قيمة المسافة البادئة العليا بشكل طفيف:

.c-button {
    /*   */
    min-width: 120px;
    padding: 14px 14px 16px 14px; /* ,  , ,   */
}

محتوى زر الالتفاف في علامة <span>


أثناء التجارب ، اكتشفت أن محاذاة نص أزرار Adobe مفلسة قليلاً. هنا هو كيف يبدو.


التوسيط قليلاً ،

فحصت هذه الأزرار ولاحظت نمطًا مثيرًا للاهتمام. يتم لف المحتوى في عنصر<span>يشير إلى ارتفاع ثابت للزر.

<button class="c-button-adobe">
    <span>Save Changes</span>
</button>

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


تغيير ارتفاع الزر وتوسيط محتوياته تلقائيًا

صحيح ، إذا كنا نتحدث عن ارتباط يشبه الزر ، فيجب<span>توسيطالعنصر. من أجل أخذ هذه الميزة في الاعتبار ، يمكن للمرء استخدام طريقة ترتيب العناصرflexbox.

.c-button {
    /*   */
    display: inline-flex; *To keep the button inline, and flex container at the same time*
    align-items: center;
    justify-content: center;
}

هذا كل شئ. أريد أن أشير إلى أن هذه المقالة ساعدتني عند كتابة هذا القسم .

الأزرار داخل حاويات الشبكة المرنة أو الشبكية


هنا قد يكون لديك سؤال حول ما يجب أن تفعله الأزرار مع تخطيطات المرن والشبكة. دعني أوضح هذا السؤال.

عملت في قسم من مشروع واحد. كنت بحاجة إلى توسيط محتوياته عموديًا. لذلك استخدمت التخطيط المرن:

.c-hero {
    display: flex;
    flex-direction: column;
    justify-content: center;
}

ما فعلته كان مفاجئًا بعض الشيء.


نتيجة استخدام التخطيط المرن

بشكل افتراضي ، يتم تمديد كل عنصر مرن ضمن عرض العنصر الأصل. هذا هو بالضبط ما حدث مع الزر الموضح في الشكل السابق. لتجنب هذه المشكلة ، تحتاج إلى تكوين الخاصيةalign-self:

.c-button {
    /*   */
    align-self: flex-start;
}

هذه هي الطريقة التي سيبدو بها الزر بعد ذلك.


يبدو الزر أفضل بكثير.

تحدث مشكلة أخرى شائعة عند وضع الزر في حاوية مرنة ، يتم فيها تعيين الخاصية افتراضيًاflex-direction: row. سيتم تعديل ارتفاع الزر وفقًا لارتفاع العنصر الأصل. لإصلاح هذه المشكلة ، تحتاج إلى استخدامalign-selfخاصيةالزرأو خاصية الحاوية المرنةalign-items.


زر ممتد في الارتفاع

هنا هو CSS:

.c-button {
    align-self: center;
}

من خلال تعيين محاذاة الزر بالنسبة لمركز الحاوية ، نحل المشكلة. هذه هي الطريقة التي سيبدو بها نفس المثال الآن.


حل مشكلة الزر الممتد

باستخدام وحدات em


emيمكن استخدام وحدة القياس لتكوين أحجام الأزرار بشكل صحيح. وحدة القياس هذه مفيدة جدًا في مثل هذه الحالة. الوحدة emتساوي font-sizeالعنصر ( pxأو rem). نلقي نظرة على المثال التالي:

.element {
    font-size: 16px;
    padding: 0.5em;
}

في هذه الحالة ، تكون قيمة الحشو متساوية 16 * 0.5 px.

افترض أن المشروع يستخدم أزرارًا من ثلاثة أحجام: عادية ومتوسطة وكبيرة. عند تحديد القيم padding، width، height، marginوحدات القياس المستخدمة em، يسمح لك بإنشاء زر ، من السهل جدًا تغيير أبعاده. هنا هو كيف يبدو.


أزرار بأحجام مختلفة

ولكن فيما يلي أجزاء من كود CSS تستخدم وحدة القياسem:

.c-button {
  /*   */
  font-size: 1rem;
  min-width: 6.25em;
  border-radius: 0.3125em;
  padding: 0.625em 1em;
}

.c-button svg {
  width: 1.25em;
  height: 1.25em;
  margin-right: 0.25em;
}

للأزرار من أنواع مختلفة ، تحتاج إلى إنشاء فئات تحدد أحجام الخطوط المختلفة:

.c-button--md {
  font-size: 22px;
}

.c-button--lg {
  font-size: 30px;
}

هنا مثال على استخدام أزرار مماثلة في CodePen

إليك مقالتي حول هذا الموضوع. أوصي بأن تقرأه

الرسوم المتحركة والانتقالات


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

ملخص


لقد سررت جدا للعمل على هذه المواد. استغرق الأمر مني أكثر من عام لكتابته. أنا سعيد لأنه تم نشره أخيرا. أتمنى أن تجد شيئًا مفيدًا لك هنا.

القراء الأعزاء! هل تعرف أي طرق مفيدة للعمل مع الأزرار التي تقع خارج نطاق هذه المقالة؟


All Articles