jquery 圆形滑块与固定的背景

cx6n0qe3  于 2024-01-07  发布在  jQuery
关注(0)|答案(2)|浏览(178)

我尝试使用librery roundSlider.js创建一个圆形滑块,它在路径中有一个多色的背景。我尝试使用线性渐变,但结果不好,因为当我开始使用hadler移动滑块时,背景颜色开始移动,有些颜色消失了。
这是我的代码:

  1. $(document).ready(function () {
  2. $("#shape").roundSlider({
  3. radius: 80,
  4. width: 8,
  5. min: 0,
  6. max: 100,
  7. handleSize: "+16",
  8. circleShape: "pie",
  9. handleShape: "dot",
  10. sliderType: "min-range",
  11. startAngle: 315,
  12. value: 24,
  13. disabled: false
  14. });
  15. });
  1. .rs-range-color {
  2. background: linear-gradient(to right, yellow 20%, blue 20%, blue 40%, red 40%, red 60%, green 60%, green 80%, brown 80%, brown 100%);
  3. }
  4. .rs-path-color {
  5. /*background-color: #C2E9F7;*/
  6. background: linear-gradient(to right, yellow 20%, blue 20%, blue 40%, red 40%, red 60%, green 60%, green 80%, brown 80%, brown 100%);
  7. background-repeat: no-repeat;
  8. background-size: cover;
  9. background-position: center;
  10. background-attachment: fixed;
  11. }
  12. .rs-handle {
  13. background-color: #C2E9F7;
  14. padding: 7px;
  15. border: 2px solid #C2E9F7;
  16. }
  17. .rs-handle.rs-focus {
  18. border-color: #33B5E5;
  19. }
  20. .rs-handle:after {
  21. border-color: #33B5E5;
  22. background-color: #33B5E5;
  23. }
  24. .rs-border {
  25. border-color: transparent;
  26. }
  27. .rs-tooltip-text {
  28. font-family: Roboto, sans-serif;
  29. font-size: 20px;
  30. border-radius: 7px;
  31. transition: background 0.02s ease-in-out;
  32. color: #33B5E5;
  33. }
  34. .rs-tooltip-text:before {
  35. position: absolute;
  36. left: -10px;
  37. top: -18px;
  38. content: 'DISCOUNT';
  39. font-size: 12px;
  40. }
  41. .rs-tooltip-text:after {
  42. position: absolute;
  43. left: 10px;
  44. top: 48px;
  45. content: '';
  46. font-size: 12px;
  47. }
  48. .container{
  49. position: absolute;
  50. z-index: 2;
  51. top: 50%;
  52. left: 50%;
  53. transform: translate(-50%, -50%);
  54. font-family: Roboto, sans-serif;
  55. padding: 20px;
  56. border: 1px solid;
  57. }
  58. /* Solution for inner circle with shadow */
  59. #shape:after {
  60. content: " ";
  61. display: block;
  62. height: calc(100% - 40px); /* here 40 is the gap between the outer and inner circle */
  63. width: calc(100% - 40px);
  64. position: absolute;
  65. top: 20px; /* divide the gap value by 2 */
  66. left: 20px;
  67. z-index: 9; /* tooltip z-index is 10, so we put less than that value */
  68. border-radius: 1000px;
  69. box-shadow: 0 0 10px -2px;
  70. }
  71. /* Solution for bottom triangle out issue */
  72. #shape .rs-overlay {
  73. height: calc(50% + 5px);
  74. width: calc(50% + 5px);
  75. top: -5px;
  76. left: -5px;
  77. border-radius: 1000px 0 0 0;
  78. }
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>RoundSlider - A sample testing</title>
  5. <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  6. <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/roundslider.min.css" rel="stylesheet" />
  7. <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/roundslider.min.js"></script>
  8. </head>
  9. <body style="padding: 10px 0 0 20px; font-family: monospace;">
  10. <div class="container">
  11. <div class="control">
  12. <div id="shape"></div>
  13. </div>
  14. </div>
  15. </body>
  16. <html>

当你运行上面的代码时,你可以看到路径的背景颜色随着我移动处理程序而移动,这就是问题所在。我希望背景保持固定。换句话说,我希望背景路径是一个有3种或更多颜色的渐变,并且这个背景覆盖了滑块的100%。我不希望颜色移动或被移除,为其他颜色让路。

50pmv0ei

50pmv0ei1#

roundSlider中,**svgMode**在滑动条由SVG元素构成的情况下可用。因此,使用它可以将SVG渐变应用于range和path元素。此外,这里这些元素是单个元素,因此您不会遇到此问题。
在这里,我已经根据您的场景更新了演示,请检查以下内容:

https://jsfiddle.net/soundar24/6se2tmp9/

在这个演示中,我没有设置pathColor,因为如果rangeColor和路径颜色都相同,那么你不会发现任何差异。
此外,由于这只是默认的SVG渐变,因此可以根据您的需求修改此SVG线性渐变。

编辑1:

根据你的评论,那么你需要使用圆锥曲线渐变。在SVG中没有明确的圆锥曲线渐变选项,但你仍然可以找到实现它的方法。
1.或者,我使用CSS圆锥渐变来实现这一点。查看下面的演示:

https://jsfiddle.net/soundar24/6se2tmp9/2/

1.另外,我还做了一个变通方案,在roundSlider路径上创建SVG范围段。这也与您的要求相似。请查看下面的演示:

https://jsfiddle.net/soundar24/8pgo9ce7/

展开查看全部
6qqygrtg

6qqygrtg2#

  1. $(document).ready(function () {
  2. $.fn.roundSlider.prototype._invertRange = true;
  3. // this is core functionality to generate the numbers
  4. $.fn.roundSlider.prototype.defaults.create = function () {
  5. var o = this.options, tickInterval = 20;
  6. for (var i = o.min; i <= o.max; i += tickInterval) {
  7. var angle = this._valueToAngle(i);
  8. var numberTag = this._addSeperator(angle, "rs-custom");
  9. var number = numberTag.children();
  10. number.clone().css({
  11. "width": o.width + this._border(),
  12. "margin-top": this._border(true) / -2
  13. });
  14. number.removeClass().addClass("rs-number").html(i).rsRotate(-angle);
  15. }
  16. }
  17. // ####### ---------- Workaround for custom range segments ---------- ####### //
  18. var fn1 = $.fn.roundSlider.prototype._setProperties;
  19. $.fn.roundSlider.prototype._setProperties = function () {
  20. fn1.apply(this);
  21. var o = this.options, r = o.radius, r1 = r - (o.width / 2) - o.borderWidth;
  22. var svgElement = this.svgContainer.children();
  23. for (var i = 0; i < o.ranges.length; i++) {
  24. var obj = o.ranges[i];
  25. var startPoint = this._valueToAngle(obj.start),
  26. endPoint = this._valueToAngle(obj.end);
  27. var path = this.$createSVG("path");
  28. var d = this.$drawPath(r, r1, startPoint, endPoint);
  29. var attr = {
  30. "d": d, "stroke-width": o.width,
  31. "stroke": obj.bgcolor, "fill": "transparent"
  32. };
  33. this.$setAttribute(path, attr);
  34. svgElement.append(path);
  35. }
  36. }
  37. // ####### ---------- ---------- ####### //
  38. $("#handle1").roundSlider({
  39. svgMode: true,
  40. pathColor: "transparent",
  41. rangeColor: "transparent",
  42. sliderType: "min-range",
  43. editableTooltip: false,
  44. radius: 105,
  45. width: 16,
  46. value: 75,
  47. handleShape: "square",
  48. handleSize: 0,
  49. circleShape: "pie",
  50. startAngle: 315,
  51. min: 0,
  52. max: 100,
  53. step: 5,
  54. disabled: false,
  55. ranges: [
  56. { start: 0, end: 20, bgcolor: "#D91907"},
  57. { start: 20, end: 40, bgcolor: "#F58B00" },
  58. { start: 40, end: 60, bgcolor: "#FFBB00" },
  59. { start: 60, end: 80, bgcolor: "#6FA600" },
  60. { start: 80, end: 100, bgcolor: "#009619" }
  61. ]
  62. });
  63. });
  1. body{
  2. padding:50px;
  3. }
  4. .rs-bg-color {
  5. background-color: #fff;
  6. }
  7. .rs-block.rs-outer.rs-border.rs-split .rs-path.rs-transition:first-child {
  8. background: #ff4434 !important;
  9. }
  10. .rs-block.rs-outer.rs-border.rs-split .rs-path.rs-transition:nth-child(2) {
  11. background: #ff9000 !important;
  12. }
  13. .rs-block.rs-outer.rs-border.rs-split .rs-path.rs-transition:nth-child(4) {
  14. background: #00b71c !important;
  15. z-index: 2 !important;
  16. }
  17. #handle1 .rs-handle {
  18. background-color: transparent;
  19. border: 8px solid transparent;
  20. border-right-color: black;
  21. margin: -6px 0px 0px 14px !important;
  22. border-width: 6px 104px 6px 4px;
  23. }
  24. #handle1 .rs-handle:before {
  25. display: block;
  26. content: " ";
  27. position: absolute;
  28. height: 22px;
  29. width: 22px;
  30. background: black;
  31. right: -11px;
  32. bottom: -11px;
  33. border-radius: 100px;
  34. }
  35. #handle1 .rs-tooltip {
  36. top: 75%;
  37. font-size: 12px;
  38. }
  39. #handle1 .rs-tooltip div {
  40. text-align: center;
  41. background: orange;
  42. color: white;
  43. border-radius: 4px;
  44. padding: 1px 5px 1px;
  45. }
  46. #handle1 .rs-range-color {
  47. background-color: #DB5959;
  48. }
  49. #handle1 .rs-path-color {
  50. background-color: #F0C5C5;
  51. }
  52. span.rs-number {
  53. position: absolute;
  54. top: -8px;
  55. left: -25px;
  56. font-size: 15px;
  57. color: #000;
  58. }
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>Fuel</title>
  5. <script src="https://code.jquery.com/jquery-3.2.1.js"></script>
  6. <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/roundslider.min.js"></script>
  7. <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/roundslider.min.css" rel="stylesheet" />
  8. <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
  9. <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
  10. </head>
  11. <body>
  12. <div id="handle1"></div>
  13. </body>
  14. </html>
展开查看全部

相关问题