تم تشكيل مهارة إبراز النص والكائنات الأخرى بين مستخدمي الكمبيوتر منذ سنوات عديدة. نسلط الضوء على محتوى صفحات الويب لأسباب مختلفة. ربما تحتاج إلى نسخ النص والاقتباس منه في مكان ما ، ربما - من السهل على شخص ما قراءة النص ، مع تسليط الضوء على شظاياه. على الأجهزة المحمولة ، مع ذلك ، تسليط الضوء على شيء أكثر صعوبة. على سبيل المثال ، يزعجني. لا أحب تسليط الضوء على محتويات صفحات الويب على الهاتف. يبدو أن هذه العملية "خاطئة" بطريقة أو بأخرى. في هذه المقالة سأتحدث عن كل ما تحتاج لمعرفته حول اختيارات التصميم مع CSS. على وجه الخصوص ، سنتحدث عن العنصر الزائف والممتلكات
::selection
user-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. قد تكون مهتمًا بالنظر إلى هذه المواد.القراء الأعزاء! كيف تقوم بإعداد اختيار النص في مشاريعك؟