投稿日:2021年1月2日
前回のCSS 禁則処理シミュレーター に引き続き、あったら便利そうなボタン作成シミュレーターを、HTML、CSS、JavaScriptで作ってみました。
▲こんな感じのボタン。
.myBtn{
background-color:#f00;
padding:0.25em;
text-align:center;
border-radius:10px;
box-shadow:2px 2px 3px #ccc;
color:#fff;
width:5em;
cursor:pointer;
}
▲毎回、CSS書くの面倒ですよね。
コピペでいいじゃん ! と思うかも知れませんが、勉強のため作ってみました。
『テキスト』と書かれている箇所のテキストは任意入力できます。
widthは、入力した文字数+1になり、単位はemになります。
例:4文字だったら5em。
それぞれのプロパティを変更すると見た目と、右(レスポンシブ時は下)のCSSがダイレクトに変更します。
padding
とborder-radius
は単位の切り替えが可能です。
box-shadow
の単位はpx
のみにしてあります。
バリデートは厳密にしてないので、数値の箇所に数値以外のものも入力できてしまいます。
コピーボタンをクリックするとプロパティと値がコピーされます。
今回もせっかくなので、iframe内のHTML、CSS、JavaScriptを掲載しておきます。
HTML
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="css/style.css">
<script src="https://code.jquery.com/jquery-3.5.1.min.js"
integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
</head>
<body>
<section id="contentsWrap">
<div id="inputWrap">
<div id="createBtn"></div>
<form action="">
<p><input type="text" name="text" value="テキスト" id="txtVal"></p>
<div id="bgc01Wrap">
<p>
color:
<input type="color" value="#ffffff" id="bgc01">
</p>
<p id="bgc01Txt"></p>
</div>
<p>padding:<input type="text" name="padding" id="paddingVal" value="5">
<select name="paddingSelect" id="paddingSelect">
<option value="px">px</option>
<option value="em">em</option>
<option value="pt">pt</option>
<option value="%">%</option>
</select>
<p>border-radius:<input type="text" name="borderRadius" id="borderRadiusVal" value="5">
<select name="borderRadiusSelect" id="borderRadiusSelect">
<option value="px">px</option>
<option value="em">em</option>
<option value="pt">pt</option>
<option value="%">%</option>
</select>
</p>
<p>box-shadow:<br>
<p>X:<input type="text" name="boxShadowX" id="boxShadowXVal" value="2"> px</p>
<p>Y:<input type="text" name="boxShadowY" id="boxShadowYVal" value="2"> px</p>
<p>ぼかし:<input type="text" name="boxShadowBlur" id="boxShadowBlurVal" value="2"> px</p>
<div id="bgc01Wrap">
<p>
ぼかしカラー:
<input type="color" value="#898989" id="bgc02">
</p>
<p id="bgc02Txt"></p>
</div>
</p>
<div id="bgc03Wrap">
<p>
背景色:
<input type="color" value="#ff0000" id="bgc03">
</p>
<p id="bgc03Txt"></p>
</div>
</form>
</div>
<div id="elmStyleWrap">
<div class="elmStyle">
<p>element.style {</p>
<p class="colorProp">color<span class="colorPropVal"></span></p>
<p class="paddingProp">padding<span class="paddingPropVal"></span></p>
<p class="boderRadiusProp">border-radius<span class="boderRadiusPropVal"></span></p>
<p class="boxShadowProp">box-shadow<span class="boxShadowPropVal"></span></p>
<p class="bgcProp">background-color<span class="bgcPropVal"></span></p>
<p class="cursorProp">cursor<span class="cursorPropVal">: pointer ;</span></p>
<p>}</p>
</div>
<div id="btnWrap"><p class="button copyBtn">コピー</p></div>
</div>
</section>
<script src="js/index.js">
</script>
</body>
</html>
CSS
body {
box-sizing: border-box;
}
form p {
margin: .25em;
}
#contentsWrap {
display: flex;
flex-wrap: wrap;
}
#bgc01Wrap,
#bgc02Wrap,
#bgc03Wrap {
display: flex;
}
#paddingVal,
#borderRadiusVal,
#boxShadowXVal,
#boxShadowYVal,
#boxShadowBlurVal {
width: 3em;
text-align: right;
}
#txtVal {
color: #ffffff;
cursor: pointer;
text-align: center;
border: initial;
}
#btnWrap {
display: flex;
justify-content: flex-end;
}
.button {
background-color: #ccc;
width: 7em;
text-align: center;
padding: 0.125em;
border-radius: 7px;
box-shadow: 2px 2px 2px #aaa;
font-size: 0.75em;
cursor: pointer;
transition: .3s;
}
.button:hover {
background-color: #ddd;
transition: .3s;
}
.elmStyle {
background-color: rgb(36, 36, 36);
font-size: .9em;
color: #fff;
width: 320px;
padding: .5em 1em;
}
.elmStyle p {
margin: 0;
}
.elmStyle p.colorProp,
.elmStyle p.paddingProp,
.elmStyle p.boderRadiusProp,
.elmStyle p.boxShadowProp,
.elmStyle p.bgcProp,
.elmStyle p.cursorProp {
color: rgb(54, 212, 199);
margin-left: 1.5em;
}
.elmStyle p.lbProp,
.elmStyle p.wbProp,
.elmStyle p.owProp {
display: none;
}
.elmStyle span {
color: #fff;
}
#elmStyleWrap {
margin: 1em 0 0 1em;
}
@media screen and (max-width:1104px) {
#elmStyleWrap {
margin: 0;
}
}
.copyBtn {
margin: .5em 0;
}
JavaScript
jQuery(document).ready(function ($) {
//////////////////////////////////
// ▼▼▼ 初期設定
let txtValLen = $('#txtVal').val().length, //テキスト数
paddingVal = $('#paddingVal').val(), //padding
borderRadiusVal = $('#borderRadiusVal').val(), //border-radius
boxShadowXVal = $('#boxShadowXVal').val(), //box-shadow X
boxShadowYVal = $('#boxShadowYVal').val(), //box-shadow Y
boxShadowBlurVal = $('#boxShadowBlurVal').val(), //box-shadow ぼかし
bgc01Val = $('#bgc01').val(), //color
bgc02Val = $('#bgc02').val(), //box-shadow カラー
bgc03Val = $('#bgc03').val(); //background-color
$('#bgc01Txt').text(bgc01Val); //color値を表示
$('#bgc02Txt').text(bgc02Val); //box-shadowのぼかしカラー値を表示
$('#bgc03Txt').text(bgc03Val); //background-color値を表示
$('#paddingSelect').change(function () {
paddingSelectVal = $(this).val();
})
$('#txtVal').css({
color: bgc01Val,
width: txtValLen + 1 + "em",
padding: paddingVal + $('#paddingSelect').val(), //padding
borderRadius: borderRadiusVal + $('#borderRadiusSelect').val(), //border-radius
boxShadow: boxShadowXVal + "px " + boxShadowYVal + "px " + boxShadowBlurVal + "px " + bgc02Val, //box-shadow
backgroundColor: bgc03Val,
});
//////////////////////////////////
// ▼▼▼ プロパティ表示枠
$('.colorPropVal').html(' : ' + bgc01Val + ' ;');
$('.paddingPropVal').html(' : ' + paddingVal + $('#paddingSelect').val() + ' ;');
$('.boderRadiusPropVal').html(' : ' + borderRadiusVal + $('#borderRadiusSelect').val() + ' ;');
$('.boxShadowPropVal').html(' : ' + boxShadowXVal + "px " + boxShadowYVal + "px " + boxShadowBlurVal + "px " + bgc02Val + ' ;');
$('.bgcPropVal').html(' : ' + bgc03Val + ' ;');
//////////////////////////////////
// ▼▼▼ 値が変更された場合の処理
// テキスト数
$('#txtVal').change(function () {
const txtValLen = $(this).val().length;
$('#txtVal').css('width', (txtValLen + 1) + "em");
});
// color
$('#bgc01').change(function () {
// ▼テキストカラー
$('#txtVal').css('color', $(this).val());
// ▼テキストカラー表示
$('#bgc01Txt').text($(this).val());
// ▼プロパティ表示枠内
$('.colorPropVal').html(' : ' + $(this).val() + ' ;');
});
// padding
$('#paddingVal').change(function () {
// ▼padding
$('#txtVal').css('padding', $(this).val() + $('#paddingSelect').val());
// ▼プロパティ表示枠内
$('.paddingPropVal').html(' : ' + $(this).val() + $('#paddingSelect').val() + ' ;');
});
$('#paddingSelect').change(function () {
// ▼単位変更
$('#txtVal').css('padding', $('#paddingVal').val() + $(this).val());
// ▼プロパティ表示枠内
$('.paddingPropVal').html(' : ' + $('#paddingVal').val() + $(this).val() + ' ;');
});
// border-radius
$('#borderRadiusVal').change(function () {
// ▼border-radius
$('#txtVal').css('borderRadius', $(this).val() + $('#borderRadiusSelect').val());
// ▼プロパティ表示枠内
$('.boderRadiusPropVal').html(' : ' + $(this).val() + $('#borderRadiusSelect').val() + ' ;');
});
$('#borderRadiusSelect').change(function () {
// ▼単位変更
$('#txtVal').css('borderRadius', $('#borderRadiusVal').val() + $(this).val());
// ▼プロパティ表示枠内
$('.boderRadiusPropVal').html(' : ' + $('#borderRadiusVal').val() + $(this).val() + ' ;');
});
//box-shadow
boxShadowConfig('#boxShadowXVal');
boxShadowConfig('#boxShadowYVal');
boxShadowConfig('#boxShadowBlurVal');
boxShadowConfig('#bgc02');
function boxShadowConfig(target) {
$(target).change(function () {
let boxShadowXVal = $('#boxShadowXVal').val(), //X値
boxShadowYVal = $('#boxShadowYVal').val(), //Y値
boxShadowBlurVal = $('#boxShadowBlurVal').val(), //blur値
bgc02Val = $('#bgc02').val();
// ▼box-shadow
$('#txtVal').css('boxShadow', boxShadowXVal + "px " + boxShadowYVal + "px " + boxShadowBlurVal + "px " + bgc02Val);
// ▼プロパティ表示枠内
$('.boxShadowPropVal').html(' : ' + boxShadowXVal + "px " + boxShadowYVal + "px " + boxShadowBlurVal + "px " + bgc02Val+ ' ;');
// ▼ぼかしカラー表示
$('#bgc02Txt').text(bgc02Val);
});
}
// background-color
$('#bgc03').change(function () {
// ▼background-color
$('#txtVal').css('backgroundColor', $(this).val());
// ▼background-color表示
$('#bgc03Txt').text($(this).val());
// ▼プロパティ表示枠内
$('.bgcPropVal').html(' : ' + $(this).val() + ' ;');
});
//////////////////////////////////
// ▼▼▼ コピー押下でプロパティをクリップボードに送る
$('.copyBtn').click(function () {
const txtVal = $('.elmStyle p:visible').text();
const repTxt = txtVal.replace(/ (;)/g, '$1'); //セミコロンの前の半角スペースを削除
// ▼クリップボードに送る
const txtArea = $('');
txtArea.text(repTxt);
$(this).append(txtArea);
txtArea.select();
document.execCommand('copy');
txtArea.remove();
});
});
最初はIris Color Picker を使おうと思いましたが、クリックイベントでうまく色が拾えずあきらめました。
HTML5のinput type="color"
を使用しました。
正月休みに書きましたが、やる気モードにならず簡単なプログラムですが3日も費やしてしまいました。
今年もWeb界隈のことや、Adobe関連のことなど取り上げてゆきたいと思います。
なお、掲載しているソースコードはご自由にお使いいただいても構いませんが、何かあっても責任は追いかねるのでご了承ください。
最後まで読んでくださりありがとうございました。
本年もどうぞ、宜しくお願いします。