Элемент положения зафиксированный вертикально, абсолютный горизонтально


вот что я пытаюсь добиться:

Мне нужна кнопка, которая расположена на определенном расстоянии от правой стороны div и всегда находится на том же расстоянии от стороны div независимо от размера окна просмотра, но будет прокручиваться с окном.

таким образом, это X пикселей с правой стороны div во все времена, но y пикселей с верхней части порта просмотра во все времена.

это возможно?

3 58

3 ответа:

Положение Фиксированного Элемента По Горизонтали На Основе Другого Элемента

(Отказ От Ответственности Примечание: решение, предлагаемое здесь не технически "абсолютная горизонтально "как указано в заголовке вопроса, но достигло того, что изначально хотел OP, фиксированный элемент положения должен быть" X " расстояние от правого края другого, но фиксируется в его вертикальной прокрутке.)

я люблю эти типы проблем css. В качестве доказательства концепция, да,вы можете получить то, что вы желаете. Возможно, вам придется настроить некоторые вещи для ваших нужд, но вот некоторые примеры html и css, которые прошли FireFox, IE8 и IE7 (IE6, конечно, не имеет position: fixed).

HTML:

<body>
  <div class="inflow">
    <div class="positioner"><!-- may not be needed: see notes below-->
      <div class="fixed"></div>
    </div>
  </div>
</body>

CSS (границы и все размеры для демонстрации):

div.inflow {
  width: 200px; 
  height: 1000px; 
  border: 1px solid blue; 
  float: right; 
  position: relative; 
  margin-right: 100px;
}
div.positioner {position: absolute; right: 0;} /*may not be needed: see below*/
div.fixed {
  width: 80px; 
  border: 1px solid red; 
  height: 100px; 
  position: fixed; 
  top: 60px; 
  margin-left: 15px;
}

ключ - это не то!--3--> или right вообще за горизонталь на то div.fixed но используйте две обертки divs, чтобы установите горизонтальное положение. Элемент div.positioner и не если div.inflow фиксированная ширина, как левый край div.fixed можно установить на известную ширину контейнера. Однако, если вы хотите, чем контейнер, чтобы иметь ширину в процентах, то вам понадобится div.positioner нажать div.fixed С правой стороны div.inflow первый.

Edit: как интересная заметка, когда я установил overflow: hidden (если нужно это сделать) на div.inflow С нет эффекта на фиксированном положении div, находящемся за пределами границ другого. По-видимому, фиксированного положения достаточно, чтобы вывести его из контекста div для overflow.

Я приехал сюда в поисках решения аналогичной проблемы, которая должна была иметь нижний колонтитул, который охватывает ширину окна и сидит ниже (переменной высоты и ширины) контента. Другими словами, сделайте вид, что нижний колонтитул "зафиксирован" относительно своего горизонтального положения, но сохраняет свое нормальное положение в потоке документов относительно своего вертикального положения. В моем случае, у меня был текст, выровненный по правому краю, так он работал для меня, чтобы динамически регулировать ширину нижняя сноска. Вот что я придумал:

HTML

<div id="footer-outer">
<div id="footer">
    Footer text.
</div><!-- end footer -->
</div><!-- end footer-outer -->

CSS

#footer-outer
{
    width: 100%;
}
#footer
{
    text-align: right;
    background-color: blue;
    /* various style attributes, not important for the example */
}

CoffeeScript / JavaScript

(через прототип.js).

class Footer
document.observe 'dom:loaded', ->
    Footer.width = $('footer-outer').getDimensions().width
Event.observe window, 'scroll', ->
    x = document.viewport.getScrollOffsets().left
    $('footer-outer').setStyle( {'width': (Footer.width + x) + "px"} )

, который компилируется в:

Footer = (function() {

  function Footer() {}

  return Footer;

})();

document.observe('dom:loaded', function() {
  return Footer.width = $('footer-outer').getDimensions().width;
});

Event.observe(window, 'scroll', function() {
  var x;
  x = document.viewport.getScrollOffsets().left;
  return $('footer-outer').setStyle({
    'width': (Footer.width + x) + "px"
  });
});

это прекрасно работает в FireFox, и довольно хорошо в Chrome (это немного нервно); я не пробовал другие браузеры.

Я также хотел, чтобы любое свободное пространство под Нижним колонтитулом было другого цвета, поэтому я добавил Это footer-stretch div:

HTML

...
</div><!-- end footer -->
<div id="footer-stretch"></div>
</div><!-- end footer-outer -->

CSS

#footer-outer
{
    height: 100%;
}
#footer-stretch
{
    height: 100%;
    background-color: #2A2A2A;
}

обратите внимание, что для работы #footer-stretch div все родительские элементы до элемента body (и, возможно, элемент html - не уверен) должны иметь фиксированную высоту (в этом случае height = 100%).

после долгих копаний (включая этот пост) я не мог найти решение, которое мне понравилось. Принятый ответ здесь не делает то, что читал заголовок OP, и лучшие решения, которые я мог найти, по общему признанию, привели к нервным элементам. Затем меня поразило: пусть элемент будет "фиксированным", обнаружьте, когда происходит горизонтальная прокрутка, и переключите его на абсолютное положение. Вот полученный код:

просмотр его в виде кода Ручка.

HTML

  <div class="blue">
    <div class="red">
    </div>
  </div>

CSS

/* Styling */
.blue, .red {
  border-style: dashed;
  border-width: 2px;
  padding: 2px;
  margin-bottom: 2px;
}

/* This will be out "vertical-fixed" element */
.red {
  border-color: red;
  height: 120px;
  position: fixed;
  width: 500px;
}

/* Container so we can see when we scroll */
.blue {
  border-color: blue;
  width: 50%;
  display: inline-block;
  height: 800px;
}

JavaScript

$(function () {
  var $document = $(document),
      left = 0,
      scrollTimer = 0;

  // Detect horizontal scroll start and stop.
  $document.on("scroll", function () {
    var docLeft = $document.scrollLeft();
    if(left !== docLeft) {
      var self = this, args = arguments;
      if(!scrollTimer) {
        // We've not yet (re)started the timer: It's the beginning of scrolling.
        startHScroll.apply(self, args);
      }
      window.clearTimeout(scrollTimer);
      scrollTimer = window.setTimeout(function () {
        scrollTimer = 0;
        // Our timer was never stopped: We've finished scrolling.
        stopHScroll.apply(self, args);
      }, 100);
      left = docLeft;
    }
  });

  // Horizontal scroll started - Make div's absolutely positioned.
  function startHScroll () {
    console.log("Scroll Start");
    $(".red")
    // Clear out any left-positioning set by stopHScroll.
    .css("left","")
    .each(function () {
      var $this = $(this),
          pos = $this.offset();
      // Preserve our current vertical position...
      $this.css("top", pos.top)
    })
    // ...before making it absolutely positioned.
    .css("position", "absolute");
  }

  // Horizontal scroll stopped - Make div's float again.
  function stopHScroll () {
    var leftScroll = $(window).scrollLeft();
    console.log("Scroll Stop");
    $(".red")
    // Clear out any top-positioning set by startHScroll.
    .css("top","")
    .each(function () {
      var $this = $(this), 
        pos = $this.position();
      // Preserve our current horizontal position, munus the scroll position...
      $this.css("left", pos.left-leftScroll);
    })
    // ...before making it fixed positioned.
    .css("position", "fixed");
  }
});