【问题标题】:Pure CSS Solution - Square Elements? [duplicate]纯 CSS 解决方案 - 方形元素? [复制]
【发布时间】:2012-11-30 21:01:42
【问题描述】:

如果我有一个具有相对宽度(例如 width: 50%)的<div>,是否有一种简单的方法可以使其具有与高度相同的宽度而不使用 JavaScript ?

【问题讨论】:

  • 你的意思是动态的,意思是如果宽度增加那么高度会自动匹配?
  • 感谢您指出这一点。是的,我愿意;更新以反映这一点。
  • 听起来您想在 css 中使用逻辑,据我所知,目前还不可能。请记住,css 的工作不是处理逻辑(至少不是这种能力),而只是布局和显示。像这样的东西(数学计算)正是 javascript 的本意。
  • JavaScript 更多的是一种动态交互的手段,而不是实现某种布局的拐杖。与当前的 CSS 功能相比,这个逻辑非常简单。我很惊讶没有使用纵横比来调整元素大小的方法。
  • 当当前的工具不能做你需要它们做的事情时,这不是拐杖。您感到惊讶并不能改变目前无法单独在 CSS 中完成的事实。

标签: css layout width aspect-ratio


【解决方案1】:

实际上可以通过我发现的这个巧妙的技巧来实现它 this blog

#square {
   width: 100%;
   height: 0;
   padding-bottom: 100%;
}

希望有帮助

【讨论】:

  • 这行得通,而且确实回答了我原来的问题。但是,我的要求略有变化,我需要能够通过具有一定百分比的高度来调整元素的大小,然后相应地设置宽度以使元素成为正方形。这个解决方案似乎不太适用。虽然,也许一个 kluge 会使用 transform: rotate(90deg);对于元素,并变换:旋转(270度);对于里面的内容。
【解决方案2】:

不,是(有点)

好的,所以简短的回答是“不”,不可能。长答案是,“是的”,考虑到某些约束和让步(即额外的 html 标记,以及对可以做什么的限制)。

鉴于此 CSS:

.square {
    position: relative;
    margin: 20px;
    display: inline-block; /* could be float */
    overflow: auto; /* UPDATE: if content may overflow square */
}
.sq-setter-w {
    width: 100%;
    height: auto;
    visibility: hidden;
}
.sq-setter-h {
    width: auto;
    height: 100%;
    visibility: hidden;
}
.sq-content {
    position: absolute;
    z-index: 1;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
}

使用此 HTML:

<div class="square" style="width: 200px">
    <img src="http://dummyimage.com/50x50/000/fff.gif&text=50x50" class="sq-setter-w"/>
    <div class="sq-content">Here is content</div>
</div>
<div class="square" style="height: 100px">
    <img src="http://dummyimage.com/50x50/000/fff.gif&text=50x50" class="sq-setter-h"/>
    <div class="sq-content">Here is content</div>
</div>
<div class="extrawrapper">
<div class="square" style="width: 200px">
    <img src="http://dummyimage.com/50x50/000/fff.gif&text=50x50" class="sq-setter-w"/>
    <div class="sq-content">Here is content</div>
</div>
</div>
<div class="extrawrapper">
<div class="square" style="height: 100px">
    <img src="http://dummyimage.com/50x50/000/fff.gif&text=50x50" class="sq-setter-h"/>
    <div class="sq-content">Here is content</div>
</div>
</div>

你可以得到它来做what this fiddle shows

关键是:

  1. 使用的图像必须是正方形图像,因为它会驱动比例大小(img 元素是唯一可以进行这种比例工作的元素,因为它可以根据图像本身的比例来确定其大小)。
  2. 您必须知道是否要设置widthheight,以便正确设置图像类以调整其大小。 可选地,在img 本身上设置widthheight,那么您不必担心将类设置为100% 值。我的演示假设您在包装 div 上设置了大小(我的 .square 类)。
  3. 要让div 折叠在img 周围,这会驱动比例大小,您需要在div 上设置display: inline-blockfloat(如上面的css 中所述)。李>
  4. 由于 #3,如果您希望 div 表现得更像“块状”,您需要给它们一个额外的包装器 div,就像第三个和第四个显示的那样。

显然,这个解决方案涉及很多额外的标记。 所以在很多方面,最好说“只使用 javascript”,但我确实想证明它可以完全使用 HTML 和 CSS 来完成(至少在某些情况下)。

更新:显示灵活调整大小的可能性

See this fiddle for percentages driving the size,这个 html 示例(width 设置为 30%):

<div class="square" style="width: 30%">
    <img src="http://dummyimage.com/50x50/000/fff.gif&text=50x50" class="sq-setter-w"/>
    <div class="sq-content">Here is content</div>
</div>

【讨论】:

  • This seems 为我工作...
  • 在“更新”部分之前,我一直在浪费时间试图弄清楚元素中的“不使用固定大小”在包装元素上设置它有什么用处。这就像不想长大,把自己放在一个用来种植西瓜方块的盒子里。我会看看第二个小提琴,但到目前为止你浪费了我的时间。你的第一个例子(我已经说“没用”了吗?)这个jsfiddle.net/8x91z9a2你能解释一下所有这些额外的代码和用一个div和两行css设置宽度和高度有什么区别吗?
  • @sergio:挑战是明确地将 div 设置为 square,使用 only HTML/CSS,并且只有 one 值(高度或宽度)驱动正方形的大小,甚至不必提前知道该值可能是什么(动态生成或百分比)。所以表格(正方形)是用未知值固定的。这就是它的“用途”。您的示例中的内容溢出可能是设计师未处理内容量或溢出的副产品,I would recommend overflow:auto on the square class
  • 使容器停止作为容器工作(即内容将溢出它)与仅设置渐变单色背景且大小设置为“包含”或仅使用图像相同.如果容器不包含任何东西,那么将容器保留为容器是没有意义的。
【解决方案3】:

我今天需要实现类似的东西,并且对图像有相同的想法。我想检查其他可能性,谷歌把我带到了这里。

...你真的不需要图片src。如果你想要一个正方形,你可以简单地使用hash。 它保存了一个 http 请求。

如果你想获得不同的纵横比,你应该使用src。如果你想要 16:9 的比例,图像应该是 16px 宽和 9px 高(尽可能小)


比较两种技术(请参阅此线程中的其他答案)

imgpadding-bottom

Here's a fiddle 显示img 版本的兼容性(也可以轻松处理pxvalue(间隔将每秒调整“正方形”的大小)

如果您使用百分比值,两种技术都可以获得相同的结果,但填充版本不需要额外的标记 (&lt;img src="#"/&gt;)


结论:

根据实现,每种技术都有其优缺点。


HTML

<div class="floater">
    <div class="square square_noImg">
        <div class="inner">Hey blue you look totally squared</div>
    </div>
    <div class="square square_img">
        <img src="#"/>
        <div class="inner">Hey red you seem off</div>
    </div>
</div>

CSS

.floater {
    font-size: 0;
}
.square {
    position: relative;
    display: inline-block;
    width: 100px;
    margin: 0 5px; 
}
.square_noImg {
    padding-bottom: 100px;
    background: red;
}
.square_img {    
    background: blue;
}
img{
    width: 100%;
    height: auto;
    border: 0;
    visibility: hidden;
}
.inner {
    position: absolute;
    top: 10%;
    right: 10%;
    bottom: 10%;
    left: 10%;
    background: white;
    font-size: 14px;
    text-align: center;
    overflow: hidden;
    padding: 10px 5px;
}

【讨论】:

    【解决方案4】:

    响应 @Dave 对 @praveen-kumar 的评论的原生 JS 方法回答:

    var squareElement = function(el) {
        el.style.height = el.offsetWidth + 'px';
    }
    

    并在任何地方使用它

    squareElement(document.querySelector('your-selector'));
    

    【讨论】:

      【解决方案5】:

      不适用于像% 这样的相对单位,因为它们是相对于容器元素计算的。但是,如果您使用pxem 之类的单位来设置两个尺寸,则可以使元素成为正方形。

      【讨论】:

        【解决方案6】:

        仅靠 CSS 无法做到这一点。使用 jQuery,您可以通过这样做来实现这一目标

        var chld = $('.child').width();
        $('.child').css({'height':chld+'px'});
        

        http://jsfiddle.net/4Jnfq/查看工作示例


        在上一次“根据内容调整大小”更新中可以找到仅 CSS 的解决方案 here
        虽然它适用于圆形,但您可以删除 border-radius: 50% 以使其适用于正方形。

        【讨论】:

        • 要注意 jQuery 不是唯一的答案... Javascript 通常可以做到这一点。我个人不是 JS 库的粉丝。
        • 这可以单独在 CSS 中完成,当您签入 this answer 时(请参阅“根据内容调整大小”更新)。这是响应式圆圈的答案,但同样适用于正方形。
        • @JoseRuiSantos 好久不见了。为什么要挖旧的?
        • @PraveenKumar 我同意这是一个老问题,但是为其他有同样问题的人改进解决方案总是好的。
        • @JoseRuiSantos 同意...继续编辑我的答案... :)
        猜你喜欢
        • 2015-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多