SVG applications on mobile devices require special attention to performance, compatibility, and user experience. Here are best practices for SVG development on mobile:
1. Responsive Design
Use viewBox for Responsiveness:
svg<svg viewBox="0 0 100 100" width="100%" height="auto"> <circle cx="50" cy="50" r="40" fill="blue" /> </svg>
Use Media Queries to Adjust SVG:
css/* Small screens */ @media (max-width: 768px) { .mobile-svg { width: 100%; height: auto; } } /* Large screens */ @media (min-width: 769px) { .mobile-svg { width: 50%; height: auto; } }
2. Touch Event Support
Add Touch Events:
javascriptconst svg = document.querySelector('svg'); // Touch start svg.addEventListener('touchstart', function(event) { event.preventDefault(); const touch = event.touches[0]; const point = svg.createSVGPoint(); point.x = touch.clientX; point.y = touch.clientY; const svgPoint = point.matrixTransform(svg.getScreenCTM().inverse()); console.log('Touch start:', svgPoint); }); // Touch move svg.addEventListener('touchmove', function(event) { event.preventDefault(); const touch = event.touches[0]; // Handle touch move }); // Touch end svg.addEventListener('touchend', function(event) { event.preventDefault(); // Handle touch end });
3. Performance Optimization
Reduce Element Count:
svg<!-- Before optimization: multiple independent elements --> <circle cx="10" cy="10" r="5" fill="blue" /> <circle cx="20" cy="10" r="5" fill="blue" /> <circle cx="30" cy="10" r="5" fill="blue" /> <!-- After optimization: use group --> <g fill="blue"> <circle cx="10" cy="10" r="5" /> <circle cx="20" cy="10" r="5" /> <circle cx="30" cy="10" r="5" /> </g>
Use CSS Animations Instead of SMIL:
css/* CSS animation (better performance) */ .mobile-animated { animation: pulse 1s ease-in-out infinite; } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.1); } }
4. Mobile-Specific Optimizations
Optimize Touch Target Size:
svg<svg width="44" height="44" viewBox="0 0 24 24"> <path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z" fill="currentColor" /> </svg>
Use Appropriate Font Sizes:
svg<svg width="200" height="100" viewBox="0 0 200 100"> <text x="100" y="50" font-size="16" text-anchor="middle"> Mobile text </text> </svg>
5. Battery Optimization
Reduce Animation Complexity:
css/* Simple animation (saves battery) */ .simple-anim { animation: fade 0.3s ease; } @keyframes fade { from { opacity: 0; } to { opacity: 1; } } /* Avoid complex animations (drains battery) */ .complex-anim { /* Avoid using on mobile */ }
Use prefers-reduced-motion:
css@media (prefers-reduced-motion: reduce) { * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } }
6. Network Optimization
Lazy Load Non-Critical SVGs:
html<!-- Critical SVG loads immediately --> <svg class="critical" viewBox="0 0 24 24"> <path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z" /> </svg> <!-- Non-critical SVG lazy loads --> <img src="non-critical.svg" loading="lazy" alt="Non-critical" />
Use SVG Sprite:
html<!-- Merge multiple icons --> <svg style="display: none;"> <symbol id="icon1" viewBox="0 0 24 24">...</symbol> <symbol id="icon2" viewBox="0 0 24 24">...</symbol> </svg> <!-- Use icons --> <svg><use href="#icon1" /></svg>
7. Compatibility Handling
Detect SVG Support:
javascriptfunction supportsSVG() { return !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect; } if (!supportsSVG()) { // Fallback to PNG document.querySelector('.svg-icon').src = 'icon.png'; }
Provide Fallback:
html<picture> <source type="image/svg+xml" srcset="icon.svg" /> <img src="icon.png" alt="Icon" /> </picture>
8. Accessibility
Add Appropriate ARIA Attributes:
svg<svg role="img" aria-labelledby="svg-title svg-desc" tabindex="0"> <title id="svg-title">Icon</title> <desc id="svg-desc">Click to open menu</desc> <path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z" /> </svg>
Support Screen Readers:
javascriptconst svg = document.querySelector('svg'); svg.setAttribute('role', 'img'); svg.setAttribute('aria-label', 'Search icon');
9. Debugging and Testing
Debug with Chrome DevTools:
- Check rendering performance
- Monitor memory usage
- Test touch events
Test on Real Devices:
- iOS Safari
- Android Chrome
- Various screen sizes
- Different network conditions
Best Practices:
- Always use viewBox for responsiveness
- Optimize touch target size (at least 44x44px)
- Reduce animation complexity to save battery
- Lazy load non-critical SVGs
- Provide appropriate fallbacks
- Add accessibility support
- Test on real devices
- Monitor performance metrics