如何根据高度调整旋转,理想情况下仅在 css 中?
How do I adjust rotation based on height, ideally in css only?
我有一个 ::before
元素,它与父元素大小相同,但稍微旋转了一点。它用在很多地方,父元素的高度因内容而异。
我遇到的问题是,使用(例如)transform: rotate(-1deg);
对小元素旋转不够,对大元素旋转太多。
Here is a jsfiddle example(下面的片段)- 将鼠标悬停在蓝色框上,以查看当蓝色框更高时橙色框会发生什么。
.container {
width : 26px;
border : 1px solid #999;
display : flex;
justify-content : center;
margin : 0 auto;
padding : 3px 0;
}
.box {
height : 60px;
width : 20px;
background : blue;
position : relative;
transition : height 1s ease-in-out;
}
.box:hover {
height :400px;
}
.box::before {
content : "";
position : absolute;
height : 99%;
width : 99%;
background-color : orange;
left : 0px;
top : -1px;
transform : rotate(-3deg);
z-index : -1;
transform-origin : center center;
}
<div class='container'>
<div class='box'> </div>
</div>
我怎样才能抵消这种影响,而不是旋转的度数是常量,从 ::before 的左上角到父元素的左上角的像素宽度(大致)是常量?我不需要它是准确的,只是当内容使父元素非常高时不要疯狂。
我正在尝试确定是否有 css 唯一的解决方案。我可以想出一种方法,只需将旋转度数更改为插入内容后根据父元素高度计算的数字即可。
替代版本,左边正确,中间不正确,右边正确。高度未定义,可能会动态变化。 https://jsfiddle.net/4x6qdtv7/
.container {
float: left;
width: 26px;
border: 1px solid #999;
display: flex;
justify-content: center;
margin-right: 10px;
padding: 3px 0;
}
.c1 .box {
height: 60px;
}
.c2 .box {
height: 400px;
}
.c3 .box {
height: 400px;
}
.box {
height: 60px;
width: 20px;
background: blue;
position: relative;
}
.box:hover {
height:400px;
}
.c1 .box::before, .c2 .box::before {
transform: rotate(-3deg);
}
.c3 .box::before {
transform: rotate(-.4deg);
}
.box::before {
content: "";
position: absolute;
height: 99%;
width: 99%;
background-color: orange;
left: 0px;
top: -1px;
z-index: -1;
transform-origin: center center;
}
<div class='container c1'>
<div class='box'> </div>
</div>
<div class='container c2'>
<div class='box'> </div>
</div>
<div class='container c3'>
<div class='box'> </div>
</div>
您可以使用 clip-path
以不同的方式对此进行近似。调整主容器的大小以查看结果:
.box {
--d:15px; /*adjust this */
width:100px;
height:200px;
border:1px solid red;
padding:15px; /* this */
position:relative;
z-index:0;
overflow:hidden;
resize:both;
}
.box div{
height:100%;
background:blue;
}
.box::before {
content:"";
position:absolute;
margin:5px; /* and this */
top:0;
left:0;
right:0;
bottom:0;
z-index:-1;
background:green;
clip-path:polygon(0 var(--d),calc(100% - var(--d)) 0,100% calc(100% - var(--d)),var(--d) 100%);
}
<div class="box">
<div></div>
</div>
回答的时候看到Temani Afif回答所以犹豫了
现在我告诉自己,这个答案还是可以感兴趣的(而且简单多了)。
它还显示了如何使用不同的单位进行计算
.container {
float : left;
width : 26px;
border : 1px solid #999;
display : flex;
justify-content : center;
margin-right : 10px;
padding : 3px 0;
--clr : orange;
}
.container:hover {
--clr : yellow;
}
.c1 .box { --hgt : 100; }
.c2 .box { --hgt : 200; }
.c3 .box { --hgt : 400; }
.c1:hover .box { --hgt : 200; }
.c2:hover .box { --hgt : 400; }
.c3:hover .box { --hgt : 100; }
.box {
height : calc(1px * var(--hgt));
width : 20px;
background : blue;
position : relative;
transition : height 1s ease-in-out;
}
.box::before {
content : "";
position : absolute;
height : 100%;
width : 99%;
background-color : var(--clr);
left : 0;
top : -1px;
transform : rotate( calc(-500deg / var(--hgt))); /* adjust 500deg */
z-index : -1;
transform-origin : center center;
}
<div class='container c1'>
<div class='box'></div>
</div>
<div class='container c2'>
<div class='box'> </div>
</div>
<div class='container c3'>
<div class='box'> </div>
</div>
我有一个 ::before
元素,它与父元素大小相同,但稍微旋转了一点。它用在很多地方,父元素的高度因内容而异。
我遇到的问题是,使用(例如)transform: rotate(-1deg);
对小元素旋转不够,对大元素旋转太多。
Here is a jsfiddle example(下面的片段)- 将鼠标悬停在蓝色框上,以查看当蓝色框更高时橙色框会发生什么。
.container {
width : 26px;
border : 1px solid #999;
display : flex;
justify-content : center;
margin : 0 auto;
padding : 3px 0;
}
.box {
height : 60px;
width : 20px;
background : blue;
position : relative;
transition : height 1s ease-in-out;
}
.box:hover {
height :400px;
}
.box::before {
content : "";
position : absolute;
height : 99%;
width : 99%;
background-color : orange;
left : 0px;
top : -1px;
transform : rotate(-3deg);
z-index : -1;
transform-origin : center center;
}
<div class='container'>
<div class='box'> </div>
</div>
我怎样才能抵消这种影响,而不是旋转的度数是常量,从 ::before 的左上角到父元素的左上角的像素宽度(大致)是常量?我不需要它是准确的,只是当内容使父元素非常高时不要疯狂。
我正在尝试确定是否有 css 唯一的解决方案。我可以想出一种方法,只需将旋转度数更改为插入内容后根据父元素高度计算的数字即可。
替代版本,左边正确,中间不正确,右边正确。高度未定义,可能会动态变化。 https://jsfiddle.net/4x6qdtv7/
.container {
float: left;
width: 26px;
border: 1px solid #999;
display: flex;
justify-content: center;
margin-right: 10px;
padding: 3px 0;
}
.c1 .box {
height: 60px;
}
.c2 .box {
height: 400px;
}
.c3 .box {
height: 400px;
}
.box {
height: 60px;
width: 20px;
background: blue;
position: relative;
}
.box:hover {
height:400px;
}
.c1 .box::before, .c2 .box::before {
transform: rotate(-3deg);
}
.c3 .box::before {
transform: rotate(-.4deg);
}
.box::before {
content: "";
position: absolute;
height: 99%;
width: 99%;
background-color: orange;
left: 0px;
top: -1px;
z-index: -1;
transform-origin: center center;
}
<div class='container c1'>
<div class='box'> </div>
</div>
<div class='container c2'>
<div class='box'> </div>
</div>
<div class='container c3'>
<div class='box'> </div>
</div>
您可以使用 clip-path
以不同的方式对此进行近似。调整主容器的大小以查看结果:
.box {
--d:15px; /*adjust this */
width:100px;
height:200px;
border:1px solid red;
padding:15px; /* this */
position:relative;
z-index:0;
overflow:hidden;
resize:both;
}
.box div{
height:100%;
background:blue;
}
.box::before {
content:"";
position:absolute;
margin:5px; /* and this */
top:0;
left:0;
right:0;
bottom:0;
z-index:-1;
background:green;
clip-path:polygon(0 var(--d),calc(100% - var(--d)) 0,100% calc(100% - var(--d)),var(--d) 100%);
}
<div class="box">
<div></div>
</div>
回答的时候看到Temani Afif回答所以犹豫了
现在我告诉自己,这个答案还是可以感兴趣的(而且简单多了)。
它还显示了如何使用不同的单位进行计算
.container {
float : left;
width : 26px;
border : 1px solid #999;
display : flex;
justify-content : center;
margin-right : 10px;
padding : 3px 0;
--clr : orange;
}
.container:hover {
--clr : yellow;
}
.c1 .box { --hgt : 100; }
.c2 .box { --hgt : 200; }
.c3 .box { --hgt : 400; }
.c1:hover .box { --hgt : 200; }
.c2:hover .box { --hgt : 400; }
.c3:hover .box { --hgt : 100; }
.box {
height : calc(1px * var(--hgt));
width : 20px;
background : blue;
position : relative;
transition : height 1s ease-in-out;
}
.box::before {
content : "";
position : absolute;
height : 100%;
width : 99%;
background-color : var(--clr);
left : 0;
top : -1px;
transform : rotate( calc(-500deg / var(--hgt))); /* adjust 500deg */
z-index : -1;
transform-origin : center center;
}
<div class='container c1'>
<div class='box'></div>
</div>
<div class='container c2'>
<div class='box'> </div>
</div>
<div class='container c3'>
<div class='box'> </div>
</div>