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. 2、flex最后不对齐问题

    https://www.zhangxinxu.com/wordpress/2019/08/css-flex-last-align/

  2. web3 的身份验证之以太坊签名消息

    https://zhuanlan.zhihu.com/p/535573066 python 实现 #coding=utf-8 from web3 import Web3 from eth_accoun ...

  3. springbooot 序列化对象配置

    RbpsemsConfig:    @Bean    @Primary    @ConditionalOnMissingBean(ObjectMapper.class)    public Objec ...

  4. RDD编程练习

    一.filter,map,flatmap练习: 1.读文本文件生成RDD lines 2.将一行一行的文本分割成单词 words 3.全部转换为小写 4.去掉长度小于3的单词 5.去掉停用词 6.练习 ...

  5. java double/float转BigDecimal,精度问题

    double/float 转BigDecimal,会有精度问题.所以需要转String类型,然后再转BigDecimal

  6. nginx 与 k8s ingress 配置转发websocket

    环境 10.1.100.10:70 是后端websocket 服务 需要通过nginx 向后端转发,nginx 配置文件如下 # cat test-ue4.conf map $http_upgrade ...

  7. leetcode刷题(二)

    1.栈 逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分.给定逆波兰表 ...

  8. leecode76. 最小覆盖子串

    76. 最小覆盖子串 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" . 注意: ...

  9. torrent种子

  10. CC1101RGPR学习笔记:工作原理简单入门

    众所周知,在IOT的市场应用中,从通信协议细分的话,有SUB-1G,2.4G,3G, 4G,以及最新推出的5G,虽然5G通信协议已经在崭露头角,但是不同的通信协议在不同的应用领域之中还是占据着一定的重 ...