我有一个单词要添加两个字母。这两个字母应该位于单词内的某个位置(不是在开头或结尾),并且也应该在悬停时淡入单词中。 这个词直接放置在我页面的主包装元素中,这是一个
flex
主体。该单词本身必须有一个fixed
位置,并且必须“垂直”放置在屏幕的左上角。我无法将 width: 100%;
之类的内容应用于元素,因为这样它就不会在所有屏幕尺寸上粘在同一位置。但是,一旦我将鼠标悬停在该单词上,它就会移出其位置,尽管它不应该这样做。从技术上讲,它应该只以使其自己的容器稍大一些的方式扩展,以便两个新字母适合。
截至目前,我正在尝试使用
transition
来实现字母的插入:
.main-element { /* h1 */
position: fixed;
...
}
.element-to-appear { /* span */
position: absolute;
opacity: 0;
transition: opacity .5s;
}
.main-element:hover .element-to-appear {
opacity: 1;
}
在上面的示例中,
main-element
是单词,
element-to-appear
是要插入的两个字母(包含在主文本中的 <span>
元素中)。此外,我还推开了该单词的最后几个字符(也包含在 <span>
中),以便为新字母腾出空间:.main-element:hover .remaining-letters { /* span */
margin-left: -10px
}
这也是我想要实现的目标的一个小例子:
为了解决这个问题,我已经尝试了以下方法,希望这会导致插入两个字母而文本不会移出其位置:
更改悬停时的
display
none
更改为 inline-block
,这使得字母出现,但问题仍然存在。我尝试了前面提到的transition
opacity
和position: absolute;
。我尝试更改元素的 width
display
fixed
::before
<span>
分配奇怪的边距,这使得整个文本“在恢复正常之前“跳”出位置一秒钟 - 我真的很想避免这样的事情。最终,我还为文本分配了边距,这会在悬停时将其移回原位,但这使整个过渡再次看起来“跳跃”。(由于某种原因我无法创建堆栈片段,所以我也制作了一个 JSFiddle 并仅提供了代码块)
HTML:
<div class="wrapper">
<h1 class="main-element">test-wor<span id="element-to-appear">rr</span><span id="remaining-letters">d.</span></h1>
</div>
:
.wrapper {
display: flex;
width: 100%;
height: 100%;
margin: 0;
}
.main-element {
position: fixed;
left: 100px;
top: -100px;
rotate: 90deg;
color: black;
}
#element-to-appear {
display: inline-block;
position: absolute;
opacity: 0;
transition: opacity .5s;
}
#remaining-letters {
transition: .6s;
}
.main-element:hover #element-to-appear {
opacity: 1;
}
.main-element:hover #remaining-letters {
margin-left: 50px;
transition: .25s;
}
代码片段中应该发生的情况是,元素在不应该的情况下进一步移动到顶部和右侧。它应该保持在相同的位置,但以适合新字母的方式扩展,但元素保持在相同的位置(本质上,它应该只向下扩展)。
我已经尝试了很多,但我不知道还能尝试什么。我愿意使用 JS 和 JQuery 或任何其他工具。
提前感谢您的帮助!
transform-origin: left
添加到您的
.main-element
。尽管看起来旋转后的文本宽度只占用了大约 20 像素,但 DOM 仍然为元素留出了足够的空间,就好像它没有旋转一样。你可以通过我制作的这个调试示例清楚地看到它。由于 transform-origin
默认设置为
center
,因此旋转后的元素将保留在 DOM 为其创建的空间的中心。这是一个工作示例(我调整了一些内容以使其更容易在 Stack Overflow 上查看):
.wrapper {
display: flex;
width: 100%;
height: 100%;
margin: 0;
}
.main-element {
position: fixed;
/*
it might be necessary to run the fiddle without the 'left' and 'top' values once
and then reassigning them and running it again, it somehow seems to be broken on
JSFiddle
*/
left: 50px;
top: 10px;
rotate: 90deg;
color: black;
transform-origin: left;
}
#element-to-appear {
display: inline-block;
position: absolute;
opacity: 0;
transition: opacity .5s;
}
#remaining-letters {
transition: .6s;
}
.main-element:hover #element-to-appear {
opacity: 1;
}
.main-element:hover #remaining-letters {
margin-left: 50px;
transition: .25s;
}
<div class="wrapper">
<h1 class="main-element">test-wor<span id="element-to-appear">rr</span><span id="remaining-letters">d.</span></h1>
</div>