Встановіть Fixed 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


Оновив свою скрипку, щоб краще пояснити, що я роблю: jsfiddle.net/EVYRE/4
Джек Мердок

@JackMurdoch, єдиний спосіб, який я знаходжу без js - це використання calcfor rightта leftвластивостей. Подивіться на jsfiddle
YD1m

Це не буде працювати, якщо обгортка зменшена до максимальної ширини (600px у прикладі), але я вважаю, що ви праві, це не можна робити поза javascript. Дякую за допомогу.
Джек Мердок,

5
це насправді не працює, подивіться на цю скрипку jsfiddle.net/EVYRE/4 . Ширина #sidebar буде відносно його батьків (#sidebar_wrap), але це не так, і вона переповнює його батьків.
mlb

Я думаю, це працює лише тому, що між фіксованим елементом та вікном є лише один div. Це не спрацює, якщо фіксований елемент багато разів вкладений в елементи, які не складають 100% ширини вікна
Джей,

3

Як щодо цього ?

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

За допомогою jquery ви можете встановити будь-яку ширину :)

EDIT: Як зазначає dream у коментарях, використовувати JQuery саме для цього ефекту безглуздо і навіть контрпродуктивно. Я зробив цей приклад для людей, які використовують JQuery для інших матеріалів на своїх сторінках, і розглядають можливість використання його і для цієї частини. Перепрошую за незручності, спричинені моєю відповіддю.


"Всередині плаваючого відносного div у мене є фіксований div, який я хотів би мати такий же розмір, як його батьківський" - усередині "#wrap" він має "#fixed", який йому подобається мати такий самий розмір, як div # # wrap (висоту вже встановлено, тому я її не міняв). Поясніть, будь ласка, яку його частину я не отримав? І яка частина результату відрізняється від інших відповідей?
Христо Вальканов

2
Привіт, приятелю, не ображайся. насправді питання полягало в тому, щоб надати відповідь у css, для якого ви ввели jQuery, який повинен був бути пропозицією, ніж відповідати.
dreamweiver

Я знаю, що навіть підтримав інше рішення з полями, але я не розумію, чому ніхто не може розмістити рішення jquery. Уявіть, якщо через 5-6 місяців хтось знайде це питання через Google і вважає рішення jquery більш відповідним для його випадку?
Христо Вальканов

1
Я згоден, що ваше рішення ідеальне з точки зору обсягу jquery, але не для простого css. коли я не використовую бібліотеку Jquery, чи очікуєте ви, що я її застосую, просто тому, що я знайшов у jquery таке просте рішення, як ви розмістили. Файл бібліотеки Jquery розміром 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, а не за межами потоку, оскільки ви вже надали йому атрибут relational position.

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/


Я спробував це спочатку, але проблема в тому, що коли ви прокручуєте, він рухається разом з іншими div, таким чином, це насправді не поведінка фіксованого позиціонування
ThinkBonobo

1

man ваш контейнер становить 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/

Я сподіваюся, що це допоможе, привіт


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%;або використовуйте px замість відсотків для.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;

}

йому потрібна ширина, щоб бути відсотком для # обгортання. але ви поставили фіксовану с.
Ачинта Саміндіка

Це те саме, що встановити ширину фіксованого елемента вручну, і зовсім не допомагає
Джей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.