¿Cómo puedo hacer width = 100% - 100px en CSS?


153

En CSS, ¿cómo puedo hacer algo como esto?

width: 100% - 100px;

Supongo que esto es bastante simple, pero es un poco difícil encontrar ejemplos que lo demuestren.


1
La pregunta vinculada stackoverflow.com/questions/11093943/… ofrece una respuesta interesante, pero no totalmente compatible con versiones anteriores, tal vez le gustaría echarle un vistazo también.
— 11684

55
Para cualquiera que cruce esta pregunta, Chad respondió que los navegadores modernos admiten width: calc(100% - 100px);que hay algunas respuestas y espero que el autor de la pregunta actualice su pregunta :) :)
— Anders M.

Respuestas:


278

Los navegadores modernos ahora admiten:

width: calc(100% - 100px);

Para ver la lista de versiones de navegador admitidas, ¿puede usar calc () como valor de unidad CSS?

Hay una reserva de jQuery: css ancho: calc (100% -100px); alternativa usando jquery


13
Descubrí que cuando estaba usando, calc(100% - 6px)por ejemplo, se mostraba como calc(94%), tuve que escapar de la siguiente manera y ahora funcionawidth: calc(~"100% - 6px");
— nsilva

12
Tenga en cuenta que debe tener espacios en blanco alrededor del -(o +) carácter. Esto funciona: calc(100% - 100px); Y esto no:calc(100%-100px);
— freefaller

Estoy un poco sorprendido de que no haya ninguna opción para restar automáticamente 2 veces el relleno del elemento, lo que generalmente sería un caso de uso bastante común. Por ejemplo, termino teniendo que hacerlo padding: 0.25em; width: calc(100% - 2 * 0.25em - 2em);, y tendría que cambiarlo 0.25emen dos lugares ahora si tiene que ser modificado.
— cnst

Muchas gracias, también me gustaría señalar que funciona para agregar: (100% + 100px)
— Viktor Mellgren

99

¿Podrías anidar un div con margin-left: 50px;y margin-right: 50px;dentro de un <div>con width: 100%;?


44
ancho: calc (100% - 100px); esta es la respuesta correcta en su lugar.
— Sushan

17

Puedes probar esto ...

<!--First Solution-->
width: calc(100% - 100px);
<!--Second Solution-->
width: calc(100vh - 100px);

vw: ancho de ventana

vh: altura de la ventana gráfica


La primera solución es correcta, el contenedor podría no ser la ventana y, por lo tanto, 100vh podría no ser igual al 100%
— Ben Taliadoros

1
Descubrí que cuando estaba usando, calc(100% - 6px)por ejemplo, se mostraba como calc(94%), tenía que escapar de la siguiente manera y ahora funcionawidth: calc(~"100% - 6px");
— nsilva

4

mi código, y funciona para IE6:

<style>
#container {margin:0 auto; width:100%;}
#header { height:100px; background:#9c6; margin-bottom:5px;}
#mainContent { height:500px; margin-bottom:5px;}
#sidebar { float:left; width:100px; height:500px; background:#cf9;}
#content { margin-left:100px; height:500px; background:#ffa;}

</style>

<div id="container">
  <div id="header">header</div>
  <div id="mainContent">
    <div id="sidebar">left</div>
    <div id="content">right 100% - 100px</div>
  <span style="display:none"></span></div>
</div>

ingrese la descripción de la imagen aquí


66
¿Para qué es ese Javascript?
— Faiz

3

Debe tener un contenedor para su div de contenido que desea que sea 100% - 100px

#container {
   width: 100%
}
#content {
   margin-right:100px;
   width:100%;
}

<div id="container">
  <div id="content">
      Your content here
  </div>
</div>

Es posible que deba agregar un div de limpieza justo antes del último </div>si su div de contenido se desborda.

<div style="clear:both; height:1px; line-height:0">&nbsp;</div>

1
Esto no funcionará. El ancho del contenido será del 100%: jsfiddle.net/cuezK/1
— gilly3

2

Establecer los márgenes del cuerpo a 0, el ancho del contenedor externo al 100%, y usar un contenedor interno con 50px márgenes izquierdo / derecho parece funcionar.

<style>
body {
    margin: 0;
    padding: 0;
}

.full-width
{
    width: 100%;
}

.innerContainer
{
    margin: 0px 50px 0px 50px;
}
</style>

<body>
  <div class="full-width" style="background-color: #ff0000;">
    <div class="innerContainer" style="background-color: #00ff00;">
      content here
    </div>
  </div>
</body>

2

Al trabajar con paneles de arranque, buscaba cómo colocar el enlace "eliminar" en el panel de encabezado, que no estaría oscurecido por el elemento vecino largo. Y aquí está la solución:

html:

<div class="with-right-link">
    <a class="left-link" href="#">Long link header Long link header</a>
    <a class="right-link" href="#">Delete</a>
</div>

css:

.with-right-link { position: relative; width: 275px; }
a.left-link { display: inline-block; margin-right: 100px; }
a.right-link { position: absolute; top: 0; right: 0; }

Por supuesto, puede modificar los valores "superior" y "derecho", de acuerdo con sus hendiduras. Fuente


2

Comenzó a funcionar para mí solo cuando revisé todos los espacios. Entonces, no funcionó así: width: calc(100%- 20px)o calc(100%-20px)funcionó perfectamente width: calc(100% - 20px).


1

Podrías hacer:

margin-right: 50px;
margin-left: 50px;

Editar: mi solución está mal. La solución publicada por Aric TenEyck que sugiere usar un div con un ancho del 100% y luego anidar otro div usando los márgenes parece más correcto.


3
Si haces esto, ¿no terminarás con un ancho total de 100% + 100px?
— Adam Crume

: o (Lo siento. ¿Debería eliminar mi publicación o dejarla y dejar que los votos
— negativos la

1
los votos negativos generalmente tienen el propósito de alentarlo a que limpie su publicación para que pueda recuperar puntos de representación perdidos por los votos negativos. Si sabe que su solución es incorrecta, puede eliminarla con o sin votos negativos o actualizarla para que sea correcta.
— aleemb

@AdamCrume - No Ese solo sería el caso si también especificaras width:100%. Un div llenará automáticamente el contenedor a menos que lo anule, por ejemplo, especificando explícitamente width, o usando floato posicionamiento absoluto. Agregar un margen a un div solo hará que llene su contenedor, menos la cantidad especificada por el margen.
— gilly3

@aleemb: en este caso, los votos negativos son de usuarios que no entienden css ya que esta respuesta es perfectamente correcta.
— gilly3

1

El relleno en el div externo obtendrá el efecto deseado.

<html>
<head>
<style>
    #outer{
        padding: 0 50px;
        border:1px solid black; /*for visualization*/
    }

    #inner{
        border:1px solid red; /*for visualization*/
    }
</style>
</head>
<body>
<div id="outer">
    <div id="inner">
        100px smaller than outer
    </div>
</div>
</body>
</html>

1

Hay 2 técnicas que pueden ser útiles para este escenario común. Cada uno tiene sus inconvenientes, pero ambos pueden ser útiles a veces.

tamaño de la caja: border-box incluye relleno y ancho del borde en el ancho de un elemento. Por ejemplo, si establece el ancho de un div con 20px 20px padding y 1px border a 100px, el ancho real sería 142px pero con border-box, tanto el relleno como el margen están dentro de 100px.

.bb{
    -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
    -moz-box-sizing: border-box;    /* Firefox, other Gecko */
    box-sizing: border-box;     
    width: 100%;
    height:200px;
    padding: 50px;
}

Aquí hay un excelente artículo sobre él: http://css-tricks.com/box-sizing/ y aquí hay un violín http://jsfiddle.net/L3Rvw/

Y luego está la posición: absoluta

.padded{
    position: absolute;
    top: 50px;
    right: 50px;
    left: 50px;
    bottom: 50px;
    background-color: #aefebc;
}

http://jsfiddle.net/Mw9CT/1/

Tampoco son perfectos, por supuesto, el tamaño de la caja no se ajusta exactamente a la pregunta, ya que el elemento es en realidad 100% de ancho, en lugar de 100% - 100px (sin embargo, un elemento secundario sería). Y el posicionamiento absoluto definitivamente no se puede usar en todas las situaciones, pero generalmente está bien siempre que se establezca la altura principal.


0

CSS no se puede usar para animación, o cualquier modificación de estilo en eventos.

La única forma es usar una función de JavaScript, que devolverá el ancho de un elemento dado, luego, restará 100 píxeles y establecerá el nuevo tamaño de ancho.

Suponiendo que está utilizando jQuery, podría hacer algo así:

oldWidth = $('#yourElem').width();
$('#yourElem').width(oldWidth-100);

Y con javascript nativo:

oldWidth = document.getElementById('yourElem').clientWidth;
document.getElementById('yourElem').style.width = oldWidth-100+'px';

Suponemos que tiene un estilo CSS establecido con 100%;


0

¿Estás usando el modo estándar? Esta solución depende de ello, creo.

Si está tratando de hacer 2 columnas, podría hacer algo como esto:

<div id="outer">
    <div id="left">
        sidebar
    </div>
    <div id="main">
        lorem ispsum etc... 
    </div>
</div>

Luego usa CSS para darle estilo:

div#outer
{
    width:100%;
    height: 500px;
}

div#left
{
    width: 100px;
    height: 100%;
    float:left;
    background: green;
}

div#main
{
   width: auto;
   margin-left: 100px; /* same as div#left width */
   height: 100%;
   background:red;
}

Si no quieres 2 columnas, probablemente puedas eliminar <div id="left">


0
<div style="width: 200px; border: 1px solid red;">
    <br>
    <div style="margin: 0px 50px 0px 50px; border: 1px solid blue;">
        <br>
    </div>
    <br>
</div>

0

Puede usar LESS , que es un archivo JavaScript que procesa previamente su CSS para poder incluir lógica y variables en su CSS. Entonces, para su ejemplo, en MENOS escribiría width: 100% - 100px;para lograr exactamente lo que quería :)


-1

No puedes

Sin embargo, puede utilizar márgenes para obtener el mismo resultado.


-1

Esto funciona:

margin-right:100px;
width:auto;

1
¿Podría por favor agregar una explicación a su respuesta?
— Michał Perłakowski

Intenté: calc (100% -100px) y los resultados no son consistentes en todas las plataformas / navegadores, luego intenté simplificar realmente y utilicé el margen derecho: 100px; ancho: auto; y funcionó ...
— user1552559

calc es un componente CSS3 y este CSS funcionará en aquellos navegadores que admitan CSS3.
— Sushan

-2

La respuesta corta es que NO hagas esto en CSS. Internet Explorer tiene soporte para algo llamado Expresiones CSS, pero esto no es estándar y definitivamente no es compatible con otros navegadores como FireFox, por ejemplo.

Sería mejor hacer esto en JavaScript.


Sí, supongo que tendré que mantenerlo en JavaScript, estoy refractando un código y quería eliminar el JavaScript que estaba haciendo eso tks.
— fmsf

1
Por favor, si puede evitarlo, no lo haga en JavaScript. HTML + CSS puede ser complicado y la solución puede no ser obvia, pero es probable que pueda hacer casi cualquier cosa que necesite. Usar JavaScript para diseños estáticos es casi siempre una mala idea.
— Nicole
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.