Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >探索在网页中使用“标注”

探索在网页中使用“标注”

作者头像
winty
发布于 2020-09-14 07:37:07
发布于 2020-09-14 07:37:07
58500
代码可运行
举报
文章被收录于专栏:前端Q前端Q
运行总次数:0
代码可运行
本文为作者行舟客投稿,点击阅读原文可到达github地址~

github地址:https://github.com/1314mxc/yunUI ,欢迎star!

说起“标注”,在HTML5之前,你可能想起的是各种浏览器插件,emmmmmmm或者说你根本不认为浏览器上可以有这种玩意。

但是HTML5来了,这是它的时代。

我们完全可以不借助CSS、JavaScript的力量实现这个东西 —— 因为浏览器实现了 <ruby></ruby> 这个神奇的标签:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ruby>
 <rb>中文</rb>
 <rp>(</rp><rt>zhongwen</rt><rp>)</rp>
</ruby>

它是这样表现的:

据说在不支持ruby的浏览器中也能这样适应:

除此之外,随着前端的发展,CSS3也给我们带来了“惊喜” —— 文字强调装饰 text-emphasistext-emphasis家族总共有4个CSS属性,分别是:

  1. text-emphasis
  2. text-emphasis-color
  3. text-emphasis-style
  4. text-emphasis-position

其中,text-emphasistext-emphasis-colortext-emphasis-style这两个CSS属性的缩写,注意,并不包含text-emphasis-position属性,text-emphasis-position属性是独立的!text-emphasis-position属性用来指定强调装饰符的位置,默认位置是在正文的上方,我们可以指定强调装饰符在正文的下方,也可以指定垂直排版的时候强调装饰符是左侧还是右侧。语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
text-emphasis-position: [ over | under ] && [ right | left ]

使用示意:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
text-emphasis-position: over left;
text-emphasis-position: under right;
text-emphasis-position: under left;

text-emphasis-position: left over;
text-emphasis-position: right under;
text-emphasis-position: left under;
// text-emphasis-position的初始值是over right。right定位出现在文字垂直排版的时候,例如设置writing-mode:vertical-rl,此时就可以看到强调装饰符在右侧了

比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p id="p">aishfaoihfoiahfoahdfoiahfdoshoigsoidshioshghudsihfisjhiodshoishoighdihishoighsoiv</p>

//css
color: red;
-webkit-text-emphasis-style: '·';
text-emphasis-style: '·';
-webkit-text-emphasis-color: red;
text-emphasis-color:red;
-webkit-text-emphasis-position:under;
text-emphasis-position: under;

它是这样表现的:

稍稍有些小遗憾的是:它不能“针对每个字体设置不同的重点标志”,所以常常只用来做辅助突出功能

★笔者一直认同的是:能用HTML完成的就不用CSS,能用CSS的就不用JS。并在日常实践中愈发觉得这是一条“至理”! ”


那么问题来了,现在我想实现这样一个功能:现在的「网页翻译」大多是“页面整体翻译”或者“弹框拖入”,少部分是“选中文字后在文字旁弹出一个提示框”,但是这几种方式不管是哪一种都会有一丝丝的影响:比如遮挡页面其余内容、精确度不高等等。那能不能“当用户选中文字后在选中文本下方有突出强调、在文本上方出现翻译”呢?

(这个笔者在本文先不说,以免造成“长篇大论”,本文只把实现的基础知识全盘托出!)

首先是HTML:这里我们简单的做一个p标签:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p id="p">aishfaoihfoiahfoahdfoiahfdoshoigsoidshioshghudsihfisjhiodshoishoighdihishoighsoiv</p>

笔者的思路是:当用户鼠标“抬起”时,去判断有没有选中文本,如果没有则啥事没有、反之则要将这一部分选中的文本替换成标签!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p.onmouseup=function(e){
    var txt = window.getSelection();
 console.log(txt)
 var selectStr = txt.toString();
 console.log(selectStr)
 if(selectStr!==''){
  replaceSelectedStrByEle(txt,selectStr,'nite-writer-pen')
 }
}

这里 window.getSelection() 是浏览器API,专门用于获取用户选中的文本,其具体值用 .toString() 即可获得。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
  * 用元素替换被选中的文本
  */
var replaceSelectedStrByEle = function(selecter,selectStr,className){
  if (selectStr.trim != "") {
    var rang = selecter.getRangeAt(0);
 var ele = document.createElement("span");
 ele.style.cssText="-webkit-text-emphasis-style: '·';text-emphasis-style: '·';text-emphasis-color:red;-webkit-text-emphasis-position:under;text-emphasis-position:under";
    ele.className = className;
    ele.textContent = selectStr;
    rang.surroundContents(ele);
  }
}

selecter.getRangeAt(0):selection API是将每次选中的都保存到内部的数组里,而且是最新的保存到第一个这样的顺序。没错这里就是用的 -webkit-text-emphasis 突出强调符 —— 如果要为某个元素一次添加多个样式,cssText可以优化性能!

★受笔者“信奉”准则的影响,其实在这里一开始还想用纯CSS的 伪类::selection 去做突出强调,但是很不幸的是:这个伪类里面只能改变选中文字的颜色相关:如背景颜色、字体本身颜色。其他的什么都改变不了(不知道为啥,感觉很奇怪:虽说它是子选择器行为,但是其影响应该是和display之流是一样的,并不会产生太大的变动)。诸君请看:

selection

(如上图)至此,选中状态已经差不多了 —— 至于没说的翻译,这里如果你没有足够的能力建一个“词库”,那么我还是建议你启用“第三方库/插件”或者在线翻译API。这里还有一个问题是:在笔者实践过程中发现,ruby标签是没有办法嵌套在行内元素中的:它会带着其内包裹的文字消失不见 !这一点一定注意。

好了,你总不能让用户一直处于这个状态吧。那就要在一定情况下取消上面的状态 —— 这里笔者也遇到了一些“奇葩”问题:

  1. 什么时候结束选中状态?我建议,在点击页面其余空白地方时改变状态 —— 因为为了更好的体验,上面选中使用的mouseup:这里涉及到一个“浏览器事件触发的优先级”。你可以让文本处于“高zIndex区域”、或者用JS去隔离。
  2. 怎么取消?对这个才是大问题:你这里可能“理所应当的”想到了“把元素的标签去掉不就完了”,这里你可以尝试一下,可不是一件简单的事。一开始笔者想到了 将dom再转化回string,但是随即想到了这个string怎么插入到父p标签中,而且要插入到原位置!

辗转了一上午,想到了一个“取巧的方法”:因为选中的文本已经是一个dom了,将选中的文本都转化为string,然后再用字符串替换替换掉父p标签的innerText内容的相同之处!~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 将dom转化为文本
*/
function nodeToString ( node ) {  
 //createElement()返回一个Element对象
 var tmpNode = document.createElement( "div" ); 
 //appendChild()  参数Node对象   返回Node对象  Element方法
 //cloneNode()  参数布尔类型  返回Node对象   Element方法
 tmpNode.appendChild( node.cloneNode( true ) );  
 var str = tmpNode.innerHTML;  
 tmpNode = node = null;
 return str;  
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mxc.onclick=function(){
 if(document.querySelector('p .nite-writer-pen')){
  let p=document.querySelector('p .nite-writer-pen').parentNode
  let nite=document.querySelector('p .nite-writer-pen')
  console.log(nite)
  console.log(p)
  p.innerText=(p.innerHTML).replace(nodeToString(nite),nite.innerText)
 }
}

display


笔者开源了微信小程序日期组件扩展:可自定义精确到分、秒;可自定义位置、颜色、是否用默认样式。地址:https://github.com/1314mxc/yunUI 欢迎star!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端Q 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CSS3着重符及其fallback
在中文里面,我们一般会在文字下方加上圆形符号。在日语中会在文字上方加上小顿号。在CSS3中如下属性可以控制着重符号:
mmzhou
2018/08/06
1.8K0
CSS3着重符及其fallback
18个很有用的 CSS 技巧
shape-outside 是一个允许设置形状的 CSS 属性。它还有助于定义文本流动的区域:
@超人
2023/05/12
5970
18个很有用的 CSS 技巧
2020年你不应该错过的CSS新特性
@argyleink在第四次的伦敦(LondonCSS 2020)CSS活动中分享了一个有关于CSS特性相关的话题。看了一下这个主题的PPT,里面有些新东西还是蛮有意思的。基于该PPT,我稍微整理近24个CSS方面的新特性,感兴趣的同学可以继续往下阅读。
童欧巴
2020/11/02
1.2K0
2020年你不应该错过的CSS新特性
我可能学到了“假”的CSS:伪类伪元素
==在*-child系列伪类中,索引是相对于所有同级兄弟元素计算的,而非特定类型==
江米小枣
2020/06/15
1.5K0
妙用 background 实现花式文字效果
Hello 大家好,我是 Coco。本文将讲解如何利用 background 系列属性,巧妙的实现一些花式的文字效果。通过本文,你将可以学到:
ConardLi
2021/09/29
6190
妙用 background 实现花式文字效果
适合收藏,一些CSS优化技巧!
当各种框架以及复杂的 JS 知识开始充斥着我们的工作环境时。谁还能够记得,以 CSS 来构建更加良好的用户体验,也是前端的一个重要组成部分。 所以说,今天咱们就来看看 css 的优化方案-终极合集。一共一百条,有点多,适合收藏
老K博客
2024/03/10
4000
前端之BOM和DOM
BOM(Browser Object Model)浏览器对象模型,它使得JS能够与浏览器进行‘对话’(交互,通过JS对页面内容进行操作)。
GH
2019/12/16
2.8K0
前端之BOM和DOM
你这磨人的小妖精——选中文本并标注的实现过程
但是现在问题来了,我们这是一个现成的react页面,是一个详情页,页面的内容是多个接口返回填进去的:
lhyt
2020/07/21
2K0
useTextSelection vue 文本选择hook
文本选择 vx-hookhttps://www.npmjs.com/package/vx-hook vue 3.0 hook 库 getSelection 文本选择 Uesage <template> <div id="app"> {{ state }} <div ref='ele'> 测试文本 </div> </div> </template> <script> import { useTextSelection } from 'vx-hook'
copy_left
2020/05/09
7910
JavaScript基础②
console.log(item)//点哪里,item的值就是你点击对应的currentvalue console.log(index)//点哪里,index的值就是你点击对应的索引
ymktchic
2022/01/18
1.1K0
JavaScript基础②
emmet(Zen coding)前端写代码神器
emmet前身zen coding。支持sublime Text。 基本上,大多数文本编辑器有允许你存储和再利用常用的代码块,称为“片段”。而片段是提高生产率的一个好方法,所有的实现都是常见的陷阱:你需要定义段第一,你不能在运行时扩展。 埃米特以片段的想法到一个新的水平:你可以像CSS表达式类型可以动态解析,并产生输出取决于你输入的缩写。埃米特是开发和优化Web开发者的工作依赖于HTML / XML和CSS,但可以用编程语言太。 官网:http://docs.emmet.io/ api:http://doc
deepcc
2018/05/16
2.1K0
博客园美化大全
1.1、自动生成目录 首先得有js权限 (1)页脚js代码 <script type="text/javascript"> /* 功能:生成博客目录的JS工具 测试:IE8,火狐,google测试通过 zhang_derek 2018-01-03 */ var BlogDirectory = { /* 获取元素位置,距浏览器左边界的距离(left)和距浏览器上边界的距离(top) */ getElementPosition:functi
zhang_derek
2018/05/30
1.9K0
学习js在线html(富文本)编辑器
你要的是所见即所得HTML编辑器,简单来说需要几个基本步骤: 1,需要一个可以编辑同时又可显效果的编辑框。textarea不行,它只能用来输入纯文本,不能显示颜色、斜体之类的文字样式,就像记事本。 你可以使用iframe来实现,修改iframe的designMode属性使其可以被编辑。 <iframe id="myEditer" width="100%" height="150px"></iframe> <script>myEditer.document.designMode = 'on';</scri
deepcc
2018/05/16
20.1K0
前端开发面试题总结之——CSS3
---- 相关知识点 布局、 浮动、 盒子模型、 弹性和模型、 选择器优先级、 居中定位、 兼容性、 hack写法...... 题目&答案 如何理解CSS的盒子模型? 每个HTML元素都是长方形盒子。 (1)盒子模型有两种:IE盒子模型、标准W3C盒子模型;IE的content部分包含了border和pading。 (2)标准W3C盒模型包含:内容(content)、填充(padding)、边界(margin)、边框(border)。 link和@import的区别? (1)link属于XHTML标签,
用户1667431
2018/04/18
1.1K0
前端开发面试题总结之——CSS3
前端代码相关规范
项目目录和文件的命名使用小写字母,避免使用大写或驼峰,多个单词以下划线 _ 分隔  如:my_project/cast_detail.js
书童小二
2018/09/03
2K0
前端代码相关规范
JS快速入门(二)
和 innerHTML 类似,写入内容如果包含 html 标签字符串,会被解析成对应的 html 标签,document.write()根据运行时机,会写入文档不同的位置
HammerZe
2022/03/24
6.6K0
JS快速入门(二)
文本溢出截断省略
文本溢出截断省略是比较常见的业务场景,主要分为单行文本溢出截断省略与多行文本溢出截断省略,单行的截断方案比较简单,多行截断相对比较复杂。
WindRunnerMax
2020/08/27
1.7K0
Js DOM
要创建新的 HTML 元素 (节点)需要先创建一个元素,然后在已存在的元素中添加它。
hss
2022/02/25
3.8K0
Day15:大前端
position: relative, absolute, fixed, static
达达前端
2019/07/15
3.9K0
Day15:大前端
事件基础及操作元素
JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为。
星辰_大海
2020/09/30
1.5K0
相关推荐
CSS3着重符及其fallback
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验