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