الاختيار و CSS

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



::selectionuser-select. تهدف هذه المقالة إلى إظهار كل من يريد أن تعمل CSS مع التحديدات ، وكيفية استخدام طرق مختلفة للعمل مع التحديدات.

أساسيات


على MDN ، يمكنك معرفة أن عنصر زائف ::selectionيسمح لك بتطبيق الأنماط على أجزاء من المستند التي تم تحديدها من قبل المستخدم (على سبيل المثال ، باستخدام الماوس).

لاستخدامها ::selectionيكفي استخدام البناء التالي:

p::selection {
   color: #fff;
   background-color: #000
}



النص المحدد. فيما

يلي مثال يمكنك تجربته.

الخصائص المدعومة :: الاختيار


تجدر الإشارة إلى أن العنصر الزائف ::selectionلا يدعم سوى الخصائص color، backgroundو text-shadow.

تخصيص تأثيرات التحديد الخاصة بك


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


مثال على تحديد خاص للاختيار

هذا ممكن ، على الرغم من أنه يتطلب بعض الجهد. إليك كيفية إجراء التحديد الموضح أعلاه:

  • تمت إضافة عنصر زائف ، بنفس النص الذي نختاره. ثم يتم تعيين العنصر الزائف إلى خاصية height: 50%ولون خلفية بيضاء.
  • يقع العنصر الزائف فوق النص المصدر.

إذا حددت النص الآن ، فعندئذٍ سيتداخل العنصر الزائف 50٪ من النص عموديًا. هذا يسمح لنا بمحاكاة التأثير الذي نحتاجه.

p {
  position: relative;
  color: #fff;
}

p:after {
  content: attr(data-content);
  position: absolute;
  color: #000;
  top: 0;
  left: 0;
  width: 100%;
  height: 50%;
  background-color: #fff;
}

p::selection {
  background: rgba(76, 125, 225, 0.18);
}

تعلمت عن هذه التقنية هنا .

يتم عرض خيار آخر لهذا التحديد أدناه. هنا ، بدلاً من التحديد القوي ، قمت بتطبيق التحديد كتدرج CSS. النقطة هنا هي استخدام تدرج أبيض بارتفاع 50٪ وملء العنصر مرة واحدة بصورة الخلفية باستخدام القيمة no-repeatعند تعيين الخاصية background.

h1:after {
  content: attr(data-content);
  position: absolute;
  color: #000;
  top: 0;
  left: 0;
  width: 100%;
  background: linear-gradient(#fff, #fff) top/100% 50% no-repeat;
}

يوضح الشكل التالي هذه التقنية.


تطبيق إبراز التدرج

نأمل أن أكون قد تمكنت من شرح هذه الفكرة بوضوح. هنا مثال عملي.

التحديد المتحرك


سألت عن المثال السابق السؤال التالي: "هل من الواقعي تحريك التحديد؟". على سبيل المثال ، في عملية تحديد النص ، يكون ارتفاع التحديد 50٪. وعندما يتم تحريك مؤشر الماوس إلى الجانب ، يزيد ارتفاع التحديد إلى 80٪. كيف افعلها؟ ولكن مثل هذا:

p {
    transition: background 0.3s ease-out;
}

p:hover:after {
  background-size: 100% 80%;
}



النص في عملية الاختيار


النص بعد اكتمال التحديد

إليك مقطع فيديو يوضح التحديد المتحرك.

نص متعدد الخطوط


للأسف ، تقنية ضبط التحديد المذكورة أعلاه ليست مناسبة للنص متعدد الأسطر. ومع ذلك ، من أجل تنفيذ شيء مشابه لمثل هذا النص ، تحتاج إلى اللجوء إلى إمكانيات JavaScript ووضع كل كلمة في عنصر (صغير) مضمّن ، على سبيل المثال ، في <span>. بعد ظهور كل كلمة في العنصر الخاص بها <span>، يجب إضافة عنصر زائف إلى كل عنصر من هذه العناصر. وبعد ذلك ، يمكن تطبيق التأثير الموصوف أعلاه على نص متعدد الخطوط.

في ما يلي نص برمجي لوضع كل كلمة في <span>حاوية:

let paragraph = document.querySelector(".text");
const words = paragraph.textContent.split(" ");

paragraph.innerHTML = "";

words.forEach(function (word) {
  let wordItem = document.createElement("span");
  wordItem.setAttribute("data-word", word);
  wordItem.innerHTML = word + " ";
  paragraph.appendChild(wordItem);
});

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

span {
    position: relative;
    font-size: 1.25rem;
    line-height: 1.4;
  }

  span::after {
    content: attr(data-word);
    position: absolute;
    left: 0;
    right: 0;
    top: -0.28em;
    height: 75%;
    padding-top: 0.14em;
    background: #fff;
    pointer-events: none;
  }

  span::selection {
    background: rgba(#4C7DE1, 0.18);
  }

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


اختيار غير متجانس

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

هنا ، مع هذا التحديد ، يمكنك التجربة.

الاستخدام الإبداعي :: التحديد وظل النص


نظرًا لأن إحدى الخصائص التي يدعمها العنصر الزائف ::selectionهي text-shadowأنه يمكننا محاولة تحقيق بعض التأثيرات المثيرة للاهتمام باستخدام العديد من ظلال النص. نحن نستكشف الاحتمالات التي تفتحها هذه الفكرة أمامنا.

▍ تسليط الضوء على الظلال الطويلة



يلقي النص المحدد بظلال طويلة.

وإليك كيفية تنفيذ هذا التأثير:

p::selection {
    color: #444444;
    background: #ffffff;
    text-shadow: 1px 0px 1px #cccccc, 0px 1px 1px #eeeeee, 2px 1px 1px #cccccc, 1px 2px 1px #eeeeee, 3px 2px 1px #cccccc, 2px 3px 1px #eeeeee, 4px 3px 1px #cccccc, 3px 4px 1px #eeeeee, 5px 4px 1px #cccccc, 4px 5px 1px #eeeeee, 6px 5px 1px #cccccc, 5px 6px 1px #eeeeee, 7px 6px 1px #cccccc;
}

effect تأثير النص المخطط التفصيلي



يصبح النص المحدد كفافًا

هذه الفكرة التي وجدتها في هذه المقالة. نحن نتحدث عن حقيقة أنه باستخدام الخاصيةtext-shadowيمكنك محاكاة تأثير نص المخطط التفصيلي.

p::selection {
    color: #fff;
    text-shadow
        -1px -1px 0 #000,  
        1px -1px 0 #000,
        -1px 1px 0 #000,
        1px 1px 0 #000;
}

effect تأثير طمس



يبدو النص المحدد ضبابيًا.

هناك تأثير آخر مثير للاهتمام يمكن تطبيقه على النص المحدد وهو تمويه النص. خلاصة القول هي استخدام الخاصية عند تعيين لون النصcolor: transparent. text-shadowلن تختفيالظلال بمساعدة فيأي مكان ، مما سيعطي التأثير المطلوب.

p::selection {
  color: transparent;
  text-shadow: 0 0 3px #fff;
}

أنا متأكد من أنك ستتمكنين بنفسك من طرح المزيد من الأمثلة على text-shadowاختيارات التصميم. هذا العقار يمنحنا إمكانيات غير محدودة.

textsتظليل النصوص والأداء


لا يوصى باستخدام أنماط معقدة للغاية عند التخصيص text-shadow. والحقيقة هي أن الحماس المفرط لهذه الخاصية يؤدي إلى مشاكل في الأداء. في ما يلي مقطع فيديو يعرض مثالًا واحدًا لهذه المشكلات.


استخدام أنماط معقدة للغاية لتخصيص اختيار النص

تأثير النيون المعروض هنا معقد للغاية. يرجى ملاحظة أنه عند تحديد هذا النص ، يكون هناك تأخير ملحوظ بين لحظة تحديد النص ولحظة تطبيق النمط. بالإضافة إلى ذلك ، انتبه إلى حقيقة أن ما لا يجب أن يظهر في الأعلى واليسار. لذلك ، أطلب منك استخدامهtext-shadowبعناية.

هل تبرز عناصر النموذج؟


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


تم تمييز المحتوى الموجود داخل حقول الإدخال.

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

هنا مثال.

التحقيق في خاصية تحديد المستخدم


user-selectتسمح لنا الخاصية بتعيين القدرة على تحديد نص معين من قبل المستخدم. قد تكون هذه الخاصية مفيدة لتعطيل القدرة على تحديد النص ، مما قد يكون مفيدًا للحد من قدرة المستخدم على تحديد المواد الموجودة بجانب بعضها البعض. هنا معيار يصف user-select.

هذا العقار يمكن أن تأخذ القيم التالية: none, auto, text, contain, all.

حالات الاستخدام التي يحددها المستخدم


ext النص والرمز


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


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

إليك رمز هذا الزر:

<button>Our Services<span aria-hidden="true">▼</span></button>

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


زر مخصص

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

button span[aria-hidden="true"] {
    user-select: none;
}

هذا يسمح لك بمنع اختيار الأيقونة. وفي الوقت نفسه ، نربط حظر التحديد بالسمة aria-hidden. ونتيجة لذلك ، فإن كل ما لا يجب أن يبرز ، على الأرجح ، لا يجب أن يكون مرئيًا لقراء الشاشة.

▍ أعلام


يزعجني هذا السلوك من العلامات عندما أقوم بتحديد نص وصفه عن طريق تعيين أو إلغاء تحديد العلم. هنا هو كيف يبدو.


يتم تحديد نص وصف العلم بشكل عشوائي. يمكنك

حل هذه المشكلة عن طريق تصميم العنصر على<label>النحو التالي:

label {
    user-select: none;
}

▍ قم بتمييز كل النص


تتيح لك القيمة allالتي يمكن أن يأخذها العقار user-selectتحقيق تأثير مثير للاهتمام. إذا كان العنصر الأصلي يحتوي على هذه الخاصية بهذه القيمة ، فيمكن تحديد كل النص الموجود في هذا العنصر بنقرة واحدة. يمكن أن يكون هذا مفيدًا للعمل مع محتوى النص ، والذي يجب إبرازه بالكامل. على سبيل المثال ، لتمييز أجزاء التعليمات البرمجية المتوفرة على الصفحة:

.embed-code {
    user-select: all;
}

يمكن تحديد جزء من النص المصمم بهذا النمط بنقرة واحدة عليه.

تطبيقات الويب


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

تأمل بعض الأمثلة من الحياة.

▍سود


في Slack ، يمكنك تمييز الملصقات وحقول الإدخال. ومع ذلك ، لا يتم تمييز نصوص الأزرار.


لم يتم تمييز التسميات التوضيحية للأزرار.

إليك مثال آخر.


تم تمييز التوقيع في شريط العنوان للنافذة المشروطة

. لا يمكن تحديد تاريخ المحادثة.


لا يمكن تخصيص التاريخ

بشكل عام - يبدو لي غريبًا أنه في التطبيق يمكنك تحديد بعض النصوص التي ، على ما يبدو ، لا يجب أن تدعم التحديد. هناك أماكن في واجهة Slack حيث يتم استخدامهاuser-select: none، ولكن هناك عدد أقل من هذه الأماكن مما قد تتوقعه. على سبيل المثال ، بالنسبة لي ، كمستخدم ، لا فائدة من تمييز عنوان نافذة مشروطة.

ot ملاحظة


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


ما لا يجب أن يبرز لا يبرز.

لا يتم تمييز جزء واحد من النص من هذه الصورة. هذا هو بالضبط ما يمكن أن تتوقعه من تطبيق.

لا تستخدم تعطيل التحديد العام


لا يوصى بتعطيل التحديد على مستوى العالم. عند استخدام تعطيل التحديد ، حاول تعطيله فقط للعناصر التي لا معنى لها. للقيام بذلك ، يمكنك إنشاء فئة مساعدة. على سبيل المثال - هذا:

.disable-selection {
    -webkit-user-select:text;
    -moz-user-select:text;
    -ms-user-select:text;
    user-select:text;
}

نمط سيء


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


تعطيل إبراز مع عرض الإعلام من

فضلك لا تفعل ذلك.

قم بالتمييز على الأجهزة المحمولة


هناك خاصية -webkit-touch-calloutلـ iOS Safari يجب أن تقوم بإيقاف عرض تلميح الأدوات القياسي المعروض عند تحديد النص. حاولت استخدام هذه الخاصية ، لكنها لا تعمل.

p {
    -webkit-touch-callout: none;
}

الأنماط ::selectionلا تعمل أيضًا. ويعمل

العقار user-select: noneكما هو متوقع.

حاولت أن أجد مثالا حقيقيا يوضح هذه المشكلة. قمت بنسخ جزء من النص من ويكيبيديا. في الوقت نفسه ، تم نسخ النص غير الضروري تمامًا بالنسبة لي (listen). هذا مزعج.


إلى جانب النص المفيد ، يتم نسخه و (الاستماع)

بدلاً من السماح للمستخدم بنسخ هذا "الاستماع" ، سيكون من الأفضل إضافة نمط إلى هذا العنصرuser-select: none. ونتيجة لذلك ، عند نسخ نص يحتوي على هذا العنصر ، لن يتم نسخه.

ملخص


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

القراء الأعزاء! كيف تقوم بإعداد اختيار النص في مشاريعك؟


All Articles