Я использую слайдер d3-simple и хочу, чтобы на слайдере отображалось многоцветие, т.е.
В диапазоне 0–9 он должен быть синим, а от 9 до 26 — оранжевым, а для диапазона 26–60 цвет должен быть красным. Если я переместил ручку, которая в настоящее время указывает на 26, затем сдвину ее влево, за ней должен последовать красный цвет, аналогично для Другая ручка тоже. Может кто-нибудь помочь в этом вопросе?
const rangeSvg = d3.select('figure#rangeContainer')
.append('svg')
.attr('width', 350)
.attr('height', height);
const segmentWidth = 90;
// Create the first slider
const rangeSlider = rangeSvg.append('g')
.attr('transform', 'translate(10,30)'); // Position the first slider
// Call your slider function to draw the first slider
rangeSlider.call(sliderHorizontal()
.min(1)
.max(60)
.step(1)
.default([6,36])
.tickValues([1, 6, 36, 60])
.width(segmentWidth * 3)
.handle(d3.symbol().type(d3.symbolCircle).size(100)())
.fill('orange') // Apply the gradient here
.on('onchange', selectedPeriod => {
let fileAgingPeriod = selectedPeriod.map(Math.round);
this.activeValue = fileAgingPeriod[0];
this.obsoleteValue = tfileAgingPeriod[1];
this.cdr.detectChanges();
})
);
rangeSlider.select('.track-inset')
.attr('stroke', '#54A7FF');
// .attr('stroke-dasharray',230);
rangeSlider.selectAll('.handle')
.attr('fill', '#54A7FF');
Я думаю, что это возможно.
Можете ли вы настроить таргетинг на определенные элементы SVG с помощью CSS? Было бы полезно предоставить пример кода этого конкретного слайдера, а не просто скриншот.
@jjroley, пожалуйста, проверьте код, упомянутый выше.
Вот небольшой трюк с d3/SVG. Он клонирует «вставку» ползунка, чтобы разбить их на две части: одну до выделения, окрашенную в синий цвет, а другую после нее, окрашенную в красный цвет. Затем размер двух вставок динамически изменяется при перемещении ползунка.
<script src = "https://d3js.org/d3.v7.js"></script>
<script src = "https://unpkg.com/d3-simple-slider"></script>
<p id = "value"></p>
<div id = "slider"></div>
<script>
const min = 1,
max = 60;
// function to dynamically resize
setInsetLens = (selection) => {
d3.select('#before-inset')
.attr('x2', (selection[0] / (min + max)) * initialWidth);
d3.select('#after-inset')
.attr('x1', (selection[1] / (min + max)) * initialWidth);
};
var slider = d3
.sliderHorizontal()
.min(min)
.max(max)
.step(1)
.default([6, 36])
.tickValues([1, 6, 36, 60])
.width(90 * 3)
.handle(d3.symbol().type(d3.symbolCircle).size(100)())
.fill('orange')
.on('onchange', setInsetLens);
d3.select('#slider')
.append('svg')
.attr('width', 500)
.attr('height', 100)
.append('g')
.attr('transform', 'translate(30,30)')
.call(slider);
// clone the inset, set the colors and get its initial width
const initialWidth = d3.select('.track-inset')
.attr('id', 'before-inset')
.attr('stroke', 'steelblue')
.clone()
.attr('id', 'after-inset')
.attr('stroke', 'red')
.node()
.getBBox()
.width;
// set initial size
setInsetLens([6,36]);
</script>
Большое спасибо, это сработало, я интегрировал это в свой угловой код и создал его. Большое спасибо за ваши усилия, я очень ценю это. Я многому научился из вашего решения.
Вы уверены, что это возможно с помощью компонента под названием «простой слайдер»? Возможно, вам придется изменить сам компонент.