首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使光标工具提示不脱离屏幕

如何使光标工具提示不脱离屏幕
EN

Stack Overflow用户
提问于 2022-04-20 01:00:21
回答 2查看 54关注 0票数 0

我正在处理一个弹出框,当光标悬停在元素上时,弹出框显示一些文本与元素之间的某个位置。您可以在这里看到一个简化的演示:https://jsfiddle.net/xsvm2Lur/61/

现在,弹出框将压扁当它靠近包围框。我希望弹出窗口出现在悬停元素的左下角(如果弹出窗口将向右溢出)或左上角(如果弹出窗口将溢出到下端和右侧),如果弹出窗口将溢出。

将显示的位置和文本是动态生成的(例如,在呈现之前我不知道)。

现在,我有一个使用Javascript的工作版本。我的做法是:

  • 获取将显示的文本。计算每个字符将显示的字符数x0.25em,以获得文本的宽度。
  • 计算显示的字符串+填充(左和右)的宽度。我们叫它textLength吧。这将被设置为弹出的宽度,所以所有的文本进入1行。
  • 如果光标的textLength +x位置>框宽,则在x轴上“反转”弹出框,方法是通过textLength推导弹出框的“左”值,并与元素相距一段距离。
  • 对y位置重复相同的检查,即如果光标位置+直线高度(1em) +底部填充>框高,则反转y。

这个解决方案是可行的,但我想知道是否有更好的方法可以做到这一点而不需要计算字符,或者是否有其他方法来优雅地完成它,也许CSS只有在没有Javascript的情况下呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-20 01:31:56

遗憾的是,我不相信只有CSS才能做到这一点。但是,通过处理您的小提琴,我成功地添加了您想要的功能。

我这样做只是为了包含对容器的引用,并检查弹出位置和大小是否在容器BoundingClientRect中。

这是popupShow函数的更新代码:

代码语言:javascript
运行
AI代码解释
复制
const showPopup = (top, left, text, container) => {
    popup.textContent = text;
  
  const containerBCR = container.getBoundingClientRect();
  const popupBCR = popup.getBoundingClientRect();
  const popupWidth = popupBCR.width,
        popupHeight = popupBCR.height;
  
  let popupTop = top + 20,
        popupLeft = left + 20,
      newPopupWidth;
  
  console.log("height: ", popupHeight);
  console.log("top: ", top);
  console.log("bottomPopup: ", top + 20 + popupHeight);
  console.log("bottomBoundary", containerBCR.bottom);
  
  if (left + 20 + popupWidth > containerBCR.right) {
    popupLeft = left - popupWidth;
    
    if (popupLeft < containerBCR.left) {
        popupLeft = containerBCR.left;
      newPopupWidth = left - containerBCR.left;
    }
  }
  
  if (top + 20 + popupHeight > containerBCR.bottom) {
    popupTop = top - popupHeight;
    
    if (popupTop < containerBCR.top) {
        popupTop = containerBCR.top;
    }
  }
  
  popup.style.top = popupTop + "px";
  popup.style.left = popupLeft + "px";
  popup.style.width = newPopupWidth;
  popup.style.visibility = 'visible';
}

如您所见,我还编辑了弹出窗口,使用“可见性:隐藏”而不是“显示:无”。这是因为如果显示设置为"none",我们将无法得到他的大小(不过,可能会有解决办法)。

试着检查一下更新小提琴,告诉我你的想法。

我把一个圆圈往下推了一点,因为代码目前没有检查弹出窗口的填充,所以它溢出了一点(几个像素)。

票数 1
EN

Stack Overflow用户

发布于 2022-04-20 01:31:44

这是基于象限,简单计算,如果我们是超过50%的宽度和/或高度,并互换风格使用右或底部代替。这不关心弹出的内容,不需要测量。

代码语言:javascript
运行
AI代码解释
复制
const popup = document.getElementById("pop-up")

const parsePx = (px) => parseFloat(px.slice(0, -2))

const showPopup = (text, position) => {
  popup.textContent = text;
  popup.style.top = position.top;
  popup.style.left = position.left;
  popup.style.right = position.right;
  popup.style.bottom = position.bottom;
  popup.style.display = 'inline-block';
}

const hidePopup = () => {
  popup.style.display = 'none';
}

const circles = document.querySelectorAll(".red-circle")
circles.forEach(el => el.addEventListener('mouseover', (e) => {

  const hoveredEl = e.target;

  const textContent = hoveredEl.getAttribute('data-content');
  
  //get absolute position of elements
  let elBounds = hoveredEl.getBoundingClientRect();
    
  //get absolute position of parent;
  let ctBounds = popup.parentElement.getBoundingClientRect();
    
  //calculate relative positions
  let left =  elBounds.left - ctBounds.left + (elBounds.width / 2), 
    top = elBounds.top - ctBounds.top + (elBounds.height / 2),
    width = ctBounds.width,
    height = ctBounds.height

  //prepare position settings
  let position = { left: "auto", top: "auto", bottom: "auto", right: "auto" }
  
  //calculate if we're over 50% of box size
  if(top>ctBounds.height/2) position.bottom = ctBounds.height - top + 20 + 'px'; else position.top = top + 20 + 'px';
  if(left>ctBounds.width/2) position.right = ctBounds.width - left + 20 + 'px'; else position.left = left + 20 + 'px';
  
  showPopup(textContent, position);
  
}))

circles.forEach(el => el.addEventListener('mouseout', (e) => { hidePopup() }))
代码语言:javascript
运行
AI代码解释
复制
.container {  width: 200px;  height: 200px; border: 1px solid black;  position: relative;}
.red-circle { border-radius: 50%;  background: red;  width: 20px;  height: 20px;  position: absolute;}
#pop-up {  background-color: #EFEFEF;  padding: 0.25em;  position: absolute;}
代码语言:javascript
运行
AI代码解释
复制
<div class="container">
  <div style="top:20px;left:20px;" class="red-circle" data-content="This is a red circle"></div>
  <div style="top:10px;left:150px;" class="red-circle" data-content="This is the top-right red circle"></div>
  <div style="top:140px;left:150px;" class="red-circle" data-content="This is the bottom-right red circle"></div>
  <div style="top:140px;left:15px;" class="red-circle" data-content="This is the bottom-left red circle"></div>
  <span style="display:hidden" id="pop-up"></span>
</div>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71936872

复制
相关文章
如何使背景照片覆盖全屏不会随屏幕滚动
html 中 css 中 使背景照片覆盖全屏 body,html{ background: url(../img/index.png); background-repeat: no-repeat; background-size: 100% 100%; background-attachment: fixed; }
江一铭
2022/06/16
1.6K0
Linux下使Shell 命令脱离终端在后台运行
你是否遇到过这样的情况:从终端软件登录远程的Linux主机,将一堆很大的文件压缩为一个.tar.gz文件,连续压缩了半个小时还没有完成,这时,突然你断网了,你登录不上远程Linux主机了,那么前面的半个小时就会前功尽弃,你非常气愤……
飞奔去旅行
2019/06/13
2.7K0
input框取消光标颜色手机端不生效
<style> input{ color:transparent; } </style> <input value="我要隐藏光标"> //文字颜色可以使用text-shadow属性 <style> input{ color:transparent; text-shadow:0 0 0 red; } </style> PC端没问题,但是手机端测试无效。 参考链接:http://blog.csdn.net/u010730897/article/details/72721960 这里我用div模拟一个
蓓蕾心晴
2018/04/12
1.4K0
input框取消光标颜色手机端不生效
Linux下如何使cp命令不提示覆盖文件 原
在Linux下,如果希望将文件file拷贝到目录dir下,可以执行:cp file dir 但如果dir下已经存在一个名为file的文件的时候,系统总是会提示是否覆盖file。 这是一个很好的功能,它能够防止我们由于疏忽对系统造成的损害,但如果不希望看到这些交互的提示信息呢?比如我们需要写一个脚本,将某些文件安装到指定的目录下,这时我们肯定不希望看到提示。 可以试一下 -f 选项,-f 一般表示强制执行(force)。
donghui
2019/04/19
8.9K0
屏幕取色工具
在程序开发过程中,经常会用到颜色,但是我们不知道一些颜色的代码究竟是什么,这些问题困惑着一些初学的程序员。下面我来为大家介绍一个屏幕取色工具:TakeColor。
OECOM
2020/07/02
1.6K0
动态获取当前屏幕中光标所在位置的颜色
usingSystem;usingSystem.Drawing;usingSystem.C运维
Java架构师必看
2020/10/15
2.8K0
Google Breakpad:脱离符号的调试工具
https://jackwish.net/2015/introduction-of-google-breakpad.html
Linux阅码场
2020/02/26
5.1K0
提示Android屏幕适配方案分析
Android开发过程中我们常用的尺寸单位有px、dp,还有一种sp一般是用于字体的大小。但是由于px是像素单位,比如我们通常说的手机分辨例如1920*1080都是px的单位。现在Android屏幕分辨率碎片化720x1280、1080x1920、2280x1080,这就造成例如187px会在各个分辨率的机型上都是显示一样大小的,那肯定不是我们想要的效果,所以用px单位我们是难以达到适配效果的,那么为什么用dp可以呢?
用户2356368
2019/05/15
1.2K0
提示Android屏幕适配方案分析
12-2 提示符添加颜色及光标移动
三、添加颜色 大多数终端都会响应某些非打印字符序列,来控制光标位置、字符属性(如:颜色、粗体、文本闪烁)等内容。 1.字符颜色 (1)是什么? 字符颜色是由发送到终端仿真器的一个 ANSI 转
见贤思齊
2020/08/12
1.4K0
IntelliJ IDEA自动提示,如何设置不区分大小写
本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/154
joshua317
2021/10/09
2.4K0
IntelliJ IDEA自动提示,如何设置不区分大小写
【说站】mysql光标如何使用
以上就是mysql光标的使用,希望对大家有所帮助。更多mysql学习指路:MySQL
很酷的站长
2022/11/23
1.3K0
【说站】mysql光标如何使用
Snagit for mac(屏幕截图和屏幕录制工具)
Snagit是一款由TechSmith公司开发的屏幕截图和屏幕录制工具,旨在帮助用户在Mac OS X平台上捕捉和编辑屏幕内容。Snagit可以快速捕捉全屏、窗口、区域或滚动屏幕截图,并提供多种编辑工具,如裁剪、调整大小、添加文本、箭头、形状、高亮、马赛克和数字等标记。此外,Snagit还支持屏幕录制,可以捕捉视频、音频和鼠标点击等操作,并进行编辑和导出。Snagit已经成为许多行业中使用的标准工具,包括软件开发、技术支持、教育、医疗保健、市场营销和在线培训等领域。
快乐的小丸子
2023/03/28
3.1K0
iOS不弹窗提示网络权限
iOS网络编程的项目在真机上跑,可能会出现socket死活连不上、错误提示no route to host、网络访问不了、无法下载后台资源等情况。
动动我试试
2020/03/12
6.4K0
如何解决iOS打包提示“AppID与profile文件不匹配”
云打包 发布 iOS端 发布 报错 Profile文件中的应用标识 与打包配置的包名不匹配。
iOS程序应用
2023/03/24
1.6K0
光标定位,隐藏光标
最近写贪吃蛇游戏时,需要用到光标定位,故总结如下。 方法一: 1 #include<windows.h> 2 #include<stdio.h> 3 4 HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE); 5 COORD coord; 6 void locate(int x,int y) 7 { 8 coord.X=x; 9 coord.Y=y; 10 SetConsoleCursorPosition(hout,coord);
猿人谷
2018/01/17
2.5K0
如何让数据分析不脱离业务?
如果数据分析脱离业务,那么数据分析无任何意义,数据分析师或者数据分析部门于企业而言没有任何存在的价值。
Python进阶者
2022/04/12
2550
如何让数据分析不脱离业务?
如何使 Grafana as code
Grafana Dashboard 可以做很多事情,但您知道其实是可以通过代码来配置管理 Grafana Dashboard 的吗?本文是 Grafana Labs 软件开发工程师 Malcolm Holmes 和 Inuits 的开源顾问 Julien Pivotto 在 FOSDEM 2020 上的 topic 演讲记录。演讲中,两人讨论了如何使用代码来管理您的 Grafana 实例,并介绍了一些使用 Jsonnet[1] 的秘诀和技巧以及 Grafonnet[2](一个用于生成 Grafana Dashboard 的 Jsonnet 库)。
郭旭东
2020/12/30
1.7K0
如何使 Grafana as code
点击加载更多

相似问题

如何防止工具提示脱离屏幕反应

11

如何使工具提示跟随光标

14

使CSS工具提示跟随光标

23

如何使qtip工具提示随光标移动

17

如何创建一个从未脱离屏幕的html工具提示?

37
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档