【问题标题】:How to do the right positioning of css elements?如何正确定位css元素?
【发布时间】:2015-07-14 13:26:08
【问题描述】:

我正在做一个基于 noUi Slider 的滑块。试图实现这样说“优雅”的解决方案。由于我的 ui 句柄很大,因此我将 ui 基数稍大一些,并在基数中添加了额外的值。但是这些值是不允许的,并且句柄将跳回到允许的值。我决定将加号和减号按钮放在限制值所在的位置。

但问题是我无法实现当您将手柄移到控制符号(加号/减号)上时它们会隐藏在手柄后面的效果。就我而言,他们仍然位居榜首。我无法解决这个问题。

一些帮助/建议会很棒。

这是我的代码(样式在 JSFiddle 上):

$(document).ready(function(){

    var sliders = document.getElementById('red'),
        input = document.getElementById('handle'),
        sliderPlus = document.getElementById('slider-amount-plus'),
        sliderMinus = document.getElementById('slider-amount-minus'),
        termCur = 500;

    noUiSlider.create(sliders, {
        start: termCur,
        step: 50,
        connect: "lower",
        range: {
            'min': 0,
            'max': 1100
        },
        pips: {
            mode: 'values',
            values: [100, 500, 1000],
            density: 4.5
        }
    });
    $('<div class="value">' + termCur + ' zł' + '</div>').appendTo($('.noUi-handle', sliders));


sliders.noUiSlider.on('change', function ( values, handle ) {
    if ( values[handle] < 100 ) {
        sliders.noUiSlider.set(100);
    } else if ( values[handle] > 1000 ) {
        sliders.noUiSlider.set(1000);
    }
});
sliders.noUiSlider.on('update', function( values ) {
    termCur = values;
    if( termCur >= 100 && termCur <= 1000 ) {
    $('.value', sliders).text(parseInt(termCur) + ' zł');}
});
sliderPlus.addEventListener('click', function(){
    if(termCur < 1000) {
        var setValue = parseInt(termCur) + 50;
        sliders.noUiSlider.set(setValue);
    }
}); 
sliderMinus.addEventListener('click', function(){
    if(termCur > 100) {
        var setValue = parseInt(termCur) - 50;
        sliders.noUiSlider.set(setValue);
    }
}); 

<div class="sliders" id="red">
        <a class="controls-symbols slider-minus" id="slider-amount-minus"><i class="fa fa-minus"></i></a>
        <a class="controls-symbols slider-plus" id="slider-amount-plus"><i class="fa fa-plus"></i></a>
    </div>

https://jsfiddle.net/o7Ly845j/

【问题讨论】:

  • 您是否正在尝试实现类似Fiddle 的目标?
  • 不完全。当我悬停时,您正在隐藏减号/加号控制元素。我想要实现的是控制元素将始终存在,就像它们现在一样。但是当我将手柄移动到该区域时(控制元素的区域,因为它是允许的,在它反弹之前),控制元素将隐藏在手柄后面,而不是留在前面。
  • 哦,我明白了。
  • 你在寻找类似Fiddle的东西吗?
  • 如果您打算使用 DOM 操作,那么您可能希望使用 jQuerys on 方法附加您的点击事件,如下所示:$(document).on('click', sliderMinus, function(e){ alert('click'); }); 这将确保始终附加事件。在对 sliderMinus 的引用被克隆然后删除之前,因此事件没有正常进行

标签: jquery html css css-position z-index


【解决方案1】:

所以,使用最后一个@zgood fiddle,我猜问题不再是 z 顺序了,这是因为滑块和加/减元素都在获取事件,并且到加号的时候/minus events 抓住了它,滑块已经在 1100 或 0。所以我改变了事件,所以 plus/minus 首先得到了事件并阻止它进入酒吧。我真的只需要停止 mousedown 并且大多数问题都会自行解决。在那之后,我可以取出所有 > 100 和

我还注意到,一旦您达到 50/1050,滑块按钮就会覆盖加/减。所以我在小提琴中将 plus/minus 更改为 z-index:13 而不是 3。我不确定哪个更好,所以请尝试 3 和 13 并做出自己的决定。

https://jsfiddle.net/guyschalnat/radpjf47/2/

$(document).ready(function(){

    var sliders = document.getElementById('red'),
        input = document.getElementById('handle'),
        termCur = 500;

    noUiSlider.create(sliders, {
        start: termCur,
        step: 50,
        connect: "lower",
        range: {
            'min': 0,
            'max': 1100
        },
        pips: {
            mode: 'values',
            values: [100, 500, 1000],
            density: 4.5
        }
    });
    $('<div class="value">' + termCur + ' zł' + '</div>').appendTo($('.noUi-handle', sliders));

    var c = $('#red > span').clone(true);
    $('#red > span').remove();
    $('.noUi-base').prepend(c);

    sliders.noUiSlider.on('update', function( values ) {
        var val = parseInt(values);
        termCur = val;
        $('.value', sliders).text(termCur + ' zł');
    });
    $('#slider-amount-plus').click(function(e){
        if(termCur < 1100) {
            termCur = termCur + 50;
            sliders.noUiSlider.set(termCur);
            $('.value', sliders).text(termCur + ' zł');
        }
       e.stopPropagation();
    }).mousedown(function(e){
       e.stopPropagation();
    });     
    $('#slider-amount-minus').click(function(e){ 
        if(termCur > 0) {
            termCur = termCur - 50;
            sliders.noUiSlider.set(termCur);
            $('.value', sliders).text(termCur + ' zł');
        }
    }).mousedown(function(e){
       e.stopPropagation();
    }); 

});

【讨论】:

  • 行得通!覆盖加号/减号的滑块按钮实际上是这个想法。 noUI 滑块最初不支持禁用边缘,因此手柄会停在导轨的末端,而是越过,所以想法是使其更宽(使其更具视觉吸引力)并且如果用户滑动向左或向右(0、50、1050、1100),则手柄会弹回。在我自制的边缘,你可以看到加/减,所以这也是点击事件的限制。添加了额外的东西 - fiddle。现在就像一个魅力。
  • @llyaK 太好了!我不知道你要去哪里,但现在我明白了。我喜欢它。
  • 现在是小问题。如果我在不克隆的情况下通过将按钮的代码插入到 prepend 中来添加额外的代码行而不是加号/减号,这不是更好吗? $('.noUi-base').prepend( '&lt;a class="controls-symbols slider-minus" id="slider-amount-minus"&gt;&lt;i class="fa fa-minus"&gt;&lt;/i&gt;&lt;/a&gt;&lt;a class="controls-symbols slider-plus" id="slider-amount-plus"&gt;&lt;i class="fa fa-plus"&gt;&lt;/i&gt;&lt;/a&gt;' ); 当然我怀疑这个小代码会影响页面的整体性能,但仍然。
  • @llyaK 我认为这是一个判断电话。我通常会争取以最快的速度编写出最易维护的代码,这比其他任何事情都更直观。在某些方面,我更喜欢避免克隆,可能是因为我担心更新滑块基本代码时会发生什么,结果发现它们进行了重大更改。所以去你最好的猜测。我没有对实际的滑块库做太多事情,所以我没有太多的感觉。很抱歉,这是一个空洞的答案。
【解决方案2】:

具有共同父元素且按堆叠顺序一起向前或向后移动的元素组构成了所谓的堆叠上下文。 全面了解堆叠上下文是真正掌握 z-index 和堆叠顺序如何工作的关键。

每个堆叠上下文都有一个 HTML 元素作为其根元素。当在元素上形成新的堆叠上下文时,该堆叠上下文将其所有子元素限制在堆叠顺序中的特定位置。这意味着如果一个元素包含在堆叠顺序底部的堆叠上下文中,则无法让它出现在堆叠顺序更高的不同堆叠上下文中的另一个元素之前,即使使用z-index 十亿!

可以通过以下方式之一在元素上形成新的堆叠上下文:

  • 当一个元素是文档的根元素(元素)时

  • 当元素的位置值不是静态的,z-index 值不是自动的时

  • 当元素的不透明度值小于 1 时

  • 除了不透明度之外,一些 CSS 属性还会创建堆叠上下文。其中包括:变换、过滤器、css-regions、分页 媒体,可能还有其他。


以下是在单个堆叠上下文中确定堆叠顺序的基本规则(从后到前):

  • 堆叠上下文的根元素

  • 具有负 z-index 值的定位元素(及其子元素)(较高值堆叠在较低值前面;具有相同值的元素根据 HTML 中的外观堆叠)

    李>
  • 非定位元素(按在 HTML 中的外观排序)

  • z-index 值为 auto 的定位元素(及其子元素)(按 HTML 中的外观排序)

  • 具有正 z-index 值的定位元素(及其子元素)(较高值堆叠在较低值前面;具有相同值的元素根据 HTML 中的外观堆叠)

    李>

注意: 具有负 z-index 的定位元素在堆叠上下文中首先排序,这意味着它们出现在所有其他元素的后面。正因为如此,一个元素有可能出现在它自己的父元素后面,这通常是不可能的。这仅在元素的父元素位于同一堆叠上下文中且不是该堆叠上下文的根元素时才有效。


我用 jQuery 创建了一个“hackish”方式来做到这一点,你可以view the Fiddle here。不过,这不是一个永久的解决方案,我正在努力抽象定位,因为它使用静态值。我还将弄清楚为什么 CSS 不正常并在此处发布。

     $(document).mousemove(function (e) {
         var newpos = $(".noUi-handle").offset().left;

         if (newpos < 0) {
             $(".slider-minus").hide();
         } else { 
             $(".slider-minus").show();
         }

         if (newpos > 830) {
             $(".slider-plus").hide();  
         } else {  
             $(".slider-plus").show();
         }     
    });

更新 Here is a better version,现在正在研究为什么 CSS 不能为你做这件事。

【讨论】:

  • @HimeshAadeshara 对不起什么?我不明白你在说什么。
  • 看起来问题已由您解答。您希望通过赏金实现什么目标?我不介意深入研究这一点,但我想知道我正在努力实现的目标,超越你已经完成的目标。
  • @GuySchalnat,我们的想法是让它发挥作用。 Notorious Pet 让它与 jQuery 一起工作,但解决方案很重,z-index 解决方案到目前为止也没有成功。我看过竞争对手,他们都没有使用类似的解决方案,如果使用加/减,通常他们把它放在滑块之外,这是一个无赖。
  • @GuySchalnat CSS 部分。 jquery 解决方案充其量是“hackish”。它真的应该在 CSS 中完成,我想知道为什么 z-index 的东西不起作用,因为我花了一些时间但无法弄清楚。
  • @IlyaK 如果我这个周末有时间,我可能会再看看这个。您还在寻找解决方案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多