Tôi muốn mặt trái có màu xanh lá cây và mặt phải có màu xám. Như hình trên sẽ là HOÀN THÀNH. Tốt hơn là một giải pháp CSS thuần túy (chỉ cần lo lắng về WebKit).
Một điều như vậy là có thể?
Tôi muốn mặt trái có màu xanh lá cây và mặt phải có màu xám. Như hình trên sẽ là HOÀN THÀNH. Tốt hơn là một giải pháp CSS thuần túy (chỉ cần lo lắng về WebKit).
Một điều như vậy là có thể?
Câu trả lời:
Giải pháp CSS thuần túy :
input[range]
và lấp đầy tất cả các khoảng trống còn lại cho ngón tay cái bằng màu bóng.::-ms-fill-lower
::-moz-range-progress
/*Chrome*/
@media screen and (-webkit-min-device-pixel-ratio:0) {
input[type='range'] {
overflow: hidden;
width: 80px;
-webkit-appearance: none;
background-color: #9a905d;
}
input[type='range']::-webkit-slider-runnable-track {
height: 10px;
-webkit-appearance: none;
color: #13bba4;
margin-top: -1px;
}
input[type='range']::-webkit-slider-thumb {
width: 10px;
-webkit-appearance: none;
height: 10px;
cursor: ew-resize;
background: #434343;
box-shadow: -80px 0 0 80px #43e5f7;
}
}
/** FF*/
input[type="range"]::-moz-range-progress {
background-color: #43e5f7;
}
input[type="range"]::-moz-range-track {
background-color: #9a905d;
}
/* IE*/
input[type="range"]::-ms-fill-lower {
background-color: #43e5f7;
}
input[type="range"]::-ms-fill-upper {
background-color: #9a905d;
}
<input type="range"/>
Trong khi câu trả lời được chấp nhận là tốt về mặt lý thuyết, nó bỏ qua thực tế rằng ngón tay cái sau đó không thể lớn hơn kích thước của bản nhạc mà không bị cắt bởi overflow: hidden
. Hãy xem ví dụ này về cách xử lý điều này chỉ với một chút JS.
// .chrome styling Vanilla JS
document.getElementById("myinput").oninput = function() {
this.style.background = 'linear-gradient(to right, #82CFD0 0%, #82CFD0 ' + this.value + '%, #fff ' + this.value + '%, white 100%)'
};
#myinput {
background: linear-gradient(to right, #82CFD0 0%, #82CFD0 50%, #fff 50%, #fff 100%);
border: solid 1px #82CFD0;
border-radius: 8px;
height: 7px;
width: 356px;
outline: none;
transition: background 450ms ease-in;
-webkit-appearance: none;
}
<div class="chrome">
<input id="myinput" type="range" value="50" />
</div>
+ this.value / (10-0)*100 +'%, #fff
(this.value-this.min)/(this.max-this.min)*100
Có, nó là có thể. Mặc dù tôi sẽ không khuyên bạn nên sử dụng nó vì nó input range
không thực sự được hỗ trợ đúng cách bởi tất cả các trình duyệt vì là một phần tử mới được thêm vào HTML5 và HTML5 chỉ là bản nháp (và sẽ còn lâu) nên đi xa về kiểu dáng có lẽ không phải là tốt nhất sự lựa chọn.
Ngoài ra, bạn cũng sẽ cần một chút JavaScript. Tôi đã tự do sử dụng thư viện jQuery cho việc này, vì mục đích đơn giản.
Đây là trang web của bạn: http://jsfiddle.net/JnrvG/1/ .
.change(
để on('input', func..
nền sẽ thay đổi khi người dùng di chuyển ngón tay cái chứ không chỉ di chuột lên.
Một cập nhật nhỏ cho cái này:
nếu bạn sử dụng phần sau, nó sẽ cập nhật nhanh hơn là khi phát hành bằng chuột.
"thay đổi di chuyển chuột", chức năng "
<script>
$('input[type="range"]').on("change mousemove", function () {
var val = ($(this).val() - $(this).attr('min')) / ($(this).attr('max') - $(this).attr('min'));
$(this).css('background-image',
'-webkit-gradient(linear, left top, right top, '
+ 'color-stop(' + val + ', #2f466b), '
+ 'color-stop(' + val + ', #d3d3db)'
+ ')'
);
});</script>
Dựa trên câu trả lời của @ dargue3 , nếu bạn muốn ngón tay cái lớn hơn bản nhạc, bạn muốn tận dụng tối đa <input type="range" />
phần tử và sử dụng trình duyệt chéo, bạn cần thêm một chút dòng JS & CSS.
Trên Chrome / Mozilla, bạn có thể sử dụng các linear-gradient
kỹ thuật, nhưng bạn cần phải điều chỉnh tỷ lệ dựa trên min
, max
, value
thuộc tính như đã đề cập ở đây bởi @Attila O. . Bạn cần đảm bảo rằng bạn không áp dụng điều này trên Edge, nếu không ngón tay cái sẽ không hiển thị. @Geoffrey Lalloué giải thích điều này chi tiết hơn tại đây .
Một điều đáng nói nữa, là bạn cần điều chỉnh rangeEl.style.height = "20px";
trên IE / Older. Nói một cách đơn giản là vì trong trường hợp này "chiều cao không được áp dụng cho bản nhạc mà là toàn bộ đầu vào bao gồm cả ngón tay cái". vĩ cầm
/**
* Sniffs for Older Edge or IE,
* more info here:
* https://stackoverflow.com/q/31721250/3528132
*/
function isOlderEdgeOrIE() {
return (
window.navigator.userAgent.indexOf("MSIE ") > -1 ||
!!navigator.userAgent.match(/Trident.*rv\:11\./) ||
window.navigator.userAgent.indexOf("Edge") > -1
);
}
function valueTotalRatio(value, min, max) {
return ((value - min) / (max - min)).toFixed(2);
}
function getLinearGradientCSS(ratio, leftColor, rightColor) {
return [
'-webkit-gradient(',
'linear, ',
'left top, ',
'right top, ',
'color-stop(' + ratio + ', ' + leftColor + '), ',
'color-stop(' + ratio + ', ' + rightColor + ')',
')'
].join('');
}
function updateRangeEl(rangeEl) {
var ratio = valueTotalRatio(rangeEl.value, rangeEl.min, rangeEl.max);
rangeEl.style.backgroundImage = getLinearGradientCSS(ratio, '#919e4b', '#c5c5c5');
}
function initRangeEl() {
var rangeEl = document.querySelector('input[type=range]');
var textEl = document.querySelector('input[type=text]');
/**
* IE/Older Edge FIX
* On IE/Older Edge the height of the <input type="range" />
* is the whole element as oposed to Chrome/Moz
* where the height is applied to the track.
*
*/
if (isOlderEdgeOrIE()) {
rangeEl.style.height = "20px";
// IE 11/10 fires change instead of input
// https://stackoverflow.com/a/50887531/3528132
rangeEl.addEventListener("change", function(e) {
textEl.value = e.target.value;
});
rangeEl.addEventListener("input", function(e) {
textEl.value = e.target.value;
});
} else {
updateRangeEl(rangeEl);
rangeEl.addEventListener("input", function(e) {
updateRangeEl(e.target);
textEl.value = e.target.value;
});
}
}
initRangeEl();
input[type="range"] {
-webkit-appearance: none;
-moz-appearance: none;
width: 300px;
height: 5px;
padding: 0;
border-radius: 2px;
outline: none;
cursor: pointer;
}
/*Chrome thumb*/
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
-moz-appearance: none;
-webkit-border-radius: 5px;
/*16x16px adjusted to be same as 14x14px on moz*/
height: 16px;
width: 16px;
border-radius: 5px;
background: #e7e7e7;
border: 1px solid #c5c5c5;
}
/*Mozilla thumb*/
input[type="range"]::-moz-range-thumb {
-webkit-appearance: none;
-moz-appearance: none;
-moz-border-radius: 5px;
height: 14px;
width: 14px;
border-radius: 5px;
background: #e7e7e7;
border: 1px solid #c5c5c5;
}
/*IE & Edge input*/
input[type=range]::-ms-track {
width: 300px;
height: 6px;
/*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
background: transparent;
/*leave room for the larger thumb to overflow with a transparent border */
border-color: transparent;
border-width: 2px 0;
/*remove default tick marks*/
color: transparent;
}
/*IE & Edge thumb*/
input[type=range]::-ms-thumb {
height: 14px;
width: 14px;
border-radius: 5px;
background: #e7e7e7;
border: 1px solid #c5c5c5;
}
/*IE & Edge left side*/
input[type=range]::-ms-fill-lower {
background: #919e4b;
border-radius: 2px;
}
/*IE & Edge right side*/
input[type=range]::-ms-fill-upper {
background: #c5c5c5;
border-radius: 2px;
}
/*IE disable tooltip*/
input[type=range]::-ms-tooltip {
display: none;
}
input[type="text"] {
border: none;
}
<input type="range" value="80" min="10" max="100" step="1" />
<input type="text" value="80" size="3" />
Giải pháp được chấp nhận trước đó không hoạt động nữa .
Tôi đã kết thúc việc viết mã một hàm đơn giản bao bọc nó range
vào một vùng chứa được tạo kiểu, thêm thanh cần thiết trước con trỏ. Tôi đã viết ví dụ này trong đó dễ dàng nhìn thấy hai màu 'xanh lam' và 'cam' được đặt trong css, vì vậy chúng có thể được sửa đổi nhanh chóng.
Nếu bạn sử dụng câu trả lời đầu tiên , có vấn đề với ngón tay cái. Trong chrome, nếu bạn muốn ngón cái lớn hơn bản nhạc , thì bóng hộp sẽ chồng lên bản nhạc bằng chiều cao của ngón tay cái.
Chỉ cần tổng hợp tất cả các câu trả lời này và viết thanh trượt hoạt động bình thường với ngón tay cái thanh trượt lớn hơn: jsfiddle
const slider = document.getElementById("myinput")
const min = slider.min
const max = slider.max
const value = slider.value
slider.style.background = `linear-gradient(to right, red 0%, red ${(value-min)/(max-min)*100}%, #DEE2E6 ${(value-min)/(max-min)*100}%, #DEE2E6 100%)`
slider.oninput = function() {
this.style.background = `linear-gradient(to right, red 0%, red ${(this.value-this.min)/(this.max-this.min)*100}%, #DEE2E6 ${(this.value-this.min)/(this.max-this.min)*100}%, #DEE2E6 100%)`
};
#myinput {
border-radius: 8px;
height: 4px;
width: 150px;
outline: none;
-webkit-appearance: none;
}
input[type='range']::-webkit-slider-thumb {
width: 6px;
-webkit-appearance: none;
height: 12px;
background: black;
border-radius: 2px;
}
<div class="chrome">
<input id="myinput" type="range" min="0" value="25" max="200" />
</div>