首页
友链
留言
图片
Search
1
拼多多关于anti-content,crawlerInfo加密算法破解。
1,749 阅读
2
拼多多店群被割N次韭菜,终于测试出一个接近100%成功率的起店方法,日出百单!
1,419 阅读
3
如何操作让拼多多无货源店群能够日出500到800 单。
707 阅读
4
宝塔面板秒级别定时任务
675 阅读
5
拼多多店群存在的坑,新人看了再决定是不是要做!
669 阅读
互联网
创业故事
随笔
电商运营
编程技术
自媒体
Search
标签搜索
拼多多店群
店群
拼多多无货源
PHP
无货源
Winform
编程入门
拼多多无货源店群
激活
idea
phpstorm
webstorm
jetbrains激活
idea激活
永久激活
激活码
ffmpeg
不留名
累计撰写
23
篇文章
累计收到
1,088
条评论
首页
栏目
互联网
创业故事
随笔
电商运营
编程技术
自媒体
页面
友链
留言
图片
搜索到
12
篇与
编程技术
的结果
2021-12-09
宝塔面板秒级别定时任务
1分钟执行一次脚本PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH step=1 #间隔的秒数,不能大于60 for (( i = 0; i < 60; i=(i+step) )); do curl -sS --connect-timeout 10 -m 60 '这里填写域名地址' echo "-------------------监控状态----------------------" endDate=`date +"%Y-%m-%d %H:%M:%S"` echo "★[$endDate] Successful" echo "-------------------监控状态----------------------" sleep $step done exit 0
2021年12月09日
675 阅读
2 评论
0 点赞
2021-11-13
mysql根据字段值进行排名运算
8.0之前递增排序,排序字段值相同排序递增select ranks from (select id,name,@rank:=@rank+1 as ranks from user u, (select @rank:=0) ran order by u.age) r where id=xxx8.0占位排序,排序字段值相同,排序相同select ranks from (select user_id, rank() over(order by price desc) as ranks from bid ) res where user_id=xxx递增排序rank()换成 row_number() 不会出现相同排序,一直递增分类排序SELECT a.stu_id,a.point, IF( @className = a.class_name,@rank := @rank + 1,@rank :=1 ) AS rank, (@className := a.class_name) class_name FROM TMP_A a, ( select @rank :=0,@className := NULL ) b ORDER BY a.class_name, a.point DESC ; 排序SELECT a.stu_id,a.point, @rank:=case when @className = a.class_name then @rank := @rank + 1 when @className := a.class_name then @rank :=1 when a.class_name =0 then @rank :=1 else ‘’ end rank, @className := a.class_name FROM TMP_A a, ( select @rank :=0,@className := NULL ) b ORDER BY a.class_name, a.point DESC ;
2021年11月13日
416 阅读
0 评论
0 点赞
2021-11-13
微信昵称带表情无法存入Mysql数据库。
修改表ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;对字符串进行 base64编码 存入, 取出时再解码
2021年11月13日
310 阅读
0 评论
0 点赞
2021-09-17
宝塔面板环境下一键安装ffmpeg命令
一键安装命令wget http://download.bt.cn/install/ext/ffmpeg.sh && sh ffmpeg.sh安装完后可输入以下命令是否安装成功ffmpeg -version 此脚本只适用Centos6/Centos7 64位系统若网站程序需要使用请在Php禁用函数中取消掉exec、system等函数
2021年09月17日
651 阅读
0 评论
0 点赞
2021-09-02
关于Ios new Date()的坑
使用new Date() 的坑1.只有日期 不支持"2021-09-02",需要转换为"2021/09/02"2.有日期和时间 可以同1进行转换 也可中间加T "2021-09-02T18:53:00"
2021年09月02日
447 阅读
0 评论
-2 点赞
2021-06-09
关于PHP-CGI漏洞问题
在昨天淘宝上一客户发来一个需求,漏洞修复。PHP-CGI 远程代码执行漏洞描述在地址后面加入【?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input】POST访问传入 任意PHP代码就能执行。搜索资料得知不是网站代码的问题,由于是新网的虚拟主机,不能修改服务器配置,下了工单后解决了。大致解决思路是修改Apache或者Ngix配置文件这个大致原理是 -d 指定配置项%3d 代替 =allow_url_include=1 修改php置,允许url包含文件auto_prepend_file=hp://input 在访问php文件前加入 POST传入的内容做为PHP文件,从而达到远程执行PHP代码。Apache开启URL过滤,把危险的参数过滤掉RewriteEngine on RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC] RewriteRule ^(.*) $1? [L]
2021年06月09日
501 阅读
0 评论
0 点赞
2021-02-23
JetBrains全家桶激活方法( Idea PHPstorm webstrom 已亲自测试)
本文提到的方法仅支持2020.3.x 以及2020.2.x其它版本2020 1.1——2020 1.3链接:https://pan.baidu.com/s/1PXC46AtXebfIXxnWZpF9Vg 提取码:i1ez 2018 2019 2020 1.1 链接:https://pan.baidu.com/s/1nNs9RTC4Q9od2ArwehL1BQ 提取码:gsp0 我已经测试了Idea Phpstorm Webstrom其它的没有测试,理论是都能支持的。教程以Idea为例:1、下载idea2020.3.1下载地址如下,这个地址中包含了各种历史版本!来来来,热乎的!https://www.jetbrains.com/idea/download/other.html2、安装idea你肯定会!3、来运行idea啦,兄弟!选择Evaluate for free4、安装插件打开插件中心 File -> Settings -> Plugin,设置插件中心仓库,如下图,是不是很简单呀!??!设置仓库地址:https://repo.idechajian.com,如下图点击ok,然后插件中心搜索“BetterIntellij”,安装,如下图点击“Accept”,如下图5、重启idea6、输入注册码操作如下图,恭喜永久注册成功,有效期到2099年7、注册码获取方式搜索关注公众号 blm-95 回复 : key
2021年02月23日
452 阅读
1 评论
0 点赞
2021-01-06
易语言值得学习吗?易语言的优势有什么?
我在大学的时候就对易语言就有所了解,当时只是简单的了解了一下,并没有过多接触。再次接触易语言是因为自身从事互联网行业,同时也涉及了一些网赚项目,在这些网赚项目中运用了许多易语言开发的软件,也接触了许多使用易语言的技术人员,便不得不再次去重温了一下。 易语言用其官方的说明介绍就是以中文作为程序代码的编程语言,以“易”著称,也就是说用户不必懂英文也能编程。 在我看来或许连作者都自身都没有想到就是因为他这个核心优势导致了易语言最终发展成了一个带有颜色的小众的语言(黑灰产用得特别多)。用户群体 易语言是2000年推出的,具有充分利用API,COM、DLL、OCX组件,各种主流数据库,各种实用程序等多种资源的接口和支撑工具,中文源代码被直接编译为CPU指令,运行效率高等提点,基本可以说是VB的汉化版。 在那个还是windows软件的时代,网络安全存在很大问题,黑客成为了许多电脑爱好者的向往。有人因此便去自学编程,在他们潜意识里学习编程一定要英语水平很好,了解到易语言不需要会英文全中文就能编程,同时也能实现他们的需求,易语言要求便成为了他们学习的首选。也就是说好多初期学习易语言的用户都是对于黑客技术感兴趣的用户,各种辅助、外挂、盗号便成了他们的作品,从而奠定了易语言的发展方向。 随之互联网安全的逐渐提高,以及杀毒软件的普及,再到后来的WEB时代的到来,学习windows软件开发的用户越来越少。PHP、ASP、JSP逐渐成为了编程热门语言,直到目前为止学习windows软件开发的也是很少了,许多曾经的PC软件开发人员也转向了WEB端。而一些黑灰项目以及小众项目对于软件的需求仍然需要PC软件,早期易语言的开发者对于这些项目更有经验,这个时候易语言的开发者便成为了这些市场的主要语言。随着一些项目的不断积累,易语言对于这些黑灰项目逐渐形成了一个很好的学习生态;对于一些逆向编程,Hook技术,外挂技术等在百度上随便一搜易语言的资料比任何一个语言还要多,对于一些windows的API以及内存的处理甚至有了一些现成的模块拿过来就可以调用,相当的方便,大大节约了学习时间以及开发时间。易语言便成为了学习这些黑灰项目相关软件开发"最好"的语言。市场需求 几乎所有主流编程语言的诞生都是为了解决某个技术领域存在的缺陷;而易语言的错误也就在于立志于解决一个根本不存在的问题,我们国家从来就不缺会英文的程序员,这也导致了易语言不会成为主流编程语言,也意味着主流互联网企业大都不会选择易语言作为开发语言,学习易语言去求职也成了不现实的选择!这里大家可以从主流的招聘网去搜索易语言的职位得出(主流招聘网几乎没有几个职位)。 对于易语言的招聘几乎集中在某论坛(防止广告嫌疑就不提名字了),我翻看了10页左右,平均的薪酬待遇大概在15k左右(没有指定地区);但据我了解这薪酬基本是入门级别的开发者。对于那些经验丰富的开发人员,大多数都是自由职业者,或者小工作室的创始者,这些人员在这个圈子呆久了深知这个圈子盈利只要技术到位相当简单,在精通易语言的同时,他们还掌握了许多逆向技术,包括Js逆向,安卓逆向,以及windows内存注入等等,掌握这些技术后,只要稍微有点市场洞察能力开发一两款软件,年收入很轻松就能上百万,没有任何压力负担相当滋润。比如微商火爆的时候,各种微信群发工具,微信群机器人,清粉工具,微信助手等,再到各种群控软件,以及引流协议等;店群火的时候,各种上货软件,采集软件;胆子大一点的针对一些游戏开发外挂脚本等等,这些软件竞争都很小,但是市场需求却很大。 我之所以再次重温易语言就是因为做到了一款店群软件的时候有些技术上的问题百度了一下得到的结果都是来自易语言的某论坛,一些参考的源代码也是易语言写的,无奈之下只能去重温了一下,但我始终习惯了英文的编程模式,对于易语言的学习我仅是能大概看懂一些逻辑思路以及一些API调用就行了。发展 从目前来看,互联网的发展是免不了一些黑灰项目的,从互联网的出现到目前以及将来都会一直存在这样的项目,而在我国易语言也发展成了黑灰项目的主要易语言。对于从事相关行业的人员来说,如果你单纯只是想在这个圈子混迹,易语言确实值得你去学习一下,对于那些已经掌握了其它语言不习惯中文编程模式的人员,你要接触这个圈子,能大概看懂易语言对你还是有很多好处的。总结 当然对于技术而言,本不该存在任何的偏见;技术本身没有对错,要看使用技术的人员用他拿来做了什么。某杀毒软件一概把易语言开发的软件视为病毒这点在我看来确实有点过了毕竟早期贵公司的文件粉碎机都是用易语言开发的。最后用作者的一段话结尾。易语言正在不断发展,易语言的用户以后会越来越多,使用易语言的用户年纪越来越小,我呼吁有使用易语言在事业上取得了较大成果的,能够晒一晒正能量,帮我一起引导他们,让他们能够正大光明地使用易语言开创一番人生的事业!
2021年01月06日
488 阅读
6 评论
0 点赞
2020-12-27
选什么语言入门Java?Python?C/C++?PHP…
经常有人问我,想学习编程,要学什么语言好呢?什么语言最有前景?什么语言工资高?什么语言最好?通常遇到这样的问题我都会反问一句你为什么要学编程?其实语言没有最好,只有最适合,你的兴趣点在哪,你学习的目标是什么?这都是你选择的依据,千万别听别人说什么语言好就去学什么语言;因为他连你学了要干什么都不知道,就胡乱推荐一番。由于问我的人大多是网赚从业者,对于他们来说学习编程的主要目的就是搭建各种项目系统比如小说、影视、分销红包分享等;或者做点辅助类的小软件、按键精灵引流脚本、数据采集软件等。针对网赚或者自由职业人员网站类源码知道了目的再去分析学习什么编程语言就简单的得多了,对于目前整个市场上最常见的网赚项目的程序源码PHP肯定是占绝对优势的,比如常见的微擎系统,微赞,Ecshop,DZ应用,卡盟系统,影视系统,小说分销,淘宝客系统,社区团购系统等等。如果你是要做这类相关的项目选择PHP绝对没错,在做项目的同时还能接点企业站这类现成模板很多的项目。引流脚本辅助引流类的软件首推按键精灵,目前许多引流脚的目标都是各种APP,如果通过协议去做引流的话,难度相当大,需要抓包逆向破解协议安全参数的加密方式,而且APP更新后不一定有效,所以按键精灵脚本成为了首选!采集桌面类软件再说采集类吧,常见的就是各类电商平台采集,短视频平台采集,这类软件;对于数据采集其实后端语言都能做。目前来说Python的爬虫名气是最大的,但是采集有个问题,用户少的或者你自己用的话无所谓是服务器去采集还是本地电脑去采集;如果是用户多的情况用服务器去采集的话会相当占用服务器资源,所以不建议用WEB的形式去做采集软件那么就只考虑本地软件。本地软件的话只考虑windows电脑的情况,首推荐C#,C#自身支持多线程,winform又是拖拽式开发,学起来也容易;虽然Python在爬虫上有优势同时也是可以开发桌面程序,但相对来说Python在开发桌面软件上就远不如C#那么方便快捷了。因此推荐本地采集软件推荐C#,WEB采集推荐Python。针对其他人员这里再提一下Java和C/C++毕竟许多想学编程的听过最多介绍的应该就是这三个吧。什么情况选择学习Java呢?那么我们先要知道Java的优势和劣势。首先,Java属于那种很全能的语言,电脑软件,WEB,安卓APP,大数据,嵌入式系统,跨平台无所不能。其次,Java的安全性、稳定性、高性能、分布性、面向对象等优势让Java 成为了许多大型软件的首选语言;同时早期政府大型企业都使用Java作为开发语言,大学编程课程中也涉及Java课程,让Java成为了当下使用者最多的语言。最后,Java在开发WEB的效率上远不如PHP,在开发桌面软件的时候又不如C#,嵌入式开发所整体学习环境又不如C和C++;所以很多个人开发者或者中小外包公司都很少选择Java语言。所以,如果你是想通过学编程语言去求职,那么必须了解你想要进入的企业是以什么开发语言为主,已经薪酬待遇来决定自己的学习路线!这里也提醒下由于Java很多应届毕业生都多少学过,相对来说竞争也激烈一点!如果你仅仅只是想通过学了编程语言来接点私活提高个人收入那么还是推荐你学PHP,毕竟PHP有着各种开源或者盗版的源码,网上找找拿过来改一下能适应很多外包的需求!还有就是如果只是单纯的对某方面感兴趣比如单片机,硬件类的那就老老实实的学习C和C++;对人工智能感兴趣或者爬虫那就Python;对目前的小程序感兴趣的就学习HTML/CSS/JavaScript,目前小程序推出的云开发只要学会了前端不用学习后端语言也能实现;更何况学会了JavaScript,Node.Js也就不在话下了。总结其实对于入门语言只要考虑目前学了要干嘛什么就行了,不要考虑其它因素。因为如果真你学会了第一门语言真的的对编程感兴趣你绝对还会去学习其他语言的,那时候你已经有了一定的编程逻辑思维,学其他语言相对来说就容易得很多了。
2020年12月27日
542 阅读
0 评论
0 点赞
2020-12-19
拼多多关于anti-content,crawlerInfo加密算法破解。
过程通过 Ot.a.getAntiContent()得到的这个值,(a = e.sent)&&(r.antiContent = a)执行这段的时候就已经获得了这个anticontent了.但是跟这这个追进去得到的是一个Promise对象,单步就会一直进入到漫长的pengding状态中…this.request = function() { var e, t = (e = c.a.mark(function e(t) { var n, o, a, i, s, l; return c.a.wrap(function(e) { for (; ; ) switch (e.prev = e.next) { case 0: return n = t.requestContext, o = void 0 === n ? {} : n, e.next = 4, Ot.a.getAntiContent(); case 4: (a = e.sent) && (r.antiContent = a); case 6: return r.formatRequestParams(), e.prev = 7, e.next = 10, Object(wt.a)({ req: o.__req, path: "search", params: r.requestModelParams }).get(); case 10: if (e.t0 = e.sent, e.t0) { e.next = 13; break } e.t0 = {}; case 13: return i = e.t0, s = kt(i, { sort: r.sortType, page: r.searchPageIndex }) || {}, l = r.successLoggerParams(i), r.trackingSearchEvent(l), s.loadSearchResultTracking = l, s.firstFilter = r.requestModelParams.filter || "", r.flip = i.flip, r.updateFlip(i.flip), r.searchPageIndex++, Ot.a.clearCache(), e.abrupt("return", s); case 26: return e.prev = 26, e.t1 = e.catch(7), e.abrupt("return", Object(St.a)(e.t1)); case 29: case "end": return e.stop() } }, e, null, [[7, 26]]) })思路先看看这个:{ key: "initRiskController", value: function() { this.riskControlCrawler || (this.riskControlCrawler = new n.a({ serverTime: this.serverTime, _2827c887a48a351a: !1 }), this.riskControlCrawler.init()) } }爬虫控制风险,看名字就知道不简单,这里先做了一次初始化,初始化的时候记录了一个serverTime的时间戳,而且以后的每一次下拉页面都有拿时间作比较.等等…看一下是js头部:(window.webpackJsonp = window.webpackJsonp || []).push([[11], { 100: function(e, t, r) { e.exports = { container: "_1y-VhIOC", title: "rvmJzAGI", list: "_8KUXGnrb", item: "_2oaWTr_0", mallItem: "_1cIPk2r5" } },又是webpack打包!!!不过还是得硬上啊!然后就打算把所有的包都打开,放到一起运行,结果…电脑先破溃了!!没有办法,我们还是要一个文件一个文件的看看:研究了一下,发现是这样的代码:187: function(e, t, r) { (function(e) { var r, n, o, a; function i(e) { return (i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { return typeof e } : function(e) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e } )(e) } "undefined" != typeof self && self, a = function() { return function(e) { var t = {}; function r(n) { if (t[n]) return t[n].exports; var o = t[n] = { i: n, l: !1, exports: {} }; return e[n].call(o.exports, o, o.exports, r), o.l = !0, o.exports } return r.m = e, r.c = t, r.d = function(e, t, n) { r.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: n }) } , r.r = function(e) { "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(e, "__esModule", { value: !0 }) } , r.t = function(e, t) { if (1 & t && (e = r(e)), 8 & t) return e; if (4 & t && "object" == i(e) && e && e.__esModule) return e; var n = Object.create(null); if (r.r(n), Object.defineProperty(n, "default", { enumerable: !0, value: e }), 2 & t && "string" != typeof e) for (var o in e) r.d(n, o, function(t) { return e[t] } .bind(null, o)); return n } , r.n = function(e) { var t = e && e.__esModule ? function() { return e.default } : function() { return e } ; return r.d(t, "a", t), t } , r.o = function(e, t) { return Object.prototype.hasOwnProperty.call(e, t) } , r.p = "", r(r.s = 5)内层又进行一次打包!!!感觉要吐血了!!! 都快要放弃了!不要紧,慢慢看,那么容易就让你搞到数据,那还怎么玩!分析this.riskControlCrawler || (this.riskControlCrawler = new n.a({ serverTime: this.serverTime, _2827c887a48a351a: !1 }), this.riskControlCrawler.init()) }首先初始化了一个加密对象跟着这个对象进去,发现了一堆混淆了的代码,这个ee就是关键的加密代码了:没有关系我们把它全部把下来,但是发现还是需要好多的依赖包比如这些:看到这里完全是一团乱麻,有2个思路1.每次把需要的代码就把对应的依赖包找到,改写成单独的文件,使用require()加载进来2.一次运行到位,加载所有的包我采用第二种办法,首先把整个代码call一遍,不管有多少依赖包,全部都加载到位,在关键的地方强制截断,强制弹出anticontent aaa=new ee({ serverTime: 1556530561960, _2827c887a48a351a: !1 }) aaa.init() //初始化 anticontent = aaa.messagePackSync({ touchEventData: !0, clickEventData: !0, focusblurEventData: !0, changeEventData: !0, locationInfo: !0, referrer: !0, browserSize: !0, browserInfo: !0, token: !0, fingerprint: !0 }) console.log(anticontent)测试后能正常获取数据。anti_content成品源码关注公众号,点击菜单福利资料获取JS源码
2020年12月19日
1,749 阅读
0 评论
3 点赞
2020-12-09
CSS Grid 布局完全指南(图解 Grid 详细教程)
本文转载于 https://www.html.cn/archives/8510/ CSS Grid 布局是 CSS 中最强大的布局系统。与 flexbox 的一维布局系统不同,CSS Grid 布局是一个二维布局系统,也就意味着它可以同时处理列和行。通过将 CSS 规则应用于 父元素 (成为 Grid Container 网格容器)和其 子元素(成为 Grid Items 网格项),你就可以轻松使用 Grid(网格) 布局。简介CSS Grid(网格) 布局(又称为 “Grid(网格)” ),是一个二维的基于网格的布局系统,它的目标是完全改变我们基于网格的用户界面的布局方式。CSS 一直用来布局我们的网页,但一直以来都存在这样或那样的问题。一开始我们用表格(table),然后是浮动(float),再是定位(postion)和内嵌块(inline-block),但是所有这些方法本质上都是只是 hack 而已,并且遗漏了很多重要的功能(例如垂直居中)。Flexbox 的出现很大程度上改善了我们的布局方式,但它的目的是为了解决更简单的一维布局,而不是复杂的二维布局(实际上 Flexbox 和 Grid 能协同工作,而且配合得非常好)。Grid(网格) 布局是第一个专门为解决布局问题而创建的 CSS 模块,只要我们一直在制作网站,我们就一直要讨论这些问题。有两个主要因素激发了我创建本指南的灵感。第一个是 Rachel Andrew 出色的书籍 为 CSS Grid 布局做好准备。这本书对 Grid 布局做了全面,清晰的介绍 ,也是本指南的基础。我强烈建议你购买并阅读。另一个灵感来自 Chris Coyier 的 Flexbox 布局完整指南,这也是我学习 flexbox 首选的资源。这篇文章是帮助了很多人,这点从 Google “flexbox” 排名第一就可以看出来。你会发现那篇文章和我的文章有很多相似之处,为什么不跟随最好的文章呢?本指南的目的是介绍存在于最新版本的规范中 Grid(网格) 概念。所以我不会覆盖过时的 IE 语法,而且随着规范的逐渐成熟,我会尽我最大的努力去更新这个指南。基础知识和浏览器支持首先,你必须使用 display: grid 将容器元素定义为一个 grid(网格) 布局,使用 grid-template-columns 和 grid-template-rows 设置 列 和 行 的尺寸大小,然后通过 grid-column 和 grid-row 将其子元素放入这个 grid(网格) 中。与 flexbox 类似,网格项(grid items)的源(HTML结构)顺序无关紧要。你的 CSS 可以以任何顺序放置它们,这使得使用 媒体查询(media queries)重新排列网格变得非常容易。定义整个页面的布局,然后完全重新排列布局以适应不同的屏幕宽度,这些都只需要几行 CSS ,想象一下就让人兴奋。Grid(网格) 布局是有史以来最强大的 CSS 模块之一。截至2017年3月,许多浏览器都提供了对 CSS Grid 的原生支持,而且无需加浏览器前缀:Chrome(包括 Android ),Firefox,Edge,Safari(包括iOS)和 Opera 。 另一方面,Internet Explorer 10和11支持它,但是是一个过时的语法实现。 现在是时候使用 Grid 布局网页了!这个浏览器支持 CSS Grid 的数据,来自 Caniuse ,你可以查看更多的细节。 数字表示支持以上功能的浏览器版本号。桌面(Desktop) 浏览器ChromeOperaFirefoxIEEdgeSafari57445211*(旧语法)1610.1手机(Mobile) / 平板(Tablet)浏览器iOS SafariOpera MobileOpera MiniAndroidAndroid ChromeAndroid Firefox10.346No677063除了微软之外,浏览器厂商似乎还没有对 Grid(网格) 搞自己的一套实现(比如加前缀),直到规范完全成熟。这是一件好事,因为这意味着我们不必担心学习多个语法。在生产中使用 Grid 只是时间问题。 但现在是学习的时候了。重要术语在深入了解 Grid 的概念之前,理解术语是很重要的。由于这里涉及的术语在概念上都很相似,如果不先记住 Grid 规范定义的含义,很容易混淆它们。但是别担心,术语并不多。网格容器(Grid Container)应用 display: grid 的元素。这是所有 网格项(grid item)的直接父级元素。在这个例子中,container 就是 网格容器(Grid Container)。HTML 代码:<div class="container"> <div class="item item-1"></div> <div class="item item-2"></div> <div class="item item-3"></div></div>网格项(Grid Item)网格容器(Grid Container)的子元素(例如直接子元素)。这里 item 元素就是网格项(Grid Item),但是 sub-item 不是。HTML 代码:<div class="container"> <div class="item"></div> <div class="item"> <p class="sub-item"></p> </div> <div class="item"></div></div>网格线(Grid Line)构成网格结构的分界线。它们既可以是垂直的(“列网格线(column grid lines)”),也可以是水平的(“行网格线(row grid lines)”),并位于行或列的任一侧。例如,这里的黄线就是一条列网格线。网格轨道(Grid Track)两条相邻网格线之间的空间。你可以把它们想象成网格的列或行。下图是第二条和第三条 行网格线 之间的 网格轨道(Grid Track)。网格单元格(Grid Cell)两个相邻的行和两个相邻的列网格线之间的空间。这是 Grid(网格) 系统的一个“单元”。下图是第 1 至第 2 条 行网格线 和第 2 至第 3 条 列网格线 交汇构成的 网格单元格(Grid Cell)。网格区域(Grid Area)4条网格线包围的总空间。一个 网格区域(Grid Area) 可以由任意数量的 网格单元格(Grid Cell) 组成。下图是 行网格线1和3,以及列网格线1和3 之间的网格区域。Grid(网格) 属性目录网格容器(Grid Container) 属性displaygrid-template-columnsgrid-template-rowsgrid-template-areasgrid-templategrid-column-gapgrid-row-gapgrid-gapjustify-itemsalign-itemsplace-itemsjustify-contentalign-contentplace-contentgrid-auto-columnsgrid-auto-rowsgrid-auto-flowgrid网格项(Grid Items) 属性grid-column-startgrid-column-endgrid-row-startgrid-row-endgrid-columngrid-rowgrid-areajustify-selfalign-selfplace-self父元素 网格容器(Grid Container) 属性display将元素定义为网格容器,并为其内容建立新的 网格格式上下文。值:grid :生成一个块级网格inline-grid :生成一个内联网格CSS 代码:.container { display: grid | inline-grid;}注意:通过嵌套元素(也称为子网格,即 subgrid )向下传递网格参数的能力已移至 CSS Grid 规范的 Level 2 版本。这里有 一个快速解释。回到目录grid-template-columns / grid-template-rows使用空格分隔的值列表,用来定义网格的列和行。这些值表示 网格轨道(Grid Track) 大小,它们之间的空格表示网格线。值:– <track-size>: 可以是长度值,百分比,或者等份网格容器中可用空间(使用 fr 单位)– <line-name>:你可以选择的任意名称CSS 代码:.container { grid-template-columns: <track-size> ... | <line-name> <track-size> ...; grid-template-rows: <track-size> ... | <line-name> <track-size> ...;}示例:当你在 网格轨道(Grid Track) 值之间留出空格时,网格线会自动分配正数和负数名称:CSS 代码:.container { grid-template-columns: 40px 50px auto 50px 40px; grid-template-rows: 25% 100px auto;}但是你可以明确的指定网格线(Grid Line)名称,例如 <line-name> 值。请注意网格线名称的括号语法:CSS 代码:.container { grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end]; grid-template-rows: [row1-start] 25% [row1-end] 100px [third-line] auto [last-line];}请注意,一条网格线(Grid Line)可以有多个名称。例如,这里的第二条 行网格线(row grid lines) 将有两个名字:row1-end 和 row2-start :CSS 代码:.container { grid-template-rows: [row1-start] 25% [row1-end row2-start] 25% [row2-end];}如果你的定义包含多个重复值,则可以使用 repeat() 表示法来简化定义:CSS 代码:.container { grid-template-columns: repeat(3, 20px [col-start]);}上面的代码等价于:CSS 代码:.container { grid-template-columns: 20px [col-start] 20px [col-start] 20px [col-start];}如果多行共享相同的名称,则可以通过其网格线名称和计数来引用它们。CSS 代码:.item { grid-column-start: col-start 2;}fr 单元允许你用等分网格容器剩余可用空间来设置 网格轨道(Grid Track) 的大小 。例如,下面的代码会将每个网格项设置为网格容器宽度的三分之一:CSS 代码:.container { grid-template-columns: 1fr 1fr 1fr;}剩余可用空间是除去所有非灵活网格项 之后 计算得到的。在这个例子中,可用空间总量减去 50px 后,再给 fr 单元的值 3 等分:CSS 代码:.container { grid-template-columns: 1fr 50px 1fr 1fr;}回到目录grid-template-areas通过引用 grid-area 属性指定的 网格区域(Grid Area) 名称来定义网格模板。重复网格区域的名称导致内容跨越这些单元格。一个点号(.)代表一个空单元格。这个语法本身可视作网格的可视化结构。值:<grid-area-name>:由网格项的 grid-area 指定的网格区域名称.(点号) :代表一个空的网格单元none:不定义网格区域CSS 代码:.container { grid-template-areas: "<grid-area-name> | . | none | ..." "...";}示例:CSS 代码:.item-a { grid-area: header;}.item-b { grid-area: main;}.item-c { grid-area: sidebar;}.item-d { grid-area: footer;} .container { grid-template-columns: 50px 50px 50px 50px; grid-template-rows: auto; grid-template-areas: "header header header header" "main main . sidebar" "footer footer footer footer";}上面的代码将创建一个 4 列宽 3 行高的网格。整个顶行将由 header 区域组成。中间一排将由两个 main 区域,一个是空单元格,一个 sidebar 区域组成。最后一行全是 footer 区域组成。你的声明中的每一行都需要有相同数量的单元格。你可以使用任意数量的相邻的 点. 来声明单个空单元格。 只要这些点.之间没有空隙隔开,他们就代表一个单独的单元格。注意你 不能 用这个语法来命名网格线,只是命名 网格区域 。当你使用这种语法时,区域两端的网格线实际上会自动命名。如果你的网格区域的名字是 foo,该区域的起始行网格线 和 起始列网格线 的名称将为 foo-start,而最后一条行网格线 和 最后一条列网格线 的名称将为 foo-end。这意味着某些网格线可能有多个名字,如上例中最左边的网格线,它将有三个名称:header-start,main-start 和 footer-start 。回到目录grid-template用于定义 grid-template-rows ,grid-template-columns ,grid-template-areas 简写属性。值:none:将所有三个属性设置为其初始值<grid-template-rows> / <grid-template-columns>:将 grid-template-columns 和 grid-template-rows 设置为相应地特定的值,并且设置grid-template-areas为noneCSS 代码:.container { grid-template: none | <grid-template-rows> / <grid-template-columns>;}这个属性也接受一个更复杂但非常方便的语法来指定三个上诉属性。这里有一个例子:CSS 代码:.container { grid-template: [row1-start] "header header header" 25px [row1-end] [row2-start] "footer footer footer" 25px [row2-end] / auto 50px auto;}等价于:CSS 代码:.container { grid-template-rows: [row1-start] 25px [row1-end row2-start] 25px [row2-end]; grid-template-columns: auto 50px auto; grid-template-areas: "header header header" "footer footer footer";}由于 grid-template 不会重置 隐式 网格属性(grid-auto-columns, grid-auto-rows, 和 grid-auto-flow),这可能是你想在大多数情况下做的,建议使用 grid 属性而不是 grid-template。回到目录grid-column-gap / grid-row-gap指定网格线(grid lines)的大小。你可以把它想象为设置列/行之间间距的宽度。值:<line-size> :长度值CSS 代码:.container { grid-column-gap: <line-size>; grid-row-gap: <line-size>;}示例:CSS 代码:.container { grid-template-columns: 100px 50px 100px; grid-template-rows: 80px auto 80px; grid-column-gap: 10px; grid-row-gap: 15px;}只能在 列/行 之间创建间距,网格外部边缘不会有这个间距。注意:这两个属性将删除 grid- 前缀,就是将 grid-column-gap 和 grid-row-gap重命名为 column-gap 和 row-gap。 Chrome 68+,Safari 11.2 Release 50+ 和Opera 54+ 已经支持无前缀的属性。回到目录grid-gapgrid-column-gap 和 grid-row-gap 的简写语法值:<grid-row-gap> <grid-column-gap>:长度值CSS 代码:.container { grid-gap: <grid-row-gap> <grid-column-gap>;}示例:CSS 代码:.container { grid-template-columns: 100px 50px 100px; grid-template-rows: 80px auto 80px; grid-gap: 15px 10px;}如果grid-row-gap没有定义,那么就会被设置为等同于 grid-column-gap 的值。例如下面的代码是等价的:CSS 代码:.container{ /* 设置 grid-column-gap 和 grid-row-gap */ grid-column-gap: 10px; grid-row-gap: 10px; /* 等价于 */ grid-gap: 10px 10px; /* 等价于 */ grid-gap: 10px;}注意:这个属性将删除 grid- 前缀,就是将 grid-gap 重命名为 gap。 Chrome 68+,Safari 11.2 Release 50+ 和Opera 54+ 已经支持无前缀的属性。回到目录justify-items沿着 inline(行)轴线对齐网格项(grid items)(相反的属性是 align-items 沿着 block(列)轴线对齐)。此值适用于容器内的所有网格项。值:start:将网格项对齐到其单元格的左侧起始边缘(左侧对齐)end:将网格项对齐到其单元格的右侧结束边缘(右侧对齐)center:将网格项对齐到其单元格的水平中间位置(水平居中对齐)stretch:填满单元格的宽度(默认值)CSS 代码:.container { justify-items: start | end | center | stretch;}示例:CSS 代码:.container { justify-items: start;}CSS 代码:.container{ justify-items: end;}CSS 代码:.container{ justify-items: center;}CSS 代码:.container{ justify-items: stretch;}这些行为也可以通过每个单独网格项(grid items) 的 justify-self 属性设置。回到目录align-items沿着 block(列)轴线对齐网格项(grid items)(相反的属性是 justify-items 沿着 inline(行)轴线对齐)。此值适用于容器内的所有网格项。值:start:将网格项对齐到其单元格的顶部起始边缘(顶部对齐)end:将网格项对齐到其单元格的底部结束边缘(底部对齐)center:将网格项对齐到其单元格的垂直中间位置(垂直居中对齐)stretch:填满单元格的高度(默认值)CSS 代码:.container { align-items: start | end | center | stretch;}示例:CSS 代码:.container { align-items: start;}CSS 代码:.container { align-items: end;}CSS 代码:.container { align-items: center;}CSS 代码:.container { align-items: stretch;}这些行为也可以通过每个单独网格项(grid items) 的 align-self 属性设置。回到目录place-itemsplace-items 是设置 align-items 和 justify-items 的简写形式。值:<align-items> <justify-items>:第一个值设置 align-items 属性,第二个值设置 justify-items 属性。如果省略第二个值,则将第一个值同时分配给这两个属性。除 Edge 之外的所有主要浏览器都支持 place-items 简写属性。有关更多详细信息,请参阅align-items 和 justify-items。回到目录justify-content有时,你的网格合计大小可能小于其 网格容器(grid container) 大小。 如果你的所有 网格项(grid items) 都使用像 px 这样的非灵活单位设置大小,就可能出现这种情况。在这种情况下,您可以设置网格容器内的网格的对齐方式。 此属性沿着 inline(行)轴线对齐网格(相反的属性是 align-content ,沿着 block(列)轴线对齐网格)。值:start:将网格对齐到 网格容器(grid container) 的左侧起始边缘(左侧对齐)end:将网格对齐到 网格容器 的右侧结束边缘(右侧对齐)center:将网格对齐到 网格容器 的水平中间位置(水平居中对齐)stretch:调整 网格项(grid items) 的宽度,允许该网格填充满整个 网格容器 的宽度space-around:在每个网格项之间放置一个均匀的空间,左右两端放置一半的空间space-between:在每个网格项之间放置一个均匀的空间,左右两端没有空间space-evenly:在每个网格项目之间放置一个均匀的空间,左右两端放置一个均匀的空间CSS 代码:.container { justify-content: start | end | center | stretch | space-around | space-between | space-evenly; }示例:CSS 代码:.container { justify-content: start;}CSS 代码:.container { justify-content: end;}CSS 代码:.container { justify-content: center;}CSS 代码:.container { justify-content: stretch;}CSS 代码:.container { justify-content: space-around;}CSS 代码:.container { justify-content: space-between;}CSS 代码:.container { justify-content: space-evenly;}回到目录align-content有时,你的网格合计大小可能小于其 网格容器(grid container) 大小。 如果你的所有 网格项(grid items) 都使用像 px 这样的非灵活单位设置大小,就可能出现这种情况。在这种情况下,您可以设置网格容器内的网格的对齐方式。 此属性沿着 block(列)轴线对齐网格(相反的属性是 justify-content ,沿着 inline(行)轴线对齐网格)。值:start:将网格对齐到 网格容器(grid container) 的顶部起始边缘(顶部对齐)end:将网格对齐到 网格容器 的底部结束边缘(底部对齐)center:将网格对齐到 网格容器 的垂直中间位置(垂直居中对齐)stretch:调整 网格项(grid items) 的高度,允许该网格填充满整个 网格容器 的高度space-around:在每个网格项之间放置一个均匀的空间,上下两端放置一半的空间space-between:在每个网格项之间放置一个均匀的空间,上下两端没有空间space-evenly:在每个网格项目之间放置一个均匀的空间,上下两端放置一个均匀的空间CSS 代码:.container { align-content: start | end | center | stretch | space-around | space-between | space-evenly; }示例:CSS 代码:.container { align-content: start; }CSS 代码:.container { align-content: end; }CSS 代码:.container { align-content: center; }CSS 代码:.container { align-content: stretch; }CSS 代码: .container { align-content: space-around; }CSS 代码:.container { align-content: space-between; }CSS 代码:.container { align-content: space-evenly; }回到目录place-contentplace-content 是设置 align-content 和 justify-content 的简写形式。值:<align-content> <justify-content>:第一个值设置 align-content 属性,第二个值设置 justify-content 属性。如果省略第二个值,则将第一个值同时分配给这两个属性。除 Edge 之外的所有主要浏览器都支持 place-content 简写属性。有关更多详细信息,请参阅align-content 和 justify-content。回到目录grid-auto-columns / grid-auto-rows指定任何自动生成的网格轨道(grid tracks)(又名隐式网格轨道)的大小。当网格中的网格项多于单元格时,或者当网格项位于显式网格之外时,就会创建隐式轨道。(参见显式网格和隐式网格之间的区别)值:<track-size>:可以是长度值,百分比,或者等份网格容器中可用空间的分数(使用 fr 单位)CSS 代码:.container { grid-auto-columns: <track-size> ...; grid-auto-rows: <track-size> ...;}为了说明如何创建隐式网格轨道,请考虑一下以下的代码:CSS 代码:.container { grid-template-columns: 60px 60px; grid-template-rows: 90px 90px}这将生成了一个 2×2 的网格。但现在想象一下,你使用 grid-column 和 grid-row 来定位你的网格项,像这样:CSS 代码:.item-a { grid-column: 1 / 2; grid-row: 2 / 3;}.item-b { grid-column: 5 / 6; grid-row: 2 / 3;}我们告诉 .item-b 从第 5 条列网格线开始到第 6 条列网格线结束,但我们从来没有定义过 第5 或 第6 列网格线。因为我们引用的网格线不存在,所以创建宽度为 0 的隐式网格轨道以填补空缺。我们可以使用 grid-auto-columns 和 grid-auto-rows 来指定这些隐式轨道的大小:CSS 代码:.container { grid-auto-columns: 60px;}回到目录grid-auto-flow如果你有一些没有明确放置在网格上的网格项(grid items),自动放置算法 会自动放置这些网格项。该属性控制自动布局算法如何工作。值:row:告诉自动布局算法依次填充每行,根据需要添加新行 (默认)column:告诉自动布局算法依次填入每列,根据需要添加新列dense:告诉自动布局算法在稍后出现较小的网格项时,尝试填充网格中较早的空缺CSS 代码:.container { grid-auto-flow: row | column | row dense | column dense}请注意,dense 只会更改网格项的可视顺序,并可能导致它们出现乱序,这对可访问性不利。示例:考虑以下 HTML :HTML 代码:<section class="container"> <div class="item-a">item-a</div> <div class="item-b">item-b</div> <div class="item-c">item-c</div> <div class="item-d">item-d</div> <div class="item-e">item-e</div></section>你定义一个有 5 列和 2 行的网格,并将 grid-auto-flow 设置为 row(也就是默认值):CSS 代码:.container { display: grid; grid-template-columns: 60px 60px 60px 60px 60px; grid-template-rows: 30px 30px; grid-auto-flow: row;}将网格项放在网格上时,只能为其中的两个指定位置:CSS 代码:.item-a { grid-column: 1; grid-row: 1 / 3;}.item-e { grid-column: 5; grid-row: 1 / 3;}因为我们把 grid-auto-flow 设成了 row ,所以我们的网格看起来会是这样。注意 我们没有进行定位的网格项(item-b,item-c,item-d)会这样排列在可用的行中:相反地,如果我们把 grid-auto-flow 设成了 column ,那么 item-b,item-c,item-d 会沿着列向下排列:CSS 代码:.container { display: grid; grid-template-columns: 60px 60px 60px 60px 60px; grid-template-rows: 30px 30px; grid-auto-flow: column;}回到目录grid在一个声明中设置所有以下属性的简写: grid-template-rows, grid-template-columns, grid-template-areas, grid-auto-rows, grid-auto-columns, 和 grid-auto-flow 。(注意:您只能在单个网格声明中指定显式或隐式网格属性)。值:none:将所有子属性设置为其初始值。<grid-template>:与grid-template 简写的工作方式相同。<grid-template-rows> / [ auto-flow && dense? ] <grid-auto-columns>? :将grid-template-rows 设置为指定的值。 如果 auto-flow 关键字位于斜杠的右侧,则会将 grid-auto-flow 设置为 column。 如果另外指定了 dense 关键字,则自动放置算法使用 “dense” 算法。 如果省略 grid-auto-columns ,则将其设置为 auto。[ auto-flow && dense? ] <grid-auto-rows>? / <grid-template-columns>:将 grid-template-columns 设置为指定值。 如果 auto-flow 关键字位于斜杠的左侧,则会将grid-auto-flow 设置为 row 。 如果另外指定了 dense 关键字,则自动放置算法使用 “dense” 打包算法。 如果省略 grid-auto-rows ,则将其设置为 auto。例子:以下两个代码块是等效的:CSS 代码:.container { grid: 100px 300px / 3fr 1fr;}CSS 代码:.container { grid-template-rows: 100px 300px; grid-template-columns: 3fr 1fr;}以下两个代码块是等效的:CSS 代码:.container { grid: auto-flow / 200px 1fr;}CSS 代码:.container { grid-auto-flow: row; grid-template-columns: 200px 1fr;}以下两个代码块是等效的:CSS 代码:.container { grid: auto-flow dense 100px / 1fr 2fr;}CSS 代码:.container { grid-auto-flow: row dense; grid-auto-rows: 100px; grid-template-columns: 1fr 2fr;}以下两个代码块是等效的:CSS 代码:.container { grid: 100px 300px / auto-flow 200px;}CSS 代码:.container { grid-template-rows: 100px 300px; grid-auto-flow: column; grid-auto-columns: 200px;}它也接受一个更复杂但相当方便的语法来一次设置所有内容。您可以指定 grid-template-areas,grid-template-rows和grid-template-columns,并所有其他的子属性都被设置为它们的初始值。这么做可以在它们网格区域内相应地指定网格线名字和网格轨道的大小。用最简单的例子来描述:CSS 代码:.container { grid: [row1-start] "header header header" 1fr [row1-end] [row2-start] "footer footer footer" 25px [row2-end] / auto 50px auto;}等价于:CSS 代码:.container { grid-template-areas: "header header header" "footer footer footer"; grid-template-rows: [row1-start] 1fr [row1-end row2-start] 25px [row2-end]; grid-template-columns: auto 50px auto; }回到目录子元素 网格项(Grid Items) 属性注意:float,display: inline-block,display: table-cell,vertical-align 和 column-* 属性对网格项无效。grid-column-start / grid-column-end / grid-row-start / grid-row-end通过引用特定网格线(grid lines) 来确定 网格项(grid item) 在网格内的位置。 grid-column-start / grid-row-start 是网格项开始的网格线,grid-column-end / grid-row-end 是网格项结束的网格线。值:<line> :可以是一个数字引用一个编号的网格线,或者一个名字来引用一个命名的网格线span <number> :该网格项将跨越所提供的网格轨道数量span <name> :该网格项将跨越到它与提供的名称位置auto:表示自动放置,自动跨度,默认会扩展一个网格轨道的宽度或者高度CSS 代码:.item { grid-column-start: <number> | <name> | span <number> | span <name> | auto grid-column-end: <number> | <name> | span <number> | span <name> | auto grid-row-start: <number> | <name> | span <number> | span <name> | auto grid-row-end: <number> | <name> | span <number> | span <name> | auto}示例:CSS 代码:.item-a { grid-column-start: 2; grid-column-end: five; grid-row-start: row1-start grid-row-end: 3;}CSS 代码:.item-b { grid-column-start: 1; grid-column-end: span col4-start; grid-row-start: 2 grid-row-end: span 2}如果没有声明指定 grid-column-end / grid-row-end,默认情况下,该网格项将占据 1 个轨道。项目可以相互重叠。您可以使用 z-index 来控制它们的重叠顺序。回到目录grid-column / grid-row分别为 grid-column-start + grid-column-end 和 grid-row-start + grid-row-end 的简写形式。值:<start-line> / <end-line>:每个网格项都接受所有相同的值,作为普通书写的版本,包括跨度CSS 代码:.item { grid-column: <start-line> / <end-line> | <start-line> / span <value>; grid-row: <start-line> / <end-line> | <start-line> / span <value>;}示例:CSS 代码:.item-c { grid-column: 3 / span 2; grid-row: third-line / 4;}如果没有声明分隔线结束位置,则该网格项默认占据 1 个网格轨道。回到目录grid-area为网格项提供一个名称,以便可以 被使用网格容器 grid-template-areas 属性创建的模板进行引用。 另外,这个属性可以用作grid-row-start + grid-column-start + grid-row-end + grid-column-end 的简写。值:<name>:你所选的名称<row-start> / <column-start> / <row-end> / <column-end>:数字或分隔线名称CSS 代码:.item { grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;}示例:作为为网格项分配名称的一种方法:CSS 代码:.item-d { grid-area: header}作为grid-row-start + grid-column-start + grid-row-end + grid-column-end 属性的简写形式CSS 代码:.item-d { grid-area: 1 / col4-start / last-line / 6}回到目录justify-self沿着 inline(行)轴线对齐网格项( 相反的属性是 align-self ,沿着 block(列)轴线对齐)。此值适用于单个网格项内的内容。值:start:将网格项对齐到其单元格的左侧起始边缘(左侧对齐)end:将网格项对齐到其单元格的右侧结束边缘(右侧对齐)center:将网格项对齐到其单元格的水平中间位置(水平居中对齐)stretch:填满单元格的宽度(默认值)CSS 代码:.item { justify-self: start | end | center | stretch;}示例:CSS 代码:.item-a { justify-self: start;}CSS 代码:.item-a { justify-self: end;}CSS 代码:.item-a { justify-self: center;}CSS 代码:.item-a { justify-self: stretch;}要为网格中的所有网格项设置 行轴线(row axis) 线上对齐方式,也可以在 网格容器 上设置 justify-items 属性。回到目录align-self沿着 block(列)轴线对齐网格项(grid items)( 相反的属性是 justify-self ,沿着 inline(行)轴线对齐)。此值适用于单个网格项内的内容。值:start:将网格项对齐到其单元格的顶部起始边缘(顶部对齐)end:将网格项对齐到其单元格的底部结束边缘(底部对齐)center:将网格项对齐到其单元格的垂直中间位置(垂直居中对齐)stretch:填满单元格的高度(默认值)CSS 代码:.item{ align-self: start | end | center | stretch;}示例:CSS 代码:.item-a { align-self: start;}CSS 代码:.item-a { align-self: end;}CSS 代码:.item-a { align-self: center;}CSS 代码:.item-a { align-self: stretch;}要为网格中的所有网格项设置 列轴线(column axis) 上的对齐方式,也可以在 网格容器 上设置 align-items 属性。place-selfplace-self 是设置 align-self 和 justify-self 的简写形式。值:auto – 布局模式的 “默认” 对齐方式。<align-self> <justify-self>:第一个值设置 align-self 属性,第二个值设置 justify-self 属性。如果省略第二个值,则将第一个值同时分配给这两个属性。示例:CSS 代码:.item-a { place-self: center;}CSS 代码:.item-a { place-self: center stretch;}除 Edge 之外的所有主要浏览器都支持 place-self 简写属性。回到目录动画(Animation)根据 CSS Grid 布局模块 Level 1 规范,有 5 个可应用动画的网格属性:grid-gap, grid-row-gap,grid-column-gap 作为长度,百分比或 calc。grid-template-columns,grid-template-rows 作为长度,百分比或 calc 的简单列表,只要列表中长度、百分比或calc组件的值不同即可。浏览器支持CSS网格属性截至今天(2018年5月7日),在测试的几个浏览器中仅实现 (grid-)gap,(grid-)row-gap,(grid-)column-gap 的动画。浏览器支持可设置动画的网格属性:浏览器(grid-)gap, (grid-)row-gap, (grid-)column-gapgrid-template-columnsgrid-template-rowsFirefox 55+, Firefox 53+ Mobile✅❌❌Safari 11.0.2❌❌❌Chrome 66+✅❌❌Chrome for Android 66+, Opera Mini 33+✅❌❌Edge 16+✅❌❌
2020年12月09日
296 阅读
0 评论
0 点赞
2020-12-09
UniApp采坑记录
开发者启用自定义组件模式后,在进行自定义组件开发(页面开发不影响)时,需注意如下约束id 为保留属性名,不能作为 props 传递,微信小程序自定义组件限制props 中不能定义 data 为属性名,百度小程序限制props 不支持 date 类型数据传递,微信小程序自定义组件限制uni.createSelectorQuery() 和 uni.createIntersectionObserver() 的调整
2020年12月09日
280 阅读
0 评论
0 点赞