Establezca un div fijo al 100% del ancho del contenedor principal

83

Tengo una envoltura con algo de relleno, luego tengo un div relativo flotante con un ancho de porcentaje (40%).

Dentro del div relativo flotante tengo un div fijo que me gustaría del mismo tamaño que su padre. Entiendo que un div fijo se elimina del flujo del documento y, como tal, ignora el relleno del envoltorio.

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;
}

Aquí está el violín obligatorio: http://jsfiddle.net/C93mk/489/

¿Alguien sabe de una manera de lograr esto?

He modificado el violín para mostrar más detalles sobre lo que estoy tratando de lograr, perdón por la confusión: http://jsfiddle.net/EVYRE/4/

Jack Murdoch
fuente

Respuestas:

41

Puede usar el margen para el contenedor .wrap en lugar del relleno para .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
fuente
Actualicé mi violín para explicar mejor lo que estoy haciendo: jsfiddle.net/EVYRE/4
Jack Murdoch
@JackMurdoch, la única forma que encuentro sin js es usando calcfor rightand leftproperties. Mira jsfiddle
YD1m
Esto no funcionaría cuando el contenedor se reduce por debajo del ancho máximo (600 px en el ejemplo), pero creo que tiene razón, no se puede hacer fuera de javascript. Gracias por la ayuda.
Jack Murdoch
5
realmente no funciona, mira este violín jsfiddle.net/EVYRE/4 . El ancho de #sidebar sería relativo a su padre (#sidebar_wrap), pero no lo es, y desborda su padre.
mlb
Creo que esto solo funciona porque solo hay un div entre el elemento fijo y la ventana. Esto no funcionaría si el elemento fijo está anidado muchas veces en elementos que no son el 100% del ancho de la ventana
Jay
3

¿Qué tal esto ?

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

Al usar jquery puede establecer cualquier tipo de ancho :)

EDITAR: Como dice Dream en los comentarios, usar JQuery solo para este efecto es inútil e incluso contraproducente. Hice este ejemplo para las personas que usan JQuery para otras cosas en sus páginas y consideran usarlo también para esta parte. Pido disculpas por cualquier inconveniente causado por mi respuesta.

Hristo Valkanov
fuente
"Dentro del div relativo flotante tengo un div fijo que me gustaría tener el mismo tamaño que su padre" - Dentro del "#wrap" tiene '#fixed' que le gusta tener el mismo tamaño que el div '#wrap' (la altura ya está configurada, así que no la cambié). Por favor, explícame qué parte no recibí. ¿Y qué parte del resultado difiere de las otras respuestas?
Hristo Valkanov
2
Hola amigo, no te ofendas. en realidad, la pregunta era proporcionar una respuesta en css, para lo cual presentó jQuery, que debería haber sido una sugerencia que una respuesta.
dreamweiver
Sé que incluso voté a favor de la otra solución con los márgenes, pero no veo por qué nadie puede colocar una solución jquery. Imagínese si dentro de 5 a 6 meses alguien encuentra esta pregunta a través de Google y considera que la solución jquery es más apropiada para su caso.
Hristo Valkanov
1
Estoy de acuerdo en que su solución es perfecta en términos de alcance de jquery pero no en CSS simple. cuando no estoy usando Jquery lib, ¿espera que lo use solo porque encontré una solución simple en jquery como la que ha publicado? Un archivo Jquery lib es de 32 KB comprimido / 91.6 KB (modo de producción) / 252 KB ( modo de desarrollo) .Realmente no es factible que uno use jQuery lib, si no vale la pena. una posible desventaja de jQuery o un punto clave en términos de rendimiento en el sitio
dreamweiver
4
Esto se rompe si cambia el tamaño de la ventana. Ahora tienes que hacer cálculos de tamaño único, genial, suena caro. nty
Jay
3

Intente agregar una transformación al padre (no tiene que hacer nada, podría ser una traducción cero) y establezca el ancho fijo del niño al 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>

Wojtek Kochanowski
fuente
1

Puede usar el posicionamiento absoluto para fijar el pie de página a la base del div principal. También agregué 10px padding-bottom a la envoltura (coincida con la altura del pie de página). El posicionamiento absoluto es relativo al div padre en lugar de fuera del flujo, ya que ya le ha dado el atributo relativo de posición.

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
fuente
Intenté esto inicialmente, pero el problema es que cuando te desplazas, se mueve junto con el resto de los divs, por lo que no es realmente el comportamiento del posicionamiento fijo
ThinkBonobo
1

hombre, tu contenedor es el 40% del ancho del elemento principal

pero cuando usa position: fixed, el ancho se basa en el ancho de la ventana gráfica (documento) ...

pensando, me di cuenta de que su elemento principal tiene un 10% de relleno (izquierda y derecha), significa que su elemento tiene el 80% del ancho total de la página. por lo que su elemento fijo debe tener un 40% basado en el 80% del ancho total

por lo que solo necesita cambiar su clase #fixed a

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

si usa sass, postcss u otro compilador css, puede usar variables para evitar romper el diseño cuando cambia el valor de relleno del elemento padre.

aquí está el violín actualizado http://jsfiddle.net/C93mk/2343/

espero que ayude, saludos

LuizAsFight
fuente
0

Además de tu último jsfiddle , te perdiste una cosa:

#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*/
}

Pero, ¿cómo solucionará esto tu problema? Simple, expliquemos primero por qué es más grande de lo esperado.

El elemento fijo #sidebarusará el tamaño del ancho de la ventana como base para obtener su propio tamaño, como cualquier otro elemento fijo, una vez que este elemento esté definido width:inherity #sidebar_wraptenga un 40% como valor en ancho, luego calculará window.width * 40%, luego, si el ancho de su ventana es mayor que su .containerancho, #sidebarserá mayor que #sidebar_wrap.

De esta manera, debe establecer un ancho máximo en su #sidebar_wrap, para evitar que sea mayor que #sidebar_wrap.

Verifique este jsfiddle que muestra un código de trabajo y explique mejor cómo funciona.

Vagner
fuente
-3

Elimina Padding: 10%;o usa px en lugar del porcentaje para.wrap

vea el ejemplo: 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;

}
Mohammad Masoudian
fuente
necesita que el ancho sea un porcentaje en el #wrap. pero has puesto un fijo con.
Achintha Samindika
Esto es lo mismo que configurar el ancho del elemento fijo manualmente, y no ayuda en absoluto
Jay