美文网首页
1个CSS3插件引发的问题和思考

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

作者: 妙言Lisa | 来源:发表于2016-12-16 23:16 被阅读0次

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

插件: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">
    ![](https://img.haomeiwen.com/i4047954/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>

   ![](https://img.haomeiwen.com/i4047954/9859a63e6349192d.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  ![](https://img.haomeiwen.com/i4047954/5fde9acd2a5b7017.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  ![](https://img.haomeiwen.com/i4047954/8ab42330b0316d15.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  ![](https://img.haomeiwen.com/i4047954/a9d3014b1f061d86.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  ![](https://img.haomeiwen.com/i4047954/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)选中元素有动画属性时,动画效果只对被切换的元素有效,而不会对所有非活动元素有效。

相关文章

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

    总结了一下最近做的一个插件,及其背后引发的一些问题。 插件:CSS3背景图片切换动画 预览效果 源码下载注:文中插...

  • 孩子作业引发的问题和思考

    因为旅游请假三天,上周的数学课连上了两次,加上昨天,一共三次的作业。任务重,时间在他看来并不紧。放学跟在家里同学玩...

  • 生产问题问题引发的思考

    想了好久,打算要离职了。 当我敲好了离职原因,离职时间后,准备发送时,看到邮件报生产问题,我想了想,删除了刚打好的...

  • #19-三门问题引发的思考

    最近老有人催更,今天就更一篇吧。其实标题叫三门问题引发的思考并不妥。而是三门问题引发的问题引发的思考(太绕,后面你...

  • 浏览器启用NPAPI后页面CSS3动画的影响

    问题描述: 产生条件: 在360安全浏览器/360极速浏览器(npapi插件开启)CSS3动画及flash 共存 ...

  • JAVA 内存溢出问题总结

    现场内存溢出问题引发的思考

  • 由问题引发的思考

    今天有人问我: 你与人交往比较看重什么? 我心里第一反应,没思考过。 想一想后,我觉得靠眼缘,了解以后靠三观。 但...

  • lightGallery 动态查看图片,放大

    使用方法:功能齐全的jquery图片查看器插件_jQuery之家-自由分享jQuery、html5、css3的插件...

  • 情绪和问题

    今日思考: 1、困扰某人的,也许不是问题,而是问题引发的焦虑和情绪,先解决情绪,然后再说问题。 2、讲故事比道理好...

  • 网站推荐 (不定时更新)

    1.网页设计 jQuery插件库:JS特效,网页特效,以及各种html5,css3动画和效果Bootstrap,来...

网友评论

      本文标题:1个CSS3插件引发的问题和思考

      本文链接:https://www.haomeiwen.com/subject/knlomttx.html