/* 应用于单个图片 */
.pixel-image {
image-rendering: pixelated;
filter: blur(0) contrast(1.5) brightness(1.2);
}
/* 应用于整个容器 */
.pixel-container {
image-rendering: pixelated;
filter: blur(0) contrast(1.5) brightness(1.2);
background-size: 20px 20px;
background-image:
linear-gradient(to right, rgba(0,0,0,0.05) 1px, transparent 1px),
linear-gradient(to bottom, rgba(0,0,0,0.05) 1px, transparent 1px);
}
<!-- 单个元素像素化 -->
<img src="image.jpg" class="pixel-image" alt="像素化图片">
<!-- 整个容器像素化 -->
<div class="pixel-container">
<img src="image.jpg" alt="容器内图片">
<p>其他内容也会受到像素化影响</p>
</div>
// PixelImage.jsx
import React from 'react';
const PixelImage = ({ src, alt, width, height, className, ...rest }) => {
return (
<img
src={src}
alt={alt}
width={width}
height={height}
className={`pixelated pixel-effect ${className}`}
{...rest}
/>
);
};
export default PixelImage;
<!-- PixelImage.vue -->
<template>
<img
:src="src"
:alt="alt"
:width="width"
:height="height"
class="pixelated pixel-effect"
v-bind="$attrs"
/>
</template>
<script>
export default {
props: {
src: {
type: String,
required: true
},
alt: {
type: String,
default: ''
},
width: {
type: Number,
default: null
},
height: {
type: Number,
default: null
}
}
}
</script>
<style scoped>
.pixelated {
image-rendering: pixelated;
}
.pixel-effect {
filter: blur(0) contrast(1.5) brightness(1.2);
}
</style>
// tailwind.config.js
module.exports = {
theme: {
extend: {
utilities: {
'pixelated': {
'image-rendering': 'pixelated',
},
'pixel-effect': {
'filter': 'blur(0) contrast(1.5) brightness(1.2)',
},
'pixel-bg': {
'background-size': '20px 20px',
'background-image': `
linear-gradient(to right, rgba(0,0,0,0.05) 1px, transparent 1px),
linear-gradient(to bottom, rgba(0,0,0,0.05) 1px, transparent 1px)
`,
}
},
}
}
}
// PixelCard.jsx
import React from 'react';
const PixelCard = ({ title, content, imageUrl, className, ...rest }) => {
return (
<div
className={`bg-white rounded-lg shadow-md overflow-hidden pixel-bg ${className}`}
{...rest}
>
<div className="pixelated pixel-effect">
<img src={imageUrl} alt={title} className="w-full h-48 object-cover" />
</div>
<div className="p-4">
<h3 className="font-bold text-lg mb-2">{title}</h3>
<p className="text-gray-600">{content}</p>
</div>
</div>
);
};
export default PixelCard;
// PixelButton.jsx
import React from 'react';
const PixelButton = ({ label, onClick, variant = 'primary', size = 'medium', className, ...rest }) => {
const variantClasses = {
primary: 'bg-blue-500 text-white',
secondary: 'bg-gray-500 text-white',
success: 'bg-green-500 text-white',
danger: 'bg-red-500 text-white'
};
const sizeClasses = {
small: 'px-3 py-1 text-sm',
medium: 'px-4 py-2 text-base',
large: 'px-5 py-3 text-lg'
};
return (
<button
className={`
${variantClasses[variant]} ${sizeClasses[size]} rounded-md transition-all duration-200
hover:opacity-90 focus:outline-none focus:ring-2 pixelated pixel-effect ${className}
`}
onClick={onClick}
{...rest}
>
{label}
</button>
);
};
export default PixelButton;
// PixelToggle.jsx
import React, { useState } from 'react';
const PixelToggle = ({ children }) => {
const [isPixelated, setIsPixelated] = useState(false);
const togglePixelated = () => {
setIsPixelated(!isPixelated);
};
return (
<div>
<button
className="bg-primary text-white px-4 py-2 rounded-md mb-4"
onClick={togglePixelated}
>
{isPixelated ? '关闭像素化' : '开启像素化'}
</button>
<div className={isPixelated ? 'pixelated pixel-effect pixel-bg' : ''}>
{children}
</div>
</div>
);
};
export default PixelToggle;
<!-- PixelToggle.vue -->
<template>
<div>
<button
class="bg-primary text-white px-4 py-2 rounded-md mb-4"
@click="togglePixelated"
>
{{ isPixelated ? '关闭像素化' : '开启像素化' }}
</button>
<div :class="{ 'pixelated pixel-effect pixel-bg': isPixelated }">
<slot />
</div>
</div>
</template>
<script>
export default {
data() {
return {
isPixelated: false
}
},
methods: {
togglePixelated() {
this.isPixelated = !this.isPixelated;
}
}
}
</script>
import React from 'react';
import PixelImage from './components/PixelImage';
import PixelCard from './components/PixelCard';
import PixelToggle from './components/PixelToggle';
const App = () => {
return (
<div className="container mx-auto px-4 py-8">
<h1 className="text-3xl font-bold mb-8">像素化示例</h1>
<PixelToggle>
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
<PixelCard
title="自然风光"
content="这是一个像素化的自然风光图片示例"
imageUrl="https://picsum.photos/800/450?random=1"
/>
<div className="bg-white rounded-lg shadow-md p-6">
<h3 className="font-bold text-lg mb-4">像素化文字</h3>
<p className="mb-4">这段文字也可以应用像素化效果,创造独特的视觉体验。</p>
<PixelImage
src="https://picsum.photos/400/300?random=2"
alt="示例图片"
className="rounded-lg"
/>
</div>
</div>
</PixelToggle>
</div>
);
};
export default App;
<!-- App.vue -->
<template>
<div class="container mx-auto px-4 py-8">
<h1 class="text-3xl font-bold mb-8">像素化示例</h1>
<PixelToggle>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8">
<PixelCard
title="自然风光"
content="这是一个像素化的自然风光图片示例"
imageUrl="https://picsum.photos/800/450?random=1"
/>
<div class="bg-white rounded-lg shadow-md p-6">
<h3 class="font-bold text-lg mb-4">像素化文字</h3>
<p class="mb-4">这段文字也可以应用像素化效果,创造独特的视觉体验。</p>
<PixelImage
src="https://picsum.photos/400/300?random=2"
alt="示例图片"
class="rounded-lg"
/>
</div>
</div>
</PixelToggle>
</div>
</template>
<script>
import PixelImage from './components/PixelImage.vue';
import PixelCard from './components/PixelCard.vue';
import PixelToggle from './components/PixelToggle.vue';
export default {
components: {
PixelImage,
PixelCard,
PixelToggle
}
}
</script>
/* 添加浏览器前缀以提高兼容性 */
.pixelated {
image-rendering: pixelated; /* 标准语法 */
image-rendering: -moz-crisp-edges; /* Firefox */
image-rendering: -webkit-optimize-contrast; /* Safari */
-ms-interpolation-mode: nearest-neighbor; /* IE */
}
通过上述组件封装方法,你可以在项目中方便地使用像素化效果,无论是简单的图片处理还是复杂的UI组件,都能轻松实现复古像素风格。
CSS, 像素化技术,前端开发,Web 设计,图像处理,响应式设计,组件封装,前端组件,JavaScript,CSS3,HTML5, 可视化效果,网页美化,前端框架,用户体验
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。