Элемент положения зафиксированный вертикально, абсолютный горизонтально
вот что я пытаюсь добиться:
Мне нужна кнопка, которая расположена на определенном расстоянии от правой стороны div и всегда находится на том же расстоянии от стороны div независимо от размера окна просмотра, но будет прокручиваться с окном.
таким образом, это X пикселей с правой стороны div во все времена, но y пикселей с верхней части порта просмотра во все времена.
это возможно?
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"); } });