Web那些事

【魅力CSS】CSS3滑动背景菜单

例牌的唠叨

想当年哇, 刚写编程的时候, 做页面想用些绚丽的效果, 可那个是不会js, 才刚学java, 哪那么快搞股这么多东西呢. 无奈只好google搜(当年google这愣头青还才跑进中国呢), 找了一大堆, 不是运行出错就是只支持ie, 真是坑爹啊~~

当年菜单特效很流行, 好像没有动画就不能进菜单家门了. 在google N久之后, 我也终于找到一个滑动背景效果的代码. 不懂原理, 也用得不亦乐乎.

以上都是废话

嗯, 以上都是废话 :oops: . 最近偶然看到以前做的滑动背景菜单, 看了下代码, 都快笑喷了 — 天啊, 我竟然写过这么挫的代码! 所谓滑动背景菜单, 就是鼠标移上去, 会有一个气泡什么的垫在菜单下面的, 可以看看下面这个 live demo.

这个是用jq做的, 当然不是我写的, 出处在这里. 如果一个效果/动画能用css3实现, 我是绝对不想用js搞的. 继续阅读…

剥离模板代码加速Web页面加载

开篇

现在Web富应用越来越多, 越来越多网站朝单页面发展, 所有功能模块都在一个页面中创建. 作为一个合格的前端, 所负责的模块一定是逻辑跟UI分离的, 通常的做法就是页面代码编写成模板, 然后往模板填充数据并输出到页面上. 关于前端模板的介绍和使用我就不说了, 不了解的可以先看看这篇文章(http://www.css88.com/archives/4564), 这里讨论下使用模板引擎引入的另外一个问题(也不是Bug啦~) — 页面模板代码放哪?

页面模板代码放哪

呼~~总算到正题了(- -||). 说回来, 页面模板的代码到底要放哪呢?

  1. 放在 js 文件中;
  2. 放在页面不可见的地方, 比如 <script type=”text/plain”></script>标签内;

话说很久很久以前, 我也是把模板写在js里面的, 然后需要修改的时候就崩溃了~ 在一堆字符串里面找到想要改动的地方就像是在一坨黄色的屎里面找个金戒指(恶…). 过了不久学乖了, 把模板像写html那样换行和缩进, 就跟下面一样. 继续阅读…

【魅力CSS】使用CSS3动画制作时钟

倒倒苦水

做完这个小玩意之后, 我觉得, 我一定是闲得蛋疼才做的. 嗯, 一定是的.

话说昨天今天加班, 下午下班前总算把临时变更的需求完成的七七八八了, 昨晚又爬了一趟南山, 累的不行…

想起某个产品说的, 工作累了, 就写写代码, 休息一下 =_=||

好了, 言归正传. 下午偶然看到一个jquery+css3实现的时钟, 挺漂亮的, 突然觉得是不是也可以用纯css3整一个, 于是乎…先看看最终效果

 或者你也可以直接点这里看代码(因为我太喜欢啰嗦啦…)
继续阅读…

【疯狂的菊花系列】用CSS3帧动画实现Loading

一直以来, 本人都认为css3的animation只能实现渐变动画, 比如高度从0渐变到100px这类的. 而无法实现高度从0跳变到50px再跳变到100px这种类似flash的帧动画效果.

但是在看到天才的师姐给的例子之后, 让我愧疚得无地自容, 原来还真有css3帧动画的, T_T. 这个属性是 timing-function: step-end; 而且firefox,webkit,ie10都有支持, 详细介绍可以在这里(https://developer.mozilla.org/en/CSS/timing-function#step-end)看.

跟帧动画有关的timing-function有step-start, step-end, 就那step-end来说, 它的效果是在每一步的结束点, 进行跳变.

比如下面的代码, 这个动画有两步, 如果是用linear方式渐变, 那么在动画的执行过程中, background-position-x的值将从0一直递减到-100%, 你看到的效果就是: 背景图片一直在慢慢的向右(注意, 是向右)移动; 而如果用step-end方式, 则可以看到背景是突然变成 background-position-x: -100%处的. 继续阅读…

【魅力CSS】CSS3单边阴影

话说, CSS3的事实标准出来那么久了, 很多属性都开始去掉私有前缀了, 如 box-show. 如果你还不知道box-show是什么, 那只能说你是个正常人类, 不是前端攻城师, 可以离开这里回去地球了.

既然你还在继续看到这, 那么你可能知道box-shadow, 不过我还是要讲概念, ^_^.  box-shadow, 顾名思义就是盒子阴影, 可以给一个块级容器加上阴影或者发光效果. 效果如下:

把阴影的颜色和透明度调整下, 就可以整成发光效果了. 不过今天的主角不是他, 略过.

说回正事, 这box-shadow虽然好用, 可是有时还会遇到蛋疼的设计, 搞出只有一边的内阴影. 而box-shadow最多只能做到剩下两边有阴影(看下面,看下面↓), 这可愁死了咱这苦命的娃啊. 继续阅读…

CSS3模拟Checkbox

话说, 很久很久以前, 一直到不久前, 浏览器原生的checkbox(复选框)的样式大部分都不能改的, 在各个浏览器中的外观和行为都不一致, 这是一件相当让人蛋疼的事.

而在那个远古的蛮荒时代, 还生活着一种叫攻城师的生物, 每天被产品经理们强迫着, 想方设法让checkbox外观一统江湖, 苦不堪言.

在那个时代, css2和dom level2风行, 却对checkbox束手无策, 苦逼的攻城师们只能用JS来模拟checkbox的行为, 无辜的checkbox只能灰溜溜的束之高阁~.~ 继续阅读…

【疯狂的菊花系列】全CSS3制作Loading动画

话说上三回, 我们用css3的animation让png图片动起来了.

但是美中不足的是, 还要画一张图片. 如果要求做几个不同大小的菊花, 或者要换个颜色, 又或者要不同的地方用不同的颜色和大小的菊花, 得找到原图(psd之类的)再导出一个不同的size, 个人感觉蛋疼死了.

这次咱们用css3来画那几个点, 让它能大能小能色, 嘿嘿~~(邪恶了).

先看看效果吧, 用鼠标左键狠狠的砸这里.

菊花上有12个点, 我们用12个span标签来做, 宽高使用百分比, 用来自适应外层容器的变化, 圆角设置为100%,就可以保证显示成一个圆了.

接下来的事情就比较痛苦, 需要一个个摆到正确的位置. 但是为了以后的幸福生活哇, 咱也得硬着头皮的上是吧.

好在有了css3的选择器,我们也不用一个个给这些span起名字了,span:nth-child(1)就表示第一个span, nth-child的值是从1开始的,感觉有点怪异.

定位的话用绝对定位, 然后用负的margin把圆心偏移回去, 位置要自己算好, 具体可以看 demo.

css代码我就不贴全了,避免凑字数的嫌疑, 关键代码如下:

.loading{
    width: 50px;
    height: 50px;
}
.loading div{
    position: relative;
    width: 100%;
    height: 100%;
    -webkit-animation: auto-circle 1s linear infinite ;
    -moz-animation: auto-circle 1s linear infinite ;
}
.loading div span{
    display: block;
    background: #04AED9;
    -webkit-border-radius: 100%;
    -moz-border-radius: 100%;
    position: absolute;
}
.loading div span:nth-child(1){
    width: 18%;
    height: 18%;
    left: 50%;
    top: 0%;
    margin-left: -9%;
}
.loading div span:nth-child(2){
    width: 16.5%;
    height: 16.5%;
    top: 15%;
    left: 28%;
    margin-left: -8.25%;
    margin-top: -8.25%;
}
/*:nth-child(3)--> :nth-child(12) */

除了loading的外框, 全部值都是用百分比, 这样12个小点的大小和位置都能随着外框的大小改变而改变了, 连颜色都能随便改, 爽了吧.

后传:

某产品: 这个菊花改成16px的, 那个换成红色的.

苦逼代码男: 32px改成16px是吧, 蓝色换成红色是吧,  嗯, 改完了, 吃饭~~

某产品: …… 

=== 2012-4-4更新 ===
有同学反映, 这个百分比宽度不会算. 其实很简单那的呐:

  1. 先定下最大的那个圆的宽度, 比如这的 第一个, 18%;
  2. 然后这里的菊花有12个瓣, 18 / 12 = 1.5;
  3. 之后第二个第三个就一直从18%往下减就行啦

【疯狂的菊花系列】Canvas绘制Loading动画

上回说到用png图片来做帧动画, 总的来说也没什么大问题, 但是画个菊花, 按固定角度旋转N次做图实在是蛋疼.

既然怎么样都要画个菊花, 那不如就用canvas来画算了. 对于不支持canvas的浏览器, 可以用svg, 原理都差不多.

这个canvas动画的原理跟帧动画也类似, 先绘制第一帧的画面, 然后擦掉, 接着绘制第二帧, 以此循环. 时间间隔短的话看上去就变成动画了.

具体解释请看代码, 有足够的注释, 或者也可以点这里看看结果. canvas的api说明可以在这里找到.

window.onload = function(){
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    if(!ctx){
        return;
    }
    ctx.clearRect(0,0,128,128);//擦除画布
    ctx.fillStyle = 'transparent';
    ctx.fillRect(0,0,128,128);
    ctx.fillStyle = 'black'; //定义点的颜色
    var base = 0;
    var update = function(){
        ctx.save(); //把当前的绘图状态保存起来(如旋转角度的初始位置, 填充颜色, 坐标原点等)
        ctx.clearRect(0,0,128,128);//擦除画布
        ctx.translate(64, 64);//把坐标原点移动到画布中央
        base = (++base === 13) ? (base - 12) : base;//使用base来指示最大的圆点所在的位置, 实现旋转动画的效果
        var angle = Math.PI / 6;//画12个点, 所以每个点之间的角度是 1/6 PI
        var beginAngle = angle * base ;
        for(var i = 1; i <= 12; i ++){
            ctx.beginPath();//开始一个路径
            if(i === 1){
                ctx.rotate(beginAngle);
            }else{
                ctx.rotate(angle);//每次调用rotate之后, 其旋转角度并不会还原, 而是接着上一次的位置
            }
            ctx.arc(0, -48, i * 0.8 + 1, 0, 2 * Math.PI, true);//绘制一个圆点
            ctx.closePath();//闭合路径
            //如果不是用beginPath和closePath, 在调用fill方法时, 会导致画布上的所有圆都重叠在一起了
            ctx.fill();//填充(使用上面最后定义的fillStyle)
        }
        ctx.restore();//还原绘图状态, 如果不还原, 则下一次调用rotate时会接着这次的位置旋转, 而不是初始位置
    }
    update();
    setInterval(update, 50);
};

菊花系列暂时就到这里了, 有时间再去用svg整个.

1 2 3 4  返回顶部