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

标签 javascript html css scrollbar

与许多 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/

相关文章:

javascript - 粘性褪色导航栏即将出现

javascript - 在第一个 <br> 之前设置文本区域中的文本样式

javascript - 如何将属性传递给 Backbone View ?

javascript - (Windows 8 Javascript)WinJS.xhr 不反射(reflect) api 的更改

javascript - 如何使这些表格单元格可排序?

javascript - 如何使用 Selenium 从没有 ID 的 div 中获取值

javascript - 在javascript中无法通过id找到元素

javascript - 使用 javascript 将 css 应用于 iframe(无法控制此域)

css - 如何将像素定位到右侧

css - 使用 Angular Material 时无法对齐复选框