20191009のCSSに関する記事は11件です。

CSSと組み込み方法のメモ

CSSとは

Webページ開発者がhtmlコンテンツのスタイルを設定するための言語です。
cssはWebページの色、フォントの種類、フォントサイズ、影、画像、要素の配置などの変更することが出来るのです。

自分の書いたCSSをWebページに適用する方法は以下の通りです。

①htmlのタグに組み込む
②cssファイルを用意してhtmlから読み込ませる
③styleタグで挟む

これらの適用方法を紹介していきます。

適用方法 その1 htmlのタグに組み込む方法

「style=」でタグに組み込みます。
下記はpタグの文字色を赤色に変更した例です。

hello.html
<p style="color: red;">Hello World!</p>

適用方法 その2 cssファイルを用意してhtmlから読み込ませる

style.cssをindex.htmlに適用したい場合は、下記のように同じ階層のディレクトリに置くか、
cssファイルを下位の階層に置きます。

.
├── index.html
├── style.css
・
・
・
・

ファイルが用意出来たら、htmlファイルから読み込みます。

index.html
<link rel="stylesheet" href="ファイル名.css">

適用方法 その3 styleタグで挟む

下記は「style.html」というhtmlファイルにstyleタグをつけてその中にpタグの設定を組み込んでいます。styleタグはhead内に組み込まないと正しく動作しないようです。

style.html
<head>
  <style>
    p {
      color: gleen;
      font-size: 100px;
    }
  </style>
</head>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iOS fixed+慣性スクロールがなくなった?

背景

iPhoneでモーダルを表示するときなど、デフォルトで慣性スクロールしてくれないので-webkit-overflow-scrolling: touchを指定して、慣性スクロールを実現させているページがありました。
ですが、fixed+慣性スクロールの掛け合わせだと、動きが止まるときがあったので指定を外しました。
そしたらoverflow-scrollingの指定がないのにiPhoneでも慣性スクロールになっている?と思ったので、検証してみます。

検証用

See the Pen menu scroll test by かぶきち (@cubkich) on CodePen.

端末・バージョン別

iPhone7 iOS 13.1.2

私の持っている端末では、慣性スクロールが確認出来ました。

iPhone6 iOS 12.3.1

会社にある端末では、慣性スクロールの確認は出来ませんでした。

iPhone10s iOS ??.?.?

先輩の端末で見てみたら、慣性スクロールしていませんでした。

考察

もしかしたらiOS13からデフォで慣性スクロールしてくれるのかもしれない。
ただ、まだシェアがそこまで広がっていないと思うので、慣性スクロールできないことを前提に対応するべき。
かなぁ。

お使いのiPhoneでは慣性してますか?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iOS デフォで慣性スクロールできるようになった?

背景

iPhoneでモーダルを表示するときなど、デフォルトで慣性スクロールしてくれないので-webkit-overflow-scrolling: touchを指定して、慣性スクロールを実現させているページがありました。
ですが、fixed+慣性スクロールの掛け合わせだと、動きが止まるときがあったので指定を外しました。
そしたらoverflow-scrollingの指定がないのにiPhoneでも慣性スクロールになっている?と思ったので、検証してみます。

検証用

See the Pen menu scroll test by かぶきち (@cubkich) on CodePen.

端末・バージョン別

iPhone7 iOS 13.1.2

私の持っている端末では、慣性スクロールが確認出来ました。

iPhone6 iOS 12.3.1

会社にある端末では、慣性スクロールの確認は出来ませんでした。

iPhone10s iOS ??.?.?

先輩の端末で見てみたら、慣性スクロールしていませんでした。

考察

もしかしたらiOS13からデフォで慣性スクロールしてくれるのかもしれない。
ただ、まだシェアがそこまで広がっていないと思うので、慣性スクロールできないことを前提に対応するべき。
かなぁ。

お使いのiPhoneでは慣性してますか?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iPadOSでフォントサイズが変わる

WEARフロントエンドエンジニアのむーさん(@murs313)です!

iPadOSが出て、User Agentやらフォント太り問題やらで騒がれましたが、他にもこっそり変わっていることがありました…。

フォントサイズが変わってる!

小さい文字が大きくなって、崩れてるボタンがあるじゃないですか!!!

BEFORE & AFTER
image.pngimage.png
あかんでえ…。

対応

bodyにtext-size-adjust: none;を設定すると解決します。
サポートしたいブラウザ・バージョンに合わせて、必要ならベンダープレフィックスも設定しましょう。
https://developer.mozilla.org/ja/docs/Web/CSS/text-size-adjust

text-size-adjust: none;
-webkit-text-size-adjust: none;

補足① フォントが大きくなる基準は?

WEARのサイトでは13px~14pxより小さい文字が大きくなるようですが、同じ14pxでも変わる箇所と変わらない箇所などがあり、基準は謎…。

BEFORE (フォントサイズが変わる箇所を赤枠で囲っています)
image.png
AFTER
image.png
どこを大きくするかはAppleの采配なんだろうか…。

補足② text-size-adjust: none;のバグ

こちらのブログにもあるように、text-size-adjust: none;を指定するとブラウザで拡大・縮小しても文字サイズが変わらないというChromeのバグがあったようですが、現在は直っています。

Instead of ignoring the -webkit-text-size-adjust property, a bug prevents desktop Chrome users from zooming in or out. The bug was fixed after Chrome 26.

(引用) https://developer.mozilla.org/ja/docs/Web/CSS/text-size-adjust

最後に

サイトを持っている方は、一度Simulatorでチェックしてみることをおすすめします!(最新のXcodeでiPadOSのSimulatorが使えます!)

すぺしゃるさんくす

今回のこの現象と対応法を共有してくださったのは、ZOZOTOWNフロントエンドエンジニアのあーさーさんです!(iPadOSのUser Agentの影響調査をしていたところ発見したそう)
あーさーさんと、情報共有ができる会社の風土に多大なる感謝を…!!

風通しの良い風土でWEARの開発をしたい方はJOIN US!!!
https://tech.zozo.com/recruit/mid-career/detail59/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Go の Web フレームワーク Echo で IT 用語クイズアプリを作ってみた

はじめに

近年、世間ではクイズが流行っています(?)が、IT 用語に特化したクイズのアプリってあんまりないような気がしたので作ってみました。
Go の勉強を最近始めたので、 echo でクイズのデータの JSON を返すだけの Web サーバをたてることにします。

作ったもの

https://go-itquiz.herokuapp.com/
Github: https://github.com/chgzm/go-itquiz

  • 動作イメージ itquiz-screenshot.png

サーバ側

Go そのものについては、始めて 3 日くらいなのでよくわかってませんが、echo の Guite を読めば大体問題なくできました。

  • main 部分. heroku にデプロイするために、環境変数 PORT からポート番号を取得するようにする
main.go
package main                                                                                                                                                                                                                                                                    

import (
    "html/template"
    "io"
    "os"

    "github.com/chgzm/go-itquiz/data"
    "github.com/chgzm/go-itquiz/handler"
    "github.com/labstack/echo"
)

type TemplateRenderer struct {
    templates *template.Template
}

func (t *TemplateRenderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
    if viewContext, isMap := data.(map[string]interface{}); isMap {
        viewContext["reverse"] = c.Echo().Reverse
    }   

    return t.templates.ExecuteTemplate(w, name, data)
}

func setRouting(e *echo.Echo) {
    e.GET("/", handler.HandleIndex)
    e.GET("/question", handler.HandleQuestion)
    e.POST("/data", handler.HandleData)
}

func setStatic(e *echo.Echo) {
    e.Static("/public/css", "./public/css/")
    e.Static("/public/js", "./public/js/")
}

func main() {
    e := echo.New()
    renderer := &TemplateRenderer{
        templates: template.Must(template.ParseGlob("public/*.html")),
    }   
    e.Renderer = renderer

    err := data.InitTable(e, "./data")
    if err != nil {
        e.Logger.Error(err)
        return
    }   

    setRouting(e)
    setStatic(e)

    port := os.Getenv("PORT")
    if port == "" {
        port = "1323"
    }   

    e.Logger.Fatal(e.Start(":" + port))
}
  • ハンドラの処理. /data へのアクセスでランダムに 10 問選んで JSON 形式で返す
handler/handler.go
package handler                                                                                                                                                                                                                                                                 

import (
    "math/rand"
    "net/http"
    "time"

    "github.com/chgzm/go-itquiz/data"
    "github.com/labstack/echo"
)

func HandleIndex(c echo.Context) error {
    return c.Render(http.StatusOK, "index.html", "") 
}

func HandleQuestion(c echo.Context) error {
    return c.Render(http.StatusOK, "question.html", "") 
}

func HandleData(c echo.Context) error {
    entries := data.GetAllEntries()
    extract := extractEntry(entries)

    return c.JSON(http.StatusOK, extract)
}

func extractEntry(entries []data.Entry) []data.Entry {
    extract := make([]data.Entry, 0, 10) 
    selected := make(map[int]bool)

    rand.Seed(time.Now().UnixNano())
    entLen := len(entries)
    i := 0
    for {
        index := rand.Intn(entLen)
        if selected[index] == true {
            continue
        }
        selected[index] = true
        extract = append(extract, entries[index])

        i++
        if i == 10 {
            break
        }
    }   

    return extract
}
  • テキストからクイズのデータを読み込んでメモリ上に保持する処理
data/table.go
package data

import (
    "bufio"
    "io/ioutil"
    "os"
    "path/filepath"
    "strings"

    "github.com/labstack/echo"
)

type Entry struct {
    ID       int    `json:"id"`
    Question string `json:"question"`
    Answer   string `json:"answer"`
    Dummy1   string `json:"dummy1"`
    Dummy2   string `json:"dummy2"`
    Dummy3   string `json:"dummy3"`
}

type Tag struct {
    ID       int
    Name     string
    EntryIDs []int
}

var entryTable []Entry
var tagTable []Tag

func InitTable(e *echo.Echo, dir string) error {
    entryTable = make([]Entry, 0, 2048)
    tagTable = make([]Tag, 0, 64)

    //
    // init entry
    //

    ent := Entry{}
    tagIDMap := make(map[string]int)
    entryID := 0
    tagID := 0

    for _, path := range getFilePaths(dir) {
        f, err := os.Open(path)
        if err != nil {
            e.Logger.Error(err)
            return err
        }

        scanner := bufio.NewScanner(f)
        for scanner.Scan() {
            str := scanner.Text()
            if len(str) == 0 {
                continue
            } else if strings.HasPrefix(str, "##") {
                // add to TagTable
                tagNames := strings.Split(strings.TrimLeft(strings.TrimPrefix(str, "##"), " "), ",")
                for _, tagName := range tagNames {
                    if id, ok := tagIDMap[tagName]; ok == false {
                        tagIDMap[tagName] = tagID
                        tag := Tag{}
                        tag.ID = tagID
                        tag.Name = tagName
                        tag.EntryIDs = make([]int, 0, 256)
                        tag.EntryIDs = append(tag.EntryIDs, entryID)
                        tagTable = append(tagTable, tag)
                        tagID++
                    } else {
                        tag := tagTable[id]
                        tag.EntryIDs = append(tag.EntryIDs, entryID)
                    }
                }
            } else if str[0] == '#' {
                ent.Question = strings.TrimLeft(strings.TrimPrefix(str, "#"), " ")
            } else if str[0] == '1' {
                ent.Answer = strings.TrimLeft(strings.TrimPrefix(str, "1."), " ")
            } else if str[0] == '2' {
                ent.Dummy1 = strings.TrimLeft(strings.TrimPrefix(str, "2."), " ")
            } else if str[0] == '3' {
                ent.Dummy2 = strings.TrimLeft(strings.TrimPrefix(str, "3."), " ")
            } else if str[0] == '4' {
                ent.Dummy3 = strings.TrimLeft(strings.TrimPrefix(str, "4."), " ")

                // add to EntryTable
                ent.ID = entryID
                entryID++
                entryTable = append(entryTable, ent)
                ent = Entry{}
            }
        }

        f.Close()
    }

    return nil
}

func GetAllEntries() []Entry {
    return entryTable
}

func GetEntries(tagID int) []Entry {
    entries := make([]Entry, 0, 1024)
    for _, entryID := range tagTable[tagID].EntryIDs {
        entries = append(entries, entryTable[entryID])
    }

    return entries
}

func getFilePaths(dir string) []string {
    files, err := ioutil.ReadDir(dir)
    if err != nil {
        panic(err)
    }

    paths := make([]string, 0, 32)
    for _, file := range files {
        if file.IsDir() {
            paths = append(paths, getFilePaths(filepath.Join(dir, file.Name()))...)
            continue
        }

        if file.Name() == "question.md" {
            paths = append(paths, filepath.Join(dir, file.Name()))
        }
    }

    return paths
}

クライアント側

CSS や Javascript のフレームワークは使わず実装しました(使うほどの規模でもないので)。作ってる途中に気づきましたが、ドットインストール にクイズアプリ作るレッスンがあったので大いに参考にしました。

おわりに

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初心者による初心者のための font-family

font-familyがフォントの指定をするためのプロパティってことはわかってるけど、現場ではすでに固定の指定があって自分で指定することはなかったり、font-family指定はこれでOK!みたいなのをコピペしてきてばかりで、書き方をイマイチわかってない自分用メモ。
間違ってるところがあればぜひ指摘してください!

基本文法

font-family: family-name, generic-family;
↓例↓

body {
   font-family: Helvetica, Verdana, sans-serif;
}

If Helvetica is available it will be used when rendering.
If neither Helvetica nor Verdana is present, then the user-agent-defined sans serif font will be used.
W3C Recommendation
https://www.w3.org/TR/css-fonts-3/#propdef-font-family

一番左に書いてあるフォントから、コンピュータにインストールされてるかどうか調べて、最初に見つかったもので表示します。
なので、Helveticaが見つかればHelveticaで表示、もしなければVerdana。
それもなかったら適当なsans-serifのフォントで表示する。
とりあえず、使ってほしい順にfamily-name書いて、最悪の場合せめてこのgeneric-familyにしてねって滑り止めを一番最後に書いておく。

family-name

上記の例だと、Helvetica, Verdanaがfamily-name。
, (カンマ)で区切って複数指定。↑の通り、見つからないとコンピュータが勝手にフォント決めちゃうから、複数予備を書いておく。
有名どころだと、ヒラギノ角ゴシック、メイリオ、游明朝とか。

generic-family

keywords 特徴
serif 文字の端に三角形の飾りがあるシュッとしたやつ
sans-serif 飾りがないやつ
cursive 筆記体。日本語フォントはあんま関係ない
fantasy 装飾書体。小洒落たやつ。日本語フォントはあんま関係ない
monospace 等幅フォント、もっと増えて〜〜〜

フォント一覧

MacならFont Bookアプリ。
左上の[i]ボタン押すとfont-familyに書く正式名称が確認できる。

family-nameは""(クォーテーション)で囲む?

To avoid mistakes in escaping, it is recommended to quote font family names that contain white space, digits, or punctuation characters other than hyphens:
body { font-family: "New Century Schoolbook", serif }
<BODY STYLE="font-family: '21st Century', fantasy">

W3C Recommendation
https://www.w3.org/TR/css-fonts-3/#propdef-font-family

空白、数字、またはハイフン以外の句読点を含むfamily-nameのときはクォーテーションつけることを推奨するよ!って感じ。
なので、Helveticaはクォーテーション不要。MS Pゴシックは空白があるからクォーテーション必要。

''(シングルクォーテーション)と""(ダブルクォーテーション)どっち?

どっちでもOK。

例と疑問

body{
font-family: "Noto Sans JP",-apple-system,BlinkMacSystemFont,"ヒラギノ角ゴシック W3","Hiragino Sans",YuGothic,"メイリオ",Meiryo,sans-serif;
}

日本語と英語で同じの書くのなんで?

"メイリオ", Meiryo, とか、同じじゃないの?
結論:同じ
日本語で書くと認識されない場合があるそうで、英語名も書く。
じゃあ英語名だけでいいんじゃないの?と思うんですが、昔はどっちも書いておいた方が良いとされてたそうで
今でも、念の為そうしてるところが多いっぽい。
参考:https://www.foxism.jp/entry/2019/04/06/183108

"Noto Sans JP" ってよく見かけるけどなに?

Google fonts( https://fonts.google.com/ ) の一つ。
よくわかんないけど人気。
詳しくは↓がわかりやすかったです。
参照:https://plu-plu.net/notosansjp/

-apple-system, BlinkMacSystemFont ってなに?

Appleのシステムフォントの指定。

  • -apple-system:Safari用
  • BlinkMacSystemFont:Chrome, Opera用

もうちょっと勉強してから追記します〜

補足

日頃からフォントを意識してみる

Chrome拡張子:WhatFont
https://chrome.google.com/webstore/detail/whatfont/jabopobgcpjmedljpbcaablpmlmfcogm?hl=ja

カーソル当てるとなんのフォント使ってるのか表示してくれる拡張子。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CSS z-indexの使用

22ee0fde90db24b73255b249e9a14407.png

z-index:数字で指定した値が大きい要素ほど上に表示されます。数字には整数を入れます。

class="one">1番目
class="two">2番目
class="three">3番目

.one {
z-index: 10;
left: 10;
top: 10;
}
.two {
z-index: 20;
left: 20px;
top: 20px;
}
.three {
z-index: 30;
left: 30px;
top: 30px;
}
-1.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

HTML CSS勉強するときにオススメな教材

はじめに

こんにちは。
現在デザイナーをやりながらフロントエンドエンジニアを目指して
勉強中のあくしおです。

アウトプットするって言ったのにかなり久しぶりの投稿です。。。

気持ちを切り替えて今日はHTML CSSを勉強するときにおすすめの教材を紹介していきたいと思います。

私のように遠回りして欲しくないので書きます。

基礎編

対象者:

・HTML CSSってなにそれ。
・名前は聞いたことあるよって人

オススメ教材:

Progate
・めっちゃ分かりやすいです。無料プランでもいいですが有料会員になって
 サッと2週くらいやるといいと思います。
・本とかだとモチベ上がらない人とかは特におすすめ。

おすすめサイト:
Webliker
・凄く丁寧に説明してくれてる。
 こちらも初学者の方にかなりオススメ

ドットインストール
・動画形式で一緒に基礎を学びたい方向け

 

上記教材をやれば基礎の基礎は身につくと思います。

次のステップ

対象者:基礎は学んだよ!って人

UdemyのBuild Responsive Real World Websites with HTML5 and CSS3コース

こちらはUdemyのHTML CSSコースの中でもベストセラーの教材となっており僕自身もこの教材をやって大変満足しております。

実際に作るサイトもオシャレなのでテンションも上がります。

上記の事が終わったらあとはひたすら自分でサイトを作ってみるしかないと思います。
何も作るものが思いつかない人は既存のサイトの模写コーディングがオススメです。

「模写コーディング おすすめ」とかで検索したらたくさん出てくるのではないでしょうか。

実際のコーディング作業に移った時に手が止まってしまうということはあると思いますがググりながら一つずつ潰していけば必ずできるようになると思います。

まとめ

結局のところ基礎の基礎を勉強したら調べながら自分で手を動かすがオススメ。
もしこの記事がいまいち勉強方法がわからないという方の参考になれば幸いです。

Qiita自体書き慣れていないので間違い等あれば指摘していただけると大変助かります。
またこの次のステップも需要があれば書きたいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JavaScriptで自販機を作る方法

JavaScriptで自動販売機のブログラムを作りたいのですが、以下をできるようなプログラムを作りたいです。
1.お金を投入
2.商品を選択
3.商品とお釣りを受け取る。
まだ、JavaScriptを始めたばかりなので分かる方いましたら、教えていただきたいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[CSS] marginに値を4つ指定する。

CSSでmarginやpaddingに4つ値を指定すると、記述した順に[上][右][下][左]のマージンになります。

p.sample5 {background-color: #f8dce0; margin: 10px 20px 30px 40px;}

HTMLソース

<p class="sample5"> 上10px、右20px、下30px、左40px </p>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

勉強して150時間目の進捗

youtubeでKENTAさんが準備期間は大体150時間くらいでその後はどんどんポートフォリオ作っていった方が良いよってことで
自分がそろそろそれくらいなので作ってみることにしました。

スクリーンショット 2019-10-07 23.38.48.png

勉強した教材は、Progate、paizaラーニング、はじめてのふりがなプログラミングJS編、それぞれやってることは一緒ですが、教材によって説明の解釈や見せ方が違うので似た内容でも良い復習になりました。

とりあえずトップページを作ってみました。大体イメージ通りです。
もっとスライドとか使ってヌルヌル動かしたいんですが、お手本にしたいHPの検証モードが何書いてあるのか全然わからないので調べてできる範囲でなるべく似せて作って行こうと思います。

トップページできたらそれぞれコンテンツページを作っていくんですが、HOME、YouTube、Twitterはリンクにするだけで完了
galleryとproductionの部分は作っていくんですが、galleryを見せ方によっては超かっこよくしたいですが、なんかサンプル素材がググったら沢山出てきて、コピペするだけでまんまパクれるかなって思ってやってみたんですが、なんか上手くいかないので、シンプルなので良いから形にはしていかないかんので簡単そうなものを色々試していってみることにします。
production(制作代行)の部分は注文フォームの見せ方をどうするか、ある程度お客さんが注文しやすいようにJSで作り込んでいく必要がありそうです、てゆうかここくらいでしかJSの出番がなさそうなので、これもできる範囲でやっていきます。

僕の大好きなプラモデル制作もそうですが、細かい部分が全然綺麗に作れない、塗れないからって、何回もやり直していたらいつまでたっても完成しません、ある程度自分の実力と見切りをつけて、なるべくパーツの少ないキャラを選んで、荒くても良いからガツガツ作っていって次の作品でまた学べば良いかなと考えています。
今の営業の仕事はどんなけ売りまくって稼げないので、もうウンザリしてます。はよプログラム覚えて仕事の幅を広げていきたいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む