Установите фиксированный div на 100% ширины родительского контейнера

83

У меня есть оболочка с некоторым заполнением, затем у меня есть плавающий относительный div с процентной шириной (40%).

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

HTML

<div id="wrapper">
  <div id="wrap">
    Some relative item placed item
    <div id="fixed"></div>
  </div>
</div>

CSS

body { 
  height: 20000px 
}  
#wrapper {
  padding: 10%;
}  
#wrap { 
  float: left;
  position: relative;
  width: 40%; 
  background: #ccc; 
} 
#fixed { 
  position: fixed;
  width: inherit;
  padding: 0px;
  height: 10px;
  background-color: #333;
}

Вот обязательная скрипка: http://jsfiddle.net/C93mk/489/

Кто-нибудь знает, как это сделать?

Я изменил скрипку, чтобы показать более подробную информацию о том, чего я пытаюсь достичь, извините за путаницу: http://jsfiddle.net/EVYRE/4/

Джек Мердок
источник

Ответы:

41

Вы можете использовать поле для контейнера .wrap вместо заполнения для .wrapper:

body{ height:20000px }
#wrapper { padding: 0%; }
#wrap{ 
    float: left;
    position: relative;
    margin: 10%;
    width: 40%; 
    background:#ccc; 
}
#fixed{ 
    position:fixed;
    width:inherit;
    padding:0px; 
    height:10px;
    background-color:#333;    
}

jsfiddle

YD1m
источник
Обновил свою скрипку, чтобы лучше объяснить, что я делаю: jsfiddle.net/EVYRE/4
Джек Мердок
@JackMurdoch, единственный способ найти без js - это использовать свойства calcfor rightи left. Посмотрите на jsfiddle
YD1m
Это не сработает, если обертка будет уменьшена ниже максимальной ширины (600 пикселей в примере), но я считаю, что вы правы, это невозможно сделать за пределами javascript. Спасибо за помощь.
Джек Мердок
5
на самом деле это не работает, посмотрите на эту скрипку jsfiddle.net/EVYRE/4 . Ширина #sidebar будет относительно его родителя (#sidebar_wrap), но это не так, и оно переполняет его родительский элемент.
mlb 04
Я думаю, что это работает только потому, что между фиксированным элементом и окном есть только один div. Это не сработает, если фиксированный элемент вложен много раз в элементы, которые не составляют 100% ширины окна,
Джей
3

Как насчет этого ?

$( document ).ready(function() {
    $('#fixed').width($('#wrap').width());
});

Используя jquery, вы можете установить любую ширину :)

РЕДАКТИРОВАТЬ: Как сказано в комментариях dream, использование JQuery только для этого эффекта бессмысленно и даже контрпродуктивно. Я сделал этот пример для людей, которые используют JQuery для других вещей на своих страницах и рассматривают возможность его использования и для этой части. Приносим извинения за неудобства, вызванные моим ответом.

Христо Валканов
источник
«Внутри плавающего относительного div у меня есть фиксированный div, размер которого я хотел бы иметь такой же, как у его родителя» - внутри «#wrap» у него есть '#fixed', который ему нравится иметь тот же размер, что и div '#wrap'. (высота уже установлена, поэтому я ее не менял). Объясните, пожалуйста, какую часть я не получил? И какая часть результата отличается от других ответов?
Христо Валканов
2
Привет, дружище, без обид. на самом деле вопрос заключался в том, чтобы дать ответ в css, для которого вы ввели jQuery, который должен был быть предложением, чем ответом.
dreamweiver
Я знаю, что даже поддержал другое решение с полями, но я не понимаю, почему никто не может разместить решение jquery. Представьте, что через 5-6 месяцев кто-то найдет этот вопрос через Google и сочтет решение jquery более подходящим для его случая?
Христо Валканов
1
Я согласен, что ваше решение идеально с точки зрения области jquery, но не в простом css. когда я не использую Jquery lib, ожидаете ли вы, что я буду использовать его только потому, что я нашел простое решение в jquery, как вы опубликовали. файл JQuery lib имеет размер 32 КБ в архиве / 91,6 КБ (рабочий режим) / 252 КБ ( режим разработки). действительно невозможно использовать jQuery lib, если это не стоит. один из возможных недостатков jQuery или ключевой момент с точки зрения производительности на сайте
dreamweiver
4
Это сломается, если вы измените размер окна. Теперь вам нужно выполнить расчеты по размеру, круто, звучит дорого. nty
Джей
3

Попробуйте добавить преобразование к родительскому элементу (ничего делать не нужно, может быть нулевой перевод) и установите фиксированную ширину дочернего элемента на 100%.

body{ height:20000px }
#wrapper {padding:10%;}
#wrap{ 
    float: left;
    position: relative;
    width: 40%; 
    background:#ccc; 
    transform: translate(0, 0);
}
#fixed{ 
    position:fixed;
    width:100%;
    padding:0px;
    height:10px;
    background-color:#333;
}
<div id="wrapper">
    <div id="wrap">
    Some relative item placed item
    <div id="fixed"></div>
    </div>
</div>

Войтек Кохановски
источник
1

Вы можете использовать абсолютное позиционирование, чтобы прикрепить нижний колонтитул к основанию родительского div. Я также добавил 10px padding-bottom к обертке (соответствует высоте нижнего колонтитула). Абсолютное позиционирование относительно родительского div, а не вне потока, поскольку вы уже дали ему относительный атрибут позиции.

body{ height:20000px }
#wrapper {padding:10%;}
#wrap{ 
    float: left;
    padding-bottom: 10px;
    position: relative;
    width: 40%; 
    background:#ccc; 
}
#fixed{ 
    position:absolute;
    width:100%;
    left: 0;
    bottom: 0;
    padding:0px;
    height:10px;
    background-color:#333;

}

http://jsfiddle.net/C93mk/497/

MattP
источник
Сначала я пробовал это, но проблема в том, что при прокрутке он перемещается вместе с остальными div, поэтому на самом деле это не поведение фиксированного позиционирования
ThinkBonobo
1

человек, ваш контейнер составляет 40% ширины родительского элемента

но когда вы используете position: fixed, ширина зависит от ширины области просмотра (документа) ...

подумав, я понял, что ваш родительский элемент имеет 10% отступов (слева и справа), это означает, что ваш элемент имеет 80% от общей ширины страницы. поэтому ваш фиксированный элемент должен иметь 40% на основе 80% общей ширины

поэтому вам просто нужно изменить свой #fixed класс на

#fixed{ 
    position:fixed;
    width: calc(80% * 0.4);
    height:10px;
    background-color:#333;
}

если вы используете sass, postcss или другой компилятор css, вы можете использовать переменные, чтобы не нарушать макет при изменении значения отступа родительского элемента.

вот обновленная скрипка http://jsfiddle.net/C93mk/2343/

Надеюсь, это поможет, с уважением

LuizAsFight
источник
0

Помимо последней версии jsfiddle , вы упустили одну вещь:

#sidebar_wrap {
  width:40%;
  height:200px;
  background:green;
  float:right;
}
#sidebar {
  width:inherit;
  margin-top:10px;
  background-color:limegreen;
  position:fixed;
  max-width: 240px; /*This is you missed*/
}

Но как это решит вашу проблему? Просто, давайте сначала объясним, почему больше, чем ожидалось.

Фиксированный элемент #sidebarбудет использовать размер ширины окна в качестве основы для получения своего собственного размера, как и любой другой фиксированный элемент, как только этот элемент определен width:inheritи #sidebar_wrapимеет 40% в качестве значения ширины, затем будет вычисляться window.width * 40%, тогда, когда ширина вашего окна больше, чем ваша .containerширина, #sidebarбудет больше чем #sidebar_wrap.

Таким образом, вы должны установить максимальную ширину в вашем #sidebar_wrap, чтобы не было больше, чем #sidebar_wrap.

Проверьте этот jsfiddle, который показывает рабочий код и лучше объяснит, как это работает.

Вагнер
источник
-3

Удалите Padding: 10%;или используйте пиксели вместо процентов для.wrap

см. пример: http://jsfiddle.net/C93mk/493/

HTML:

<div id="wrapper">
    <div id="wrap">
    Some relative item placed item
    <div id="fixed"></div>
    </div>
</div>

CSS:

body{ height:20000px }
#wrapper {padding:10%;}
#wrap{ 
    float: left;
    position: relative;
    width: 200px; 
    background:#ccc; 
}
#fixed{ 
    position:fixed;
    width:inherit;
    padding:0px;
    height:10px;
    background-color:#333;

}
Мохаммад Масудиан
источник
ему нужна ширина в процентах от #wrap. но вы поставили фиксированный.
Achintha Samindika
Это то же самое, что и установка ширины фиксированного элемента вручную, и совершенно не помогает,
Джей