最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • CSS弹性布局FLEX,媒体查询,移动端点击事件

    正文概述 掘金(二十有五)   2021-02-24   594

    flex弹性布局

    定义:Flex布局的元素,称为Flex容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为Flex项目

    容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。

    主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end

    项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size

    CSS弹性布局FLEX,媒体查询,移动端点击事件

    弹性布局如何使用:只需要给容器设置display:flex

    容器属性

    • .box { flex-direction: row | row-reverse | column | column-reverse;}
      • row(默认值):主轴为水平方向,起点在左端。
      • row-reverse:主轴为水平方向,起点在右端。
      • column:主轴为垂直方向,起点在上沿。
      • column-reverse:主轴为垂直方向,起点在下沿。
    <style>
        ul:nth-of-type(1){ flex-direction:row;}
        ul:nth-of-type(2){ flex-direction:row-reverse;}
        ul:nth-of-type(3){ flex-direction:column;}
        ul:nth-of-type(4){ flex-direction:column-reverse;}
    </style>
    

    CSS弹性布局FLEX,媒体查询,移动端点击事件

    • .box { flex-wrap : nowrap| wrap | wrap-reverse ;}
      • nowrap(默认):不换行。
      • wrap:换行,第一行在上方。
      • wrap-reverse:换行,第一行在下方。
    <style>
        ul:nth-of-type(1){flex-wrap:nowrap;}
        ul:nth-of-type(2){flex-wrap:wrap;}
        ul:nth-of-type(3){flex-wrap:wrap-reverse;}
    </style>
    

    CSS弹性布局FLEX,媒体查询,移动端点击事件

    • .box {justify-content: flex-start | flex-end | center | space-between | space-around;}
      • flex-start(默认值):左对齐
      • flex-end:右对齐
      • center: 居中
      • space-between:两端对齐,项目之间的间隔都相等。
      • space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
    <style>
        ul:nth-of-type(1){justify-content:flex-start;}
        ul:nth-of-type(2){justify-content:flex-end;}
        ul:nth-of-type(3){justify-content:center;}
        ul:nth-of-type(4){justify-content:space-between;}
        ul:nth-of-type(5){justify-content:space-around;}
    </style>
    

    CSS弹性布局FLEX,媒体查询,移动端点击事件

    • .box {  align-items: flex-start | flex-end | center | baseline | stretch;}
      • flex-start:交叉轴的起点对齐。
      • flex-end:交叉轴的终点对齐。
      • center:交叉轴的中点对齐。
      • baseline: 项目的第一行文字的基线对齐。
      • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
    <style>
        ul:nth-of-type(1){align-items:flex-start;}
        ul:nth-of-type(2){align-items:flex-end;}
        ul:nth-of-type(3){align-items:center;}
        ul:nth-of-type(4){align-items:baseline;}
        ul li{ height:auto;}
        ul:nth-of-type(5){align-items:stretch;}
    </style>
    

    CSS弹性布局FLEX,媒体查询,移动端点击事件

    align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

    • .box {align-content: flex-start | flex-end | center | space-between | space-around | stretch;}
      • flex-start:与交叉轴的起点对齐。
      • flex-end:与交叉轴的终点对齐。
      • center:与交叉轴的中点对齐。
      • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
      • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
      • stretch(默认值):轴线占满整个交叉轴。
    <style>
        ul:nth-of-type(1){ flex-wrap:wrap; align-content:flex-start;}
        ul:nth-of-type(2){ flex-wrap:wrap; align-content:flex-end;}
        ul:nth-of-type(3){ flex-wrap:wrap; align-content:center;justify-content:center;}
        ul:nth-of-type(4){ flex-wrap:wrap; align-content:space-between;}
        ul:nth-of-type(5){ flex-wrap:wrap; align-content:space-around;}
        ul li{ height:auto;}
        ul:nth-of-type(6){ flex-wrap:wrap;align-content: stretch; justify-content:center;}
    </style>
    

    CSS弹性布局FLEX,媒体查询,移动端点击事件

    简写方式:

    • flex-flow:
      • flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap
      • .box {flex-flow: <flex-direction> || <flex-wrap>;}

    项目属性

    • order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0
    • .item {order: <integer>;}
    <style>
        ul li:nth-of-type(3){order:1;}
        ul li:nth-of-type(2){order:2;}
        ul li:nth-of-type(1){order:3;}
        ul li:nth-of-type(5){order:4;}
        ul li:nth-of-type(4){order:5;}
    </style>
    

    CSS弹性布局FLEX,媒体查询,移动端点击事件

    • flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。 如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。
    • .item { flex-grow: <number>; /* default 0 */}
    <style>
        ul li:nth-of-type(1){ flex-grow:1;}
        ul li:nth-of-type(2){ flex-grow:1;}
    </style>
    

    CSS弹性布局FLEX,媒体查询,移动端点击事件

    • flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
    • 如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。
    • 负值对该属性无效。
    • .item {  flex-shrink: <number>; /* default 1 */}
    <style>
        ul li:nth-of-type(1){flex-shrink:0;}
        ul li:nth-of-type(2){flex-shrink:1;}
        ul li:nth-of-type(3){flex-shrink:2;}
        ul li:nth-of-type(4){flex-shrink:3;}
    </style>
    

    CSS弹性布局FLEX,媒体查询,移动端点击事件

    • flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。
    • .item {  flex-basis: <length> | auto; /* default auto */}
    <style>
        ul li:nth-of-type(1){ flex-basis:50%;}
    </style>
    

    CSS弹性布局FLEX,媒体查询,移动端点击事件

    • align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch
    • .item {  align-self: auto | flex-start | flex-end | center | baseline | stretch;}
    <style>
        ul{align-items:flex-start;}
        ul li{height: auto}
        ul li:nth-of-type(1){ align-self:auto;}
        ul li:nth-of-type(2){ align-self:flex-start;}
        ul li:nth-of-type(3){ align-self:center; }
        ul li:nth-of-type(4){ align-self:flex-end;}
        ul li:nth-of-type(5){ align-self:baseline;line-height: 80px;}
        ul li:nth-of-type(6){ align-self:stretch;}
    </style>
    

    CSS弹性布局FLEX,媒体查询,移动端点击事件

    • flex属性
      • flex属性是flex-growflex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
      • .item { flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]}
      • 该属性有两个快捷值:auto (1 1 auto)none (0 0 auto)
      • 建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。

    媒体查询

    <!DOCTYPE html>
    <html>
    
    <head>
        <title></title>
    </head>
    
    <body>
    </body>
    <script type="text/javascript">
    /*
    viewport
    定义:viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,css中的1px并不等于设备的1px:因为像素密度不同
        layout viewport:布局视口
        一般移动设备的浏览器都默认设置了一个viewport元标签,定义一个虚拟的layout viewport,用于解决早期页面手机上显示的问题
        visual viewport :可视视口
        设置物理屏幕的可视区域,屏幕显示的物理像素,同样的屏幕,像素密度大的设备,可现实的像素会更多
        ideal viewport   :理想视口
        通过metab标签来得到理想视口
        示例:<meta name="viewport" content="width=device-width, initial-scale=1.0 maximum-scale=1.0">
    
    * 移动端布局
        * meta标签的content属性的值
        * width=device-width,height=device-height,让当前的viewport宽度,高度等于设备的宽度,高度,也可以设置一个固定的值,尽量不使用height
        * initial-scale=1.0;初始化缩放比例:0.25-1.0
        * maximum-sacle=1.0;设置最大缩放比例:0.25-1.0
        * minimum-scale=1.0;设置最小缩比例:0.25-1.0
        * user-scalable=no;是否允许用户缩放,默认为yes,如果设置为no:那么minimax-scale,与maximum-scale将被忽略,因为不允许缩放
        * 实例:
        * <meta id="viewport" name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, user-scalable=no">
    
    * 移动端手势事件
        * 与pc端事件差异对比
        * pc端的mousemove,mouseup,mousedown,在移动端会失效或者不正常
        * pc端的click事件可以使用,|   不要说300ms问题   |  但是会有300ms延迟问题:手机早期:用于断定是否是双击放大缩小
        * 
        * 移动端事件
        * touchstart:手指按下触发
        * touchmove:手指移动时触发
        * touched:手指离开时触发
        * touchcancel:事件被打断是触发
        * 
        * 移动端事件执行顺序:touchstart->touchmove->touched->click
        * 
        * touchEvent	  对象与pc端事件的差异对比,多了三个TouchList属性
        * touches         位于当前屏幕上的所有手指的一个列表
        * targetTouches   位于当前DOM对象上的手指的一个列表
        * changedTouhes   保存状态改变的手指对象的一个列表
        * 
        * 每个TouchList中有多个对象,每个Touch对象的对象属性
        * screenX 相对屏幕左边的距离
        * screenY 相对屏幕上边的距离
        * clientX  相对浏览器左边的距离
        * clientY  相对浏览器上边的距离
        * pageX  相对页面左边的距离
        * pageY  相对页面上边的距离
        * target  触摸的当前元素
        * identifier 当前触摸对象的id,用于辨别手指
        * radiusX, radiusY  手指触摸的范围
    */
    </script>
    <style type="text/css">
    /*媒体查询一*/
    * {
        margin: 0;
        padding: 0;
    }
    
    body {
        background-color: pink;
    }
    
    /*使用@media query可以实现响应式布局效果,会根据不同的条件,去设置不同的样式*/
    /*screen表示屏幕,min-width:1200px 表示宽度最小值是1200px换句话说就是当屏幕宽度大于等于1200px的时候是什么样式*/
    @media only screen and (min-width:1200px) {
    
        /*这里写样式*/
        body {
            background-color: red;
        }
    }
    
    /*当屏幕宽度,大于800,小于1199显示的样式*/
    @media only screen and (min-width: 800px) and (max-width:1199px) {
        body {
            background-color: aqua;
        }
    }
    
    /*当屏幕宽度,大于400,小于640显示的样式*/
    /*//如果在媒体查询中没有衔接上的部分,会显示默认部分*/
    @media only screen and (min-width: 400px) and (max-width: 640px) {
        body {
            background-color: yellow;
        }
    }
    </style>
    <!-- 
    	媒体查询二
    	<meta name="viewport" content="width=device-width, initial-scale=1.0 maximum-scale=1.0">
    	<link rel="stylesheet" href="css/m320.css" media="only screen and (max-width:320px)">
    	<link rel="stylesheet" href="css/m375.css" media="only screen and (min-width:321px) and (max-width:375px)">
    	<link rel="stylesheet" href="css/m414.css" media="only screen and (min-width:376px) and (max-width:414px)">
     -->
    
    </html>
    

    移动端点击事件

    <!DOCTYPE html>
    <html>
    
    <head>
        <title></title>
    </head>
    
    <body>
    </body>
    <script type="text/javascript">
    // 移动端手势
    var box = document.querySelector('#box')
    //pc端的click事件
    box.addEventListener('click', function(e) {
        console.log('===========click============');
        console.log(e);
    });
    //手指按下
    box.addEventListener('touchstart', function(e) {
        console.log('===========touchstart============');
        //            Fn(e);
    })
    //手指移动
    box.addEventListener('touchmove', function(e) {
        console.log('==========touchmove===========');
        Fn(e);
    })
    //手指抬起
    box.addEventListener('touchend', function() {
        console.log('============touchend==========');
    });
    //被打断后出发
    box.addEventListener('touchcancel', function() {
        alert('============被打断了================');
    })
    
    var touchesH1 = document.querySelector('#box h1:nth-of-type(1)');
    var targettouchesH1 = document.querySelector('#box h1:nth-of-type(2)');
    var changetouchesH1 = document.querySelector('#box h1:nth-of-type(3)');
    
    function Fn(e) {
        touchesH1.innerHTML = 'touches' + e.touches.length;
        targettouchesH1.innerHTML = 'targettouches' + e.targetTouches.length;
        changetouchesH1.innerHTML = 'changetouches' + e.changedTouches.length;
    
    }
    
    // 使用touch库(移动端)
    $('#box').tap(function() {
        console.log('====tap====')
    })
    $('#box').longTap(function() {
        console.log('====long tap====')
    })
    $('#box').doubleTap(function() {
        console.log('====double tap====')
    })
    
    $('#box').swiperLeft(function() {
        console.log('====left tap====')
    })
    
    // 使用zepto库(移动端)
    $("#box").tap(function() {
        console.log('======tap=========');
    })
    $("#box").singleTap(function() {
        console.log('======singleTap=========');
    })
    $("#box").doubleTap(function() {
        console.log('======doubleTap=========');
    })
    $("#box").longTap(function() {
        console.log('======longTap=========');
    })
    $("#box").swipe(function() {
        console.log('======swipeTap=========');
    })
    
    
    
    // 自定义Touch事件库
    //封装自定义的touch事件库
    //注意:这里前面一个分号,是为了防止引用其他库的时候,那个库没有分号结尾,以后代码压缩的话容易出问题
    ;
    (function(window, undefined) {
        var query = function(selector) {
            return query.fn.init(selector);
        };
    
        query.fn = query.prototype = {
            //初始化方法,就是模拟获取元素的方法,但这里获取的不是真正的元素,真正的元素存取在与整个对象的element属性中
            init: function(selector) {
                if (typeof selector == 'string') {
                    this.element = document.querySelector(selector);
                    return this;
                }
            },
    
            //单击,handler是回调函数,就是单击之后做出的响应功能
            tap: function(handler) {
                this.element.addEventListener('touchstart', touchFn);
                this.element.addEventListener('touchend', touchFn);
    
                //用来区分和长按的时间变量,做一个时间差判断
                var startTime, endTime;
    
                function touchFn(e) {
                    switch (e.type) {
                        case 'touchstart':
                            //按下的时候记录一个时间
                            startTime = new Date().getTime();
                            break;
                        case 'touchend':
                            //离开的事件记录一个时间
                            endTime = new Date().getTime();
                            if (endTime - startTime < 500) {
                                //在手势离开的时候,回调
                                handler();
                            }
    
                            break;
    
                    }
                }
            },
            //长按
            longTap: function(handler) {
                this.element.addEventListener('touchstart', touchFn);
                this.element.addEventListener('touchend', touchFn);
                //这个移动事件是为了解决与其他事件冲突问题
                this.element.addEventListener('touchmove', touchFn);
                var timeId;
    
                function touchFn(e) {
                    switch (e.type) {
                        case 'touchstart':
                            //按下达到500ms,我们认为是长按
                            clearTimeout(timeId);
    
                            timeId = setTimeout(function() {
                                handler();
                            }, 500);
                            break;
                        case 'touchend':
                            //离开的时候清空定时器
                            clearTimeout(timeId);
                            break;
                        case 'touchmove':
                            //一旦移动了就清空长按定时器
                            clearTimeout(timeId);
                            break;
    
                    }
                }
            },
            //双击
            doubleTap: function(handler) {
                this.element.addEventListener('touchstart', touchFn);
                this.element.addEventListener('touchend', touchFn);
    
                //记录次数
                var tapCount = 0,
                    timeId;
    
                function touchFn(e) {
                    switch (e.type) {
                        case 'touchstart':
                            //按下的时候记录一次
                            tapCount++;
                            //刚进来的时候,就清空一下定时器
                            clearTimeout(timeId);
    
                            timeId = setTimeout(function() {
                                //如果达到500ms,我们认为就不是双击,要把tapCount清零
                                tapCount = 0;
                            }, 500);
                            break;
                        case 'touchend':
                            //离开的时候清空定时器
                            if (tapCount == 2) {
                                //当按下2次的时候,才算双击
                                handler();
                                //触发双击之后,点击次数清零
                                tapCount = 0;
                                //清空定时器
                                clearTimeout(timeId);
                            }
    
                            break;
    
                    }
                }
            },
            //左滑
            swiperLeft: function(handler) {
                this.element.addEventListener('touchstart', touchFn);
                this.element.addEventListener('touchend', touchFn);
    
                //手势触发的坐标
                var startX, startY, endX, endY;
    
                function touchFn(e) {
                    switch (e.type) {
                        case 'touchstart':
                            //按下的时候记录起始的坐标
                            startX = e.targetTouches[0].pageX;
                            startY = e.targetTouches[0].pageY;
                            break;
                        case 'touchend':
                            //离开的时候记录下终止坐标
                            endX = e.changedTouches[0].pageX;
                            endY = e.changedTouches[0].pageY;
                            //判断是否是左右滑&& //判断具体是左滑,还是右滑
                            if (Math.abs(endX - startX) >= Math.abs(endY - startY) && (startX - endX) >= 25) {
                                handler();
                            }
                            break;
    
                    }
                }
            },
        }
        query.fn.init.prototype = query.fn;
        window.$ = window.query = query;
    }(window, undefined))
    </script>
    
    </html>
    

    起源地下载网 » CSS弹性布局FLEX,媒体查询,移动端点击事件

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元