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. PostgreSQL的10进制与16进制互转

    1.10进制转16进制Postgres里面有一个内置的10进制转16进制的函数:to_hex(int)/to_hex(bigint) [postgres@localhost ~]$ psql Pass ...

  2. .NET静态代码织入——肉夹馍(Rougamo) 发布1.4.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo)通过静态代码织入方式实现AOP的组件,其主要特点是在编译时完成AOP代码织入,相比动态代理可以减少应 ...

  3. 红米note9 刷开机第一屏logo

    参考:https://romprovider.com/change-boot-logo-redmi-9-prime/ 工具:https://sites.google.com/site/kadanuti ...

  4. fabric学习笔记7

    Fabric2.0Java SDK实践-合约交易 20201303张奕博 2023.1.18 1.创建基础工程 新建一个Maven工程,添加以下依赖 <dependency> <gr ...

  5. Intellij IDEA远程debug

    1.服务器开启远程调试模式,增加JVM启动参数,以支持远程调试 服务器端的tomcat/bin/catalina.sh文件,在第一行添加参数配置如下(要确保下面的端口没有被占用).CATALINA_O ...

  6. c++ class派生与多态

    目录 类继承和类派生 继承时名字遮蔽 基类和派生类的构造函数 构造函数调用顺序 基类和派生类的析构函数 多重继承 虚继承和虚基类 将派生类赋值给基类(向上转型) 将派生类指针赋值给基类指针. 将派生类 ...

  7. Filters in ASP.NET Core(Net6之过滤器)

    Filters in ASP.NET Core 如果觉得样式不好:跳转即可 (md文件复制过来有些样式会不一样) 原文地址:https://lifengying.site/archives/net6% ...

  8. IIS 安装AspNetCoreModule托管模块

    IIS安装AspNetCoreModule托管模块 进入下载地址,选在对应的版本搜索 ASP.NET Core Module 下载x32或x64即可 下载地址: https://dotnet.micr ...

  9. Linux系统Shell脚本第三章:for、while循环及脚本实操

    目录 一.echo命令 二.查看当前系统的时间-date命令 三.for循环语句 四.while循环语句结构(迭代) 五.until 循环语句结构 六.continue和break 一.echo命令 ...

  10. 关于sqlsugar二级缓存

    二级缓存 1.优点 (1).维护方便:SqlSugar的 二级缓存 支持单表和多表的 CRUD 自动缓存更新 ,减少了复杂的缓存KEY维护操作 (2).使用方便:可以直接在Queryable.With ...