我无法使用CSS来复制下面的布局,该CSS的黑色边框偏移且位于图片的后面:
我尝试使用border
属性,但是显然不起作用,因为我不知道是否可以抵消它。
理想情况下,我还应该能够移动/动画该边框,以便在将图像悬停时减少偏移量。
答案 0 :(得分:1)
如果图像下面的背景为单色,则可以使用带有两个阴影的box-shadow
:
html,
body {
height: 100vh;
margin: 0;
}
body {
background: yellow;
display: flex;
justify-content: center;
align-items: center;
}
.frame {
height: 75vh;
box-shadow:
10px -10px 0 -5px yellow,
10px -10px 0 0 black;
transition: box-shadow ease-in 150ms;
}
.frame:hover {
box-shadow:
5px -5px 0 -5px yellow,
5px -5px 0 0 black;
}
<img class="frame" src="https://cdn.motor1.com/images/mgl/7WjgW/s3/1974-lancia-stratos-hf-stradale-for-sale.jpg" />
如果背景不是纯色,您将无法正确遮盖最下面阴影的多余部分,因此您将得到如下内容:
html,
body {
height: 100vh;
margin: 0;
}
body {
background: linear-gradient(cyan, yellow);
display: flex;
justify-content: center;
align-items: center;
}
.frame {
height: 75vh;
box-shadow:
10px -10px 0 -5px cyan,
10px -10px 0 0 black;
transition: box-shadow ease-in 150ms;
}
.frame:hover {
box-shadow:
5px -5px 0 -5px cyan,
5px -5px 0 0 black;
}
<img class="frame" src="https://cdn.motor1.com/images/mgl/7WjgW/s3/1974-lancia-stratos-hf-stradale-for-sale.jpg" />
解决上述问题的方法是在该图像周围使用包装元素。然后,该元素将具有带有::before
而不是::after
的伪元素(border
或box-shadow
)。
要对其进行动画处理/移动,则可以使用transform
而不是更改边框本身:
html,
body {
height: 100vh;
margin: 0;
}
body {
background: linear-gradient(cyan, yellow);
display: flex;
justify-content: center;
align-items: center;
}
img {
height: 75vh;
display: block;
}
.frame {
position: relative;
}
.frame::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
box-sizing: border-box;
border: 5px solid black;
transform: translate(10px, -10px);
transition: transform 150ms;
}
.frame:hover::before {
transform: translate(5px, -5px);
}
<div class="frame">
<img src="https://cdn.motor1.com/images/mgl/7WjgW/s3/1974-lancia-stratos-hf-stradale-for-sale.jpg" />
</div>
请注意,我还添加了box-sizing: border-box
。否则,::before
伪元素的大小将是父对象的大小+边框周围的宽度,因此边框看起来比图像大。使用box-sizing: border-box
时,边框和填充的大小将从总大小中减去。
您是否注意到最后一个示例比其他两个示例移动得更平稳,甚至更快?这是因为your browser is now using hardware acceleration to move it,以前不是这种情况。
因此,如果您需要移动/设置动画,我建议您使用此方法。否则,如果您的背景是纯色的并且边框没有设置动画,则可以使用box-shadow
方法,该方法只涉及几行CSS。
答案 1 :(得分:0)
也许有一种更优雅的方法,但我会这样解决:
.frame-wrapper {
display: inline-block;
position: relative;
}
.frame-wrapper::before {
content: '';
display: block;
z-index: -1;
position: absolute;
bottom: 5%;
left: 5%;
border: 4px solid black;
height: 100%;
width: 100%;
}
<div class="frame-wrapper">
<img src="https://via.placeholder.com/200x300" alt="">
</div>
答案 2 :(得分:-1)
如果没有看到您的代码,将很难分辨出问题出在哪里。但是,请尝试将您的图片放置在自己的位置,并在div本身上应用边框。