CSS中的选择( ::selection和user-select)

在网络上,我们出于不同原因选择内容,也许我们想复制文本并在某处引用它。对于移动端来说,选择内容比较难,我不喜欢在移动端选择内容。

在本文中,我将详细介绍CSS中有关选择的所有内容,包括伪类 ::selection user-select。本文的目标是让你了解所有这些技术,并让你知道何时何地使用它们。

根据Mozilla开发人员网络(MDN):

::selection CSS伪元素将样式应用于用户已突出显示的文档部分(例如,在文本上单击并拖动鼠标)。

要使用 ::selection 伪类,只需执行以下操作:

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

::selection支持的属性

值得注意的是 ::selection 仅支持 color,background text-shadow 属性。

自定义选择

如果我们想要自定义选择效果怎么办?例如,控制选择的高度并具有自定义背景?见下图:

这是可能的,但有点棘手。下面是如何做到这一点的解释:

  1. 我们添加具有相同文本内容的伪元素。然后,我们给它一个50%的高度,并带有白色背景色。
  2. 伪元素位于原始文本上方。

现在,选择文本后,伪元素将垂直覆盖文本的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%,并且不重复背景。

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;
}

请参见下图,以获得直观的说明。

希望现在更加清楚!请参阅CodePen上的demo。

Demo:https://codepen.io/shadeed/pen/5074964e902cd83d96e5ce7ba9ee1423?editors=1100

动画选择

在进行上一个演示时,我问自己一个问题:是否可以对选择进行动画处理?例如,当选择文本并且鼠标没有悬停时,高度为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);
}

此解决方案有效,但不适用于所有文本。例如,下面的文本包含一个逗号,数字,大写字母。请注意,选择在所有单词中都不一致。

我想说的是,采用多行选择风格是很棘手的,因此不应在网站上全局使用。如果仅将其用于一个段落,也许完全没问题。

Demo:https://codepen.io/shadeed/pen/c6d187eadc8251fcce7a8f85506a9ee3?editors=1100

通过 ::selection 和 text-shadow 获得创意

由于 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;
}

轮廓文字选择

根据本文有关CSS技巧的文章,我们可以使用 text-shadow 模拟文本轮廓。

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

模糊选择

另一个有趣的效果是使所选文字模糊。通过使颜色 transparent,文本阴影将仍然存在并且模仿模糊效果。

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

而且,我敢肯定,你可以拿出越来越多的例子。

文本阴影和性能

建议不要使用沉重的文本阴影样式,因为它们会导致性能问题。如下示例

霓虹灯效果非常沉重。请注意,在选择文本时,在我选择的时间和所选样式出现的时间之间存在一个延迟。另外,请注意顶部和左侧的故障。请小心使用 text-shadow

 
转发

@杭州程序员小张

CSS中的选择( ::selection和user-select)

0/2000字

 

CSS中的选择( ::selection和user-select)的更多相关文章

  1. CSS中的选择器之html选择器和伪类选择器

    1.html选择器(标签选择器) 基本语法: html标签名称{ 属性名:属性值; 属性名:属性值; } 继续在上面的代码中做修改,实例代码: <!DOCTYPE html> <ht ...

  2. CSS中如何选择ul下li的奇数、偶数行

    <style> #Ulist li:nth-of-type(odd){ margin-left: 20px;}奇数行 #Ulist li:nth-of-type(even){margin- ...

  3. Eclipse插件开发中的选择监听机制(Selection Provider-Listener)

    Eclipse插件开发中的选择监听机制(Selection Provider-Listener) 监听机制是eclipse插件开发或rcp应用开发中经常使用的技术,比方点击TableViewer或Tr ...

  4. css中一些常用技巧

    // css中引入字体文件 @font-face { font-family: msyh; /*这里是说明调用来的字体名字*/ src: url('../font/wryh.ttf'); /*这里是字 ...

  5. 关于css中伪类及伪元素的总结

    css中的伪类和伪元素总是混淆,今天参考了很多资料,也查看了部分文档,现将伪类及伪元素总结如下: 一.由来: 伪类和伪元素的引入都是因为在文档树里有些信息无法被充分描述,比如CSS没有"段落 ...

  6. CSS中的一些内容总结

    一.选择器 1.选择器的分组:一个Style可以对多个选择器生效,只用在不同的选择器中间加入逗号即可.如: h1,h2,h3,h4,h5,h6 { color: green; } PS:CSS规定,所 ...

  7. 纯html+css中实现静态选座位效果技巧(input+label使用小技巧)

    很多时候,我们想通过html+css的方式实现排列在后方的代码在选中状态下,能控制排列在前的代码的样式.那么要怎么实现呢?在这里我就要用1个小技巧来完成. 众所周知的,我们css中的选择器通常只能向下 ...

  8. css3笔记系列-3.css中的各种选择器详解,不看后悔系列

    点击上方蓝色字体,关注我 最详细的css3选择器解析 ​ 选择器是什么? 比较官方的解释:在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素. 最常见的 CSS 选择器是元素选择器.换句话说 ...

  9. CSS中一些常见的兼容性问题

    CSS中一些兼容性问题就是浏览器兼容,而这些浏览器兼容问题主要是Ie和FF之间的争斗. CSS hack中的一些事: 我们为了让页面形成统一的效果,要针对不同的浏览器或不同版本写出对应可解析的CSS样 ...

  10. css中“~”和“>”是什么意思?

    css中"~"是: 为所有相同的父元素中位于 p 元素之后的所有 ul 元素设置背景: p~ul{ background:#ff0000; }    <p>快乐生活&l ...

随机推荐

  1. 一些关于STL的笔记

    c++ std中set与unordered_set区别及map与unordered_map区别: map/set基于红黑树实现,红黑树具有自动排序的功能,因此map/set内部所有的数据,在任何时候, ...

  2. 使用 FPM 将源码包转化为rpm包(技巧)

                    使用 FPM  将源码包转化为rpm包 1.支持的源类型包 dir: 将目录打包成所需要的类型,可以用于源码编译安装的软件包 rpm: 对rpm进行转换 gem: 对r ...

  3. 银河麒麟V10在线安装Postgresql步骤

    参考资料https://blog.csdn.net/u010430471/article/details/81663248 https://blog.csdn.net/qq_41619524/arti ...

  4. cuda+pytorch环境安装

    本机cuda版本为v11.5 conda install cudatoolkit 使用 CUDA 11.3版本的配置 conda install pytorch==1.11.0 torchvision ...

  5. fabric学习笔记11

    fabric学习笔记10 20201303张奕博 2023.1.23 测试实践2 导入链码依赖包 package main import ( "github.com/hyperledger/ ...

  6. think php3 中接入protobuf(一)

    protobuf,网上一大堆解释,说白了,就是跟json,xml一样的通讯协议,相比json,xml具有体积小,解析速度快的优点,我实在本地的电脑上实现的,后续会有相应的项目使用到,所以先在本地实现, ...

  7. C++ MFC学习 (三)

    视窗口覆盖在框架窗口之上 如果有了 OnDraw 不要再用OnPaint  OnPaint会覆盖掉OnDraw所画内容 1 // MFC_Demo1View.cpp : CMFC_Demo1View ...

  8. 基于VS码代码时出现访问错误的个人理解

    日常在VS写代码中,有时候我们将写好的代码调试出来会出现有未经处理的异常,在0x00000000XXXX处有未经处理的异常,写入位置0xFFFFFFFFFFFFXX时发生访问冲突. 类似于图中情况,遇 ...

  9. Tomcat配置中的java.lang.IllegalStateException: No output folder问题

    最近运行Tomcat7.0时总会报错:Tomcat安装文件夹下的某个文件拒绝访问. localhost:8080 java.lang.IllegalStateException: No output ...

  10. 对象可能是类数组对象 不具备数组的原型内的方法 所以可以用call或者apply把this指向改成数组或对象原型

    const arr = [] 2Object.prototype.toString.call(arr) === '[object Array]' // true 3 4 const obj = {} ...