当前位置: 首页 > 面试题库 >

使用CSS从中间展开div而不是仅从顶部和左侧展开

东方乐
2023-03-14
问题内容

我不确定这是否可行,但是我认为使用CSS转换创建一个效果是很酷的,其中div从其中心扩展到预定的高度和宽度,而不仅仅是从左上角扩展。

例如,如果我有demo

<div id="square"></div>

和(为简洁起见,省略了供应商前缀)

#square {
    width: 10px;
    height: 10px;
    background: blue;
    transition: width 1s, height 1s;
}
#square:hover {
    width: 100px;
    height: 100px;
}

悬停时,这会将方块向右扩展并向下扩展至100px。 我希望它从中间扩展。

我知道我可能会使用transform:scale(x)demo,但这并不能真正为我提供非常“像素完美”的布局(因为它基于百分比),并且也不会影响周围的布局(文档流中的元素会根据其大小进行调整)。除了要相应地影响文档流之外,这基本上就是我要执行的操作。

没有人知道 没有javascript的方法 吗?


问题答案:

关键是通过公式转换边距。如果过渡,则有一个“摆动”在过渡期间很烦人。

编辑添加选项

选项1 :在其周围保留的空间中扩展

#square {
    width: 10px;
    height: 10px;
    margin: 100px; /*for centering purposes*/
    -webkit-transition: width 1s, height 1s, margin 1s;
    -moz-transition: width 1s, height 1s, margin 1s;
    -ms-transition: width 1s, height 1s, margin 1s;
    transition: width 1s, height 1s, margin 1s;
}
#square:hover {
    width: 100px;
    height: 100px;
    margin: 55px; /* initial margin - (width change (and/or height change)/2), so here 100px is initial margin, and the change is (100px final W/H - 10px initial W/H = 90px change, so 100px - (90px / 2 [= 45px]) = 55px) */
}

选项2 :扩展其周围的元素:

#square {
    width: 10px;
    height: 10px;
    margin: 0; /*for centering purposes*/
    -webkit-transition: width 1s, height 1s, margin 1s;
    -moz-transition: width 1s, height 1s, margin 1s;
    -ms-transition: width 1s, height 1s, margin 1s;
    transition: width 1s, height 1s, margin 1s;
}
#square:hover {
    width: 110px;
    height: 110px;
    margin: -50px; /* 0 - (110px - 10px [= 100px]) / 2 =  -50px */
}

选项3 :在流程中扩展之前的元素,并在其之后移动元素:

#square {
    width: 10px;
    height: 10px;
    margin: 0;
    position: relative;
    top: 0;
    left: 0;
    -webkit-transition: width 1s, height 1s, top 1s, left 1s, margin 1s;
    -moz-transition: width 1s, height 1s, top 1s, left 1s, margin 1s;
    -ms-transition: width 1s, height 1s, top 1s, left 1s, margin 1s ;
    transition: width 1s, height 1s, top 1s, left 1s, margin 1s;
}
#square:hover {
    width: 110px;
    height: 110px;
    top: -50px; /* initial top[0] - (new height[110px] - initial height[10px] [=100px])/2 [=50px] = -50px) */
    left: -50px; /* initial left[0] - (new width[110px] - initial width[10px] [=100px])/2 [=50px] = -50px) */
    margin-right: -50px;
    margin-bottom: -50px;
}

附加的非平方示例

有人评论说,这不适用于非正方形(相同的宽度/高度),但这仅意味着在过渡期间必须针对每个方向进行不同的调整。因此,这里是从矩形开始的
选项2(带有非正方形)
,宽度在过渡期间是高度的两倍(因此甚至改变了矩形形状):扩展其周围的元素

#rectangle {
    width: 110px;
    height: 10px;
    margin: 0; /*for centering purposes*/
    -webkit-transition: width 1s, height 1s, margin 1s;
    -moz-transition: width 1s, height 1s, margin 1s;
    -ms-transition: width 1s, height 1s, margin 1s;
    transition: width 1s, height 1s, margin 1s;
}
#rectangle:hover {
    width: 310px;
    height: 110px;
    margin: -50px -100px; /* initial margin - ((initial margin - width change (or height change))/2) */
}

如果width只是也改变了100像素(即从110像素更改为210像素),那么只要a margin: -50px仍然可以使用。



 类似资料:
  • 问题内容: 我的ScrollView出现问题,其中包含个性化的GridView和其他视图视图。第一次启动Activity时,ScrollView从其顶部开始,但是如果我再次访问Activity,则ScrollView从头开始我将在[此链接中](http://codingdict.com/questions/136414找到的类ExpandableHeightGridView 用于我的GridVie

  • 我的文本从divs顶部对齐有问题。 以下是HTML: 以下是CSS: 如何制作文本 Lorem Ipsum Lorem Ipsum只是印刷和排版行业的虚拟文本。自16世纪以来,Lorem Ipsum一直是业界的标准虚拟文本... 是否从.txt div的中心对齐?谢谢你的帮助

  • 问题内容: 情况1: 我想在默认WordPress主题的标题中的照片上方放置徽标徽标 我的解决方案:在照片前添加徽标,然后在其上 进行 设置, 而无需 设置任何属性: HTML: CSS: 案例2: 另一个示例是水平多级菜单,其宽度为100%,并带有布局,但不支持 它适用于IE6-7,Firefox1.5,不适用于Firefox 0.8等。 您认为这是一个很好的解决方案,还是非标准的破解程序,可以

  • 问题内容: 是否有一个跨浏览器解决方案仅使用CSS而不使用javascript来生成幻灯片过渡?以下是html内容的示例: 问题答案: 您可以使用CSS3过渡或CSS3动画在元素中滑动。 我举了两个简单的例子,只是为了向您展示我的意思。 CSS过渡(悬停时) 相关代码 在这种情况下,我只是将位置从转换为1s。持续时间。也可以使用 CSS动画 与上面的原理相同(演示一),但是动画在2秒后自动开始,在

  • 我在NestedScrollview中有一个回收器视图...除了一个thig,一切都正常。我在NestedScrollview中总共有三个视图,前两个是LinearLayout,然后是回收器视图。当我运行我的应用程序时,活动不会显示前两个布局,它从回收器视图的顶部开始。 如何显示我的布局: 它应该如何显示: 我正在加载此enite布局下的一个视图寻呼机和我的视图寻呼机是一个协调器布局的孩子。 我的

  • 这里有一个关于使用方法关闭一组轴给定侧的刻度的问题。我想更改和属性在默认情况下关闭在我的,但我不知道如何做到这一点,作为文件的刻度部分处理在和方面的东西。我错过了什么?