我喜欢 Polymer 纸元素,我想使用纸滑块元素。
但是,我希望它是垂直的。我试图应用 css 来旋转它;
transform: rotate(90deg);
这会旋转滑块,但不会旋转“输入”;仍然必须单击并水平拖动鼠标才能使“旋钮”上下移动。
这很烦人,任何帮助都值得感谢!
我喜欢 Polymer 纸元素,我想使用纸滑块元素。
但是,我希望它是垂直的。我试图应用 css 来旋转它;
transform: rotate(90deg);
这会旋转滑块,但不会旋转“输入”;仍然必须单击并水平拖动鼠标才能使“旋钮”上下移动。
这很烦人,任何帮助都值得感谢!
tk-vslider是一个经过调整的具有旋转功能的纸滑块。使用它而不是纸滑块来解决这个问题。使用凉亭安装"tkvslider": "0.5.5"
<tk-vslider rotate="true"></tk-vslider>
调整。
如果rotate == true
那么
div#sliderContainer
是 css 旋转了 90 度on-trackx
被div#sliderKnob
替换为on-track
track
取e.dy
而不是e.dx
.<s-slider>
具有vertical
垂直方向的属性https://github.com/StartPolymer/s-slider
这可能是一种非常老套的方法,但是自从您将其作为功能请求以来,我们已经过了一年,而且它看起来还不是优先事项。我认为这将(在大多数情况下)允许paper-slider
Polymer 团队继续更新,而无需依赖可能不会继续支持的第三方(据我所知,tk-vslider
此处提到的自定义元素尚未更新以支持 Polymer 1.0 )。
首先,CSS。我发现如果我旋转 90 度,较小的值位于滑块的顶部,我发现这是违反直觉的。所以我改为旋转-90。边距发生了一些奇怪的事情,但这就是最终为我做的事情:
paper-slider {
width: 20vh;
margin: 10vh -10vh;
--webkit-transform: rotate(-90deg);
transform: rotate(-90deg);
}
我将纸滑块放在我自己的自定义元素中,所以我将以下代码放在就绪回调中,但我想你可以将它放在任何你需要的地方,只要你可以选择滑块元素。我们基本上只是要覆盖paper-slider
用于响应拖动事件的方法。就是这样:
var slider = this.$.slider;
slider._trackX = function(e) {
if (!slider.dragging) {
slider._trackStart(e);
}
var dx = Math.min(slider._maxx, Math.max(slider._minx, (-1 * e.detail.dy)));
slider._x = slider._startx + dx;
var immediateValue = slider._calcStep(slider._calcKnobPosition(slider._x / slider._w));
slider._setImmediateValue(immediateValue);
// update knob's position
var translateY = ((slider._calcRatio(immediateValue) * slider._w) - slider._startx);
slider.translate3d(translateY + 'px', 0, 0, slider.$.sliderKnob);
};
几乎整个这个方法都是从paper-slider
源代码中复制过来的,唯一真正的变化是,我们没有抓住 x 坐标,e.detail.dx
而是抓住了 y坐标e.detail.dy
。仅当您希望滑块底部的值较小并且您旋转paper-slider
了 -90 度时,才需要负乘数。请注意,如果 Polymer 团队更改了方法的名称_trackX
,它将破坏此解决方案。我知道这有点晚了,但希望它能帮助其他人发现自己处于类似情况(就像我一样)。
更新:可能应该对这个解决方案进行更多测试,结果发现还有另一个函数需要被覆盖来处理点击事件(另一个只处理拖动)。我通过在我的其他方法下面添加它来让它工作:
slider._bardown = function(event) {
slider._w = slider.$.sliderBar.offsetWidth;
var rect = slider.$.sliderBar.getBoundingClientRect();
var ratio = ((rect.bottom - event.detail.y) / slider._w);
var prevRatio = slider.ratio;
slider._setTransiting(true);
slider._positionKnob(ratio);
slider.debounce('expandKnob', slider._expandKnob, 60);
// if the ratio doesn't change, sliderKnob's animation won't start
// and `_knobTransitionEnd` won't be called
// Therefore, we need to manually update the `transiting` state
if (prevRatio === slider.ratio) {
slider._setTransiting(false);
}
slider.async(function() {
slider.fire('change');
});
// cancel selection
event.preventDefault();
}
此方法的主要变化是计算比率的行。之前var ratio = (event.detail.x - rect.left) / this._w;
zberry 的回答不再适合我了。但是,我接受了他的回答并进行了更新。使纸滑块垂直响应的 Polymer3 解决方案如下所示(假设使用相同的 CSS zberry):
let slider = this.shadowRoot.querySelector('paper-slider');
slider._trackX = function(event) {
if (!slider.dragging) {
slider._trackStart(event);
}
var dx =
Math.min(slider._maxx, Math.max(slider._minx, -1 * event.detail.dy));
slider._x = slider._startx + dx;
var immediateValue =
slider._calcStep(slider._calcKnobPosition(slider._x / slider._w * 100));
slider._setImmediateValue(immediateValue);
// update knob's position
var translateX =
((slider._calcRatio(slider.immediateValue) * slider._w) -
slider._knobstartx);
slider.translate3d(translateX + 'px', 0, 0, slider.$.sliderKnob);
};
slider._barclick = function(event) {
slider._w = slider.$.sliderBar.offsetWidth;
var rect = slider.$.sliderBar.getBoundingClientRect();
var ratio = (rect.bottom - event.detail.y) / slider._w * 100;
if (slider._isRTL) {
ratio = 100 - ratio;
}
var prevRatio = slider.ratio;
slider._setTransiting(true);
slider._positionKnob(ratio);
// if the ratio doesn't change, sliderKnob's animation won't start
// and `_knobTransitionEnd` won't be called
// Therefore, we need to manually update the `transiting` state
if (prevRatio === slider.ratio) {
slider._setTransiting(false);
}
slider.async(function() {
slider.fire('change', {composed: true});
});
// cancel selection
event.preventDefault();
// set the focus manually because we will called prevent default
slider.focus();
};
如果你想从上到下滑动,你必须摆弄方向