<div class="range-slider">
	<div class="range-group">
		<input class="range-input" id="location-range-slider" value="1" min="1" max="4" type="range" />
	</div>
</div><!-- // range-slider -->

<!-- With number fields -->
<div class="filter level-filter level-req">
  <div id="rangeSlider" class="range-slider">
    <label>Levels:</label>

    <div class="number-group">
      <input class="number-input" type="number" value="10" min="0" max="50" /> to 
      <input class="number-input" type="number" value="50" min="0" max="50" />
    </div>

    <div class="range-group">
      <input class="range-input" value="10" min="1" max="50" step="1" type="range" />
      <input class="range-input" value="50" min="1" max="50" step="1" type="range" />
    </div>
  </div>
</div><!-- // filter level-filter -->
.range-slider {
	display: flex;
	flex-flow: row wrap;
	align-items: center; 
	// margin-bottom: 30px; 

	label {
		color: #fff; 
		font-size: 13px; 
	}

	.number-group {
		flex: 1 0 auto; 
		text-align: right; 
		height: 30px; 
		font-weight: 300; 
		font-size: 13px; 
		color: #fff; 

		.number-input {
			width: 36px; 
			height: 30px; 
			text-align: center; 
			color: #3FAFFA; 
			background-color: #3D3E3F; 
			border: 0; 

			&:first-of-type {
				margin-right: 7px; 
			}

			&:last-of-type {
				margin-left: 7px; 
			}

			// vendor-prefix exception
			&::-webkit-outer-spin-button,
			&::-webkit-inner-spin-button {
				-webkit-appearance: none;
			}

			&:invalid,
			&:out-of-range {
				border: 2px solid red; 
			}

		}

	}

	.range-group {
		position: relative; 
		flex: 0 0 100%; 
		height: 47px; 
		
		.range-input {
			position: absolute; 
			left: 0; 
			bottom: 0; 
			margin-bottom: 0; 
			-webkit-appearance: none; // vendor-prefix exception
			width: 100%; 
			border-bottom: 0; 

			&:focus {
				outline: 0; 

				// doesn't seem to allow the track colour to change
				// &::-webkit-slider-runnable-track, 
				// &::-ms-fill-lower, 
				// &::-ms-fill-upper {
				// 	background: $primary-color; 
				// }

			}
			
			// vendor prefix exceptions - must be kept seperate to work
			&::-webkit-slider-runnable-track {
				width: 100%; 
				height: 2px; 
				cursor: pointer; 
				// animate: .2s;
				animation: .2s; 
				background: #3FAFFA; 
				border-radius: 1px; 
				box-shadow: none; 
				border: 0; 
			}
			
			&::-webkit-slider-thumb {
				z-index: 2; 
				position: relative; 
				// box-shadow: 0px 0px 0px #000;
				// border: 1px solid #2497e3;
				height: 18px; 
				width: 18px; 
				border-radius: 50%; 
				background: #3FAFFA; 
				cursor: pointer; 
				-webkit-appearance: none; 
				margin-top: -7px; 
			}
			
			&::-moz-range-track {
				width: 100%; 
				height: 2px; 
				cursor: pointer; 
				// animate: .2s;
				animation: .2s; 
				background: #3FAFFA; 
				border-radius: 1px; 
				box-shadow: none; 
				border: 0; 
			}
			
			&::-moz-range-thumb {
				z-index: 2; 
				position: relative; 
				box-shadow: 0px 0px 0px #000;
				border: 1px solid #2497e3;
				height: 18px; 
				width: 18px; 
				border-radius: 50%; 
				background: #3FAFFA; 
				cursor: pointer; 
			}
			
			&::-ms-track {
				width: 100%; 
				height: 5px; 
				cursor: pointer; 
				// animate: .2s;
				animation: .2s; 
				background: transparent; 
				border-color: transparent; 
				color: transparent; 
			}
			
			&::-ms-fill-lower,
			&::-ms-fill-upper {
				background: #3FAFFA; 
				border-radius: 1px; 
				box-shadow: none; 
				border: 0; 
			}
			
			&::-ms-thumb {
				z-index: 2; 
				position: relative; 
				// box-shadow: 0px 0px 0px #000;
				// border: 1px solid #2497e3;
				height: 18px; 
				width: 18px; 
				border-radius: 50%; 
				background: #3FAFFA; 
				cursor: pointer; 
			}

		}

	}

}


/* for demo purposes */
body {
	background-color: #323334; 
}

.range-slider, 
.filter {
	margin: 0 auto 30px; 
	max-width: 50%; 
}
View Compiled
(function() {

	var parent = document.querySelector("#rangeSlider");
	if(!parent) return;

	var
	rangeS = parent.querySelectorAll("input[type=range]"),
		numberS = parent.querySelectorAll("input[type=number]");

	rangeS.forEach(function(el) {
		el.oninput = function() {
			var slide1 = parseFloat(rangeS[0].value),
				slide2 = parseFloat(rangeS[1].value);

			if (slide1 > slide2) {
				[slide1, slide2] = [slide2, slide1];
				// var tmp = slide2;
				// slide2 = slide1;
				// slide1 = tmp;
			}

			numberS[0].value = slide1;
			numberS[1].value = slide2;
		}
	});

	numberS.forEach(function(el) {
		el.oninput = function() {
			var number1 = parseFloat(numberS[0].value),
				number2 = parseFloat(numberS[1].value);

			if (number1 > number2) {
				var tmp = number1;
				numberS[0].value = number2;
				numberS[1].value = tmp;
			}

			rangeS[0].value = number1;
			rangeS[1].value = number2;

		}
	});

})();

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js