黑月的BLooooog

  • 首页
  • 归档
  • 标签

鼠标跟随旋转效果实现

发表于 2016-08-04   |   分类于 CSS

鼠标跟随的3D转动

首先,甩一枚简单的demo看下要实现的效果。点击右下角可查看源码。

ok,直接开干,这个demo里面主要用到了两个属性:transform和perspective。分别可以设置3D和透视投影的效果。

3D变换效果

首先介绍下transform,写过一丢丢动画的孩子都会接触过的属性。CSS3的3D效果是使用transform的rotateX(Y, Z),translateX(Y, Z),scaleX(Y, Z)方法进行设置的。

上图就是一个3D坐标系,需要注意的是,3D元素的原点应该是在元素的中心,而不是像上图一样在立方体的一个角上。如果只是单单一个元素的话,它的形状就是一个平面区域。下面简单介绍一下transform中相关的3D方法。

rotateX(Y, Z)

顾名思义就是绕着X轴(Y轴或者Z轴)旋转。注意:逆时针为正方向(如图)

translateX(Y, Z)

默认情况下,开启的是平面投影,所以此时设置translateZ是没有什么luan用的。那怎么生效呢,看下去才告诉你(╭(╯^╰)╮)。

scaleX(Y, Z)

缩放,好理解。偶尔会用来做字号的特殊处理,比如像chrome默认的最小字号是12px,要是你家视觉非要设置10px大小的字体咋整,那就给他一巴掌,叫他要求这么多(现实情况是可以用这个属性来解决……)。

题外话:chrome的默认最小字号可以在设置中更改,不过你的用户可不管这些。


transform-style属性

它有两个值:

  • flat(默认,顾名思义就是平面状态,所以上面说的设置translateZ才会失效。)
  • preserve-3d

聪明如你马上明白preserve-3d才是主角,设置了transform-style: preserve-3d的父元素会生成一个3D空间,把所有的子元素都包括在这个3D空间内。

注意:上面说的是子元素 ,不是后代元素,看看demo中的我是preserve-3d的孙子这行字所在的元素,Z值和它爸爸黑月是不同的,但是转动卡片发现,视觉效果上他们是在同一个Z值平面的。那要让孙子上的Z值也生效呢?啥,你还不知道!那你再看一遍上面的两段话- -。(答案:在黑月上再设置一次这个属性,可以在demo上尝试修改下看看)。

对于父元素设置的transform属性,都会应用到生成的这个3D空间,对整个空间进行3D操作(旋转,平移,缩放)。最后会把所有的元素投影到屏幕上,不是父元素上!

当transform-style的值为flat时,子元素和父元素是互相独立的,并没有在父元素的3D空间内,他们各自做各自的3D变换,然后按照先后顺序投影到父元素上。这也是flat时,translateZ失效的原因。

tips:设置在transform属性上的rotateX(Y, Z),translateX(Y, Z),scaleX(Y, Z)方法是从右向左执行的。


透视投影

透视投影是模拟人眼的图像观察方式,让平面上的物体呈现现实的视觉效果。

有两种设置方式:

  • perspective: none | <length>;
  • transform: perspective(<length>) method(p) method(p) ...;

第一种:可以将子元素(不包含自身,不包括后代元素)的投影效果设置为透视投影。
第二种:为这个元素自身开启透视投影模式。

先看下3D视角的原理图,来自这里

图中淡蓝色部分即电脑屏幕所在的平面(z=0的平面),眼睛所在的位置就是通过perspective设置的模拟焦点位置,焦点到z=0平面的距离就是perspective的值,而橘红色部分就是设置了translateZ为负值的3D元素的所在平面,3D元素到z=0平面的距离就是3D元素上translateZ的值,如图为负值,如果在焦点和z=0及平面之间,则为正值。

这是透视的平面原理图,来自这里。

通过这两张图,应该能够很直观的看出perspective和translateZ的设置对于3D元素在屏幕上产生的投影的效果了。当元素的z值大于’perspective’的值时,你就看不见它了,就像你的boss站在你的脑袋后面一样一样。一般情况下,’perspective’设置500px到1000px在视觉上比较合理。

在demo中,如果取消perspective透视属性,你会发现,卡片就像一个没固定好的相框在转动,这就算是透视属性的必要性。

透视投影还可以设置焦点的位置(默认在中心),因为你的脑袋也是可以动的:

perspective-origin: x y;

到这里,3d和透视投影的相关属性就介绍完了,有什么不清楚的你可以改改demo测试下。

对不起,还没完……


鼠标跟随的实现

关键是理清前面的属性,最后的鼠标跟随转动效果通过js实现应该比较简单了,监听mousemove事件,根据鼠标位置到3D元素的中心的距离,除以一定的系数,实时改变元素的rotateX和rotateY的值来达到效果。你可以通过改变系数的大小来控制转动的灵敏度。

贴一下代码:

var o = $("#card");
$("#top").on("mousemove", function(t) {
    var e = -($(window).innerWidth() / 2 - t.pageX) / 20,
        n = ($(window).innerHeight() / 2 - t.pageY) / 10;
    o.attr("style",
        "transform: rotateY(" + e + "deg) rotateX(" + n + "deg);
        -webkit-transform: rotateY(" + e + "deg) rotateX(" + n + "deg);
        -moz-transform: rotateY(" + e + "deg) rotateX(" + n + "deg)"
    )
})

THE END……能看到这里的人真是让俺感动啊~

养成好习惯,顺手打广告:这个动效用在了网易有数的首页。网易有数是一款敏捷数据分析平台,欢迎使用体验。

参考自:

  • Tour of a Performant and Responsive CSS Only Site
  • 3D效果 & 透视

Hexo + GitHub Pages 构建博客

发表于 2016-08-03   |   分类于 常规

1. 介绍篇

DEMO

什么是Hexo

Hexo 是一个简单地、轻量地、基于Node的一个静态博客框架,可以方便的生成静态网页。作者是台湾大学生tommy351。

什么是GitHub Pages

GitHub Pages 可以被认为是用户编写的、托管在github上的静态网页。由于它的空间免费稳定, 可以用于介绍托管在github上的Project或者搭建网站。有两种形式: Project Site 和 User/Org Site。

GitHub Pages 生成的网站的默认域名是 username.github.io 或者 username.github.io/project-name ,但GitHub Pages是支持自定义域名的,参考教程:github怎么绑定自己的域名

2. 安装篇

安装中的一些小问题提醒

  1. npm 报连接错误导致的安装失败:建议使用淘宝NPM镜像。
  2. 权限错误:命令前加sudo

环境

  • 安装node (建议采用n模块安装)
  • 安装git(安装Xcode自带)
  • 申请github账号

安装Hexo

  1. 首先全局安装hexo

    $ npm install -g hexo
    
  1. 创建工作文件夹,举例命名为blog;

  2. 进入blog,初始化:

    $ hexo init
    

这里可能出现初始化错误,原因就是默认的npm出现连接错误,你需要手动执行$ cnpm install。
cnpm就是淘宝镜像的命令。

  1. 安装server,用于本地调试:

    $ cnpm install hexo-server --save
    

如果不安装,现在的版本是不在带服务器的,导致后面执行hexo server报没有命令的错误。

  1. 生成静态页面:

    $ hexo generate 或 $ hexo g
    
  2. 启动本地服务,进行文章预览调试:

    $ $hexo server或 $ hexo s。
    

启动成功,根据提示在浏览器浏览器输入 http://localhost:4000 即可查看。

hexo一些常用命令(可以通过hexo help查看):

  • hexo new "postName" #新建文章

  • hexo new page "pageName" #新建页面

  • hexo generate #生成静态页面至public目录

  • hexo server #开启预览访问端口(默认端口4000,’ctrl + c’关闭server)

  • hexo deploy #将.deploy目录部署到GitHub

  • hexo help # 查看帮助

  • hexo version #查看Hexo的版本

hexo关联配置Github

  • 关联之前,你得先创建好自己的GitHub Pages,按着官方教程一步步来,或者自己google。

  • 修改blog下的配置文件_config.xml:(repo的地址写你自己的GitHub Pages项目地址啊)

    deploy:
    
         type: git
    
         repo: https://github.com/fenglai0802/fenglai0802.github.io.git
    
        branch: master
    
  • 安装发布命令:

    $ cnpm install hexo-deployer-git --save
    
  • 执行命名:

    $ hexo deploy
    

此时public文件夹下的内容就会被上传到你的github中fenglai0802.github.io的这个项目下。

  • 然后再浏览器中输入 https://fenglai0802.github.io/ 就可以查看了。

  • 每次部署的步骤,可按以下三步来进行。(建议自己写一个shell方便发布)

    $ hexo clean
    
    $ hexo generate
    
    $ hexo deploy
    

3. hexo主题篇

  • 主题汇总。使用方法里面也有介绍,简单讲就是把主题克隆到theme文件夹,然后修改_config.yml配置文件中的theme选项就行。
  • 这里比较推荐主题NexT。自用就是这个,哈哈~

利用模块n管理node版本

发表于 2016-08-03   |   分类于 常规

利用模块n管理node版本

  • 由于node的版本迭代速度非常快,所以版本多样,所以升级版本或者切换版本都比较麻烦。本文介绍一下模块n的好处。
n
  • n是node的一个模块,作者是TJ Holowaychuk(鼎鼎大名的Express框架作者),就像它的名字一样,它的理念就是简单:

    no subshells, no profile setup, no convoluted api, just simple

  • 安装n

    $ sudo npm install -g n
    
  • 安装完成之后,直接输入n后控制台就会输出当前已安装的node版本以及正在使用的版本(前面有个o的),通过上下方向键来选择想要使用的版本,回车生效。

    $ n
        0.10.1
    o   6.0.0
    
  • 安装指定版本node

    $ n 6.0.0
    
  • 安装最新版本node

    $ n latest
    
  • 安装稳定版本node

    $ n stable
    
  • 删除某个版本

    $ n rm 0.10.1
    
  • 以指定的版本来执行脚本

    $ n use 0.10.21 some.js
    
12
黑月

黑月

13 日志
5 分类
19 标签
RSS
© 2017 黑月
由 Hexo 强力驱动
主题 - NexT.Muse