Quantcast
Channel: CSSタグが付けられた新着記事 - Qiita
Viewing all 8773 articles
Browse latest View live

WebサイトをHerokuでデプロイしようとしたら、エラーで躓いた話。

$
0
0

はじめに

制作したWebサイトを取り敢えずHerokuにあげて確認してみたかったのでデプロイしようとしたのですが、
エラーにかなり悩まされたので、同じところで詰まっている方の手助けになれば幸いです。

WebサイトをHerokuでデプロイ

GitHubでコード管理を行っていたので
HerokuとGitHubを連携してHerokuサイトからデプロイしようとしていたところ、

スクリーンショット 2020-03-26 9.49.33.png

上記画像のようなエラーが出てしまいました。

エラーの原因

調べてみたところ、
今回エラーが発生したざっくりとした理由としては
HTMLベースのサイトだとHerokuがアプリとして認識してくれない為でした。

〜〜〜〜〜〜〜〜〜〜〜〜
以下少し詳しく解説します。

まずエラーで何を言われているのかというと、

No default language could be detected for this app.
このアプリではデフォルトの言語を検出できませんでした。

HINT: This occurs when Heroku cannot detect the buildpack to use for this application automatically.
ヒント: これは、Herokuがこのアプリケーションで使用するビルドパックを自動的に検出できない場合に発生します。

とのことです。

ビルドパックは使用するプログラミング言語(PHPやRuby等)に応じて、
実行する前にデプロイされたコードを変換する役割を果たします。
これらのビルドパックは、使用言語に基づいてデプロイされたリポジトリ内で検索されます。
しかし、HTML、CSS、JavaScriptでは検出されません。その為このようなエラーが出たということです。

解決策

index.php
<?phpheader('Location: /index.html');?>

上記画像のように
index.phpファイルを作り、中のコードも同じように記述することで解決しました。
スクリーンショット 2020-03-26 12.03.15.png

↑デプロイ完了後のHeroku画面

〜〜〜〜〜〜〜〜
以下解説します。

今回なぜPHPファイルを作成したのかというと、
WebサイトをPHPアプリとして認識させる為です。

index.phpファイル内の
header関数は、
HTTPヘッダを送信する機能を持っています。

header関数では、
Locationの後ろに
飛び先のファイル名やURLを記述することで
その記述した場所へ移動することが出来ます。

今回はindex.htmlのページに飛ばしたかったので
上記のように記述しました。

まとめ

話をまとめると

今回のエラーの原因は、
HTMLベースのサイトの為アプリ認識してくれなかったこと。
解決策は、
phpファイルを作りアプリ認識してもらえるようにすること。

最後に、
参考にさせていただいたサイトのURLを下記に紹介します。

[Herokuを使って簡単にウェブページをインターネットで公開する方法]
https://qiita.com/reoring/items/bca12aaa5f94b190a488

[単純なHTML/CSS/JSをHerokuにデプロイする時つまずいたこと]
https://qiita.com/hozukikancho/items/b8d475e67a147cd54453

[How to Run a Simple HTML/CSS/Javascript Application on Heroku]
https://medium.com/@winnieliang/how-to-run-a-simple-html-css-javascript-application-on-heroku-4e664c541b0b

[PHPのheader関数でリダイレクト処理を行う方法【初心者向け】]
https://techacademy.jp/magazine/11609

以上です。
最後までご覧くださり、ありがとうございました。


【css】【flexBox】【レスポンシブ】w100%で、3つ並べて、3つの間隔を均等にしたい

$
0
0

メモです

イメージ
スクリーンショット 2019-11-07 17.31.11.png
間隔を保ったまま、端と端を埋めつつ、3等分したい
↓↓↓↓↓↓
並べたい要素に(子要素に)

.item{margin:050px20px0;width:calc((100%-100px)/3);/*50px * 2 = 100px*/}.item:nth-child(3n){margin-right:0;}

その親要素に

.wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%;}

[CSS]フォントの太さをさらに太くする

$
0
0

[CSS]フォントの太さをさらに太くする

文字の太さは、CSSのfont-weightプロパティで変更することができます。
タイトルなどには、太字を使った方が強調されて、また、本文とのメリハリもつくので、全体的に整って見えます。

本記事では、font-weightプロパティ以外に、さらに文字を太くしてみたいと思います。
これは軽く思いついたネタなだけなので簡単に行きたいと思います。

方法

今回はtext-strokeプロパティを使います。text-strokeプロパティは文字の縁取りをするもので調べるとかなり縁取りの仕方などがサイトに載っています。
```
// HTML


Hello World.

// CSS
.container {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.text {
font-size: 2rem;
font-family: Arial;
font-weight: bold;
color: black;
-webkit-text-stroke: 2px black;
}
```
今回は文字と縁取りをあえて同じ色にすることによって文字を少し太くしています。あんまり変わらないかもしれないですし、すごく役に立つネタでもなんでもないですが、使い方として面白いかと思いました。以上です。

補足

こんなことだってできます。文字をただ縁取る以外の使い方も面白いですね。
スクリーンショット 2020-03-26 22.38.00.png

【wordpress】【css】【PHP】cssが更新されないor読み込まれない

$
0
0

メモです

CSSの読み込みはどこに書く?WordPress公式マニュアルに書かれている正しい手順。

以下、追加

functions.php
functionadd_css_js(){//関数名add_css_js()を作成//CSSの読み込みはここから//全てのページにstyle.cssを読み込みwp_enqueue_style('style',get_template_directory_uri().'/style.css','',date('YmdGi',filemtime(get_template_directory().'/style.css')),'');//全てのページにcss/store.cssを読み込みwp_enqueue_style('store',get_template_directory_uri().'/css/store.css');//固定ページスラッグcontact か 投稿ID46の記事 か カスタム投稿タイプadd_newsの記事 か カスタム投稿タイプadd_newsの一覧だった場合、css/store2.cssを読み込みif(is_page('contact')||is_single(46)||is_singular('add_news')||is_post_type_archive('add_news')){wp_enqueue_style('store2',get_template_directory_uri().'/css/store2.css');}//JavaScriptの読み込みはここから//全てのページにjs/pagetop.jsを読み込みwp_enqueue_script('pagetop',get_template_directory_uri().'/js/pagetop.js');//トップページのみif(is_home()){//js/main.jsをfooter直下で読み込み  wp_enqueue_script('main',get_template_directory_uri().'/js/main.js',array('jquery'),'',true);}}//関数名add_scripts()を表側で呼び出すadd_action('wp_enqueue_scripts','add_css_js);

初心者によるプログラミング学習ログ 274日目

$
0
0

100日チャレンジの274日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
274日目は、

【HTML】inputのボーダーに変なくぼみが...【CSS】

$
0
0

inputに予期せぬくぼみや影が付いてる💦

そんなあなたのブラウザは、GoogleChromeではないでしょうか?

こんな時は、

「-webkit-appearance:none;」

をCSSに書き込むのが定番です。

しかしながら、これでも解決しないこともあります。そんな時は、大人しく「border」を設定しましょう。

取り敢えず、これで解決します笑

画像を添付するとその画像を表示するプログラムの作成方法

$
0
0

今回は、画像を添付するとその添付画像を表示するプログラムの作成方法をまとめていきたいと思います。

今回制作するのは、以下のような機能です。

create_image_change.gif

事前準備

まず、以下のようにディレクトリーとファイルと適当な画像の入ったディレクトリー(この画像ではimage-changeという名前)を任意の場所に作成しておきます。

ツリー.png

HTMLの記述

index.html
<!DOCTYPE html><html><head><metacharset="utf-8"><script type="text/javascript"src="js/script.js"></script><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script><linkrel="stylesheet"type="text/css"href="css/layout.css"></head><body><outputid="output-image"></output><p>※画像を選択してください</p><br><inputtype="file"id="image-field"onchange="outputReadFile()"></body></html>

CSSの記述

layout.css
img{width:200px;}

Javascriptの記述

script.js
functionoutputReadFile(){varfile=event.target.files[0];// 添付ファイルのデータを変数fileに格納initializeFile();//初期化if(file){//ファイルが添付されている場合varoutputData=newFileReader;// FileReaderを作成outputData.readAsDataURL(file);// ファイルの読み込みoutputData.onload=outputFile();// ファイルの読み取りを終えたタイミングでoutputFile関数を実行functionoutputFile(){// 添付画像のhtmlを作成returnfunction(event){varimg=document.createElement('img');//img要素を生成img.src=event.target.result;//添付画像の場所を指定varoutputImage=document.getElementById('output-image');// outputタグのidを読み込みoutputImage.insertBefore(img,null);// outputタグの中に添付画像のimgタグを出力$('p').remove();// p要素の"※画像を選択してください"を削除};};}else{//ファイルが添付されていない場合varp=document.createElement('p');// p要素生成p.innerHTML="※画像を選択してください"// p要素の内容を追加varoutputImage=document.getElementById('output-image');//outputタグのidを取得outputImage.after(p);//outputタグの後にp要素を追加}functioninitializeFile(){varoutputImage=document.getElementById('output-image');//outputタグのidを取得outputImage.innerHTML='';//outputタグの中身を削除};};

最後に

HTMLとCSSを自分でカスタマイズすると、色々と(例えば、アプリ内のプロフィール画像の編集時や記事の投稿時などで)応用できるので便利です。
何か質問などあればコメントからどうぞ。

むずかしく考えない Atomic Design 〜リファクタリング的に実施してはいかが?〜

$
0
0

以下ページの転載になります。ご了承ください。

むずかしく考えない Atomic Design 〜リファクタリング的に実施してはいかが?〜 - Yuto Hongo Portfolio


[ひとことで言うと、こんな記事]

Atomic Designの思想を学ぼう。そして、現実のアーキテクトに落とし込むのは、共通化リファクタリングのように一歩ずつ無理なく頑張ろう!


[こんなひとにおすすめ]

  • Atomic Design の考え方の基礎を知りたい方
  • フロントエンドのマークアップやCSSの管理に悩んでいるが、理想と現実に苦しめられている方

私もフロントエンドは不得意な分野です。不得意だからこそ、無理せず勉強していこうと思いますの、よろしくお願いいたします。


[目次]

  • Atomic Designとは?
  • 既存システムを持っている方は無理しないで!アプローチを変えればただの共通化リファクタリングです!
  • 「Moleculesだ!」「Organismsだ!」とかは難しいので、チームで話し合う

Atomic Designとは?

公式ホームページがございますので、こちらを引用させていただきます。

引用 Atomic Desigh

Atomicと名が付いているだけあって、化学方程式のようなものにインスパイアされた考え方だそうです。

Introduce-atomic-design-as-refactoring-01

Atomic Designはデザインを考える際に、以下の5つのヒエラルキーからなるとしています。それぞれ解説していこうと思います。

  1. Atoms
  2. Molecules
  3. Organisms
  4. Templates
  5. Pages

Atoms

日本語で「原子」です。ページを構成する最小粒度の単位を示すそうです。以下のような例があります。

Introduce-atomic-design-as-refactoring-02

  • ラベル(h1,h2...)
  • ボタン(button)
  • インプット(input type="text"など)
  • ロゴ画像(img)

html標準で準備されているようなものの単位が多そうです。それぞれにデザインを当てることもあるので、イメージしやすいかと思います。

Molecules

日本語で「分子」ですね。「原子」が結びついて1つの「分子」になるように、意味のあるAtomsが複数あり、1つの役割になっているようなものを指すようです。以下のような例があります。

Introduce-atomic-design-as-refactoring-03

  • ブログカード <--[結合]-- 画像(Atoms) + ラベル(Atoms) + テキスト(Atoms)
  • 検索機能(Molecules) <--[結合]-- インプット(Atoms) + ボタン(Atoms)

1つの責任しか持たせないようなまとめ方がいいそうです。

Organisms

複数の Atoms / Molecules / 他のOrganisms で構成される比較的複雑なものだそうです。以下のような例があります。

Introduce-atomic-design-as-refactoring-04

  • サイドメニュー(Organisms) <--[結合]-- ボタン(Atoms) + ボタン(Atoms)...
  • ヘッダー(Organisms)<--[結合]-- ロゴ(Atoms)+ サイドメニュー(Organisms)

Templates

ページデザインを示すものだそうです。ここで気をつけなければいけないことは、ページ自体の内容の違いではなく、ページのデザイン構造のみを表現したものであるという点だそうです。以下のような例で表現できるでしょう。

Introduce-atomic-design-as-refactoring-05
- 一覧テンプレート(template)<--[結合]-- ヘッダー(Organisms)+ 一覧コンテンツ(Organisms) + フッター(Organisms)

Pages

ここはみなさんがイメージする「ページ」ってものと同じではないでしょうか?1つ1つのページ自体を指すようです。

Introduce-atomic-design-as-refactoring-06

  • TOPページ <- TOPテンプレート(Template)
  • 仕事ブログ一覧ページ <-- 一覧テンプレート(Template)
  • 仕事ブログ記事ページ <-- 記事テンプレート(Template)
  • プライベートブログ一覧ページ <-- 一覧テンプレート(Template)
  • プライベートブログ記事ページ <-- 記事テンプレート(Template)

Templateとしてデザインのみを分離しているので、内容の違うページでも同じテンプレートを利用することが可能なわけです。

既存システムを持っている方は無理しないで。アプローチを変えればただの共通化リファクタリングです!

Atomic Design(再掲)

Introduce-atomic-design-as-refactoring-01

アトミックデザインの基本思想はなんとなくわかりました。各単位でまとめていけば、デザイン関連のリソースの管理は楽になりそうですよね。

「よっしゃ〜!じゃ、利点しかないので速攻導入します!」

って急になりませんよね?(笑)

一気に既存サイト適応させていこうとすると、以下のデメリットがあると思います。

  • Atoms,Molecules,Organisms,Templatesの設計を全部詰め切る
  • 次回リリースまでに作られる、フォルダやファイルの変更が極大

のように、ほぼリニューアルとなるわけです。。。

すごく考え方はシンプルなのですが、Atomic Designの「解説」の順番と全く逆の順番で「開発」していきませんか? という提案です。

例1. 共通のデザインのPageをTemplateに共通化する

Introduce-atomic-design-as-refactoring-07

  • 仕事ブログ一覧Page 
  • プライベートブログ一覧Page 

デザインが一緒なので、ブログ一覧Templateを新規作成する。

そして、無理なく1つ共通化したらデプロイ!

例2. 共通のパーツを持った複数TemplateからOrganismを共通化する

例1と同じようにブログ記事テンプレートのようなものを作成したとする

AtomicDesign.009

共通している部分として、ヘッダーOrganismなどを共通化する。

そして、無理なく1つ共通化したらデプロイ!

既存サイトにAtomic Designを適応していくイメージ図

Introduce-atomic-design-as-refactoring-09

広さ(ページの種類)と深さ(Atomic Designのヒエラルキー)両軸で少しづつ共通化と横展開をしていくのが良いかと。

そうすれば1個の共通化や1個の横展開にて、デリバリーが可能。無理なくエンハンスすることが可能なわけです。

「Moleculesだ!」「Organismsだ!」とかは難しいので、チームで話し合う

Atomic Designの公式にもあるのですが、結構以下の点は論点になりやすい部分だと思います。

Moleculesに関して

  • 「単一機能」とは、どの範囲でもって「単一機能」とするか

Organismsに関して

  • Organismsは他のOrganismsを含むことが可能であるので、Organisms内になにか階層が生まれる

上記問題を解決するために、新たなカテゴリ分けをつくるなども解決策としてあるでしょう。

いずれにせよチームで話し合ってください。みんなの共通認識が大事です。


こんな本を読みながら、デザイン管理を勉強中です。
CSS設計完全ガイド ~詳細解説+実践的モジュール集


最後までお読みいただき、誠にありがとうございます。様々なことを学んでいきたいと思っていますので、アドバイス等いただけると幸いです。


初心者によるプログラミング学習ログ 275日目

$
0
0

100日チャレンジの275日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
275日目は、

PHPでポートフォリオ作成:カレンダー

$
0
0

記事の概要

作った背景、工夫したところ、機能をまとめました。

下にコードを記載しました。

背景

一般的なカレンダー(家の壁にかかっているものを想像してほしいです)を作成したときに、自分のスケジュールを書き込めると、カレンダーとしての価値がアップするのでないかなと思い作成にいたりました。

エクセルのようなレイアウトで日付とスケジュールを同時に表示するようなカレンダーを作成します。

工夫としては、当たり前ですが見た目を分かりやすく、使用者が使いやすいようにシンプルにしました。

目的

・PHPを用いて簡単なアプリケーションを作る
・見やすくて使いやすいアプリを作る
・カレンダー機能+スケジュール機能で単純なカレンダーに価値をつける

スペック

言語
PHP 7.4.2
データーベース
MariaDB 10.4.11
開発環境
Apache 2.4.41

ビジュアルスタジオコード使用

主な機能

・今月の日付の表示機能
・来月、前月のカレンダーへのリンク
リンクをクリックすると、来月もしくわ前月のカレンダーに飛びます

・スケジュールの表示機能
カレンダーの日付の横にスケジュールの時間と内容を表示する

・スケジュールの保存機能
日付、時間、スケジュールという情報をデータベースに保存する

・スケジュールの更新機能
スケジュールを更新する

・スケジュールの削除機能
スケジュールを削除する

※データベースのカラムの情報があると説明しやすいので、詳しくは下部で説明します。

開発手順

1、要件定義
2、環境選定
3、データベース設計
4、設計
5、コーディング

1、要件定義

今回のアプリでの主要な機能は
・今月の日付の表示
・スケジュールの表示
・スケジュールの保存、更新、削除

今月の日付が表示できるということは、月(month)の部分を変更することで来月、前月のカレンダーが表示可能になります。
ということは、すべての日付のカレンダーが作成可能になります。

スケジュールの保存には、データベースが必要です。

環境選定

PHP,MySQL,apacheを使用。

Windowsローカル上に環境を構築しました。

データベース設計

記入例

iddaytime  message  
52018-12-1518:00予定を書く

スケジュールの情報をデータベースに保存。
スケジュールの情報としては
id,day,time,messageとして
idにはオートインクリメントを設定して、idの値がかぶることはないようにしました。
dayには2020-03-27の形式で年月日を保存
timeにはtextタイプなので時間の表現の仕方は自由です
messageにはスケジュールの内容を保存します

設計

のちほど追加予定

 5.コーディング

設計を書いたのですが、後々変更することは多かったです。
理由は、コーディングしていて「このように表示する方が使用者にとっては、使いやすいのではないか」という考えの結果、レイアウトの変更をしました。

5.1データベース作成

ローカル環境のMysqlサーバーに
データーベースを作成。テーブルを作成。

5.2データベース接続確認

PDOを用いて、データーベースの接続。
try~catchを用いて、成功しているか判断

5.3今月の日付の表示機能

GIF 2020-03-28 8-39-33.gif

urlに?t=2020-04のような表記があれば、その年月(この場合2020-03)で取得し、表記がなければ今月の年月を取得する
これで、年月日の年月の情報を取得したので、年月の情報からDatePeriodを使って、年月日における日の部分の情報を取得します。
これで年月日の情報がそろったのでエクセルや表のような形式で表現します

5.4・来月、前月のカレンダーへのリンク

リンクをクリックすると、来月もしくわ前月のカレンダーに飛びます

GIF 2020-03-28 8-42-58.gif

5.3にて年月日の情報を取得しています。なのでリンクをその月(month)に+1すれば翌月、-1すれば前月へ飛ぶように設定しました。

5.5スケジュールの表示機能

カレンダーの日付の横にスケジュールの時間と内容を表示する

if文で取得している年月日とデータベースにあるdayの部分で一致するレコード(行部分)が存在したら、そのレコードのスケジュール時間と内容を日付の横に表示する

5.6スケジュールの保存機能

日付、時間、スケジュールという情報をデータベースに保存する
この時、日付の形式が2020-03-27のような形式でない場合はerrorとし
errorが存在する場合はエラーメッセージを表示する

GIF 2020-03-28 8-48-45.gif

5.7スケジュールの更新機能

スケジュールを更新する

GIF 2020-03-28 8-53-15.gif

構造上、日付1つに対して1つのメッセージになるため、
更新機能を使う場合、既存のスケジュールの情報を削除してから、また新しくスケジュールをデータベースに保存する方法を使用

※1つの日付に対して、複数のメッセージがある場合はidが新しいメッセージが表示される。
※また、ある日付に対してメッセージが存在するにも関わらず、メッセージを作成した場合は、メッセージは既存のメッセージが表示されるので、新しく作ったmemberテーブルは表示されない

5.8スケジュールの削除機能

スケジュールを削除する

削除ボタンを作って、削除を実行する
この時、日付に該当する箇所を変更した場合、その日付のメッセージが削除される。

5.9レイアウト

新しくスケジュールを作る機能はアイコンにして、右上に固定しました。
これは、下にスクロールしたとしても、スケジュール作成できるためです
配色の統一、シンプルにわかりやすいをこころがけました

課題点

・「1つの日付に対して、1つのスケジュール」でなく複数のスケジュールを表示すべきだが、技術的にできなかった。
・わかりやすく,シンプルに作ったつもりであるが、その分、説明不足で慣れれ宇までに時間がかかる可能性がある
・スケジュールの保存に関して、使用者の制約があり親切でない、
1999-03-20のような形式でなくタイプをradio形式(複数の選択肢から1つを選択する形式)で年、月、日に分けて表現すれば良かったかもしれない。
・スケジュールの削除に関して、入力されている年月日のデータの削除があることを説明していない
・オブジェクト思考がなってない。機能を別ファイルでプログラミングして、呼び出すことができてない

code

index.php
画像

index.php
<?phprequire('dbconnect.php');//セキュリティ対策functionh($s){returnhtmlspecialchars($s,ENT_QUOTES,'UTF-8');}////今月を取得するtry{if(!isset($_GET['t'])||!preg_match('/\A\d{4}-\d{2}\Z/',$_GET['t'])){thrownewException();}$thisMonth=newDateTime($_GET['t']);}catch(Exception$e){$thisMonth=newDateTime('first day of this month');}//今月から来月と翌月を取得する$dt=clone$thisMonth;$prev=$dt->modify('-1 month')->format('Y-m');$dt=clone$thisMonth;$next=$dt->modify('+1 month')->format('Y-m');//$yearMonth=$thisMonth->format('F Y');//日付、メッセージの表示機能$period=newDatePeriod(newDateTime('first day of'.$yearMonth),newDateInterval('P1D'),newDateTime('first day of'.$yearMonth.'+1 month'));//複数のメッセージをつけたいがつけれなかった$body='';$today=newDateTime('today');foreach($periodas$day){$messages=$db->prepare('SELECT * FROM posts WHERE day=?');$messages->execute(array($day->format('Y-m-d')));$message=$messages->fetch();$todayClass=($day->format('Y-m-d')===$today->format('Y-m-d'))?'today':'';$body.=sprintf('<tr><td class="youbi_%d %s">%d</td><td>%s</td><td class="message"><a   href="message.php?t=%d-%02d-%2d">%s</a></td></tr>',$day->format('w'),$todayClass,$day->format('j'),$message['time'],$day->format('Y'),$day->format('n'),$day->format('d'),$message['message']);}////cssでのレイアウト//オブジェクト思考//終了。前月次月のリンク.todayのリンク,データベースに保存する//今日を太文字、土日は色変える,時間の指定もあり、消去、変更?><!DOCTYPEhtml><htmllang='ja'><head><metacharset='utf-8'><title>カレンダー</title> 
  <link rel='stylesheet' href='styles.css'>
</head><body><aclass='write'href="message.php"name='write_message'><imgsrc="write.png"alt="写真"></a>
    <table>
      <thead>
        <tr>
          <th><a href="/test/index.php?t=<?phpechoh($prev);?>">&laquo;</a></th>
          <th><?php echo $yearMonth; ?></th>
          <th><a href="/test/index.php?t=<?phpechoh($next);?>">&raquo;</a></th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>day</td>
          <td>time</td>
          <td>message</td>
        </tr>   
        <?php echo $body;?>
      </tbody>
    </table>
  </body>
</html>

message.php
画像

message.php
<?phprequire('dbconnect.php');//入力機能は取得して、それをインサートするだけif(!empty($_POST)){//すでにメッセージが存在する場合、そのメッセージを消去する//先に消去をおした場合にはメッセージを消去してexitするif($_POST['delete']==='1'){$deletes=$db->prepare('DELETE FROM posts WHERE day=? ');$deletes->execute(array($_POST['day']));header('Location:index.php');exit();}if(!empty($_POST)){$posts=$db->prepare('SELECT * FROM posts WHERE day=?');$posts->execute(array($_POST['day']));$post=$posts->fetch();if(!empty($post['message'])){$deletes=$db->prepare('DELETE FROM posts WHERE day=? ');$deletes->execute(array($_POST['day']));}//日付の設定はシビアで形式が決まっているので、形式が違えばエラーをだすif(preg_match('/\A\d{4}-\d{2}-\d{2}\z/',$_POST['day'])){$message=$db->prepare('INSERT INTO posts SET day=? ,message=?,time=?');$message->execute(array($_POST['day'],$_POST['message'],$_POST['time']));header('Location:index.php');exit();}else{$error['day']='format';}}}//messageの再取得、$messages=$db->prepare('SELECT * FROM posts WHERE day=?');$messages->execute(array($_REQUEST['t']));$message=$messages->fetch();?><!DOCTYPEhtml><htmllang='ja'><head><metacharset='utf-8'><title>カレンダー</title> 
  <link rel='stylesheet' href='styles.css'>
</head><body><divclass='title'><ahref="index.php"><< ホーム</a>
    </div><divclass='content'><formaction=""method='post'><pclass='delete_p'>メッセージを消去>><buttontype='subimt'class='delete'name='delete'value='1'>消去</button></p><p>日付 (※2020-01-01の形式で入力してください)</p>
        <input name='day' type="text" value="<?php echo $_REQUEST['t'];?>" >
        <?php if($error['day'] === 'format'): ?>
          <p class='error'>※2020-01-01の形式で入力してください。</p><?phpendif;?><p>時間</p> 
          <input name='time' type="text" value='<?php echo $message['time'] ?>'>
          <p>メッセージ</p><textareaname="message"id=""cols="30"rows="10"><?phpecho$message['message'];?></textarea>
          <button type='submit'>メッセージを保存する</button></div>
  </form></body>
</html>

Bootstrap縛りで制作するポートフォリオ #1

$
0
0

今回は、この時期にあるといいポートフォリを制作していきます。その際、普通に使うのでは面白くないので、Bootstrapを導入して実装するという縛りで実装していきます。

本来ポートフォリオにはフレームワークなどをどんどん取り入れてくのは良くないと個人的には思います。というのも自身のコードでないとその実力ははかりえないので。。。ということで今回はポートフォリオの簡単な作成の流れとBootstrapの簡単な使い方を紹介することを意図しています。

はじめに

まずは、簡単なレイアウトを決めていきます
このポートフォリオは、誰も依頼したわけでも〜な機能を必要ともされていません。それ故に、自分で決めなければいけません。ではどこで判断基準になるのでしょうか? 

UXが全て

実際にそのサイトをみてどの様に印象を持たせるかが、このポートフォリオで一番大切な点です。
~の機能がないとかは判断されませんが、ある程度の機能があった方がその評価は高くなります。

レスポンシブデザインは行なっているか

今の時代、サイトにアクセスするユーザの大半がスマートフォンからのアクセスです。つまりそのサイトにアクセスする人もPCではなく、画面表示領域の少ないスマートフォンであるかもしれません。
どんなに、hoverされた時のデザインにこだわっていてもスマホではその効果は発揮できないと言っても過言ではありません。
いくら見た目にこだわった、タブメニューを実装してもスマホで押しやすくなければ意味の無いということです。

ブレイクポイントについて

それでは、モバイルデザインを行う上で、必要となってくるメディアクエリ
ブレイクポイントを指定することにより、どの画面表示領域からそのデザインを行うかを指定することができます。
Bootstrapの場合は、デフォルトで4つのブレイクポイントが指定されています。

画面横幅class名
576px768px以下(スマホ)col-xs-
768px以上992px未満cos-sm-
992px以上、1200px未満col-md-
1200px以上col-lg-

この768pxというブレイクポイントに関してはiPad(横画面)の画面表示領域を表しています。最近のiPadではある程度画面表示領域も多くてスマホと同じスタイリングを行うべきでは無いと思います。

自前で実装する場合はここまでなくても良いかと思います。
smallスクリーンとmidiumスクリーンの二つで今回は実装していきます。

それでは、ある程度決め終わったので次回から作成していきます。

ヘッダーを途中から固定させたい!

$
0
0

概要

ポートフォリオサイト作成時、
スクロールしてヘッダーを途中から固定させたいと思い実装していたのですが、
なかなか上手くいかなかったので備忘録としてまとめます。

おかしなところあったらご指摘ください・・・

条件

ビューはHamlで記載
jQuery導入済み

Html

スクロールしてtop-visualを過ぎた後にheaderが固定されるイメージです。

index.html.haml
.top.top-visual.top-visual__movie-area=image_tag"top-image".header.header__line.header__nav-bar.header__container.header__title
            My portfolio
          .header__nav-area%ul.header__nav-lists%li.header__nav-item=link_to"HOME","#"%li.header__nav-item=link_to"ABOUT","#"%li.header__nav-item=link_to"WORKS","#"%li.header__nav-item=link_to"SERVISE","#"%li.header__nav-item=link_to"CONTACT","#".main.main-content

CSS

index.scss
.fixed{// 本来であれば「position: fixed」の「!important」は不要です。// 上手く固定されないときは試してみてください。position:fixed!important;top:0;left:0;z-index:2;width:100%;color:#fff;margin-bottom:100px;background-color:#1A1A1A;}.header{// position: absoluteを指定しないと固定させるときにガクンとビューが崩れます。position:absolute;height:50px;width:100%;}

jQuery

index.js
$(function(){var$win=$(window),$main=$('main'),$nav=$('header'),navHeight=$nav.outerHeight(),navPos=$nav.offset().top,fixedClass='fixed';$win.on('load scroll',function(){varvalue=$(this).scrollTop();if(value>navPos){$nav.addClass(fixedClass);$main.css('margin-top',navHeight);}else{$nav.removeClass(fixedClass);$main.css('margin-top','0');}});});

完成

Image from Gyazo

CSSとJSは奥が深い・・・!引き続き精進してまいります・・・!

指定したエリアだけを印刷する処理

$
0
0

こんな場面で使えます。

 例えば、ユーザーに何らかのアンケートに回答をしてもらうサイトで
ユーザーが自分の回答結果の部分だけを印刷したい場合などに使えます。
普通の印刷では余計な箇所も入ってくるので、必要なエリアだけを印刷できるようにします。
※実際の挙動が確認できるwebアプリのURLを一番下に載せてますので、そちらもご確認ください。
11printImg1.jpg

実装の流れ

 1:印刷ボタンを作成
 2:プリントしたいエリアの取得の指定
 3:2のエリア全体のコピーを作成
 4:3以外を非表示にする処理を作成
 5:印刷ダイアログの呼び出し➡︎印刷する
 6:3で作成した印刷用エリアを削除 ・ 4で非表示にした要素を表示する

実装スタート

1:印刷ボタンを作成

print.html
<buttonclass="print-btn"> <span>結果だけを印刷する</span></button>

2:プリントしたいエリアの取得

 プリントしたい範囲を以下の「divタグ」で囲む。

print.html
<divclass="print-area"> <!-- この中に要素を入れる。印刷しないものは、後で非表示にする処理で消します。 --></div>

3:2のエリア全体のコピーを作成

 1:プリントしたい範囲を取得
 2:プリント用の要素「#print」を作成。
 3:2の子要素に1を入れる。

print.js
$(function(){//個別印刷ボタンをクリックした時$('.print-btn').on('click',function(){//プリントしたいエリアの取得varprintArea=document.getElementsByClassName("print-area");//プリント用の要素「#print」を作成し、上で取得したprintAreaをその子要素に入れる。$('body').append('<div id="print" class="printBc"></div>');$(printArea).clone().appendTo('#print');//この下に、以降の処理が入ります。});});

4:3以外を非表示にする処理を作成

print.js
//プリントしたいエリア意外に、非表示のcssが付与されたclassを追加$('body > :not(#print)').addClass('print-off');
print.css
.print-off{ display:none;}

5:印刷ダイアログの呼び出し➡︎印刷する

print.js
window.print();

6:3で作成した印刷用エリアを削除 ・ 4で非表示にした要素を表示して終了です。

print.js
//window.print()の実行後、作成した「#print」と、非表示用のclass「print-off」を削除$('#print').remove();$('.print-off').removeClass('print-off');

終わりに。

いかがでしょうか。
印刷したいエリアだけを取り出せるのでユーザーにとって不要なエリアが無くなり使い勝手の良いページが作成できると思います。
自作の家庭用備蓄をチェックできるアプリでも、チェックした備蓄情報を印刷できるようにしてありますので
良かったら作業の合間にそちらを見ていただけると具体的な挙動を確認していただけます。
https://saku2stockcheck.herokuapp.com/

では、最後まで見ていただいてありがとうございました!

Bootstrapの画面分割

$
0
0

Bootstrapの基本

html.
<html>
<div class="container">
  <div class="row">
    <div class="col-サイズ-割合">
  </div>
</div>
</html>

containerの中にrow、rowの中にcolを入れていく。
div class="col-サイズ-割合"
サイズ表:

xssmmdlg
~767px768~911px912~1119px1120px~
スマホタブレットPCPC大画面

割合:
画面を12分割し、割合を決めることで画面を分けることが簡単にできる。

例1:
col-lg-4
col-lg-4
col-lg-4
これらは横並びに3列均等に分割できる。

flexで孫要素の高さを揃える


【CSS & JS】超簡単。ハンバーガーアイコンをクリックして×に変える&メニューをスライドアウトさせる方法

$
0
0

備忘録です。

ハンバーガーメニューをクリックすると、×印に変えるのってどうやるんだろう〜CSSでつくる方法もあるらしいけど、どうやるんだろう。密かにずっと気になっていたので調べてみました。

JavaScriptも使いますが、決してややこしいことはしなくていい方法を見つけました。

ここでは二つのことをします。
❶ハンバーガーにクリックすることで×印に変える
❷メニューを画面の右側からスライドアウトさせる

まずはHTMLから。

HTML

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="stylesheet" href="css/styles.css" />
    <script
      src="https://code.jquery.com/jquery-3.4.1.min.js"
      integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
      crossorigin="anonymous"
    ></script>
    <title>Slide Out Menu</title>
  </head>
  <body>
    <header>
      <nav>
        <div class="burger-menu-icon">//①ハンバーガーのdivをつくる
          <input type="checkbox" id="burger" />//②Toggleするためにはcheckboxを書く!ここがカギ!
          <label for="burger">//③label forはinputのidとそろえる。
            <div class="burger-icon">
              <span></span>
              <span></span>
              <span></span>
            </div>//④labelのなかにハンバーガーアイコンを入れましょう。
          </label>
          <div class="slideoutMenu">//⑤スライドアウトさせるメニューは、burger-menu-iconのdiv内におさめます。
            <div class="opacity"></div>
            <div class="menu">
              <ul>
                <li><a href="#">Home</a></li>
                <li><a href="#">About</a></li>
                <li><a href="#">Contact</a></li>
                <li><a href="#">Design</a></li>
                <li><a href="#">Style</a></li>
                <li><a href="#">Reviews</a></li>
              </ul>
            </div>
          </div>
        </div>
      </nav>
    </header>
    <script src="script.js"></script>
  </body>
</html>

ポイント❶

toggleするにはinput type="checkbox"を使う

ポイント❷

今回はハンバーガーアイコンをクリックすることで、メニューを引っ張り出したいです。なのでハンバーガーアイコンは、<label for="burger"></label>のなかに入れましょう。通常であればcheckboxをチェックしなければ、checkboxにチェックはつきませんが、label forというものを付け加えると、label forの中身をクリックするだけでcheckboxにcheckがつけられます。ただし一点。label for="burger"と、input id="burger"labelをinputと紐づけるには、この二つをそろえる必要があります。inputは必ずidで指定します。

ポイント❸

ハンバーガーアイコンと隠しているメニューは、同じdiv内に入れる。(この場合は.burger-menu-icon

SCSS

.burger-icon {
  display: block;
  z-index: 11;
}

.burger-icon span { //ここでburger-iconをつくる
  display: block;
  background: #000; //background-colorではなく、backgroundで指定
  width: 50px;
  height: 5px;
  margin-bottom: 10px;
  margin-left: 90%;
  cursor: pointer;
  position: relative;
  top: 0;
}

input#burger { //labelここでcheckboxを消す
  display: none;
}

.burger-icon.open span:nth-child(2) { //クリックすると'open'というクラスがtoggleされるよう、JSに記述しています。つまり、これはハンバーガーをクリックするとハンバーガーの2本目の線が消えるという記述です。
  width: 0;
  opacity: 0;
}

.burger-icon.open span:nth-child(1) { //これはハンバーガーをクリックするとハンバーガーの1本目の線が45度回転し、上から15px下方向にずらすという記述です。
  transform: rotate(45deg);
  top: 15px;
}

.burger-icon.open span:nth-child(3) {//これはハンバーガーをクリックするとハンバーガーの3本目の線が-45度回転し、15px上方向にずらすという記述です。
  transform: rotate(-45deg);
  top: -15px;
}

.slideoutMenu {
  transform: translateX(100%); //メニューを右に100%ずらすことで、画面から消す。
  z-index: -1;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: flex;
  transition: 0.3s;
  animation: slideOut 0.3s;
  .opacity,
  .menu {
    width: 50%;
    background-color: #5d348c;
    ul {
      list-style: none;
      li {
        padding-bottom: 3rem;
      }
      li a {
        text-decoration: none;
        font-size: 3rem;
        color: #ea5c5d;
        text-transform: uppercase;
      }
    }
  }
  .opacity {
    background-color: #ea5c5d;
    opacity: 0.7;
  }
}

@keyframes slideOut { //ここでスライドの動作をつくります。(slideIn、のほうがふさわしかったかも T_T )
  0% {
    transform: translateX(100%);
  }
  50% {
    transform: translatex(50%);
  }
  50% {
    transform: translatex(0%);
  }
}

input:checked ~ .slideoutMenu { //これがツワモノ!!!詳細は【覚えておきたいポイント3】で。
  transform: translateX(0%);
}

覚えておきたいポイント❶

<input>タグのあとに<label for="burger">を付け足しておけば、labelタグ内の要素をクリックすることでcheckboxをチェックできるようになります。

覚えたいおきたいポイント❷

.burger-icon.open span:nth-child(3), .burger-icon.open span:nth-child(1)ではハンバーガーの上の線と下の線を回転させ、top:〜で位置をずらしています。topの位置をずらすには、.burger-icon spanposition: relative; top: 0;と書かないと効かないので注意です。

覚えたいおきたいポイント❸

最後にあるinput:checked ~ .slideoutMenuを書くことで、メニューが右側から画面にスライドインしてくれます。
input:checkedは、「チェックボックスがcheckされていたら……」という意味です。~は、兄弟要素を取得したいよ〜という意味合いを持つ記号です。input.slideoutMenuはどちらともburger-menu-iconの子要素なので、兄弟要素に値します。~がないと効かないので注意です。

JS

$(".burger-icon").click(function() {
  $(this).toggleClass("open");
});

JSではシンプルに、「.burger-iconのクリックで、openというclassをtoggleしてね」と伝えているだけです。

やりかたは何通りもあると思うのですが、個人的にはこれが一番わかりやすいかなと感じました。こんなに簡単に実装できるとは!animationがわかると、CSSは一層おもしろみが増す気がしました。

完成版のgif👇
Screen Recording 2020-03-29 at 04.31 PM.gif

CSSのプロパティを自動で並べ替える方法

$
0
0

複数人で開発をしていると

  • marginとpaddingってどちらを先に書けば良いだろう?
  • position指定ってtop -> right -> bottom -> leftの順が良いのかな?

などの話が出ることはありませんか?

自分は結構質問されるのですが、個人的にはカスケーディングがスタイルに影響を与えない場面ではどんな順番でも良いと思っています。

しかし、ルールがあればミスが減り、レビューがしやすくなるのも事実。

というわけで自動でプロパティの並び順を変更できる設定を作っていきましょう。

Prettierのインストール

yarn add prettier -D

まず初めにPrettierをインストールします。
Prettierはコードフォーマッターで、予め指定したルールに沿ってコードを整形してくれます。

stylelintのインストール

yarn add stylelint -D

次にstylelintをインストールします。
stylelintはリンターで、CSSやSCSSなどのエラー回避や書式の統一に役立ちます。

stylelint-config-prettierのインストールと設定

yarn add stylelint-config-prettier -D
.stylelintrc
{"extends":["stylelint-config-prettier"]}

stylelint-config-prettierはPrettierと競合するルールをオフにしてくれます。
ルールが競合するとお互いがお互いをエラー/書式のミスとして認識しておかしなことになってしまうためインストールが必要です。

stylelint-prettierのインストールと設定

yarn add stylelint-prettier -D
.stylelintrc
{"extends":["stylelint-config-prettier"],"plugins":["stylelint-prettier"],"rules":{"prettier/prettier":true}}

stylelint-prettierはPrettierをstylelintのルールとして実行し、エラーを教えてくれたり修正したりに使います。
.stylelintrcの中でプラグインの有効化とルールの追加をします。

なお、stylelint-prettierをインストールしたからとPrettierやstylelintが自動でインストールされるわけではありません。
そのため前の項で手動でインストールを行っています。

また、上記の.stylelintrcは実は次のように短く書けます。

.stylelintrc
{"extends":["stylelint-prettier/recommended"]}

stylelint-prettier/recommended

  1. stylelint-config-prettierをextend
  2. stylelint-prettierプラグインを有効化
  3. prettier/prettierルールを有効化

してくれるためです。

stylelint-orderのインストールと設定

yarn add stylelint-order -D
.stylelintrc
{"extends":["stylelint-prettier/recommended"],"plugins":["stylelint-order"],"rules":{"order/properties-alphabetical-order":true}}

stylelint-orderはその名の通りプロパティの並び順ルールについてのパッケージです。
並び順は色々なルールがあるようですが、自分は一番明快だろうとアルファベット順を選択しました。

準備完了、あとはコマンドを叩くだけ

yarn run stylelint '**/*.css' --fix

上記のようなコマンドを叩くとCSSの並び順を修正してくれます。
'**/*.css'の部分はこの書き方だと全てのCSSファイルへの修正が走りますが、具体的に'src/style/somepage.css'のようにしてもOKです。

補足

実際にstylelintを使う場面ではほぼ間違いなくstylelint-config-standardなど土台となるルールセットも一緒に使うと思いますが今回は割愛しています。

リンク一覧

Sassでfor文を使ったページローダーのようなものを作る方法

$
0
0

はじめに

Sass記法にはなんとfor文も存在するということで、どういう使い方をするのか一例としてページローダーのようなものをCSSで表現してみたいと思います。
Sassでは他にもif文なんかも使えます。

Sassと言ってますが、基本的にはscss記法で書いていきます。そちらの方が個人的には見やすいので。

この記事ではSassについての詳しい解説は行いません。

ちなみに

SassMeisterというサイトで、CSSにコンパイルされた記述も同時に見ながらコードを書くことができるので、サクッと書いてみたい場合はこちらが便利です。
スクリーンショット 2020-03-29 16.56.52.png
左のSassのスペースにSassまたはscss記法で書いていくと、CSSのスペースに表示されます。

Sassのfor文の記載方法

基本的な書き方

scss
@for$ifrom1through5{nth-child(#{$i}){animation-delay:-0.3s/$i;}}

@forでfor文の宣言をし、$iで可変する数字部分の変数宣言を行います。ここまでは一般的なfor文とほぼ変わりません。
from 1through 5で1〜5までをループするという意味になります。
で、そのnth-child()のカッコ内に変数宣言をした$iを入れてあげます。
セレクター内や、文字列内に変数を使う場合#{}で変数を囲む必要があります。
プロパティの値にその変数を使用する場合はそのまま使えます。

scss
@for$ifrom1to5{nth-child(#{$i}){animation-delay:-0.3s/$i;}}

ちなみにfrom 1to 5という書き方をすることもでき、こちらは5を抜いた1〜4までという意味になります。

ページローダーっぽいやつの作り方

Sassのfor文と、animationプロパティを用いて作っていきます。

さっそくですが、こんな感じのやつです。

See the Pen oNXJRPr by fumu (@fumu238) on CodePen.

以下、簡単な解説。

html
<divclass="three-dot"><div></div><div></div><div></div><div></div></div>

htmlは特になんてことないですね。ローダー部分の要素となるdivを4つ作り、親要素の中に入れておきます。

scss
.three-dot{text-align:center;&div{display:inline-block;width:18px;height:18px;background-color:black;border-radius:50%;animation-name:delay;animation-duration:1.4s;animation-iteration-count:infinite;}}

まず4つの子要素をdisplay:inline-blockで横並びにし、黒い●状にします。
これにあとは動きをつけるために

scss
@keyframesdelay{0%{transform:scale(0);}40%{transform:scale(1);}80%{transform:scale(0);}100%{transform:scale(0);}}

@keyframesを使用して指定をしていきます。0%〜100%までの中でどような変化をするか%を指定して細かく指定できます。
ここではtransform:scale()を用いて0%~40%で開いて、あとは閉じる。みたいな動きにします。

animation-name@keyframesの名前を指定し、animatino-durationで何秒かけてその動作を行うか指定し、animation-iteration-count: infinite;でそれを無限に行うように指定します。

See the Pen eYNbwvX by fumu (@fumu238) on CodePen.

そうすると、この段階では4つの●が同時にちっちゃくなったり大きくなったりします。
ここでfor文の出番です。

scss
.three-dot{text-align:center;&div{display:inline-block;width:18px;height:18px;background-color:black;border-radius:50%;animation-name:delay;animation-duration:1.4s;animation-iteration-count:infinite;@for$ifrom1through3{&:nth-child(#{$i}){animation-delay:-0.4s+$i*0.1;}}}}

子要素のdivのn番目にそれぞれCSSを追加するための:nth-childでfor文を作ります。
今回は4つdivがあるので、その1〜3つめにanimation-delayをマイナスの値で設定します。マイナスでdelayを設定すると、delayせずむしろ早く変化を始めることになります。
そしてその設定した値を変数を使って計算すると

ループの1回目は-0.4s + 1 * 0.1 = -0.3s
ループの2回目は-0.4s + 2 * 0.1 = -0.2s ...

となり、数が増えるたびに値が変わっていくことになります。

CSSにコンパイルされるとこう。

css
nth-child(1){animation-delay:-0.3s;}nth-child(2){animation-delay:-0.2s;}nth-child(3){animation-delay:-0.1s;}

これで0.1秒ごとに変化をつけることができるようになり、見本のような動きになります。

ちなみに。for文の中で計算を行いましたが、Sassで四則演算を行うときには単位を気にせず計算することができます。
pxなんかも単位をつけたまま計算することができるので、余計な事を考えなくて済みますね。

おわりに

以上、Saasでfor文を使ったページローダーっぽいものの作り方でした。
他にもtransformを使って回転させたり、丸ではなく四角で作ったり、要素を重ねたりと、いろんなパターンが作れそうです。

そのjs、cssで代用できませんか?(件数通知バッジ編)

$
0
0

webアプリケーションエンジニアからフロントエンドエンジニアになって約一年やってきた中で、
どうしたらjsを書く量を減らせるか?みたいな状況を解決した時のtips

why 件数通知バッジ

皆さん通知バッジ作ってますか?僕は作りました。
脳筋コードで書いたら意外とめんどくさいんですよねあいつ。

  • 数字が変わるとなると、疑似要素でやるのがめんどくさいので<span>とかで作りがち
  • 0件になったら消さなきゃいけない

とかやってるとjsがとても汚くなって悲しくなったので、いい感じにcss交えて書くといい感じになったよっていうお話です。

コード

See the Pen 通知バッジ by さむとる (@sumtrue) on CodePen.

jsはdata-numを++/--するだけで済んでるので、とても綺麗で読みやすいコードになりました

tips

attr()

https://developer.mozilla.org/ja/docs/Web/CSS/attr
htmlに付与された属性を取得できる関数。
今回はこれを使うことでjsとhtmlの繋ぎこみをしている。

まだ使ったことはないが型指定とか代替値も指定できる便利屋さん。
要素によって少しだけ変わることがある、みたいなのを実現もできる。

属性セレクター

https://developer.mozilla.org/ja/docs/Web/CSS/Attribute_selectors
htmlに付与された属性でcssをあてることのできるセレクター。
今回は0件のときにバッジを非表示にする際に使用。

その他オススメの使い方としてはこれ。


img:not([alt])でaltが指定されていない画像を見つけられるというやつ

この記事を書いた理由的な

「ぶっちゃけjs書けばなんでもできるじゃん」論者だったんですが、CSS組み合わせることでコードの可読性がめっちゃあがります。
「普段あまりcssはほとんど書かないけどjsは時々書く」「jsは基本書かないけどcssは結構書くよ」みたいな人たちに、
それぞれで何ができるかを知ってもらい、世の中のコードが綺麗になったらいいなと思った次第。

初心者によるプログラミング学習ログ 276日目

$
0
0

100日チャレンジの276日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
276日目は、

Viewing all 8773 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>