Slide 1

Slide 1 text

PostCSS'for'Beginners in#ୈ12ճHTML5ϏΪφʔζ

Slide 2

Slide 2 text

About&me • Masaaki'Morishita • Twi.er:'@morishi.er_ • GitHub:'morishi.er • αΠόʔΤʔδΣϯτʢ৽ଔ1೥໨ʣ • PostCSSΤόϯδΣϦετʢࣗশʣ

Slide 3

Slide 3 text

ϒϩά

Slide 4

Slide 4 text

PostCSSͰ࡞ͬͨ΋ͷ • CSSfmt:((S)CSSίʔυ੔ܗπʔϧ • AtCSS:(΅͕͔͘Μ͕͍͖͑ͨ͞ΐ͏ͷCSSϓϦϓϩηοαʔ • postcss0style0guide:(ελΠϧΨΠυδΣωϨʔλʔ • ଞϓϥάΠϯ7ͭ

Slide 5

Slide 5 text

PostCSS

Slide 6

Slide 6 text

Over%5000%Star!%in%GitHub

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

੎͍͕͋Δ!

Slide 11

Slide 11 text

PostCSSͱ͸ • Node.js੡ͷCSSύʔαʔʢv5͔Β͸CSS͚ͩͷύʔαʔͰ͸ͳ ͘ͳͬͨʣ • ASTʢύʔε݁ՌͷJSΦϒδΣΫτʣΛૢ࡞͢ΔศརAPIΛఏڙ • ϓϥάΠϯ౳ͷΤίγεςϜ΋ؚΊͯPostCSSͱݺ͹ΕΔ

Slide 12

Slide 12 text

PostCSSͰύʔε .class { font-size: 14px; padding: 5px 10px; }

Slide 13

Slide 13 text

ASTʢൈਮʣ { raws: { before: '', between: ' ', semicolon: true, after: '\n' }, type: 'rule', nodes: [ { raws: { before: '\n ', between: ': ' }, type: 'decl', parent: [Circular], source: { start: { line: 2, column: 3 }, input: { css: '.class {\n font-size: 14px;\n padding: 5px 10px;\n}\n', id: '' }, end: { line: 2, column: 18 } }, prop: 'font-size', value: '14px' }, { raws: { before: '\n ', between: ': ' }, type: 'decl', parent: [Circular], source: { start: { line: 3, column: 3 }, input: { css: '.class {\n font-size: 14px;\n padding: 5px 10px;\n}\n', id: '' }, end: { line: 3, column: 20 } }, prop: 'padding', value: '5px 10px' } ],

Slide 14

Slide 14 text

ASTΛ͝ʹΐ͝ʹΐͯ͠ϓϥάΠϯ΍πʔϧ Λ࡞Δ

Slide 15

Slide 15 text

PostCSSͰ࡞ΒΕͨπʔϧ

Slide 16

Slide 16 text

Autoprefixer ϕϯμʔϓϨϑΟοΫεΛࣗಈ෇༩͢Δπʔϧ

Slide 17

Slide 17 text

Autoprefixer Input: .flex { display: flex; } Yield: .flex { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; }

Slide 18

Slide 18 text

cssnext ݱࡏࡦఆஈ֊Ͱϒϥ΢β͕ະ࣮૷ͷCSSͷه๏Λɺࠓͷϒϥ΢β ͕ղऍͰ͖ΔΑ͏ʹτϥϯεύΠϧ͢Δπʔϧ

Slide 19

Slide 19 text

cssnext • Custom(proper,es(&(var() • Custom(selectors • Custom(media(queries • media(queries(ranges • color() • etc..

Slide 20

Slide 20 text

cssnext :root { --mainColor: #ffbbaaff; } @custom-media --mobile (width <= 640px); @custom-selector :--heading h1, h2, h3, h4, h5, h6; .post-article :--heading { color: color( var(--mainColor) blackness(+20%) ); } @media (--mobile) { .post-article :--heading { margin-top: 0; } }

Slide 21

Slide 21 text

ۀ຿Ͱ͸PostCSSͰ࡞ΒΕͨπʔϧ΍ ϓϥάΠϯ࢖͏͜ͱʹͳΔ

Slide 22

Slide 22 text

How$to$use$PostCSS

Slide 23

Slide 23 text

in#gulp gulp.task('postcss', function () { var postcss = require('gulp-postcss'); return gulp.src('src/**/*.css') .pipe( postcss([ require('postcss-mixins'), require('postcss-nested'), require('postcss-simple-vars'), require('cssnext'), require('cssnano'), ]) ) .pipe( gulp.dest('build/') ); });

Slide 24

Slide 24 text

@define-mixin icon $network, $color: blue { .icon.is-$(network) { color: $color; @mixin-content; &:hover { color: white; background: $color; } } } @mixin icon twitter { background: url(twt.png); } @mixin icon youtube, red { background: url(youtube.png); } ↑ͷΑ͏ͳίʔυΛCSSʹม׵Ͱ͖Δ

Slide 25

Slide 25 text

ͿͬͪΌ͚ͦΜͳػೳ͍ΒΜ(") ʢ@mixin΋@extend΋؅ཧͰ͖ΜΘʂʣ (@func'oin??஌Βͳ͍ࢠͰ͢Ͷ)

Slide 26

Slide 26 text

@import(ʹΑΔϑΝΠϧͷΠϯϥΠϯల։͚ͩ࢖͍͍ͨ gulp.task('postcss', function () { var postcss = require('gulp-postcss'); return gulp.src('src/**/*.css') .pipe( postcss([ require('postcss-import'), ]) ) .pipe( gulp.dest('build/') ); });

Slide 27

Slide 27 text

ηϨΫλʔͷωετ΋͍ͨ͠ʂ gulp.task('postcss', function () { var postcss = require('gulp-postcss'); return gulp.src('src/**/*.css') .pipe( postcss([ require('postcss-import'), require('postcss-nested') ]) ) .pipe( gulp.dest('build/') ); });

Slide 28

Slide 28 text

ඞཁͳػೳ͚ͩϓϥάΠϯͰ௥ՃͰ͖Δ

Slide 29

Slide 29 text

PostCSSͷಋೖ͸ҙ֎ͱ؆୯ SassΑΓ؆୯͔΋!? PostCSSා͘ͳ͍Αʔ

Slide 30

Slide 30 text

PostCSS'is'Awesome!!

Slide 31

Slide 31 text

Thanks':D morishi'er