稀土掘金 稀土掘金

手把手实现一个Linear Gradient Generator

和上面文章实现 box shadow generator类似,这篇文章实现linear gradient generator

线上地址 wfqvqw.csb.app/

linear gradient语法非常灵活,概括为linear-gradient([<角度> | to <方向>]?, <颜色> <位置>?, ...) 可以提供额外的色标(%)实现自定义渐变

效果展示 Img

这个demo实现很简单,就是一个方位值和俩个颜色参数,像类似这样 background-image: linear-gradient(to top left, #3f87a6, #f69d3c);

html结构划分

Img

需要注意的点

  • <input type='color' value="..."> 是颜色选择器, 可选RGB,hSL,HEX;value是默认值
  • <textarea rows="2"></textarea> 文本框,输入区域设置默认显示2行文本
  • <i class="fas fa-arrow-up"></i> 箭头图标通过CDN引入 font-awesome

实现代码

<div class="container">
			<div class="colors">
				<input type="color" id="color-a" value="#7986cb" />
				<input type="color" id="color-b" value="#1a237e" />
			</div>
			<div class="buttons">
				<button onclick="setDirection('to top', this)">
					<i class="fas fa-arrow-up"></i>
				</button>
				<button class="active" onclick="setDirection('to bottom', this)">
					<i class="fas fa-arrow-down"></i>
				</button>
				<button onclick="setDirection('to right', this)">
					<i class="fas fa-arrow-right"></i>
				</button>
				<button onclick="setDirection('to left', this)">
					<i class="fas fa-arrow-left"></i>
				</button>
				<button class="rotate-icon" onclick="setDirection('to top right', this)">
					<i class="fas fa-arrow-up"></i>
				</button>
				<button class="rotate-icon" onclick="setDirection('to bottom left', this)">
					<i class="fas fa-arrow-down"></i>
				</button>
				<button class="rotate-icon" onclick="setDirection('to bottom right', this)">
					<i class="fas fa-arrow-right"></i>
				</button>
				<button class="rotate-icon" onclick="setDirection('to top left', this)">
					<i class="fas fa-arrow-left"></i>
				</button>
			</div>
			<button id="submit" onclick="generateCode()">Generate</button>

			<div class="code-container">
				<textarea id="code" rows="2"></textarea>
				<button id="copy" onclick="copyStyles()">Copy</button>
			</div>
		</div>

		<script src="index.js"></script>
	</body>

css样式

需要注意的点

  • font-awesome其实只有上下左右四个方向的箭头,给上下左右方向的箭头旋转45度就有其他四个方向辽 transform: rotate(45deg);
  • .container *:not(i) { } 表示container元素下的所有子元素(*),但不包括 <i>标签元素应用这个样式
  • input[type='color']::-webkit-color-swatch { } 用webkit定义颜色选择器(swatch)的样式
  • 点击Copy会有个animation, 动画周期到50%处button放大1.1倍

主要css

.container {
	background-color: #fff;
	width: 400px;
	padding: 50px 30px;
	position: absolute;
	transform: translate(-50%, -50%);
	top: 50%;
	left: 50%;
	border-radius: 10px;
	box-shadow: 0 20px 25px rgba(0, 0, 0, 0.25);
}
.container *:not(i) {
	font-family: 'Rubik', sans-serif;
}
input[type='color']::-webkit-color-swatch {
	border-radius: 20px;
	border: none;
}
.buttons .active {
	border: none;
	background-color: var(--bg);
	color: #fff;
}
.rotate-icon i {
	transform: rotate(45deg);
}
#submit {
	display: block;
	background-color: var(--bg);
	color: #fff;
	font-size: 16px;
	padding: 12px 70px;
	border-radius: 25px;
	margin: 0 auto 30px auto;
	cursor: pointer;
}
.animation {
	animation: animate 1s linear;
}
@keyframes animate {
	50% {
		transform: scale(1.1);
	}
}

js

当点击Generate按钮时需要把样式应用到<body>

给按钮绑定generateCode方法

generateCode

  • 获取DOM元素value值,然后拼装成linear-gradient参数params
  • DOM.style.语法 给DOM添加linear-gradient 样式
  • DOM.textContent语法 替换code-container中的文字框文本
const colorOne = document.getElementById('color-a')
const colorTwo = document.getElementById('color-b')
const styles = document.getElementById('code')
const copyButton = document.getElementById('copy')
let currentDirection = 'to bottom'
function generateCode() {
	const params = `linear-gradient(${currentDirection}, ${colorOne.value}, ${colorTwo.value})`
	styles.textContent = 'background-image:' + params
	document.getElementsByTagName('body')[0].style.backgroundImage = params
}

setDirection

给每个方向键绑定setDirection setDirection是这样调用的onclick="setDirection('to bottom right', this)" ,其中this即当前DOM元素,选中被点击时添加active样式

function setDirection(value, _this) {
	const direcrtions = document.querySelectorAll('.buttons button')
	for (let i of direcrtions) {
		i.classList.remove('active')
	}
	_this.classList.add('active')
	currentDirection = value
}

copyStyles

和上篇文章一样,直接复制过来咯

  • 当我们点击复制样式按钮时,通过 Clipboard Api实现复制到剪切板
  • .then等待执行完,copyButton直接添加animation样式,更换innerText
  • 再用setTimeout1s之后移除animation和复原innerText
function copyStyles() {
	styles.select()
	const textToCopy = styles.value
	navigator.clipboard
		.writeText(textToCopy)
		.then(() => {
			copyButton.innerText = 'Copied!🎉'
			copyButton.classList.add('animation')
			setTimeout(() => {
				copyButton.innerText = 'Copy'
				copyButton.classList.remove('animation')
			}, 1000)
		})
		.catch(() => {
			copyButton.innerText = 'Copy failed'
		})
}

代码片段

linear-gradient推荐网站

gradient.shapefactory.co调配的颜色很米,左边还有亮度和颜料调节,也可自己着色,一键COPY!

image.png

参考

  • gradient.shapefactory.co/
  • developer.mozilla.org/zh-CN/docs/…
  • www.w3schools.com/cssref/func…

玻璃钢生产厂家昆明玻璃钢雕塑直供溧水商场周年美陈肇庆玻璃钢公仔雕塑图片玻璃钢 雕塑重庆玻璃钢花盆批发平舆玻璃钢雕塑定制玻璃钢雕塑道具秀屿玻璃钢雕塑厂家湖北创意玻璃钢雕塑哪家便宜商场美陈卫生标准夏季商场美陈制作公司腾冲市玻璃钢雕塑厂家电话商场美陈重庆厂家河南不玻璃钢雕塑北京户外商场美陈销售企业河南仿铜玻璃钢雕塑销售电话呈贡玻璃钢雕塑加工哪家好济源哪里有玻璃钢卡通雕塑厂家江苏省玻璃钢雕塑生产厂家性能可靠的玻璃钢花盆批发玻璃钢雕塑红旗硅胶加玻璃钢雕塑商场生动化美陈山东玻璃钢雕塑园水中玻璃钢雕塑的利弊电器商场美陈布展照片长春园林玻璃钢雕塑生产厂家栖霞商场节庆美陈佛山玻璃钢雕塑制作厂家鹤壁公园不锈钢玻璃钢雕塑厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化