我正在构建一个文本跟踪(字母间距)演示,我有范围滑块更新的CSSprops ,但我想扩展它,使标签也动态更新.这是一种工作,但令人不快.有没有办法做得很优雅,这样我就不会重复output2.textContent = this.value; output2.textContent = this.value;个等等了?

此外,当值从(例如)0.09->0.1->0.11时,UI会出错.我可以让它总是输出两个小数吗? playbook 在收盘前.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Trax…text tracking tool</title>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Chivo&family=Chivo+Mono&family=Playfair+Display+SC:wght@700&family=Playfair+Display:wght@700&display=swap" rel="stylesheet">
    <meta name="description" content="description">
    <style>
        * {
            outline: cornflowerblue dotted 0.5px;
        }

        * {
            margin: 0;
        }

        :root {
            --_trax-fontFamily-caps: 'Playfair Display', serif;
            --_trax-fontFamily-scaps: 'Playfair Display SC', serif;
            --_trax-fontFamily-body: 'Chivo', sans-serif;
            --_trax-fontFamily-mono: 'Chivo Mono', monospace;

            --_trax-textTracking-caps: var(--trax-textTracking-caps, 0.00cap);
            --_trax-textTracking-scaps: var(--trax-textTracking-scaps, 0.00ex);
            --_trax-textTracking-body: var(--trax-textTracking-body, 0.00em);
            --_trax-textTracking-mono: var(--trax-textTracking-mono, 0.00ch);

            --_trax-text-measure: var(--trax-text-measure, 66em);
        }

        body {
            box-sizing: content-box;
            margin-inline: auto;
            text-align: center;
            max-inline-size: var(--_trax-text-measure);
            padding-inline-start: 1rem;
            padding-inline-end: 1rem;
            display: flex;
            flex-direction: column;
            align-items: center;
            font-family: var(--_trax-fontFamily-mono);
        }

        h1 {
            font-size: 5rem;
        }

        h1.caps {
            font-family: var(--_trax-fontFamily-caps);
            letter-spacing: var(--_trax-textTracking-caps);
            text-transform: uppercase;
        }

        h1.scaps {
            font-family: var(--_trax-fontFamily-scaps);
            letter-spacing: var(--_trax-textTracking-scaps);
        }

        .align-self\:flex-start,
        .asfs {
            align-self: flex-start;
        }

        /* add range slider code */
    </style>
</head>

<body>

    <p class="align-self:flex-start">Capitals</p>
    <h1 class="caps">Hamburgevons</h1>
    <div class="controls">
        <label for="trax-textTracking-caps" id="value-caps">0.00</label><span>&#8198;cap</span>
        <input name="trax-textTracking-caps" type="range" min="-0.30" max="0.30" value="0.00" step="0.01" data-uom="cap">
        <button>CSS</button>
    </div>

    <p class="align-self:flex-start">Small Capitals</p>
    <h1 class="scaps">Hamburgevons</h1>
    <div class="controls">
        <label for="trax-textTracking-scaps" id="value-scaps">0.00</label><span>&#8198;ex</span>
        <input name="trax-textTracking-scaps" type="range" min="-0.30" max="0.30" value="0.00" step="0.01" data-uom="ex">
        <button>CSS</button>
    </div>

    <script>
        const rangeSliders = document.querySelectorAll('input');
        //const labels = document.querySelectorAll('label');
        const output1 = document.querySelector('#value-caps');
        const output2 = document.querySelector('#value-scaps');

        function updateProp(event) {
            const uom = this.dataset.uom || '';
            document.documentElement.style.setProperty(`--_${this.name}`, this.value + uom);
            output1.textContent = this.value;
            output2.textContent = this.value;
        }

        rangeSliders.forEach(input => {
            input.addEventListener('input', updateProp);
        });
    </script>

</body>

</html>

推荐答案

我不认为这种情况下的重复是不优雅的.为了可读性,最好还是让它保持原样,而不是试图把一些聪明的东西放在一起,基本上做同样的事情.

至于两位小数,我相信这将是最简单的方法,如果您不介意文本内容是数字的话:

output1.textContent = parseFloat(this.value).toFixed(2);
output2.textContent = parseFloat(this.value).toFixed(2);

编辑:

为了回应下面的 comments ,这可能是一种替代方法,因为将添加更多滑块/标签:

        const rangeSliders = document.querySelectorAll('input[type="range"]');
        const labels = document.querySelectorAll('label');

        function updateProp(event) {
            const uom = this.dataset.uom || '';
            document.documentElement.style.setProperty(`--_${this.name}`, this.value + uom);

            const label = labels[Array.from(rangeSliders).indexOf(this)];
            label.textContent = parseFloat(this.value).toFixed(2);
        }

        rangeSliders.forEach((input, index) => {
            input.addEventListener('input', updateProp);
            labels[index].textContent = parseFloat(input.value).toFixed(2);
        });

这将仅基于当前滑块的索引更新相应的标签,并将为您固定浮动长度.

Javascript相关问答推荐

为什么我达到了时间限制!?LeetCode链接列表循环(已解决,但需要解释!)

Rehype将hashtag呈现为URL

如何修复我的js构建表每当我添加一个额外的列作为它的第一列?

如何使用JavaScript将文本插入空div

如何在Obsidian dataview中创建进度条

数字时钟在JavaScript中不动态更新

Javascript json定制

在HTML语言中调用外部JavaScript文件中的函数

根据一个条件,如何从处理过的数组中移除一项并将其移动到另一个数组?

创建以键值对为有效负载的Redux Reducer时,基于键的类型检测

更新Redux存储中的对象数组

Next.js中的服务器端组件列表筛选

警告框不显示包含HTML输入字段的总和

在Vercel中部署Next.js项目时获取`ReferenceError:未定义文档`

通过跳过某些元素的对象进行映射

P5JS-绘制不重叠的圆

如何在加载页面时使锚定标记成为焦点

在对象的嵌套数组中添加两个属性

在AgGrid中显示分组行的单元格值

如何在不获取其子元素的文本内容的情况下获取元素的文本内容?