gpt4 book ai didi

javascript - 有没有办法在滚动条上放置标记?

转载 作者:可可西里 更新时间:2023-11-01 14:58:59 38 4
gpt4 key购买 nike

与许多 IDE 和文本编辑器(例如 https://github.com/surdu/scroll-marker)中的功能类似,我希望能够在滚动条(overflow: scroll 元素的)上显示小标记。

我认为这可以通过将 pointer-events: none 元素作为可滚动元素的覆盖层并在其上放置绝对定位的元素来完成,但是要获得正确的位置会很棘手考虑到滚动条具有特定于平台/浏览器的宽度、填充、小块大小等等。此外,这感觉像是一个相当 hacky 的解决方案。

有什么建议吗?

最佳答案

给你。这是一个巨大的挑战。它并不完美,但我希望它能为您指明前进的方向。
因此,首先进行简要说明。

有一个固定尺寸的容器。其中有 2 个元素:.inner-container对于文本和 .scroll-marker滚动条上会有标记。

正文是<p>标签,突出显示的文本是 <span>带有 .red 的标签, .yellowblue类。这些类用于了解每个标记的颜色。每个标记都在一个循环中创建并附加在 .scroll-marker 上,它们是绝对定位的。进行三的规则计算,使滚动定位正确。

var container = document.querySelector('.container');
var containerInner = document.querySelector('.container-inner');

var containerHeight = container.offsetHeight;
var containerScrollHeight = containerInner.scrollHeight;

var scrollMarker = document.querySelector('.scroll-marker');

var colorfulStuff = document.querySelectorAll('.container-inner span'); // colorful spans from text

colorfulStuff.forEach(function (span) { // loop to create each marker

var spanTop = span.offsetTop;
var spanBottom = spanTop + span.offsetHeight;

var markerTop = Math.ceil(spanTop * containerHeight / containerScrollHeight);
var markerBottom = Math.ceil(spanBottom * containerHeight / containerScrollHeight);

if (span.className === "red") { // choose the correct color
var markerColor = '#f65e5a';
} else if (span.className === "yellow") {
var markerColor = '#fec740';
} else if (span.className === "blue") {
var markerColor = '#2985d0';
}

var markerElement = document.createElement("span"); // create the marker, set color and position and put it there
markerElement.style.backgroundColor = markerColor;
markerElement.style.top = markerTop + "px"
markerElement.style.height = (markerBottom - markerTop) + "px"
scrollMarker.appendChild(markerElement);

})
.container {
background: #2d3744;
border-radius: 4px;
position: relative;
margin: 30px auto;
height: 320px;
width: 300px;
box-shadow: 2px 2px 5px 0 rgba(0, 0, 0, 0.65);
}

.container-inner {
padding: 20px 30px;
height: calc(100% - 40px);
overflow-y: auto;
overflow-x: hidden;
}

p {
color: white;
margin: 12px 0;
font-size: 18px;
font-family: sans-serif;
letter-spacing: 0.44px;
}

.red {
color: #f65e5a;
}

.yellow {
color: #fec740;
}

.blue {
color: #2985d0;
}

.scroll-marker {
position: absolute;
height: 100%;
width: 12px;
pointer-events: none;
top: 0;
right: 0;
}

.scroll-marker span {
/* markers */
position: absolute;
width: 100%;
}

/* scrollbar style */

.container-inner::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
background-color: #2d3744;
}

.container-inner::-webkit-scrollbar {
width: 12px;
background-color: #2d3744;
}

.container-inner::-webkit-scrollbar-thumb {
border-radius: 10px;
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3);
background-color: #4c5f74;
}
<div class="container">
<div class="container-inner">
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore asperiores <span class="yellow">provident magnam impedit deleniti modi, culpa perspiciatis ex illum iusto vel nulla expedita itaque temporibus</span> voluptate non magni. Voluptatem, itaque.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore asperiores provident <span class="blue">magnam impedit deleniti modi</span>, culpa perspiciatis ex illum iusto vel nulla expedita itaque temporibus voluptate non magni. Voluptatem, itaque.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. <span class="yellow">Inventore asperiores provident</span> magnam impedit deleniti modi, culpa perspiciatis ex illum iusto vel nulla expedita itaque temporibus voluptate non magni. Voluptatem, itaque.</p>
<p><span class="red">Lorem ipsum</span> dolor sit amet consectetur adipisicing elit. Inventore asperiores provident magnam impedit deleniti modi, culpa <span class="red">perspiciatis ex illum iusto vel nulla expedita itaque temporibus voluptate non magni.</span> Voluptatem, itaque.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore asperiores provident magnam impedit deleniti modi, culpa perspiciatis ex illum iusto vel nulla expedita itaque temporibus voluptate non magni. Voluptatem, itaque.</p>
<p><span class="yellow">Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore asperiores provident magnam impedit deleniti modi, culpa perspiciatis ex illum iusto vel nulla expedita itaque temporibus</span> voluptate non magni. Voluptatem, itaque.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore asperiores provident magnam impedit deleniti modi, culpa perspiciatis ex illum iusto vel nulla expedita itaque temporibus voluptate non magni. <span class="blue">Voluptatem, itaque.</span></p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore asperiores provident magnam impedit deleniti modi, culpa perspiciatis ex illum iusto vel nulla expedita itaque temporibus voluptate non magni. Voluptatem, itaque.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore asperiores provident magnam impedit deleniti modi, culpa perspiciatis ex illum iusto vel nulla expedita itaque temporibus voluptate non magni. Voluptatem, itaque.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore asperiores <span class="yellow">provident magnam</span> impedit deleniti modi, culpa <span class="blue">perspiciatis ex illum iusto vel nulla expedita itaque</span> temporibus voluptate non magni. Voluptatem, itaque.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore asperiores provident magnam impedit deleniti modi, culpa perspiciatis <span class="red">ex illum</span> iusto vel nulla expedita itaque temporibus voluptate non magni. Voluptatem, itaque.</p>
</div>
<div class="scroll-marker"></div>
</div>

关于javascript - 有没有办法在滚动条上放置标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57612470/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com