史上最详细 纯CSS打造3D文本滚动

昨天看见了一篇文章关于用纯CSS实现文本滚动,在这里跟大家分享一下。

首先把效果图贴给大家

根据效果图我们很容易发现肯定是要用到3D转换的,如果对这个还不是很了解的可以先看看下面的文章

http://www.zhangxinxu.com/wordpress/2012/09/css3-3d-transform-perspective-animate-transition/comment-page-1/

http://www.w3cplus.com/blog/tags/95.html

那么首先我们就要把这个折角的效果做出来

HTML代码:

    <div id="container">
            <div>
                <span>用来装文字</span>
            </div>

            <div>
                <span>用来装文字</span>
            </div>
        </div>

既然是3D效果,那么就要把创建一个3D环境,我们跟id=container的div加一个perspective:500px。然后跟底下的子div加上基本样式

CSS代码:

       #container{
                perspective: 500px;
                /*font-size: 0;*/
                }
            #container div{
                font-size: 1rem;
                width: 30rem;height: 10rem;background: #c40000;
                display: inline-block;
            }

效果图:

我们可以看到中间产生了空隙,为了解决这个问题我们可以将id=container的div设置font-size:0;更多可以见下面这篇文章

http://www.w3cplus.com/css/fighting-the-space-between-inline-block-elements

解决上述问题后,就要产生折角了,主要是通过transform:rotateY 来实现。

      #container div:first-of-type{
                transform: rotateY(-40deg);
                transform-origin: top right;
                background: #E5233E;}
            #container div:last-of-type{
                transform: rotateY(40deg);
                transform-origin: top left;
                background: #B31E31;}

为了实现更为逼真的效果,凸显出明暗,我们将两个子div的背景颜色设置成不同的值( #E5233E和#B31E31),这样就会有背光和向光的区别,同时在#container div中加入如下基本设置代码

color: #fff;
line-height: 10rem;

看效果吧

怎么样,基本雏形已经有了,那么接下来就是要让文字滚动起来,这时我们就需要用到transform:translateX 这个位移特性了。

现在我们把代码变成下面这个样子

#container div{
                font-size: 6rem;
                width: 30rem;height: 10rem;
                display: inline-block;
                color: #fff;
                line-height: 10rem;

                position: relative;

            }
            #container div:first-of-type{
                transform: rotateY(-40deg);
                transform-origin: top right;
                background: #E5233E;}
            #container div:last-of-type{
                transform: rotateY(60deg);
                transform-origin: top left;
                background: #B31E31;
                }

            #container div span{
                position: absolute;
            }
            #container div:first-of-type span{
                transform: translateX(60rem);/*这里值要设置成2倍div的宽度(实际上是div的宽度+下面的translateX的值)*/
       }        #container div:last-of-type span{ transform: translateX(30rem);/*这里的30rem要设置成刚好和div的宽度相同*/ }

在这里主要说一下这两个translateX的怎么设置,首先看第二个div也就是右边这个,如果要文字从最右边移动过来,首先我们就需要把文字全部移到div的后面去,也就是上图蓝色部分;那么左边那个div的translateX的值就必须是上图中X+Y的值,如果说的不是很清楚,可以自己下来实验自行体会。哎,这个图画的貌似有点丑,将就一下啰。

那么接下来就要运动动画来改变translateX的值使文字动起来了

       #container div:first-of-type span{
                transform: translateX(60rem);
                animation: left_div 14s linear infinite;

                text-shadow: 20px 0px 4px rgba(0,0,0,0.3);/*为了效果更逼真我们在向光的div加上文字阴影*/
            }

            #container div:last-of-type span{
                transform: translateX(30rem);
                animation: right_div 14s linear infinite ;
            }

            @keyframes right_div{
                to{transform: translateX(-130rem);}
            }

            @keyframes left_div{
                to{transform: translateX(-100rem);}
            }

这里我们用到了关键帧,实现动画特效,这里需要注意的是  |(-130)-30|  和|(-100)-60|这两个的绝对值必须相等,这样你才可能,保证速度一直(简单点就是在所用的时间都相同的话,要想速度相同并排跑,那么跑的距离也应该是相同的)。在这里究竟要位移多少(如代码中的-130rem和-100rem)这个取决于你的文字长度,文字越长,这个位移的距离肯定要越长。

怎么样还是比较逼真吧!我们在这里跟子div都加了一个overflow:hidden,来隐藏已经溢出的文字,不然会见到下图

当然这里还有一个问题,那就是如果文字过长,那么在div里面就会换行得到的就是下面的效果

这种显然不是我们想要的,所以要在#container div中加入  white-space:nowrap;这样就正常了。

最后一步就是要实现响应式,因为当屏幕较小时,则会出现下面的效果

所以我们加上如下代码

      @media all and (max-width: 993px) {
              #container {
                perspective: none;
              }
              #container div:last-of-type {
                opacity: 0;
                height: 0;
              }
              #container div:first-of-type {
                width: 80%;
              }
            }

当屏幕较小是,会显示如下效果

好了,大功告成,各位拿去尽情装逼吧!最后附上完整代码

HTML

    <div id="container">
            <div>
                <span>DJL箫氏,三月七日,白桦林里,热爱前端,性别男,爱好女</span>
            </div>

            <div>
                <span>DJL箫氏,三月七日,白桦林里,热爱前端,性别男,爱好女</span>
            </div>
        </div>

CSS

        #container{
                perspective: 500px;
                font-size: 0;
                }
            #container div{
                font-size: 6rem;
                width: 30rem;height: 10rem;
                display: inline-block;
                color: #fff;
                line-height: 10rem;

                position: relative;
                overflow: hidden;

                white-space: nowrap;
            }
            #container div:first-of-type{
                transform: rotateY(-40deg);
                transform-origin: top right;
                background: #E5233E;}
            #container div:last-of-type{
                transform: rotateY(60deg);
                transform-origin: top left;
                background: #B31E31;
                }

            #container div span{
                position: absolute;
                width: 400%;
            }
            #container div:first-of-type span{
                transform: translateX(60rem);
                animation: left_div 14s linear infinite;

                text-shadow: 20px 0px 4px rgba(0,0,0,0.3);
            }

            #container div:last-of-type span{
                transform: translateX(30rem);
                animation: right_div 14s linear infinite ;
            }

            @keyframes right_div{
                to{transform: translateX(-130rem);}
            }

            @keyframes left_div{
                to{transform: translateX(-100rem);}
            }

            @media all and (max-width: 993px) {
              #container {
                perspective: none;
              }
              #container div:last-of-type {
                opacity: 0;
                height: 0;
              }
              #container div:first-of-type {
                width: 80%;
              }
            }

参考链接:

http://www.w3cplus.com/animation/wrapping-animated-3D-marquee-text-with-pure-CSS.html

http://thenewcode.com/1096/Wrapping-Animated-3D-Marquee-Text-with-Pure-CSS

时间: 2024-08-11 03:31:28

史上最详细 纯CSS打造3D文本滚动的相关文章

HTML5 CSS3专题 纯CSS打造相册效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/30993277 今天偶然发现电脑里面还有这样的一个例子,感觉效果还不错,不记得啥时候下载的了,也好久没上w3cfuns了,怀念学习前台的日子,给大家分享下. 效果图: 效果是不是还是很不错的,最主要的是没有使用一行js,这才是亮点. 先看html文件: <body> <div id="gallery"> <h1>纯CSS3相册效果&l

纯CSS打造忙碌光标

我们经常会用到忙碌等待的情况,比如ajax等待回调,或者加载页面的时候,我们通常的做法就是放一张loading.gif图片,在那里转呀转. 以前是在pc上用,也没有觉得不妥,如今要在移动端用,问题就来了,以前呢,做前端,兼容各种浏览器,就够让人头疼了,现在还要兼容各种屏幕尺寸. 开始呢,是做了N张不同大小的gif图.用javascript去判断屏的大小,然后选择适当的gif图片,这样做的缺点是很显的,说多了都是泪.现在我要做的,就是 换成css3去实现这个效果.下面看效果图: 有兴趣的,可以复制

史上最详细的Android Studio系列教程一--下载和安装

链接地址:http://segmentfault.com/a/1190000002401964#articleHeader4 原文链接:http://stormzhang.com/devtools/2014/11/25/android-studio-tutorial1/ 背景 相信大家对Android Studio已经不陌生了,Android Studio是Google于2013 I/O大会针对Android开发推出的新的开发工具,目前很多开源项目都已经在采用,Google的更新速度也很快,明显

Windows server 2003域控直接迁移到2012[史上最详细]

Windows server 2003域控直接迁移到2012[史上最详细] 有问题请联系QQ:185426445,或者加群微软统一沟通中国(一),群号:222630797, 也可以和我本人联系,手机:18666943750,非诚勿扰,谢谢! 环境介绍: 首先说明我的环境,实验环境比较简单.环境中已经有Windows server 2003 的域控.域名为contoso.com 系统 服务 主机名称 IP地址 Windows Server 2003 R2 主AD,FSMO五角色主机及GC Win2

史上最详细的Android Studio系列教程四--Gradle基础

史上最详细的Android Studio系列教程四--Gradle基础

iOS 真机调试(史上最详细步骤解析,hmt精心打造)

/*************************************************************1********************************************************************/ /*************************************************************2******************************************************

史上最详细Windows版本搭建安装React Native环境配置 转载,比官网的靠谱亲测可用

史上最详细Windows版本搭建安装React Native环境配置 2016/01/29 |  React Native技术文章 |  Sky丶清|  95条评论 |  33530 views 编辑推荐:稀土掘金 是一个高质量的技术社区,从 React Native 到 RxJava,性能优化到优秀开源库,让你不错过移动开发的每一个技术干货.各大应用市场搜索「掘金」,技术干货尽在掌握中. 说在前面的话: 感谢同事金晓冰倾情奉献本环境搭建教程 之前我们已经讲解了React Native的OS X

史上最全的css hack

1 <!DOCTYPE html> 2 3 <html> 4 5 <head> 6 7 <title>Css Hack</title> 8 9 <style> 10 11 #test 12 13 { 14 15 width:300px; 16 17 height:300px; 18 19 20 21 background-color:blue; /*firefox*/ 22 23 background-color:red\9; /*a

史上最全的css hack(ie6-9,firefox,chrome,opera,safari)

在这个浏览器百花争鸣的时代,作为前端开发的我们为了我们漂亮的设计能适应各个浏览器可为煞费苦心,主要体现在javascript和css上面.javascript我这次就不谈了,先说说css. 为了适应不同浏览器不同的版本(版本主要就ie来说),ie这朵奇葩现在我们要兼容6-9,它的10也快出来了...在ie下我们可以写条件注释来区分 ie和其他浏览器,以及ie的版本,这些请大家自行google.这篇文章主要讨论的是css hack.下面废话补多说了,直接上代码 <!DOCTYPE html>