英文:
How to properly align background with before content
问题
我有这个HTML结构:
<div class="single-apartment-typology-text">
<span class="title-apartment primary-title text-animated">
<div class="title">Testing</div>
<div class="uptitle">
<span> last 3 opportunity</span>
</div>
</span>
</div>
我已经使用:before
属性添加了title-apartment
的背景。我的目标是让位于uptitle
内的span对齐到边框,问题是当我改变分辨率时,内容不会粘在右边框上。
这是我的SCSS:
.title-apartment {
position: relative;
width: 400px;
height: 100px;
display: flex;
justify-content: flex-end;
align-items: center;
.title {
position: absolute;
z-index: 2;
display: block;
left: 0;
}
&:before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: $yellow;
left: 65px;
}
.uptitle {
position: relative;
z-index: 1;
margin-right: 10px;
background-color: $blue;
color: #fff;
padding: 10px;
transform: translateX(33.8%);
span {
display: block;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
line-height: 23px;
}
}
}
我尝试使用translateX
属性将深蓝色背景的span粘在右侧黄色背景上,但目前没有成功。有什么想法来修复这个问题?
英文:
I have this html structure:
<div class="single-apartment-typology-text">
<span class="title-apartment primary-title text-animated">
<div class="title">Testing</div>
<div class="uptitle">
<span> last 3 opportunity</span>
</div>
</span>
</div>
I've added a background title-apartment
using the :before
property. My goal is have the span within uptitle
aligned to the border, the problem's that when I change the resolution the content doesn't stick to the right border:
This is my scss:
.title-apartment {
position: relative;
width: 400px;
height: 100px;
display: flex;
justify-content: flex-end;
align-items: center;
.title {
position: absolute;
z-index: 2;
display: block;
left: 0;
}
&:before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: $yellow;
left: 65px;
}
.uptitle {
position: relative;
z-index: 1;
margin-right: 10px;
background-color: $blue;
color: #fff;
padding: 10px;
transform: translateX(33.8%);
span {
display: block;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
line-height: 23px;
}
}
}
I tried to keep the span with the dark blue background attached to the right yellow background using the translateX
property, but no luck so far.
Any idea to fix this?
答案1
得分: 1
由于您将:before
伪元素向右移动了65px,.uptitle
元素不知道它的位置,因为它是兄弟元素而不是子元素。最简单的方法是设置一个css自定义属性来记录您将:before
伪元素向右移动的距离,然后将.uptitle
元素向右移动相同的距离。如果我们使用right
属性,那么我们的参考点将是右边框,但它将必须是负值才能将该元素向右移动。因此在这里使用了calc
。
标记的代码如下:
body {
background: #BCB5AF;
}
.title-apartment {
--left-shift: 65px; /* 添加了这个 */
position: relative;
width: 400px;
height: 100px;
display: flex;
justify-content: flex-end;
align-items: center;
}
.title-apartment .title {
position: absolute;
z-index: 2;
display: block;
left: 0;
}
.title-apartment::before {
content: "";
position: absolute;
top: 0;
width: 100%;
height: 100%;
background-color: #E0CA36;
left: var(--left-shift);
}
.title-apartment .uptitle {
position: absolute; /* 从相对定位更改为绝对定位 */
right: calc(-1 * var(--left-shift)); /* 添加了这个 */
z-index: 1;
/*margin-right: 10px; 如果您希望它与边框紧贴在一起,请删除此行。如果您始终希望它离边缘10px,请保留它 */
background-color: #444F5F;
color: #fff;
padding: 10px;
}
.title-apartment .uptitle span {
display: block;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
line-height: 23px;
}
<div class="single-apartment-typology-text">
<span class="title-apartment primary-title text-animated">
<div class="title">Testing</div>
<div class="uptitle">
<span> last 3 opportunity</span>
</div>
</span>
</div>
P.S. 我假设您希望它与边框紧贴在一起,因此在.title-apartment .uptitle
规则中删除了margin-right
,但如果您希望它始终离边缘10px,请恢复它。
英文:
Since you're shifting your :before pseudo element right by 65px, the .uptitle
element doesn't know where this is as it's a sibling rather than a child. The easiest thing to do is to set up a css custom property to record how far you're shifting the :before
pseudo element then shift the .uptitle
element right by the same amount. If we use the right
property then our reference point will be the right border but it'll have to be a negative value to then shift that element right. Hence the calc
in there.
Marked up code below
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-css -->
body {
background: #BCB5AF;
}
.title-apartment {
--left-shift: 65px; /* added this */
position: relative;
width: 400px;
height: 100px;
display: flex;
justify-content: flex-end;
align-items: center;
}
.title-apartment .title {
position: absolute;
z-index: 2;
display: block;
left: 0;
}
.title-apartment::before {
content: "";
position: absolute;
top: 0;
width: 100%;
height: 100%;
background-color: #E0CA36;
left: var(--left-shift);
}
.title-apartment .uptitle {
position: absolute; /*changed from relative to absolute */
right: calc(-1 * var(--left-shift)); /*added this */
z-index: 1;
/*margin-right: 10px; if you want this to be hard up agains the border then remove this. If you always want it to be 10px then keep it in */
background-color: #444F5F;
color: #fff;
padding: 10px;
}
.title-apartment .uptitle span {
display: block;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
line-height: 23px;
}
<!-- language: lang-html -->
<div class="single-apartment-typology-text">
<span class="title-apartment primary-title text-animated">
<div class="title">Testing</div>
<div class="uptitle">
<span> last 3 opportunity</span>
</div>
</span>
</div>
<!-- end snippet -->
P.S. I've assumed you want it hard up against the border hence I've removed the margin-right
in the .title-apartment .uptitle
rule but reinstate it if you want it always to be 10px from the edge.
答案2
得分: 1
以下是翻译的部分:
实现你的目标的一种方法是执行以下操作:
- 将
.title
的width
设置为20%;
- 将
.title-apartment::before
的width
设置为80%;
这解决了你的问题吗?
请参见下面的代码段或JSFiddle。
.title-apartment {
position: relative;
width: 400px;
height: 100px;
display: flex;
justify-content: flex-end;
align-items: center;
}
.title-apartment .title {
position: absolute;
z-index: 2;
display: block;
left: 0;
width: 20%;
}
.title-apartment::before {
content: "";
width: 80%;
height: 100%;
background-color: yellow;
left: 65px;
}
.title-apartment .uptitle {
position: absolute;
right: 0;
z-index: 1;
background-color: blue;
color: #fff;
padding: 10px;
}
.title-apartment .uptitle span {
display: block;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
line-height: 23px;
}
<div class="single-apartment-typology-text">
<span class="title-apartment primary-title text-animated">
<div class="title">Testing</div>
<div class="uptitle">
<span> last 3 opportunity</span>
</div>
</span>
</div>
英文:
One way to achieve your goal is to do the following:
- set
width: 20%;
to the.title
and - set
width: 80%;
to the.title-apartment::before
.
Does this solve your problem?
See the snippet below or JSFiddle.
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-css -->
.title-apartment {
position: relative;
width: 400px;
height: 100px;
display: flex;
justify-content: flex-end;
align-items: center;
}
.title-apartment .title {
position: absolute;
z-index: 2;
display: block;
left: 0;
width: 20%;
}
.title-apartment::before {
content: "";
width: 80%;
height: 100%;
background-color: yellow;
left: 65px;
}
.title-apartment .uptitle {
position: absolute;
right: 0;
z-index: 1;
background-color: blue;
color: #fff;
padding: 10px;
}
.title-apartment .uptitle span {
display: block;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
line-height: 23px;
}
<!-- language: lang-html -->
<div class="single-apartment-typology-text">
<span class="title-apartment primary-title text-animated">
<div class="title">Testing</div>
<div class="uptitle">
<span> last 3 opportunity</span>
</div>
</span>
</div>
<!-- end snippet -->
答案3
得分: 1
I understood the problem, but tested it without the space.
.uptitle {
position: relative;
z-index: 1;
margin-right: 10px; // TO REMOVE
background-color: $blue;
color: #fff;
padding: 10px;
transform: translateX(33.8%);
}
英文:
Not sure if I understood the problem but tested and without it you don't have that space
.uptitle {
position: relative;
z-index: 1;
margin-right: 10px; // TO REMOVE
background-color: $blue;
color: #fff;
padding: 10px;
transform: translateX(33.8%);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论