使用 JavaScript 平滑更改文本

2023-12-28

我正在制作一个登陆页面,其中的短语会随着选定的单词而不断变化。例如,

设计更好的网站
为客户制作。

将切换第一个或最后一个单词成为

开发更好的网站
为客户制作。

然而,由于“开发”这个词比“设计”更大,因此文本的其余部分最终会被推来推去,而无法顺利过渡。请记住,这是一个多行句子,并且它是居中的。

var first  = ['Create','Design','Develop'];
var second = ['you','clients','artists','us'];
var i = 0;
var j = 0;
var maxfirst  = first.length - 1;
var maxsecond = second.length - 1;

function delay() {
    $('#intro').velocity("transi1ion.slideUpIn", 1250);
    setInterval(firstwordchange, 400);
    setInterval(secondwordchange, 500);
}

function firstwordchange() {
    if (i < maxfirst) i++; else i = 0;

    $('#firstword').velocity("transition.slideUpOut", 300);

    setTimeout(function () {
        $('#firstword').text(first[i]);
    }, 200);

  $('#firstword').velocity("transition.slideUpIn", 300);
}

function secondwordchange() {
    if (j < maxsecond) j++; else j = 0;

    $('#secondword').velocity("transition.slideUpOut", 300);

    setTimeout(function () {
        $('#secondword').text(second[j]);
    }, 200);

    $('#secondword').velocity("transition.slideUpIn", 300);
}

setTimeout(delay, 700);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/velocity/1.1.0/velocity.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/velocity/1.1.0/velocity.ui.min.js"></script>
<div id="intro">
    <span id="firstword" class="introchange">Create</span>
    better websites made for
    <span id="secondword" class="introchange">you</span>.
</div>

如何才能让内部不变的文字平滑过渡呢?

(实际网站在这里 http://puu.sh/dv5Mw/240ae435ca.png)


I'm going to write an outline of how I would do did it:

  1. 使用变化的单词和静态定位的默认初始值渲染句子。
  2. 还渲染其他单词变体visibility: hidden这样您就可以确定它们的尺寸。
  3. 绝对化 http://api.jquery.com/position/每个句子部分。从这一点开始,所有东西都将被绝对定位,所以最好如果你有一个很好的定位上下文(通常用position: relative在父母身上)。
  4. 测量每个句子部分,包括变化的单词和固定句子部分的宽度,包括隐藏的部分。
  5. 更改单词时,计算旧尺寸和新尺寸之间的差异。基于这些差异,使用一些非常简单的数学来查看应向左或向右移动多少部分,并对它们应用水平平移(当然,为平移设置动画 - 可能只是为了您想要向左/向右移动的内容,也许您想要其他改变单词的效果)。

Demo:

var first = ['Create','Cut','Reticulate'];
var second = ['you','clients','artists','us'];
var firstM = [], secondM = [], el;

var $first = $('.the-first'); 
var $second = $('.the-second'); 
var $container = $('#container');

// init static //    
$first.text(first[0]);
$second.text(second[0]);

// create measurables //
for(var i = 0; i < first.length; i++){
    el = $('<div class="measurable">' + first[i] + '</div>');
    $container.append(el);
    firstM.push(el.width());
}
for(var i = 0; i < second.length; i++){
    el = $('<div class="measurable">' + second[i] + '</div>');
    $container.append(el);
    secondM.push(el.width());
}

// absolutize //
var positions = [];
$('#container > span').each(function(){
    positions.push($(this).position());
});
$('#container > span').each(function(){
    var pos = positions.shift();
    $(this).css({
        position: 'absolute',
        left: pos.left,
        top: pos.top
    });
});

// remember initial sizes //
var firstInitialWidth = $first.width();
var secondInitialWidth = $second.width();

// loop the loop //
var activeWordsIndex = 0;
setInterval(function(){
    activeWordsIndex++;
    var firstIndex = activeWordsIndex % first.length;
    var secondIndex = activeWordsIndex % second.length;
    
    $first.text( first[firstIndex] );
    $second.text( second[secondIndex] );
    
    var firstLineOffset = (firstM[firstIndex] - firstInitialWidth) / 2;
    var secondLineOffset = (secondM[secondIndex] - secondInitialWidth) / 2;
   
    $('.static.first').css({
        transform: 'translateX(' + firstLineOffset + 'px)'
    });
    $('.static.second').css({
        transform: 'translateX(' + (-secondLineOffset) + 'px)'
    });
    
    $first.css({
        transition: 'none', 
        transform: 'translate(' + (-firstLineOffset) + 'px, -30px)',
        opacity: '0'
    });
    setTimeout(function(){
        $first.css({
            transition: 'all 1s ease',
            transform: 'translate(' + (-firstLineOffset) + 'px, 0px)',
            opacity: '1'
        });
    }, 50);
    
    $second.css({
        transition: 'none', 
        transform: 'translate(' + (-secondLineOffset) + 'px, 30px)',
        opacity: '0'
    });
    setTimeout(function(){
        $second.css({
            transition: 'all 1s ease',
            transform: 'translate(' + (-secondLineOffset) + 'px, 0px)',
            opacity: '1'
        });
    }, 50);
}, 2000);
#ubercontainer {
    border: 1px solid #eaeaea;
    border-radius: 2px;
    background-color: #ffefc6;
    width: 500px;
    margin: 20px auto;
    padding: 30px 0;
}
#container {
    position: relative;
    text-align: center;
    font-family: sans-serif;
    font-size: 32px;
    font-weight: 800;
    color: #4a6b82;
    height: 78px;
}
.measurable {
    position: absolute;
    visibility: hidden;
}

.static.first, .static.second {
    transition: transform 1s ease;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="ubercontainer">
<div id="container">
    <span class="the-first"></span> 
    <span class="static first">better websites </span><br />
    <span class="static second">made for</span> 
    <span class="the-second"></span>
</div>
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JavaScript 平滑更改文本 的相关文章

  • 禁用内容安全策略

    当我开发网站时 我经常想看看特定功能在网站上的外观如何 所以我会使用 chrome 开发者工具并经常运行一些 javascript 脚本 我经常发现一些脚本由于内容安全策略 CSP 而无法运行的问题 我完全理解该策略是为了防止跨站点脚本攻击
  • angularjs:如何向资源对象添加缓存?

    在 http 中添加缓存非常简单 通过传递cache true http docs angularjs org api ng http https docs angularjs org api ng service 24http有缓存选项
  • chrome 调试器承诺在暂停时不会解析?

    也许我没有正确调试承诺 但基本上 如果您在断点处停止并运行异步代码 它实际上不会完成 直到您恢复执行为止 这是一个问题 调试器允许您快速试验多个 api 方法 但如果您恢复它 您就不能 debugger now type the follo
  • 仅当表单已提交时才触发 jQuery 表单验证?

    不引人注目的验证基于这样的想法 don t进行表单验证 直到用户提交表单 一旦发生这种情况 如果表单上的某些内容无效 那么一旦用户更改了每个字段 就会立即验证它 我想做的是 不显眼地 触发表单元素的验证 也就是说 only如果用户已尝试提交
  • 非 DOM 对象上的 jQuery 自定义事件

    我最近阅读了一些代码 其功能如下 bob name Bob Smith rank 7 bob bind nameChanged function bob trigger nameChanged 这似乎有效 但我在 jQuery 文档或源代码
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • Leaflet js虚构地图

    我是 Leaflet 的新手 我想了解如何创建完全交互式的虚构地图 我有一张图像想要转换为传单地图 该图像基本上像图表一样具有许多连接和点 我想首先将该图像转换为地图 能够将鼠标悬停在这些点上 突出显示它们并显示有关它们的信息 并且还可以在
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • HTML2canvas 和 Canvas2image,下载的屏幕截图不显示我的 HTML 图像

    我一直在开发一个 HTML 页面 我想将其转换为图像 我一直在使用 html2canvas 和 canvas2image 脚本并采用此代码http jsfiddle net 8ypxW 3 http jsfiddle net 8ypxW 3
  • javascript中按tab键时如何调用函数?

    我有一个这样的功能 function whenEmpty field if field value field style backgroundColor ffcccc alert Please fill the field field f
  • 通过 node-http-proxy 保留基于 cookie 的会话

    我有一个简单的基于 Express 的 Node js Web 服务器 用于开发 JavaScript 应用程序 我将服务器设置为使用 node http proxy 来代理应用程序向在不同域和端口上运行的 Jetty 服务器发出的 API
  • Javascript - 将值从下拉框传递到 Google Maps API

    我正在使用 Google 地图 API 为一家出租车公司创建报价表 目前 用户在 2 个文本框中输入出发点和接载点 API 会计算两点之间的距离以及行程费用 我正在尝试添加两个具有设定位置的下拉框 以便用户可以选择这些位置之一或使用文本框输
  • Typeahead.js substringMatcher 函数说明

    我只是在做一些研究Typeahead js这是一个非常酷的图书馆 感谢文档 我已经成功地获得了一个基本的示例 该文档也非常好 但是我试图弄清楚以下代码块实际上在做什么 var substringMatcher function strs r
  • 单击关闭按钮后不显示 Google 一键登录 UI

    我正在尝试按照本指南使新的谷歌一键登录工作 https developers google com identity one tap web https developers google com identity one tap web
  • 如果数字小于 10,则显示前导零 [重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 相当于 printf string format https stackoverflow com questions 610406 javascript equivalent t
  • 无法在前端使用 JavaScript Fetch API 将文件上传到 FastAPI 后端

    我正在尝试弄清楚如何将图像发送到我的 API 并验证生成的token那是在header的请求 到目前为止 这就是我所处的位置 app post endreProfilbilde async def endreProfilbilde requ
  • 单击引导分页链接时调用 jquery 函数

    我想在单击引导分页链接时调用 jquery 函数 假设我想从第1页遍历到第2页 应该调用一个jquery函数 我正在使用以下代码 但它不起作用 ul pagination on click li function alert page ch
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas
  • 如何在 gulp.src 中使用基本正则表达式?

    我正在尝试选择两个文件gulp src highcharts js and highcharts src js 当然 我知道我可以使用数组表达式显式添加这两个表达式 但出于学习目的 我尝试为它们编写一个表达式 我读过可以使用简单的正则表达式
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没

随机推荐

  • 从 gmail-api 获取发件人电子邮件

    我正在使用 gmail api 但无法获取发件人的电子邮件 我说的是电子邮件的 完整 格式 我认为发件人的电子邮件实际上是使用 gmail 的网络界面写在 发件人 字段中的电子邮件 这种完整格式的标头通常包括 X Original Auth
  • 我应该在清单中声明 MainFragmentDemoActivity 吗?

    我正在尝试学习片段 我正在单击片段类 我的应用程序崩溃了 我已在清单中声明了它 但是为什么会发生这种情况 我的菜单类 public class Menu extends ListActivity String classes Spinner
  • 网页上某些缩放级别的边框

    我们的公司网站正在经历一些奇怪的恶作剧 当您在台式电脑或笔记本电脑上查看它时 它在任何浏览器上看起来都很好 然而 当您在移动设备上浏览网站时 您会在 iOS 上的 Safari 和 Android 上的 Chrome 和 Android 2
  • libGDX:如何检查演员是否存在于舞台上

    如何检查演员是否已被移除并不在舞台上 像这样 if actor isRemoved enter code here 来自文档 https libgdx badlogicgames com nightlies docs api com bad
  • 在 EC2 主节点上初始化 Ray 时出错

    我正在使用 Ray 在 AWS EC2 上的 Ubuntu 14 04 集群上运行并行循环 以下 Python 3 脚本在我的本地计算机上运行良好 只有 4 个工作线程 省略了导入和本地初始化 ray init initialize Ray
  • 如何从 XAML 内部访问嵌套命名空间?

    我有一个包含 2 个项目的 WPF 应用程序 一个用于 ViewModels MyApp Core 另一个用于 Views MyApp 在 Views 和 ViewModels 内部 我有不同的嵌套命名空间 例如 MyApp Core Vi
  • shared_from_this 导致 bad_weak_ptr

    我正在尝试在 asio 中保留已连接客户端的列表 我已经改编了文档中的聊天服务器示例 http www boost org doc libs 1 57 0 doc html boost asio example cpp03 chat cha
  • 如何在我自己的android库模块中添加crosswalk webview?

    我正在开发一个 Android 库模块 其中必须包含 Crosswalk Webview 我使用 Github Sonatype 创建库 https github com sonatype https github com sonatype
  • 处理多个文件(图像)上传到 AWS S3 Swift

    我一直在尝试研究从 iOS 应用程序上传多个图像到 AWS S3 的最佳方法 我在 StackOverflow 上看到过一些类似的问题 其中最接近 答案 的问题就在这里 link https stackoverflow com questi
  • 如何将“camelCase”转换为“Camel Case”?

    我一直在尝试获取 JavaScript 正则表达式命令来将类似的内容转换为 thisString into This String 但我得到的最接近的是替换一个字母 导致类似的结果 Thi String or This tring 有任何想
  • C++ 从文本文件读取到数组/字符串

    这是我到目前为止的代码 我需要做的是从两个不同的文本文件 Matrix A 和 Matrix B 中读取 我可以这样做 但是对于我读到的每个文本文件矩阵 它只会出现 1 0 0 所以基本上是第一行 矩阵 A 的整个文本文件实际上是 1 0
  • Typescript - 错误地推断“从不”

    这是一个基本用例 用 null 初始化变量 然后更改某些嵌套循环 函数中的值 let a number null null 1 forEach gt a 1 if a null a toFixed Error Property toFixe
  • RStudio:我可以弹出源窗格吗?

    我有一个双显示器 我希望可以弹出 源窗格 我在其中编辑代码 以便我可以在一个显示器中编辑代码并跟踪另一个显示器中的其他所有内容 有谁知道这是否可能 非常感谢您的帮助 此功能本周刚刚添加到 RStudio 您可以在我们的日常构建中尝试它 0
  • Java Setter 和构造函数混淆

    我对如何在Java中使用构造函数和setter有点困惑 请参阅下面的示例代码 public class Name private String name public void setName String name this name n
  • 拳击,已经成为过去式了吗?

    这样做有什么意义吗 public static void Write
  • 构建詹金斯缺失的历史

    我刚刚为我的项目设置了一个新的 Jenkins 实例 版本 2 19 4 但是 当我尝试生成多个构建进行测试时 我发现构建历史记录仅向我显示一个历史构建 升级之前 至少显示两个或更多 詹金斯中有一个地方可以设置应该显示的历史构建的数量吗 在
  • 我可以将 Google Places API 中的姓名、地址和纬度/经度存储在我自己的数据库中吗?

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 Google Places 关于存储信息的术语可能有点令人困惑 我希望有人能提供一些说明 我想构建一个数据库并收集有关企业的独特数据
  • MSBuild 是否需要安装 Visual Studio?

    我正在使用 Atlassian Bamboo 设置构建服务器 MSBuild 包含在 NET 框架中 所以我相信我至少可以在没有 VS2010 的情况下很好地构建 NET 应用程序 我们主要使用 C 进行开发 我是否需要在构建服务器上安装
  • 异步函数何时实际返回待处理的承诺?

    我用谷歌搜索了这个问题很多次 但我看到这个问题的唯一答案是 异步函数总是返回一个承诺 但我没有找到任何可以回答这种情况何时真正发生的问题 是一进入异步函数还是一遇到第一个await关键词 我刚刚写了这段代码 async function m
  • 使用 JavaScript 平滑更改文本

    我正在制作一个登陆页面 其中的短语会随着选定的单词而不断变化 例如 设计更好的网站为客户制作 将切换第一个或最后一个单词成为 开发更好的网站为客户制作 然而 由于 开发 这个词比 设计 更大 因此文本的其余部分最终会被推来推去 而无法顺利过