我在一个投资组合网站上工作,我有一个很酷的 idea ,即登录页面将在中间有名称,然后当我 Select 一条路由时,页面将变成导航栏.

问题是,为了做到这一点,我要么必须绝对定位导航栏项目,这是我不想做的,要么我需要将名称相对于其原始位置居中,这也是不可取的.

This is how it looks now

我使用的是Vue和TailWind,但普通的HTML解决方案会有所帮助.

这是我的代码:

<template>
  <header
    class="bg-black/25 py-3 transition-[max-height] duration-1000 ease-in-out max-h-screen h-screen justify-center"
    :class="{
      'flex max-h-20': !isHomePage,
    }"
  >
    <div
      class="w-5/6 flex justify-between items-center"
      :class="{ 'h-screen': isHomePage }"
    >
      <router-link to="/" :class="{ 'flex space-x-2 items-end': !isHomePage }">
        <div
          class="text-3xl font-semibold transition-all absolute duration-1000 left-1/2 top-1/3 -translate-y-4"
          :class="{
            'relative !translate-y-0 !translate-x-0 left-0 top-0': !isHomePage,
          }"
        >
          Aby
        </div>
        <div
          class="text-2xl font-medium transition-all duration-1000 absolute left-1/2 top-1/3 translate-y-4 -translate-x-4"
          :class="{
            'relative !translate-y-0 !translate-x-0 left-0 top-0': !isHomePage,
          }"
        >
          Isakov
        </div>
      </router-link>
      <router-link to="/other">click</router-link>
    </div>
  </header>
</template>

我试图绝对定位导航栏项目,但这导致了使组件响应的问题.

推荐答案

您需要采取一些步骤来应用更改‘Position’css属性的转换.下面是使用相对定位元素执行此操作的函数:

function positionTransition(element) {
    var rectBefore = element.getBoundingClientRect(); //get old coordinates
    
    //change positioning:
    element.style.position = "absolute";
    element.style.left = "50vw";
    element.style.top = "50vh";
    
    var rectAfter = element.getBoundingClientRect(); //get new coordinates
    
    //calculate the difference:
    var xDiff = -(rectAfter.x - rectBefore.x);
    var yDiff = -(rectAfter.y - rectBefore.y);
    
    //translate back, so that the absolute positioned element seems to be in the old place:
    element.style.transform = "translate(" + xDiff + "px, " + yDiff + "px)";
    
    //finally, make the transition, which works because it remains in position: absolute
    setTimeout(function() { //without the timeout, transition is ignored
        element.style.transition = "transform 1000ms ease-in-out";
        element.style.transform = "";
    }, 10);
}

我知道你在想什么,但别担心.位置的变化和翻译回来是瞬间的,没有闪烁!

EDIT1

我在以下代码片段中构建了一个完整的示例:

    window.addEventListener("DOMContentLoaded", function() {
        setTimeout(function() {
            var element = document.querySelector(".the-changing-span");
            positionTransition(element);
        }, 1000);
    });
    
    function positionTransition(element) {
        var rectBefore = element.getBoundingClientRect(); //get old coordinates
        
        //change positioning:
        element.style.position = "absolute";
        element.style.left = "50vw";
        element.style.top = "50vh";
        
        var rectAfter = element.getBoundingClientRect(); //get new coordinates
        
        //calculate the difference:
        var xDiff = -(rectAfter.x - rectBefore.x);
        var yDiff = -(rectAfter.y - rectBefore.y);
        
        //translate, so that the absolute positioned element seems to be in the old place:
        element.style.transform = "translate(" + xDiff + "px, " + yDiff + "px)";
        
        //finally, make the transition, which works because it remains in position: absolute
        setTimeout(function() {
            element.style.transition = "transform 1000ms ease-in-out";
            element.style.transform = "";
        }, 10);
    }
    .the-changing-span {
        position: relative;
    }
    
    span {
        border: 1px solid #AAA;
    }
    <span class="a-simple-span">
        stays
    </span>
    <span class="the-changing-span">
        changes
    </span>

Css相关问答推荐

单独.css文件中的样式不适用于Angular 元件

需要Angular material 下拉面板有向下和向上箭头按钮

防止表格水平拉伸整个Blazor页面

使用SVG以竖排书写模式创建渐变文本时,文本显示异常

仅 Select 嵌套 div 的底部,而不知道它们的嵌套程度

如何使用来自单独模块的代码将自定义标头插入到使用 DT Shiny 呈现的表中?

有没有办法在 CSS 字体速记中使用数字字体粗细?

在具有特定类的 td 之后,如何编写适用于该行上所有 td 元素的表行的 CSS Select 器?

为什么这个绝对定位的 ::after 伪元素会崩溃,除非父级有过滤器?

如何将转换应用于相同的元素但处于不同的状态:悬停

带有图像的 CSS 网格在 Firefox 中表现不同

如何使用 TailwindCSS 禁用环形阴影?

JavaFX TreeTableView Css for unfocused selected line

  • 元素上的子弹来自哪里?
  • 固定元素在 Chrome 中消失

    如何在需要时通过 HTTPS 包含 CSS 和 JS 文件?

    如何使用 Bootstrap2 使 div 居中?

    CSS - 使 div 水平对齐

    将 Fixed div 设置为父容器的 100% 宽度

    HTML浮动右元素顺序