Встановити ширину поділу "Положення: фіксований" щодо батьківського діла


137

Я намагаюся надати div (позиція: фіксований) шириною 100% (стосується його батьківського діва). Але у мене є деякі проблеми ...

EDIT: Перша проблема вирішується за допомогою спадкування, але вона все ще не працює. Я думаю, що проблема полягає в тому, що я використовую кілька дівок, які приймають ширину 100% / успадковується. Ви можете знайти другу проблему в оновлення jsfiddle: http://jsfiddle.net/4bGqF/7/

Приклад Фокса

#container {
    width: 800px;
}

#fixed {
    position: fixed;
    width: 100%;
}

і html

<div id="container">
    <div id="fixed">Sitename</div>
    <p>
        blaat
    </p>
</div>

Або ви можете спробувати: http://jsfiddle.net/4bGqF/

Проблеми, здається, полягають у тому, що нерухомий елемент завжди приймає ширину вікна / документа . Хтось знає, як це виправити?

Я не можу зафіксувати свій фіксований елемент, оскільки я використовую плагін jScrollPane. Це залежить від вмісту, чи є смуга прокрутки чи ні.

Дуже дякую!

PS: Текст двох дівок знаходиться один на одного. Це лише приклад, який насправді не має значення.


см моєї відповіді нижче , який пропонує деякий додаткове розуміння inheritі як використання max-width:inheritз width:inheritТримає / Міститься співвідношення контейнера того ж час , ще будучи гнучким і керованим
aequalsb

Відповіді:


120

Я не впевнений, що це за друга проблема (виходячи з вашої редакції), але якщо ви застосовуєтесь width:inheritдо всіх внутрішніх даних, це працює: http://jsfiddle.net/4bGqF/9/

Можливо, ви захочете розглянути javascript-рішення для веб-переглядачів, які вам потрібно підтримувати і не підтримують width:inherit


4
+1 для фантастично простого рішення, хоча width: inheritце не перше, що я б подумав
Bojangles

7
Що це за чаклунство ?! +1
Ніку Сурду

7
Будь-яка ідея, як вирішити це, якщо #container ширина 50% всередині div з шириною = 100px (тоді ширина контейнера буде 50px, а фіксована ширина - 50% від ширини браузера)?
Кек

113
Трюк із успадкуванням батьківської ширини працює лише в тому випадку, якщо у батьків встановлена ​​ширина у px.
jahu

33
Це досить погана відповідь ... Це в основному еквівалент встановлення постійних значень, що зовсім не корисно.
Джей

33

Як багато хто коментує, чуйний дизайн дуже часто встановлює ширину на%

width:inheritбуде успадковувати ширину CSS НЕ обчислену ширину - Що означає дочірній контейнер успадковуєwidth:100%

Але, я думаю, майже так само часто реагують дизайнерські набори max-width, тому:

#container {
    width:100%;
    max-width:800px;
}
#contained {
    position:fixed;
    width:inherit;
    max-width:inherit;
}

Це спрацювало дуже задовільно, щоб вирішити мою проблему, щоб зробити липке меню обмеженим до початкової ширини батьків кожного разу, коли воно "застрягло"

І батько, і дитина дотримуватимуться, width:100%якщо вікно перегляду менше максимальної ширини. Так само обидва будуть дотримуватисяmax-width:800px коли вікно перегляду ширше.

Це працює з моєю вже реагуючою темою, щоб я міг змінити батьківський контейнер, не змінюючи також фіксований дочірній елемент - елегантний та гнучкий

ps: Я особисто думаю, що не має значення один біт, який IE6 / 7 не використовує inherit


Чудова відповідь! У моєму випадку додавання min-width: inheritзробив трюк.
Бруно Монтейро

Це працює для батьківських елементів із шириною, визначеною як px та відсоток. На мій погляд, має бути правильною відповіддю.
Мікель

24

фіксована позиція трохи хитра (справді неможлива), але позиція: липкий прекрасно виконує трюк:

<div class='container'>
  <header>This is the header</header>
  <section>
    ... long lorem ipsum
  </section>
</div>

body {
  text-align: center;  
}

.container {
  text-align: left;
  max-width: 30%;
  margin: 0 auto;
}


header {
  line-height: 2rem;
  outline: 1px solid red;
  background: #fff;
  padding: 1rem;

  position: sticky;
  top: 0;
}

див. зразок кодексу


11

Ви також можете вирішити це за допомогою jQuery:

var new_width = $('#container').width();
$('#fixed').width(new_width); 

Це було так корисно для мене, тому що мій макет був чуйним, і inheritрішення не працювало зі мною!


1
погана відповідь, якщо ви зміните розмір вікна, це зламається.
Джей

2
Справді має бути window.onresize обробник подій.
кручений піксель

Це спосіб зробити. Можна було зафіксувати функцію setWidth (), а потім викликати її на "load" та "змінити розмір" слухачів вікна подій
woodz

Це добре спрацювало для мене! Я зіткнувся з проблемою, де батьківська ширина: 25%, так що роблячи ширину: успадковувати кожну дочірню ширину: 25%.
Трой Рімер

10

Використовуйте цей CSS:

#container {
    width: 400px;
    border: 1px solid red;
}

#fixed {
    position: fixed;
    width: inherit;
    border: 1px solid green;
}

Елемент #fixed успадкує його батьківську ширину, тому це буде 100% від цього.


1
крім IE6-7 не підтримують inherit. Не впевнений, чи той матессер.
Томас Шилдс

Дуже дякую. Це спрацьовує, коли я пробую це на прикладі, але не в коді ... У будь-якому випадку це відповідь на питання, яке я тут задав. Мабуть, є ще одна причина, чому це не працює ... Але все ж, дякую!
Дннз

6

Фіксоване позиціонування повинно визначати все, що стосується вікна перегляду, тому position:fixedзавжди робимо це. Спробуйте скористатися position:relativeдочірнім дівом. (Я усвідомлюю, що вам може знадобитися фіксоване позиціонування з інших причин, але якщо так - ви не можете реально зрівняти ширину, з якою він відповідає батькові, без JS inherit)


1
@Downvoter - ви можете пояснити, будь ласка? У мене немає жодної проблеми з головою, але мені хочеться знати, чому я можу в майбутньому поліпшити свої відповіді.
Томас Шилдс

1
У вас пояснення добре, проте ви сказали, що "ви не можете дійсно зрівняти ширину, яка є батьківською без JS". Хоча це можливо в деяких випадках (за допомогою спадкування).
Dnns

о, звичайно. Я забув про спадщину, оскільки я націлюю багато IE, і лише IE9 + підтримує його.
Томас Шилдс

1
навіть Microsoft хоче, щоб IE зник - враховуючи, скільки років це оригінальна публікація, я думаю, що можна впевнено сказати, що питання IE є суперечливим. якщо настійно рекомендую не підтримувати IE UNLESS, ви виставляєте рахунки саме за таку підтримку - і за годину!
aequalsb

3

Ось невеликий злом, який ми зіткнулися, виправляючи деякі проблеми з перемальовуванням у великому додатку.

Використовувати -webkit-transform: translateZ(0);на батьківському. Звичайно, це характерно для Chrome.

http://jsfiddle.net/senica/bCQEa/

-webkit-transform: translateZ(0);

2
Це виправляє проблему з шириною, але це робить дитину невиправленою щодо вікна перегляду.
Vivek Maharajh

Вибачте за голосування, оскільки це повністю перемагає мету позиції: виправлено.
trusktr

Я не думаю, що ви читали питання. У ньому йдеться про те, як зробити діва "родичем" батька з "фіксованою" позицією. ТАКОГО ТОО - антифіксоване положення. І моя відповідь чітко говорить: "хак". Це не переможе мету, коли вона наблизить до вас рішення.
Senica Gonzalez

1

Для цього є просте рішення.

Я використав фіксовану позицію для батьківського діва та максимальну ширину для вмісту.

Не потрібно занадто багато думати про інші контейнери, оскільки фіксована позиція лише відносно вікна браузера.

       .fixed{
            width:100%;
            position:fixed;
            height:100px;
            background: red;
        }

        .fixed .content{
            max-width: 500px;
            background:blue;
            margin: 0 auto;
            text-align: center;
            padding: 20px 0;
        }
<div class="fixed">
  <div class="content">
     This is my content
  </div>
</div>


1

Це рішення відповідає наступним критеріям

  1. Процентна ширина дозволена для батьків
  2. Працює після зміни розміру вікон
  3. Вміст під заголовком ніколи не є недоступним

Наскільки мені відомо, цей критерій неможливо виконати без Javascript (на жаль).

Це рішення використовує jQuery, але також може бути легко перетворене у ванільний JS:

function fixedHeader(){
  $(this).width($("#wrapper").width());
  $("#header-filler").height($("#header-fixed").outerHeight());
}

$(window).resize(function() {
  fixedHeader();
});

fixedHeader();
#header-fixed{
  position: fixed;
  background-color: white;
  top: 0;
}
#header-filler{
  width: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="wrapper">
<div id="header-fixed">
  This is a nifty header! works even when resizing the window causing a line break
</div>
<div id="header-filler"></div>

[start fluff]<br>
a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>
a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>
a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>
[end fluff]

</div>


0

Вам потрібно надати однаковий стиль нерухомого елемента та його батьківського елемента. Один з таких прикладів створюється з максимальною шириною, а в іншому прикладі - з прокладками.

* {
  box-sizing: border-box
}
body {
  margin: 0;
}
.container {
  max-width: 500px;
  height: 100px;
  width: 100%;
  margin-left: auto;
  margin-right: auto;
  background-color: lightgray;
}
.content {
  max-width: 500px;
  width: 100%;
  position: fixed;
}
h2 {
  border: 1px dotted black;
  padding: 10px;
}
.container-2 {
  height: 100px;
  padding-left: 32px;
  padding-right: 32px;
  margin-top: 10px;
  background-color: lightgray;
}
.content-2 {
  width: 100%;
  position: fixed;
  left: 0;
  padding-left: 32px;
  padding-right: 32px;
}
<div class="container">
  <div class="content">
    <h2>container with max widths</h2>
  </div>
</div>

<div class="container-2">
  <div class="content-2">
    <div>
      <h2>container with paddings</h2>
    </div>
  </div>
</div>

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