1个CSS3插件引发的问题和思考

总结了一下最近做的一个插件,及其背后引发的一些问题。

插件:CSS3背景图片切换动画

预览效果 源码下载
注:文中插件在Github上,例子在JSBin

思路:

  1. 样式不难,但因为有切换效果,所以就变得复杂了:

    1. 本来背景图片要用1个div,但这样就无法实现5种不同的切换效果,因此改用5个div;

    2. 用5个div而不是5个img是因为这样避免图片被拉伸;

    3. 因为是点击时切换,本来想用jquery,但感觉很麻烦,还要让元素动画后恢复原位置等,于是想用CSS3;

    4. 用CSS3的话,因为不是hover时修改属性,感觉无法用transition,最后用了target伪类、animation和keyframe来做。

  2. 选中(活动)时,出现相应的动画,rotatescale一起时,中间用空格

.rotate:target{
    z-index: 10;
    animation:rotate 1s 1;
    -webkit-animation:rotate 1s 1;
        }
@-webkit-keyframes rotate{
    0%{transform: rotate(-360deg) scale(0.1);}
    100%{transform: rotate(0) scale(1);}
        }
  1. 因为设置的是背景全屏,height:100%时,需要给html和body也设置height:100%才会有效。给body设置了最小宽度,确保ul不会换行。

  2. 用了nth-child属性

问题1:

.bg的position不用fixed,用absolute(Line23);.body加overflow:hidden(Line17)时;图2的变换效果时会出错(好像没有脱离文档流一样);浏览器窗口<920px(body的min-width)时不能保证所有ul都显示,为什么?是否关系到position:absoluteposition:fixed的区别?预览问题效果

  1. 高度100%。如果.bg不设置绝对定位且没有定位的父元素,则2个.bg的高度会分别=视图的高度=html高度,且出现滚动条。问题:为什么此时HTML的高度不等于文档的高度?HTML不是代表整个文档吗?猜想:应该是类似于在固定宽高的容器内放入了比容器大的内容,容器的大小是不变的,但内容会溢出来。
<div class="bg bg1"></div>
<div class="bg bg2"></div>

CSS代码如下:

html,body{width: 100%;height: 100%;margin: 0;padding: 0;}
.bg{width: 100%;height: 100%;}
.bg1{background: url(http://p1.bpimg.com/576696/cdbcb7e403358881.jpg) left no-repeat;background-size: cover;}
.bg2{background: url(http://p1.bpimg.com/576696/2e26477499566853.jpg) left no-repeat;background-size: cover;}
  1. 绝对定位与脱离文档流。先不思考第1点,继续研究我们上面提出的问题1,猜想:因为绝对定位虽然脱离了文档流,但是并没有脱离整个文档,也是会影响文档的大小的。
<div class="bg bg1"></div>
<div class="bg bg2"></div>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ea quae quam suscipit eum iste deserunt repellendus ducimus accusantium vero nemo, vitae rerum quisquam dolor facilis quis neque, est esse, autem.</p>

CSS代码如下:

html,body{width: 100%;height: 100%;margin: 0;padding: 0;}
.bg{position: absolute;top: 0;left:0;}
.bg1{
    width: 100%;
    height: 100%;
    background: url(http://p1.bpimg.com/576696/cdbcb7e403358881.jpg) left no-repeat;
    background-size: cover;
        }
.bg2{
    left: 50px;
    width: 100%;
    height: 1200px;/* 设置得比窗口高度大 */
    background: url(http://p1.bpimg.com/576696/2e26477499566853.jpg) left no-repeat;
    background-size: cover;
        }

以上例子2说明:2个.bg虽然脱离了文档流,将p覆盖住了,但.bg2将整个文档的高宽都撑开,出现了滚动条。说明,即使绝对定位,也是影响文档大小的。

<div class="wrap">
    ![](http://upload-images.jianshu.io/upload_images/4047954-629e2191a77f91b5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
</div>

CSS代码如下:

html,body{margin: 0;padding: 0;}
.wrap{position: absolute;left: 50%;}
.wrap img{position: relative;left: -50%;}

以上例子3不定宽块状元素水平居中时,出现了水平滚动条,再次说明了绝对定位是会影响文档大小。如果把.wrap改为position:fixed则不会出现滚动条,但前提是.wrap没有外嵌套父容器,否则只能用overflow:hidden了。

总结

  • 图2的变换效果时会出错,是因为position:absolute虽然脱离文档流,但依然会影响文档的大小
  • 浏览器窗口<920px(body的min-width)时不能保证所有ul都显示,是因为前面为了不让图2变换时出现滚动条而给body设置了overflow:hidden

问题2:

为什么选中任意圆形图标切换背景时,.bg:not(:target)(Line165)只选中当前最顶的背景,而不会选中其他当前没有活动的.bg呢?预览问题效果,点击审查元素,当切换任意动画的时候,查看几个.bg的z-index值。

网页一打开的时候,所有的.bgz-index都是5,说明动画是对所有非活动的.bg有效的。但当前有活动.bg时,:not(:target)只对当前已target的.bg有效了。猜想:需满足2个条件:切换和动画。

   <a href="#img1">图1</a>
   <a href="#img2">图2</a> 
   <a href="#img3">图3</a>
   <a href="#img4">图4</a>
   <a href="#img5">图5</a>

   ![](http://upload-images.jianshu.io/upload_images/4047954-9859a63e6349192d.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  ![](http://upload-images.jianshu.io/upload_images/4047954-5fde9acd2a5b7017.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  ![](http://upload-images.jianshu.io/upload_images/4047954-8ab42330b0316d15.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  ![](http://upload-images.jianshu.io/upload_images/4047954-a9d3014b1f061d86.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  ![](http://upload-images.jianshu.io/upload_images/4047954-dbebb4640692a48a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

CSS代码如下:

    img{display: block;width: 500px;}
    img:target{border: 2px solid red;}
    img:not(:target){border: 2px solid yellow;}
    img:not(:target){
            animation:notTarget 5s 1;
            -webkit-animation:notTarget 5s 1;
        }
    @-webkit-keyframes notTarget{
        0%{width: 800px;}
        100%{width: 400px;}
    }
    @keyframes notTarget{
        0%{width: 800px;}
        100%{width: 400px;}
    }
    @-moz-keyframes notTarget{
        0%{width: 800px;}
        100%{width: 400px;}
    }

通过以上例子的预览效果,说明问题2的猜想是正确的,:not(:target)选中元素有动画属性时,动画效果只对被切换的元素有效,而不会对所有非活动元素有效。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容